From a90c9ecfc5118547d0a92b2fee2779eca95e09a5 Mon Sep 17 00:00:00 2001 From: buli <137736985@qq.com> Date: 星期四, 10 三月 2022 18:49:39 +0800 Subject: [PATCH] New Code For PIPL20220310 --- force-app/main/default/pages/ViewTenderinformationDecryptInfo.page-meta.xml | 7 force-app/main/default/classes/ControllerResponse.cls | 16 force-app/main/default/classes/TestClass.cls-meta.xml | 5 force-app/main/default/pages/ViewAddressDecryptInfo.page-meta.xml | 7 force-app/main/default/classes/NewAndEditASEActivityController.cls-meta.xml | 5 force-app/main/default/pages/ViewInspectionReportDecryptInfo.page-meta.xml | 7 force-app/main/default/pages/ViewReportDecryptInfo.page | 40 force-app/main/default/classes/NewAndEditASEActivityController.cls | 49 force-app/main/default/classes/NewAndEditAgencyContactController.cls-meta.xml | 5 force-app/main/default/aura/NewAgencyContact/NewAgencyContactHelper.js | 77 force-app/main/default/classes/MetaDataUtility.cls | 177 force-app/main/default/classes/NewAndEditTenderinformationController.cls | 45 force-app/main/default/pages/TenderInformationUploadPdf.page-meta.xml | 7 force-app/main/default/triggers/FileAddressTrigger.trigger-meta.xml | 5 force-app/main/default/classes/NewAndEditQISController.cls-meta.xml | 5 force-app/main/default/pages/NewAndEditCase.page-meta.xml | 7 force-app/main/default/pages/ViewContactDecryptInfo.page-meta.xml | 7 force-app/main/default/pages/ViewOnCallDecrypt.page | 27 force-app/main/default/pages/NewAndEditASEActivity.page-meta.xml | 7 force-app/main/default/pages/ViewContactDecryptInfo.page | 68 force-app/main/default/pages/ViewQISReportDecryptInfo.page | 65 force-app/main/default/pages/NewAndEditCampaignMember.page-meta.xml | 7 force-app/main/default/pages/ViewRepairSubOrderDecryptInfo.page-meta.xml | 7 force-app/main/default/classes/NewAndEditEventController.cls | 44 force-app/main/default/classes/Option.cls-meta.xml | 5 force-app/main/default/pages/SearchContactPage.page | 185 force-app/main/default/classes/NewAndEditReportController.cls | 160 force-app/main/default/pages/ViewAgencyContactDecryptInfo.page-meta.xml | 7 force-app/main/default/classes/FileUploadController.cls | 68 force-app/main/default/pages/ViewASEActivityDecryptInfo.page | 85 force-app/main/default/pages/ViewAgencyContactDecryptInfo.page | 56 force-app/main/default/classes/DeveloperUtility.cls-meta.xml | 5 force-app/main/default/classes/NewAndEditContactController.cls-meta.xml | 5 force-app/main/default/pages/ViewInquiryFormDecryptInfo.page | 56 force-app/main/default/pages/NewAndEditAgencyContact.page-meta.xml | 7 force-app/main/default/classes/MetaDataUtility.cls-meta.xml | 5 force-app/main/default/pages/NewAndEditReport.page-meta.xml | 7 force-app/main/default/pages/UploadPdf.page-meta.xml | 7 force-app/main/default/pages/NewConsumApply.page | 402 + force-app/main/default/classes/NewAndEditInquiryFormController.cls-meta.xml | 5 force-app/main/default/classes/FieldInfo.cls | 44 force-app/main/default/pages/SearchContactPage.page-meta.xml | 7 force-app/main/default/aura/NewAgencyContact/NewAgencyContact.cmp | 60 force-app/main/default/classes/NewAndEditCampaignMemberController.cls | 18 force-app/main/default/classes/NewAndEditInspectionReportController.cls-meta.xml | 5 force-app/main/default/pages/ViewConsumApplyEquipmentSetDetailDecrypt.page | 26 force-app/main/default/pages/ViewInquiryFormDecryptInfo.page-meta.xml | 7 force-app/main/default/pages/NewListOfConsumables.page | 2 force-app/main/default/pages/SearchLeadPage.page | 185 force-app/main/default/pages/ViewReportDecryptInfo.page-meta.xml | 7 force-app/main/default/pages/ViewAddressDecryptInfo.page | 32 force-app/main/default/classes/DeleteBatch.cls | 20 force-app/main/default/classes/NewRepairController.cls-meta.xml | 5 force-app/main/default/pages/NewRepairPage.page-meta.xml | 7 force-app/main/default/classes/PIHelper.cls | 216 force-app/main/default/classes/NFM702ControllerHandler.cls | 5 force-app/main/default/classes/FileUploadController.cls-meta.xml | 5 force-app/main/default/classes/NewConsumApplyEquipSetDetailController.cls-meta.xml | 5 force-app/main/default/pages/B_Test.page | 304 + force-app/main/default/pages/NewAndEditRepairSubOrder.page | 575 ++ force-app/main/default/classes/NewAndEditCampaignMemberController.cls-meta.xml | 5 force-app/main/default/pages/NewAndEditInspectionReport.page-meta.xml | 7 force-app/main/default/classes/NFM702ControllerHandler.cls-meta.xml | 5 force-app/main/default/classes/FieldInfo.cls-meta.xml | 5 force-app/main/default/classes/SearchLeadController.cls | 53 force-app/main/default/pages/UploadPdf.page | 190 force-app/main/default/triggers/FileAddressTrigger.trigger | 13 force-app/main/default/pages/ViewCaseDecryptInfo.page | 30 force-app/main/default/classes/DeleteBatch.cls-meta.xml | 5 force-app/main/default/pages/NewAndEditCase.page | 442 + force-app/main/default/pages/NewRentalApply.page | 387 + force-app/main/default/pages/ViewRepairEncrypt.page-meta.xml | 7 force-app/main/default/pages/ViewListOfConsumablesDecrypt.page | 2 force-app/main/default/classes/NewAndEditReportController.cls-meta.xml | 5 force-app/main/default/pages/NewConsumApplyEquipmentSetDetail.page-meta.xml | 7 force-app/main/default/classes/NewAndEditCaseController.cls-meta.xml | 5 force-app/main/default/pages/TestVfPage.page | 3 force-app/main/default/pages/NewAndEditInspectionReport.page | 436 + force-app/main/default/classes/NewAndEditQISController.cls | 12 force-app/main/default/pages/NewAndEditReport.page | 590 ++ force-app/main/default/classes/NewAndEditInspectionReportController.cls | 25 force-app/main/default/pages/RentalApplyUploadPdf.page-meta.xml | 7 force-app/main/default/aura/NewAgencyContact/NewAgencyContactController.js | 217 force-app/main/default/pages/ViewRepairSubOrderDecryptInfo.page | 56 force-app/main/default/classes/NewAgencyContactController.cls-meta.xml | 5 force-app/main/default/classes/ViewParticipantsController.cls-meta.xml | 5 force-app/main/default/classes/NewAndEditTenderinformationController.cls-meta.xml | 5 force-app/main/default/pages/NewAndEditQIS.page-meta.xml | 7 force-app/main/default/classes/NewAndEditEventController.cls-meta.xml | 5 force-app/main/default/classes/SoqlHelper.cls | 136 force-app/main/default/classes/NewAndEditBaseController.cls-meta.xml | 5 force-app/main/default/classes/ControllerResponse.cls-meta.xml | 5 force-app/main/default/pages/NewAndEditContact.page | 485 ++ force-app/main/default/pages/ViewLeadDecryptInfo.page-meta.xml | 7 force-app/main/default/classes/TestClass.cls | 41 force-app/main/default/classes/NewAndEditRepairSubOrderController.cls-meta.xml | 5 force-app/main/default/pages/TestClass.page | 2 force-app/main/default/classes/NewAndEditAgencyContactController.cls | 20 force-app/main/default/classes/NewAndEditContactController.cls | 52 force-app/main/default/classes/SearchContactController.cls-meta.xml | 5 force-app/main/default/classes/NewListOfConsumablesController.cls | 3 force-app/main/default/pages/ViewEventDecryptInfo.page | 93 force-app/main/default/pages/ViewInspectionReportDecryptInfo.page | 56 force-app/main/default/pages/ViewListOfConsumablesDecrypt.page-meta.xml | 7 force-app/main/default/classes/RentalApplyController.cls-meta.xml | 5 force-app/main/default/classes/NewAndEditRepairSubOrderController.cls | 40 force-app/main/default/pages/NewAndEditAgencyContact.page | 511 ++ force-app/main/default/classes/B_Test.cls | 161 force-app/main/default/classes/ViewParticipantsController.cls | 6 force-app/main/default/classes/Option.cls | 5 force-app/main/default/classes/NewConsumApplyController.cls-meta.xml | 5 force-app/main/default/classes/TestController.cls-meta.xml | 5 force-app/main/default/pages/ViewOnCallDecrypt.page-meta.xml | 7 force-app/main/default/pages/ViewRentalApplyDecrypt.page | 27 force-app/main/default/classes/OnCallController.cls-meta.xml | 5 force-app/main/default/classes/TestController.cls | 15 force-app/main/default/pages/NewAndEditASEActivity.page | 526 ++ force-app/main/default/pages/ViewASEActivityDecryptInfo.page-meta.xml | 7 force-app/main/default/pages/NewConsumApplyEquipmentSetDetail.page | 300 + force-app/main/default/pages/ViewDecryptConsumApply.page-meta.xml | 7 force-app/main/default/pages/TestVfPage.page-meta.xml | 7 force-app/main/default/classes/RentalApplyController.cls | 153 force-app/main/default/pages/NewAndEditRepairSubOrder.page-meta.xml | 7 force-app/main/default/pages/NewOnCall.page-meta.xml | 7 force-app/main/default/pages/RentalApplyUploadPdf.page | 190 force-app/main/default/pages/ConsumApplyUploadPdf.page-meta.xml | 7 force-app/main/default/pages/NewAndEditContact.page-meta.xml | 7 force-app/main/default/classes/NewAndEditInquiryFormController.cls | 36 force-app/main/default/pages/NewConsumApply.page-meta.xml | 7 force-app/main/default/classes/NewConsumApplyController.cls | 139 force-app/main/default/classes/SObjectHelper.cls-meta.xml | 5 force-app/main/default/pages/ViewRepairEncrypt.page | 47 force-app/main/default/pages/ViewLeadDecryptInfo.page | 32 force-app/main/default/pages/NewRepairPage.page | 2 force-app/main/default/classes/SoqlHelper.cls-meta.xml | 5 force-app/main/default/classes/NewRepairController.cls | 148 force-app/main/default/pages/NewRepair.page | 327 + force-app/main/default/pages/TestClass.page-meta.xml | 7 force-app/main/default/classes/NewAndEditCaseController.cls | 146 force-app/main/default/pages/NewAndEditTenderinformation.page-meta.xml | 7 force-app/main/default/pages/NewListOfConsumables.page-meta.xml | 7 force-app/main/default/pages/ViewRentalApplyDecrypt.page-meta.xml | 7 force-app/main/default/classes/NewAndEditBaseController.cls | 260 + force-app/main/default/pages/NewAndEditInquiryForm.page-meta.xml | 7 force-app/main/default/pages/NewAndEditAddress.page-meta.xml | 7 force-app/main/default/classes/SObjectHelper.cls | 445 + force-app/main/default/classes/PIHelper.cls-meta.xml | 5 force-app/main/default/pages/ViewCaseDecryptInfo.page-meta.xml | 7 force-app/main/default/pages/NewAndEditQIS.page | 558 ++ force-app/main/default/pages/TenderInformationUploadPdf.page | 190 force-app/main/default/pages/ViewConsumApplyEquipmentSetDetailDecrypt.page-meta.xml | 7 force-app/main/default/pages/ViewTenderinformationDecryptInfo.page | 58 force-app/main/default/classes/SearchLeadController.cls-meta.xml | 5 force-app/main/default/pages/NewOnCall.page | 298 + force-app/main/default/classes/SearchContactController.cls | 61 force-app/main/default/classes/NewAgencyContactController.cls | 124 force-app/main/default/pages/NewRentalApply.page-meta.xml | 7 force-app/main/default/pages/NewRepair.page-meta.xml | 7 force-app/main/default/pages/ViewDecryptConsumApply.page | 27 force-app/main/default/aura/NewAgencyContact/NewAgencyContact.cmp-meta.xml | 5 force-app/main/default/pages/SearchLeadPage.page-meta.xml | 7 force-app/main/default/pages/ViewParticipantsDecryptInfo.page | 28 force-app/main/default/pages/ViewParticipantsDecryptInfo.page-meta.xml | 7 force-app/main/default/classes/OnCallController.cls | 129 force-app/main/default/classes/NewListOfConsumablesController.cls-meta.xml | 5 force-app/main/default/pages/ViewQISReportDecryptInfo.page-meta.xml | 7 force-app/main/default/classes/B_Test.cls-meta.xml | 5 force-app/main/default/classes/DeveloperUtility.cls | 62 force-app/main/default/aura/NewAgencyContact/NewAgencyContact.css | 15 force-app/main/default/pages/B_Test.page-meta.xml | 7 force-app/main/default/pages/ViewEventDecryptInfo.page-meta.xml | 7 force-app/main/default/pages/NewAndEditCampaignMember.page | 421 + force-app/main/default/pages/NewAndEditInquiryForm.page | 607 ++ force-app/main/default/pages/NewAndEditAddress.page | 427 + force-app/main/default/pages/NewAndEditTenderinformation.page | 434 + force-app/main/default/classes/NewConsumApplyEquipSetDetailController.cls | 125 force-app/main/default/pages/ConsumApplyUploadPdf.page | 190 177 files changed, 14,252 insertions(+), 0 deletions(-) diff --git a/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.cmp b/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.cmp new file mode 100644 index 0000000..8be5cc8 --- /dev/null +++ b/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.cmp @@ -0,0 +1,60 @@ +<aura:component implements="force:lightningQuickActionWithoutHeader,force:hasRecordId,lightning:actionOverride,lightning:isUrlAddressable" access="global" + controller="NewAgencyContactController"> + + <aura:attribute name = "recordId" type = "Id" default = ""/> + <aura:handler name="init" value="{!this}" action="{!c.doInit}" /> + <aura:attribute name="layout" type="LayoutDescriberHelper.LayoutWrapper"/> + <aura:attribute name="record_data" type="Map"/> + <aura:attribute name="section_names" type="List"/> + <aura:attribute name="showSpinner" type="Boolean" default = "False"/> + <aura:attribute name="staticResource" type="Map"/> + <aura:attribute name="pi_fields_map" type="Map"/> + + + + <div class="{! v.container_class}"> + <!-- header --> + <header class="slds-modal__header"> + <h2 id="modal-heading-01" class="slds-modal__title slds-hyphenate"> + Create Agency Contact + </h2> + </header> + + <div class="slds-modal__content slds-p-around_medium"> + <aura:if isTrue="{!v.showSpinner}"> + <lightning:spinner alternativeText="Loading" size="medium" /> + </aura:if> + + + <lightning:recordEditForm objectApiName="Agency_Contact__c"> + + <lightning:accordion activeSectionName="{! v.section_names }" allowMultipleSectionsOpen="true" class="greyyyy" > + <aura:iteration items="{!v.layout}" var="section"> + <aura:if isTrue="{! section.editHeading }"> + <lightning:accordionSection name="{! section.label }" label="{! section.label }"> + + <aura:iteration items="{! section.layoutColumns}" var="col"> + <aura:iteration items="{! col.layoutItems}" var="field"> + <aura:if isTrue="{! field.behavior != 'Readonly' }"> + <lightning:inputField required="{! field.behavior == 'Required' }" fieldName="{! field.field}" value="{! field.value}" /> + + </aura:if> + </aura:iteration> + + </aura:iteration> + + + </lightning:accordionSection> + </aura:if> + </aura:iteration> + </lightning:accordion> + </lightning:recordEditForm> + + <div style="text-align:center;margin: 5px;"> + <lightning:button class="slds-button slds-button_neutral" label="鍙栨秷" onclick="{! c.cancelClick }" /> + <lightning:button class="slds-button slds-button_brand" variant="brand" label="淇濆瓨" onclick="{! c.saveClick }" /> + + </div> + </div> + </div> +</aura:component> \ No newline at end of file diff --git a/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.cmp-meta.xml b/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.cmp-meta.xml new file mode 100644 index 0000000..632b900 --- /dev/null +++ b/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.cmp-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <description>A Lightning Component Bundle</description> +</AuraDefinitionBundle> diff --git a/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.css b/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.css new file mode 100644 index 0000000..919a7e5 --- /dev/null +++ b/force-app/main/default/aura/NewAgencyContact/NewAgencyContact.css @@ -0,0 +1,15 @@ +.THIS { +} + +.THIS .greyyyy .slds-button_reset{ + display: flex; + align-items: center; + background: var(--lwc-colorBackground,rgb(243, 242, 242)); + cursor: pointer; + width: 100%; + height: 2rem; + text-align: left; + color: currentColor; + font-size: inherit; + padding: 0 var(--lwc-spacingXSmall,0.5rem); +} \ No newline at end of file diff --git a/force-app/main/default/aura/NewAgencyContact/NewAgencyContactController.js b/force-app/main/default/aura/NewAgencyContact/NewAgencyContactController.js new file mode 100644 index 0000000..8069347 --- /dev/null +++ b/force-app/main/default/aura/NewAgencyContact/NewAgencyContactController.js @@ -0,0 +1,217 @@ +({ + doInit : function(component, event, helper) { + let rid = component.get('v.recordId'); + let pid = null; + if(!rid){ + pid = window.location.href.replace("https://","").split("/")[4]; + } + + component.set("v.showSpinner", true); + helper.CallBackAction(component,'Init',{ + rid : rid, + pid : pid, + //rid : component.get('v.recordId'), + record_type_id : component.get("v.pageReference").state.recordTypeId, + },function(data){ + component.set("v.showSpinner", false); + + + if(data.getState() == "SUCCESS"){ + var rv = data.getReturnValue(); + console.log(rv); + if(rv.IsSuccess){ + let layout = JSON.parse(rv.Data.layout); + let fields = rv.Data.fields; + let staticResource = JSON.parse(rv.Data.staticResource) + let section_names = []; + section_names = layout.map(s=>s.label); + component.set('v.section_names',section_names); + + let m = {}; + for(let f of staticResource.PIDetails){ + m[f.SF_Field_API_Name__c] = f; + } + component.set('v.pi_fields_map',m); + + + + if(rv.Data && rv.Data.data && rv.Data.data.AWS_Data_Id__c){ + helper.AwsGet(staticResource.queryUrl, { + dataId : rv.Data.data.AWS_Data_Id__c + }, function(data){ + console.log('data = ' + data); + + for(let f of staticResource.PIDetails){ + + if(data.object && data.object.hasOwnProperty(f.AWS_Field_API__c)){ + rv.Data.data[f.SF_Field_API_Name__c] = data.object[f.AWS_Field_API__c]; + if(data.object.hasOwnProperty(f.AWS_Encrypted_Field_API__c) && data.object[f.AWS_Encrypted_Field_API__c]){ + rv.Data.data[f.SF_Field_Encrypted_API__c] = data.object[f.AWS_Encrypted_Field_API__c]; + } + } + } + + for(let s of layout){ + for(let c of s.layoutColumns){ + for(let item of c.layoutItems){ + if(rv.Data.data.hasOwnProperty(item.field)){ + item.value = rv.Data.data[item.field]; + } + + if(fields.hasOwnProperty(item.field)){ + item.fi = fields[item.field]; + } + } + } + } + + component.set('v.record_data',rv.Data.data); + component.set('v.layout',layout); + }, staticResource.token); + }else{ + + for(let s of layout){ + for(let c of s.layoutColumns){ + for(let item of c.layoutItems){ + if(rv.Data && fields.hasOwnProperty(item.field) && fields[item.field].References && fields[item.field].References.map(m=>m.value).indexOf(rv.Data.pidType) > -1){ + item.value = pid; + } + } + } + } + component.set('v.layout',layout); + } + + + component.set('v.fields',fields); + component.set('v.staticResource',staticResource); + }else{ + helper.ShowToast({ + "message" : rv.Message, + "type" : "error" + }); + } + + }else{ + + helper.ShowToast({ + "message" : "Init error", + "type" : "error" + }); + + } + }); + }, + saveClick : function(component, event, helper){ + + let staticResource = component.get('v.staticResource'); + let record_id = component.get('v.recordId'); + let url = staticResource.newUrl; + let payloadPi = {}; + if (record_id) { + url = staticResource.updateUrl + payloadPi['dataId'] = component.get('v.record_data').AWS_Data_Id__c; + } + let layout = component.get('v.layout'); + + let pi_fields_map = component.get('v.pi_fields_map'); + + for(let s of layout){ + for(let c of s.layoutColumns){ + for(let item of c.layoutItems){ + if(pi_fields_map.hasOwnProperty(item.field)){ + + payloadPi[pi_fields_map[item.field].AWS_Field_API__c] = item.value; + } + } + } + } + + component.set("v.showSpinner", true); + helper.AwsPost(url, [payloadPi], function(result){ + + let obj = result.object[0]; + let data = {}; + if(record_id){ + data.Id = record_id; + }else{ + data.AWS_Data_Id__c = obj.dataId; + } + for(let s of layout){ + for(let c of s.layoutColumns){ + for(let item of c.layoutItems){ + if(item.field && item.behavior != "Readonly"){ + if(pi_fields_map.hasOwnProperty(item.field)){ + data[item.field] = obj[pi_fields_map[item.field].AWS_Field_API__c]; + data[pi_fields_map[item.field].SF_Field_Encrypted_API__c] = obj[pi_fields_map[item.field].AWS_Encrypted_Field_API__c]; + }else{ + data[item.field] = item.value; + } + } + + } + } + } + + + $A.getCallback(function(){ + helper.CallBackAction(component,'Save',{ + data : data, + transId : result.txId + },function(data){ + component.set("v.showSpinner", false); + if(data.getState() == "SUCCESS"){ + var rv = data.getReturnValue(); + console.log(rv); + var sfId = rv.Data.recordId; + + helper.AwsPost(staticResource.transactionUrl,{ + txId: result.txId, + sfRecordId:sfId, + isSuccess: rv.IsSuccess ? 1 : 0 + },function(data){ + if(rv.IsSuccess){ + helper.ShowToast({ + "message" : "鎴愬姛", + "type" : "success" + }); + + if (record_id){ + + $A.get("e.force:closeQuickAction").fire(); + $A.get('e.force:refreshView').fire(); + }else{ + var sObjectEvent = $A.get("e.force:navigateToSObject"); + sObjectEvent.setParams({ + "recordId": sfId + }) + sObjectEvent.fire(); + } + }else{ + helper.ShowToast({ + "message" : rv.Message, + "type" : "error" + }); + } + },staticResource.token); + + + }else{ + + helper.ShowToast({ + "message" : "Init error", + "type" : "error" + }); + + } + }); + })(); + + }, staticResource.token); + }, + cancelClick : function(component, event, helper){ + $A.get("e.force:closeQuickAction").fire(); + }, + + scriptsLoaded : function(component, event, helper){} +}) \ No newline at end of file diff --git a/force-app/main/default/aura/NewAgencyContact/NewAgencyContactHelper.js b/force-app/main/default/aura/NewAgencyContact/NewAgencyContactHelper.js new file mode 100644 index 0000000..e3d4714 --- /dev/null +++ b/force-app/main/default/aura/NewAgencyContact/NewAgencyContactHelper.js @@ -0,0 +1,77 @@ +({ + CallBackAction : function(component,action_name,para,callback) { + var action = component.get("c." + action_name.trimStart().replace("c.","")); + if(para){ + action.setParams(para); + } + if(callback){ + action.setCallback(this,function(data){ + callback(data); + }); + } + + $A.enqueueAction(action); + }, + ShowToast : function(paras){ + var toastEvent = $A.get("e.force:showToast"); + toastEvent.setParams(paras); + toastEvent.fire(); + }, + AwsPost : function(postURL, data ,callback,token){ + let payloadForNewPI = ''; + if(typeof(data) == 'string'){ + payloadForNewPI = data; + }else{ + payloadForNewPI = JSON.stringify(data); + } + + fetch(postURL, { + method: 'POST', + body: payloadForNewPI, + headers: { + 'Content-Type': 'application/json', + 'pi-token': token + } + }).then((data) => { + console.log('data=' + JSON.stringify(data)); + return data.json(); + }).then((result) => { + //this.insertCalloutLog(this.insertModule,postURL,JSON.stringify(payloadForNewPI),JSON.stringify(result),this.successStatus); + if(callback) callback(result); + }).catch(error => { + console.log('error'); + //this.insertCalloutLog(this.insertModule,postURL,JSON.stringify(payloadForNewPI),JSON.stringify(error),this.failStatus); + console.log(error); + }); + }, + AwsGet : function(url, data ,callback,token){ + + if(typeof(data) == 'string'){ + url += data; + }else{ + let i = 0; + for(let p in data){ + url += (i++) ? '&' : '?'; + url += p + '=' + data[p]; + } + } + + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'pi-token': token + } + }).then((data) => { + console.log('data=' + JSON.stringify(data)); + return data.json(); + }).then((result) => { + //this.insertCalloutLog(this.insertModule,postURL,JSON.stringify(payloadForNewPI),JSON.stringify(result),this.successStatus); + if(callback) callback(result); + }).catch(error => { + console.log('error'); + //this.insertCalloutLog(this.insertModule,postURL,JSON.stringify(payloadForNewPI),JSON.stringify(error),this.failStatus); + console.log(error); + }); + } +}) \ No newline at end of file diff --git a/force-app/main/default/classes/B_Test.cls b/force-app/main/default/classes/B_Test.cls new file mode 100644 index 0000000..976c009 --- /dev/null +++ b/force-app/main/default/classes/B_Test.cls @@ -0,0 +1,161 @@ +public without sharing class B_Test { + public Contact newCon { get; set; } + public Contact searchCon { get; set; } + public List<LineInfo> lineInfoList { get; set; } + public String conId { get; set; } + + public String openLine { get; set; } + private String accountId; + // SWAG-BB44G7 鎵�鍦ㄥ尰闄d start + private String HPId; + private Integer i = 0; + // SWAG-BB44G7 鎵�鍦ㄥ尰闄d end + private String nowValue; + + + + + + + public final string ApiPrefix{get;private set;} + public String staticResource {get; set;} + + + + + + public B_Test() { + openLine = Apexpages.currentPage().getParameters().get('line'); + accountId = Apexpages.currentPage().getParameters().get('acc'); + // SWAG-BB44G7 妫�绱㈡墍鍦ㄥ尰闄d start + + Account temAccount = + [select id, Parent.parentid from account where id = : accountId]; + if (temAccount.Parent.parentid != null) { + HPId = temAccount.Parent.parentid; + i = 1; + }else{ + HPId = accountId; + i = 2; + } + // SWAG-BB44G7 妫�绱㈡墍鍦ㄥ尰闄d end + nowValue = Apexpages.currentPage().getParameters().get('now'); + + lineInfoList = new List<LineInfo>(); + + ApiPrefix = 'PIBackApi'; + PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Contact'); + staticResource = JSON.serialize(piIntegration); + System.debug('B_Test'); + } + + public void init() { + searchCon = new Contact(); + if (nowValue != null && nowValue != '') { + searchCon = [select Id, Name, Department__c, Type__c, Search_LastName__c, Search_FirstName__c, Phone, Supplement__c, + FirstName, LastName + from Contact where Id = :nowValue]; + searchCon.Search_LastName__c = searchCon.LastName; + searchCon.Search_FirstName__c = searchCon.FirstName; + } + + searchContact(); + + newCon = new Contact(); + newCon.AccountId = accountId; + + return; + } + + + public PageReference searchContact() { + String searchStr = 'select Id, Name, Department__c, Type__c, AccountName__c, Supplement__c, Phone,accountid '; + searchStr += ' from Contact '; + searchStr += ' where Isactive__c = \'鏈夋晥\' '; + // SWAG-BB44G7 妫�绱㈡墍鍦ㄥ尰闄㈢殑瀹㈡埛浜哄憳 start + if(i == 1 ){ + searchStr += ' and Account.parent.parentid = :HPId '; + } + if(i == 2){ + searchStr += ' and AccountId = :HPId '; + } + // searchStr += ' and Account.parent.parentid = :HPId '; + // SWAG-BB44G7 妫�绱㈡墍鍦ㄥ尰闄㈢殑瀹㈡埛浜哄憳 end + if (searchCon.Search_LastName__c != null && searchCon.Search_LastName__c != '') { + searchStr += ' and LastName like \'%' + searchCon.Search_LastName__c + '%\''; + } + if (searchCon.Search_FirstName__c != null && searchCon.Search_FirstName__c != '') { + searchStr += ' and FirstName like \'%' + searchCon.Search_FirstName__c + '%\''; + } + system.debug('=====searchStr:' + searchStr); + + List<Contact> searchResult = Database.query(searchStr); + + lineInfoList = new List<LineInfo>(); + Integer line = 0; + for (Contact con : searchResult) { + line += 1; + LineInfo li = new LineInfo(line, con); + lineInfoList.add(li); + } + + editClear(); + + return null; + } + + public PageReference editContact() { + if (conId != null && conId != '') { + newCon = [select Id, Name, Department__c, Type__c, Search_LastName__c, Search_FirstName__c, Phone, Supplement__c,LastName_Encrypted__c,Phone_Encrypted__c, + FirstName, LastName,AWS_Data_Id__c + from Contact where Id = :conId]; + } + System.debug(newCon); + System.debug('editContact'); + return null; + } + + public PageReference saveNew() { + if (newCon.Search_LastName__c == null || newCon.Search_LastName__c == '') { + newCon.Search_LastName__c.addError('蹇呴』濉啓銆�'); + return null; + } + newCon.LastName = newCon.Search_LastName__c; + newCon.FirstName = newCon.Search_FirstName__c; + upsert newCon; + + searchCon.Search_LastName__c = newCon.LastName; + searchCon.Search_FirstName__c = newCon.FirstName; + searchContact(); + + return null; + } + + public PageReference editClear() { + newCon = new Contact(); + newCon.AccountId = accountId; + + return null; + } + + class LineInfo { + public Integer lineNo { get; set; } + public Contact con { get; set; } + + public LineInfo(Integer in_line) { + lineNo = in_line; + con = new Contact(); + } + + public LineInfo(Integer in_line, Contact in_con) { + lineNo = in_line; + con = in_con; + } + } + + // @RemoteAction + // global static Response saveContact(String leadJson,String transId) { + + // return NewAndEditBaseController.save(new Contact(),leadJson,transId,isNew); + // } +} \ No newline at end of file diff --git a/force-app/main/default/classes/B_Test.cls-meta.xml b/force-app/main/default/classes/B_Test.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/B_Test.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/ControllerResponse.cls b/force-app/main/default/classes/ControllerResponse.cls new file mode 100644 index 0000000..3fec3a3 --- /dev/null +++ b/force-app/main/default/classes/ControllerResponse.cls @@ -0,0 +1,16 @@ +public class ControllerResponse { + + @AuraEnabled + public boolean IsSuccess{get;set;} + + @AuraEnabled + public string Message{get;set;} + + @AuraEnabled + public object Data{get;set;} + + public ControllerResponse(){ + IsSuccess = false; + Message = ''; + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/ControllerResponse.cls-meta.xml b/force-app/main/default/classes/ControllerResponse.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/ControllerResponse.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/DeleteBatch.cls b/force-app/main/default/classes/DeleteBatch.cls new file mode 100644 index 0000000..01798aa --- /dev/null +++ b/force-app/main/default/classes/DeleteBatch.cls @@ -0,0 +1,20 @@ +global class DeleteBatch implements Database.Batchable<sObject>{ + global String queryString; + global DeleteBatch(String queryString){ + this.queryString = queryString; + } + global Database.QueryLocator start(Database.BatchableContext bc) { + + return Database.getQueryLocator(this.queryString); + } + global void execute(Database.BatchableContext BC, List<sObject> scope) { + try{ + delete scope; + }Catch(Exception e){ + system.debug('ERROR:' + e.getMessage()); + } + } + global void finish(Database.BatchableContext BC) { + } + +} \ No newline at end of file diff --git a/force-app/main/default/classes/DeleteBatch.cls-meta.xml b/force-app/main/default/classes/DeleteBatch.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/DeleteBatch.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/DeveloperUtility.cls b/force-app/main/default/classes/DeveloperUtility.cls new file mode 100644 index 0000000..f8f0662 --- /dev/null +++ b/force-app/main/default/classes/DeveloperUtility.cls @@ -0,0 +1,62 @@ +public class DeveloperUtility { + + public static List<HTTPResponse> CreateFields(string sobject_name,string [] fields){ + List<HTTPResponse> results = new List<HTTPResponse>(); + for(string f : fields){ + string old_label = f.removeEnd('__c').replace('_',' '); + string label = old_label + ' Encrypted'; + string name = label.replace(' ','_')+'__c'; + string description = ''; + system.debug('old_label='+old_label); + system.debug('label='+label); + system.debug('name='+name); + results.add(CreateField(sobject_name,label,name,description,'Text')); + } + return results; + } + + + public static HTTPResponse CreateField(string sobject_name, string label,string name,string description,string type){ + HTTP h = new HTTP(); + HTTPRequest req = new HTTPRequest(); + req.setMethod('POST'); + req.setHeader('Content-Type', 'text/xml'); + req.setHeader('SOAPAction', 'create'); + + + //string sobject_name = 'Contact'; + //string label = 'Title'; + //string name = 'Title'+'_Encrypted__c'; + //string description = ''; + + //string type = 'Text'; + boolean typeSpecified = true; + + String b = '<?xml version="1.0" encoding="UTF-8"?>'; + b += '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'; + b += '<soapenv:Header>'; + b += '<ns1:SessionHeader soapenv:mustUnderstand="0" xmlns:ns1="http://soap.sforce.com/2006/04/metadata">'; + b += '<ns1:sessionId>' + UserInfo.getSessionId() + '</ns1:sessionId>'; + b += '</ns1:SessionHeader>'; + b += '</soapenv:Header>'; + b += '<soapenv:Body>'; + b += '<create xmlns="http://soap.sforce.com/2006/04/metadata">'; + b += '<metadata xsi:type="ns2:CustomField" xmlns:ns2="http://soap.sforce.com/2006/04/metadata">'; + b += '<type>'+type+'</type>'; + b += '<fullName>'+sobject_name+'.'+name+'</fullName>'; + b += '<label>'+label+'</label>'; + b += '<length>255</length>'; + b += '<description>'+type+'</description>'; + b += '</metadata>'; + b += '</create>'; + b += '</soapenv:Body>'; + b += '</soapenv:Envelope>'; + + req.setBody(b); + req.setCompressed(false); + req.setEndpoint('https://ocsm--pipl.my.salesforce.com/services/Soap/m/25.0'); + HTTPResponse resp = h.send(req); + System.debug(resp.getBody()); + return resp; + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/DeveloperUtility.cls-meta.xml b/force-app/main/default/classes/DeveloperUtility.cls-meta.xml new file mode 100644 index 0000000..f928c8e --- /dev/null +++ b/force-app/main/default/classes/DeveloperUtility.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/FieldInfo.cls b/force-app/main/default/classes/FieldInfo.cls new file mode 100644 index 0000000..0046cc0 --- /dev/null +++ b/force-app/main/default/classes/FieldInfo.cls @@ -0,0 +1,44 @@ +public class FieldInfo +{ + @AuraEnabled public string TypeEnumName{get;set;} + @AuraEnabled public string Label{get;set;} + @AuraEnabled public string Name{get;set;} + @AuraEnabled public object Value{get;set;} + //@AuraEnabled public schema.DisplayType DisplayType{get;set;} + @AuraEnabled public List<Option> Options{get;set;} + @AuraEnabled public boolean IsRequired{get;set;} + @AuraEnabled public List<Option> References{get;set;} + + public Option GetFirstItemByLabel(string label){ + if(Options == null)return null; + for(Option lv : Options){ + if(lv!=null&&lv.value == label)return lv; + } + return null; + } + + public Option GetFirstItemByValue(string val){ + if(Options == null)return null; + for(Option lv : Options){ + if(lv!=null&&lv.value == val)return lv; + } + return null; + } + + public static void CopyTo(FieldInfo source,FieldInfo target) + { + if(source == null || target == null ) + { + return; + } + + target.TypeEnumName = source.TypeEnumName; + target.Label = source.Label; + target.Name = source.Name; + target.IsRequired = source.IsRequired; + target.Options = source.Options; + target.Value = source.Value; + } + + +} \ No newline at end of file diff --git a/force-app/main/default/classes/FieldInfo.cls-meta.xml b/force-app/main/default/classes/FieldInfo.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/FieldInfo.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/FileUploadController.cls b/force-app/main/default/classes/FileUploadController.cls new file mode 100644 index 0000000..c1fd78e --- /dev/null +++ b/force-app/main/default/classes/FileUploadController.cls @@ -0,0 +1,68 @@ +global without sharing class FileUploadController { + public String staticResource {get; set;} + public static String sobjectTypeValue = 'Document'; + public String PIPL_Input_PDF_Error_Msg{set;get;} + public List<FileAddress__c> fileList{set;get;} + public Document documentData{set;get;} + public String parentId{set;get;} + public FileUploadController(ApexPages.StandardController controller) { + staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Document')); + SObject obj = controller.getRecord(); + parentId = obj.Id; + system.debug('Parent Id:'+parentId); + fileList=getFileds(parentId); + } + + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + + @RemoteAction + global static Response saveFile(String fileName,String key,String transId,String parentId){ + FileAddress__c file = new FileAddress__c(); + PIHelper.PIIntegration pI=PIHelper.getPIIntegrationInfo('Document'); + file.DownloadLink__c =pI.undeleteUrl+key+'&fileName='+fileName; + file.DownloadLink2__c =pI.undeleteUrl+key+'&fileName='+fileName; + file.FileName__c =fileName; + file.ViewLink__c =pI.queryUrl+key; + file.ParentRecordId__c =parentId; + file.AWS_File_Key__c = key; + Response response =new Response(); + Savepoint sp = Database.setSavepoint(); + try { + insert file; + //4. 鎻掑叆鏃ュ織 + //update 20220218 鍔犲叆鏂扮殑鏃ュ織鏂瑰紡 + PIHelper.saveTransLog(sobjectTypeValue,key,transId,file.Id,JSON.serialize(file),'success',''); + response.recordId=file.Id; + response.status='success'; + return response; + } catch (Exception e) { + System.debug('into catch'+e.getMessage()); + PIHelper.saveTransLog(sobjectTypeValue,key,transId,file.Id,JSON.serialize(file),'fail',e.getMessage()); + Database.rollback(sp); + response.message=e.getMessage(); + response.status='fail'; + return response; + } + + + } + + public PageReference refreshFiles() { + system.debug('refresh files'); + fileList=getFileds(parentId); + system.debug('fileList size:'+String.valueOf(fileList.size())); + system.debug(JSON.serialize(fileList)); + return null; + } + + public static List<FileAddress__c> getFileds(String parentId){ + if(String.isNotBlank(parentId)){ + return [SELECT Id,ParentRecordId__c, FileName__c,DownloadLink__c,DownloadLink2__c,FileAddress__c.ViewLink__c FROM FileAddress__c where ParentRecordId__c=:parentId order by createddate desc]; + } + return [SELECT Id, ParentRecordId__c,FileName__c,DownloadLink__c,DownloadLink2__c,FileAddress__c.ViewLink__c FROM FileAddress__c order by createddate desc limit 100]; + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/FileUploadController.cls-meta.xml b/force-app/main/default/classes/FileUploadController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/FileUploadController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/MetaDataUtility.cls b/force-app/main/default/classes/MetaDataUtility.cls new file mode 100644 index 0000000..e7d6eb2 --- /dev/null +++ b/force-app/main/default/classes/MetaDataUtility.cls @@ -0,0 +1,177 @@ +public without sharing class MetaDataUtility { + + public static List<Metadata.LayoutSection> GetRecordTypePageLayout(string record_type_id,string objectType){ + + Map<string,object> mso = null; + string layout_name = GetRecordTypePageLayoutName(record_type_id,objectType,UserInfo.getProfileId()); + + List<Metadata.LayoutSection> temp = GetLayoutSections(objectType,layout_name); + List<Metadata.LayoutSection> layoutSectionList = new List<Metadata.LayoutSection>(); + for(Metadata.LayoutSection section : temp){ + boolean a = false; + for( Metadata.LayoutColumn c: section.layoutColumns){ + //system.debug(c); + if(c.layoutItems != null && c.layoutItems.size() > 0 ){ + a = true; + } + + } + if(a){ + layoutSectionList.add(section); + } + } + return layoutSectionList; + } + + /*[{ + "attributes": { + "type": "Layout", + "url": "/services/data/v53.0/tooling/sobjects/Layout/00h10000009iAb5AAE" + }, + "Id": "00h10000009iAb5AAE", + "Name": ".瀹㈡埛浜哄憳銉偆銈€偊銉�", + "TableEnumOrId": "01I10000000er3hEAA", + "LayoutType": "Standard" + }] + */ + + public static string GetTableOrEnumId(string objectType){ + + Map<string,object> mso = null; + string resp = null; + string table_or_enum_id = objectType; + if(objectType.endsWith('__c')){ + resp = ToolingQuery('SELECT id,DeveloperName from CustomObject where DeveloperName =\''+objectType.replace('__c', '')+'\''); + if(resp == null){ + system.debug('resp is not ok'); + return null; + }else{ + mso = (Map<string,object>)Json.deserializeUntyped(resp); + if(integer.valueOf(mso.get('size')) > 0){ + table_or_enum_id = string.valueOf(((Map<string,object>)(((List<object>)mso.get('records'))[0])).get('Id')); + }else{ + system.debug('no records'); + return null; + } + } + } + + return table_or_enum_id; + } + + public static List<object> GetAllPageLayout(string objectType){ + string resp = null; + Map<string,object> mso = null; + + + string table_or_enum_id = GetTableOrEnumId(objectType); + + if(string.isBlank(table_or_enum_id)){ + return new List<object>(); + } + + resp = ToolingQuery('SELECT id,name,TableEnumOrId,LayoutType FROM Layout where TableEnumOrId = \''+table_or_enum_id+'\''); + if(resp == null){ + system.debug('Layout where TableEnumOrId='+table_or_enum_id+' is null'); + return null; + }else{ + mso = (Map<string,object>)Json.deserializeUntyped(resp); + if(integer.valueOf(mso.get('size')) > 0){ + return (List<object>)mso.get('records'); + }else{ + system.debug('no records'); + return new List<object>(); + } + } + } + + + public static string GetRecordTypePageLayoutName(string record_type_id,string objectType, string profile_id){ + + if(!string.isBlank(objectType)){ + List<sobject> lso = [SELECT Id, Name, DeveloperName, SobjectType, IsActive, Description, BusinessProcessId FROM RecordType where SobjectType = :objectType]; + if(lso.size()==0){ + return string.valueOf(((Map<string,object>)(GetAllPageLayout(objectType)[0])).get('Name')); + } + } + + // 01210000000QfWdAAK + string query = 'SELECT Layout.Name, Layout.TableEnumOrId, ProfileId, Profile.Name, RecordTypeId FROM ProfileLayout where id!=null '; + if(!string.isBlank(record_type_id)){ + query += ' and RecordTypeId = \''+record_type_id+'\''; + } + + if(!string.isBlank(objectType)){ + query += ' and TableEnumOrId = \''+ GetTableOrEnumId(objectType) +'\''; + } + + if(!string.isBlank(profile_id)){ + query += ' and ProfileId = \''+profile_id+'\''; + } + query += ' order by LastModifiedDate desc '; + system.debug('query='+query); + string s = ToolingQuery(query); + if(string.isBlank(s)){ + system.debug('s is blank'); + return null; + }else{ + Map<string,object> mso = (Map<string,object>)JSON.deserializeUntyped(s); + + if(integer.valueOf(mso.get('size')) > 0){ + List<object> records = ((List<object>)mso.get('records')); + + mso = (Map<string,object>)(records[0]); + return string.valueOf(((Map<string,object>)(mso.get('Layout'))).get('Name')); + }else{ + return null; + } + } + + + + } + + public static string ToolingQuery(string query){ + + system.debug('query='+query); + String baseURL = 'callout:SF_Rest_API/services/data/v41.0/tooling/query?q='+ query.replace(' ', '+'); + HttpResponse resp = null; + HttpRequest req = new HttpRequest(); + req.setMethod('GET'); + + //req.setHeader('Authorization', 'Bearer ' + UserInfo.getsessionid()); + //req.setEndpoint(baseURL); + req.setEndpoint(baseURL); + + Http client = new Http(); + resp = client.send(req); + + system.debug(resp.getStatus()); + system.debug(resp.getStatusCode()); + if(resp.getStatus() == 'OK'){ + string s = resp.getBody(); + system.debug(resp.getBody()); + return s; + }else{ + system.debug('status is not ok,error:'+resp.getBody()); + return null; + } + + } + + public static List<Metadata.LayoutSection> GetLayoutSections(string object_name, string layout_name){ + List<String> componentNameList = new List<String>{object_name+'-'+layout_name}; + //閫氳繃Metadata.Operations.retrieve鑾峰彇metadata + //Metadata.Layout -> Metadata.LayoutSection -> Metadata.LayoutColumn objects -> Metadata.LayoutItem objects + List<Metadata.Metadata> componentList = Metadata.Operations.retrieve(Metadata.MetadataType.Layout, componentNameList); + if(componentList?.size() > 0){ + Metadata.Layout layout = (Metadata.Layout) componentList.get(0); + List<Metadata.LayoutSection> layoutSectionList = layout.layoutSections; + return layoutSectionList; + } + else{ + return null; + } + + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/MetaDataUtility.cls-meta.xml b/force-app/main/default/classes/MetaDataUtility.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/MetaDataUtility.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NFM702ControllerHandler.cls b/force-app/main/default/classes/NFM702ControllerHandler.cls new file mode 100644 index 0000000..f366511 --- /dev/null +++ b/force-app/main/default/classes/NFM702ControllerHandler.cls @@ -0,0 +1,5 @@ +public with sharing class NFM702ControllerHandler { + public NFM702ControllerHandler() { + + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NFM702ControllerHandler.cls-meta.xml b/force-app/main/default/classes/NFM702ControllerHandler.cls-meta.xml new file mode 100644 index 0000000..f3bac1f --- /dev/null +++ b/force-app/main/default/classes/NFM702ControllerHandler.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>41.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAgencyContactController.cls b/force-app/main/default/classes/NewAgencyContactController.cls new file mode 100644 index 0000000..ac558ca --- /dev/null +++ b/force-app/main/default/classes/NewAgencyContactController.cls @@ -0,0 +1,124 @@ +public class NewAgencyContactController { + + static string sobjectType = 'Agency_Contact__c'; + + @AuraEnabled + public static ControllerResponse Init(string rid,Id pid, string record_type_id){ + system.debug('rid='+rid+',length='+(rid==null?'null':rid.length()+'')); + system.debug('record_type_id='+record_type_id+',length='+(record_type_id==null?'null':record_type_id.length()+'')); + + + ControllerResponse res = new ControllerResponse(); + Map<string,object> data = new Map<string,object>(); + res.Data = data; + + Agency_Contact__c ac = null; + List<Metadata.LayoutSection> layout = null; + if(string.isBlank(rid)){ + + layout = MetaDataUtility.GetRecordTypePageLayout(record_type_id, sobjectType); + data.put('layout', Json.serialize(layout)); + + }else{ + ac = [select RecordTypeId from Agency_Contact__c where id = :rid]; + if(ac == null){ + res.Message = 'id涓嶅瓨鍦�'; + return res; + } + record_type_id = ac.RecordTypeId; + system.debug('record_type_id is fresh ='+ac.RecordTypeId); + + layout = MetaDataUtility.GetRecordTypePageLayout(record_type_id, sobjectType); + data.put('layout', Json.serialize(layout)); + + List<String> fieldApiList = new List<String>(); + /* + for (LayoutDescriberHelper.LayoutSection ls : layout.layoutSections) { + for (LayoutDescriberHelper.LayoutField lf : ls.layoutFields) { + if (lf.fieldAPI != '') { + System.debug('lf.fieldAPI='+lf.fieldAPI+' fieldType='+lf.fieldType); + fieldApiList.add(lf.fieldAPI); + } + } + } + */ + for( Metadata.LayoutSection s: layout){ + system.debug(s); + for( Metadata.LayoutColumn c: s.layoutColumns){ + system.debug(c); + if(c.layoutItems != null){ + for( Metadata.layoutItem item: c.layoutItems){ + system.debug(item); + fieldApiList.add(item.field); + } + } + + } + } + + system.debug(fieldApiList); + ac = database.query(SoqlHelper.DistinctQueryFields('select id, AWS_Data_Id__c , ' + string.join(fieldApiList, ',') + ' from ' + sobjectType + ' where id = :rid')); + + data.put('data', ac); + } + if(!string.isBlank(pid)){ + data.put('pidType',pid.getSObjectType().getDescribe().getName()); + } + data.put('fields', SObjectHelper.GetFieldInfos(sobjectType)); + data.put('staticResource', Json.serialize(PIHelper.getPIIntegrationInfo(sobjectType))); + res.IsSuccess = true; + return res; + } + + @AuraEnabled + public static ControllerResponse Save(Map<string,object> data,string transId){ + system.debug('data='+data); + system.debug(!data.containsKey('Id') ); + system.debug( data.get('Id') == null); + //NewAndEditBaseController.Response response = NewAndEditBaseController.save(new Agency_Contact__c(),Json.serialize(data),transId, !data.containsKey('Id') || data.get('Id') == null ); + //ControllerResponse r = new ControllerResponse(); + + Sobject sobj = new Agency_Contact__c(); + ControllerResponse r = SaveCore(sobj, data, transId); + if (r.IsSuccess) { + r.Data = new Map<string,object>{ + 'recordId'=> sobj.Id + }; + } + return r; + } + + + public static ControllerResponse SaveCore(Sobject sobj, Map<string,object> data,string transId ) { + string sobjectTypeValue = sobj.getSObjectType().getDescribe().getName(); + System.debug('sobjectTypeValue:'+sobjectTypeValue+' Info:' + JSON.serialize(data)); + + //1. Prepare the payload for Lead + Map<String, Schema.SObjectField> fieldAPIToTypeMap = SobjectHelper.GetFieldMap(sobjectTypeValue); + ControllerResponse r = new ControllerResponse(); + + //2. Save Record Process + String awsDataId = string.valueOf(data.get('AWS_Data_Id__c')); + Savepoint sp = Database.setSavepoint(); + try{ + for(string field : fieldAPIToTypeMap.keySet()){ + if(data.containsKey(field)){ + sobj.put(field, data.get(field)); + } + } + upsert sobj; + PIHelper.saveTransLog(sobjectTypeValue,awsDataId,sobj.Id,transId, Json.serialize(data) ,'success',''); + //System.debug('respzhj = ' + resp); + r.IsSuccess = true; + return r; + + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + r.IsSuccess = false; + r.message = e.getMessage()+e.getStackTraceString(); + PIHelper.saveTransLog(sobjectTypeValue,awsDataId,sobj.Id,transId, Json.serialize(data) ,'failed',r.message); + return r; + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAgencyContactController.cls-meta.xml b/force-app/main/default/classes/NewAgencyContactController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/NewAgencyContactController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditASEActivityController.cls b/force-app/main/default/classes/NewAndEditASEActivityController.cls new file mode 100644 index 0000000..2196438 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditASEActivityController.cls @@ -0,0 +1,49 @@ +/* + * Author: Yanan Chen + * Created Date: 02/14/2022 + * Purpose: Utility class for describe layouts + * Test Class: NewAndEditASEActivityController + * History: + * 02/14/2022 - Yanan Chen - Initial Code. + * + * */ +global class NewAndEditASEActivityController extends NewAndEditBaseController +{ + // public String contactsInfo {set;get;}//key sfid;value awsid + public String PIPL_Input_Account_Error_Msg{set;get;} + public String contactId{set;get;}//For Lookup field + public String contactAWS{set;get;} + public String staticResourceContact {get; set;} + public NewAndEditASEActivityController(ApexPages.StandardController controller) { + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('ASEActivity__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + LookUpOverrideFields.add('ReporterASE__c'); + Init(controller.getRecord()); + + //娣诲姞椤� + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + SObject obj = controller.getRecord(); + if(obj.Id == null){ + //鍒濆鍖栧姞杞藉�� + obj.put('OwnerId',UserInfo.getUserId()); + } + //鑾峰彇contact 鍔犲瘑ID + // contactsInfo = LookUpOverrideFieldsMapJson; + //contact淇℃伅锛堟悳绱㈡煡璇uery url鐢級 + ASEActivity__c aseActivity = [Select Id, ReporterASE__c From ASEActivity__c Where Id = : obj.Id]; + if(aseActivity.ReporterASE__c != null){ + Contact contact = [Select Id, AWS_Data_Id__c From Contact Where Id = : aseActivity.ReporterASE__c]; + System.debug('contact : ' + contact ); + contactAWS = contact.AWS_Data_Id__c; + System.debug('contactAWS : ' + contactAWS ); + } + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + } + + + @RemoteAction + global static Response saveASEActivity(String leadJson,String transId,Boolean isNew) { + return save(new ASEActivity__c(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditASEActivityController.cls-meta.xml b/force-app/main/default/classes/NewAndEditASEActivityController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditASEActivityController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditAgencyContactController.cls b/force-app/main/default/classes/NewAndEditAgencyContactController.cls new file mode 100644 index 0000000..341550c --- /dev/null +++ b/force-app/main/default/classes/NewAndEditAgencyContactController.cls @@ -0,0 +1,20 @@ +global without sharing class NewAndEditAgencyContactController extends NewAndEditBaseController +{ + public string staticResourceContact{get;private set;} + global NewAndEditAgencyContactController(ApexPages.StandardController controller) { + + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Agency_Contact__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + LookUpOverrideFields.add('Contact__c'); + Init(controller.getRecord()); + PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Contact'); + staticResourceContact = JSON.serialize(piIntegration); + } + + + @RemoteAction + global static Response saveContact(String leadJson,String transId,Boolean isNew) { + return save(new Agency_Contact__c(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditAgencyContactController.cls-meta.xml b/force-app/main/default/classes/NewAndEditAgencyContactController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/NewAndEditAgencyContactController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditBaseController.cls b/force-app/main/default/classes/NewAndEditBaseController.cls new file mode 100644 index 0000000..49c45e5 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditBaseController.cls @@ -0,0 +1,260 @@ +global abstract class NewAndEditBaseController { + + public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;} + public String awsToken{set;get;} + public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); + public String sobjectTypeValue {private set; get;} + public Boolean isNewMode{set;get;} + public String rtTypeId {get; set;} + public String AWSDataId{set;get;} + + // 褰撳墠瀵硅薄鎵�鏈夌殑鍔犲瘑瀛楁闆嗗悎 + public List<String> encryptedAPIList{private set;get;} + + // 褰撳墠椤甸潰涓殑鍔犲瘑瀛楁闆嗗悎 + public List<String> layoutEncryptedAPIList{private set;get;} + //fieldLabel fieldAPI + public String requiredFieldAPIListStr {get;private set;} + public String fieldApiListStr {get;private set;} + + + public String fieldAPIToLabelMapStr {get;private set;} + public String staticResource {get; set;} + public string SobjectName{get{return sobjectTypeValue;}} + public string SobjectLabel{get;private set;} + + public Map<string,string> AWSToSobjectMap{ + get{ + Map<string,string> temp = new Map<string,string>(); + temp.putAll(AWSToSobjectNonEncryptedMap); + temp.putAll(AWSToSobjectEncryptedMap); + return temp; + } + } + public string AWSToSobjectMapJson{get{return JSON.serialize(AWSToSobjectMap);}} + + public Map<string,string> AWSToSobjectNonEncryptedMap{get;private set;} + public string AWSToSobjectNonEncryptedMapJson{get{return JSON.serialize(AWSToSobjectNonEncryptedMap);}} + public string AWSToSobjectNonEncryptedMapKeySet{get{return JSON.serialize(new List<string>(AWSToSobjectNonEncryptedMap.keySet()));}} + + public Map<string,string> AWSToSobjectEncryptedMap{get;private set;} + public string AWSToSobjectEncryptedMapJson{get{return JSON.serialize(AWSToSobjectMap);}} + + public final string ApiPrefix{get;private set;} + + public String sobjectPrefix{get;private set;} + public String SaveAndNewButtonUrl{get;private set;} + public List<String> VLookUpFields{get;private set;} + public String VLookUpFieldsJson{get{return Json.serialize(VLookUpFields);}} + public List<String> LookUpOverrideFields{get;private set;} + public string LookUpOverrideFieldsMapJson{get;private set;} + + + public NewAndEditBaseController(){ + ApiPrefix = 'PIBackApi'; + AWSToSobjectNonEncryptedMap = new Map<string,string>(); + AWSToSobjectEncryptedMap = new Map<string,string>(); + VLookUpFields = new List<String>(); + layoutEncryptedAPIList = new List<String>(); + LookUpOverrideFields = new List<String>(); + } + + protected virtual void Init(SObject obj){ + sobjectTypeValue = obj.getSObjectType().getDescribe().getName(); + SobjectLabel = obj.getSObjectType().getDescribe().getLabel(); + system.debug('obj='+sobjectTypeValue); + + isNewMode = true; + List<Sobject> lso = Database.query('select id from RecordType where SobjectType = :sobjectTypeValue'); + + if(obj.Id != null){ + isNewMode = false; + string sql = 'select Id'; + if (lso.size()>0) { + sql += ',RecordTypeId'; + } + sql += GenerateReferenceSql()+',AWS_Data_Id__c from '+sobjectTypeValue+' where id =\''+obj.Id+'\' '; + System.debug('sql='+sql); + Sobject leadData = Database.query(sql); + if (lso.size()>0){ + rtTypeId = (String)leadData.get('RecordTypeId'); + } + + AWSDataId = (String)leadData.get('AWS_Data_Id__c'); + + Map<String,String> sfIdToAWSIdMap = new Map<String,String>(); + for (string f : LookUpOverrideFields) { + object o = leadData.get(f); + System.debug('leadData.get('+f+')='+o); + if (!String.isBlank(String.valueOf(o))) { + sfIdToAWSIdMap.put(String.valueOf(o).subString(0,15), String.valueOf(leadData.getSobject(GetReferenceField(f)).get('AWS_Data_Id__c'))); + } + } + + LookUpOverrideFieldsMapJson = JSON.serialize(sfIdToAWSIdMap); + + + }else{ + rtTypeId = ApexPages.currentPage().getParameters().get('RecordType'); + } + PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo(sobjectTypeValue); + layoutEncryptedAPIList = piIntegration.PIFields; + encryptedAPIList = piIntegration.PIFields; + staticResource = JSON.serialize(piIntegration); + sobjectPrefix = piIntegration.sobjectPrefix; + SaveAndNewButtonUrl = string.format('/{0}/e', new string[]{sobjectPrefix}); + if (lso.size() > 1) { + SaveAndNewButtonUrl = String.format('/setup/ui/recordtypeselect.jsp?ent={0}&retURL=/{1}/o&save_new_url=/{1}/e?retURL=%2F{1}%2Fo', new String[]{sobjectTypeValue,sobjectPrefix}); + } + + for (PI_Field_Policy_Detail__c PIDetail : piIntegration.PIDetails) { + + AWSToSobjectNonEncryptedMap.put(PIDetail.AWS_Field_API__c, PIDetail.SF_Field_API_Name__c); + AWSToSobjectEncryptedMap.put(PIDetail.AWS_Encrypted_Field_API__c, PIDetail.SF_Field_Encrypted_API__c); + } + System.debug(new List<string>(AWSToSobjectNonEncryptedMap.keySet())); + system.debug('AWSToSobjectNonEncryptedMapJson='); + system.debug(AWSToSobjectNonEncryptedMapJson); + try{ + LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, sobjectTypeValue,'classic'); + layoutSections = LayoutWrapperValue.layoutSections; + List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList; + Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap; + List<String> fieldApiList = new List<String>(); + for (LayoutDescriberHelper.LayoutSection ls : layoutSections) { + for (LayoutDescriberHelper.LayoutField lf : ls.layoutFields) { + if (lf.fieldAPI != '') { + System.debug('lf.fieldAPI='+lf.fieldAPI+' fieldType='+lf.fieldType); + fieldApiList.add(lf.fieldAPI); + if (lf.fieldType == 'reference') { + VLookUpFields.add(lf.fieldAPI); + } + + //鍦╲iew瑙e瘑section涓彧闇�鏄剧ず褰撳墠layout涓殑鍔犲瘑瀛楁 + // if (encryptedAPIList.contains(lf.fieldAPI)) { + // layoutEncryptedAPIList.add(lf.fieldAPI); + // } + } + } + } + fieldApiListStr = JSON.serialize(fieldApiList); + fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap); + requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList); + //awsToken = AWSServiceTool.getAWSToken(); + }catch(Exception e){ + system.debug('Exception from get layout service:'+e.getmessage()); + } + } + + public static string GetReferenceField(string f){ + if (f.endsWith('__c')) { + return f.substring(0,f.length()-1)+'r'; + } + else if(f.endsWith('Id') || f.endsWith('id') || f.endsWith('ID')) { + return f.substring(0, f.length()-2); + } + else{ + return f; + } + } + + public string GenerateReferenceSql(){ + string res =''; + for (string f : LookUpOverrideFields) { + res += ','+f+','+GetReferenceField(f)+'.AWS_Data_Id__c'; + } + return res; + } + + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + + @RemoteAction + global static Response save(Sobject sobj, String leadJson,String transId,Boolean isNew) { + string sobjectTypeValue = sobj.getSObjectType().getDescribe().getName(); + System.debug('sobjectTypeValue:'+sobjectTypeValue+' Info:' + JSON.serialize(leadJson)); + System.debug('json length='+leadJson.length()); + //1. Prepare the payload for Lead + Schema.SObjectType leadSchema = schemaMap.get(sobjectTypeValue); + Map<String, Schema.SObjectField> fieldAPIToTypeMap = leadSchema.getDescribe().fields.getMap(); + Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(leadJson); + Sobject leadInfo = sobj; + for (String fieldAPI: fieldValueMap.keySet()) { + system.debug('field API='+fieldAPI); + Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType(); + String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); + system.debug('Field Type:'+fielddataType+' field Value='+fieldValue); + if(String.valueOf(fielddataType)=='DATE'){ + leadInfo.put(fieldAPI,(String.isBlank(fieldValue)||String.isEmpty(fieldValue))? null:Date.valueOf(fieldValue.replace('/', '-'))); + }else if(String.valueOf(fielddataType)=='DATETIME'){ + if(String.isNotBlank(fieldValue)&&fieldValue.contains('T')){ + fieldValue = fieldValue.replace('T',' '); + leadInfo.put(fieldAPI, Datetime.valueOfGmt(fieldValue)); + }else{ + leadInfo.put(fieldAPI, null); + } + }else if(String.valueof(fielddataType)=='CURRENCY'|| String.valueof(fielddataType)=='PERCENT'||String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){ + leadInfo.put(fieldAPI, (String.isBlank(fieldValue)||String.isEmpty(fieldValue))?0:Decimal.valueOf(fieldValue)); + } else if(String.valueof(fielddataType)=='BOOLEAN'){ + leadInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + }else { + leadInfo.put(fieldAPI,fieldValue); + } + } + + system.debug('for (String fieldAPI: fieldValueMap.keySet()) end'); + + + //2. Save Record Process + String status = 'success'; + Response resp = new Response(); + String awsDataId = ''; + Savepoint sp = Database.setSavepoint(); + try{ + System.debug('abcde'); + if(isNew){ + System.debug('leadInfozhj = ' + leadInfo); + insert leadInfo; + }else{ + System.debug('into update'); + awsDataId = (String)leadInfo.get('AWS_Data_Id__c'); + if (string.isBlank(awsDataId)) { + throw new DMLException('鏇存柊鏃禔WS_Data_Id__c涓嶈兘涓虹┖'); + } + System.debug('awsDataId = ' + awsDataId); + Sobject[] leads = Database.query('select id from '+sobjectTypeValue+' where AWS_Data_Id__c =:awsDataId'); + System.debug('leads[0].id = ' + leads[0].id); + leadInfo.put('Id',leads[0].id);//For testing; + update leadInfo; + } + // //saveTransLog(transId, leadInfo.AWS_Data_Id__c, status, ''); + // Transaction_Log__c traLog = new Transaction_Log__c(); + // // AWS_Data_Id__c=AWSDataId,TransId__c=transId,JsonContent__c=leadJson,Status__c=status + // traLog.AWS_Data_Id__c = AWSDataId; + // traLog.TransId__c = transId; + // traLog.JsonContent__c = leadJson; + // traLog.Status__c = status; + // insert traLog; + resp.recordId = leadInfo.Id; + // resp.message = 'success saveLead'; + resp.status = status; + PIHelper.saveTransLog(sobjectTypeValue,awsDataId,leadInfo.Id,transId, leadJson ,status,''); + // (String module,String awsDataId,String sfId, String transId,String content,String status,String respMsg) + System.debug('respzhj = ' + resp); + return resp; + + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + resp.status = 'Exception'; + resp.message = e.getMessage()+e.getStackTraceString(); + PIHelper.saveTransLog(sobjectTypeValue,awsDataId,leadInfo.Id,transId, leadJson ,status,resp.message); + // PIHelper.saveTransLog(sobjectTypeValue,(String)leadInfo.get('AWS_Data_Id__c'),transId, leadJson,status,e.getStackTraceString()); + return resp; + } + } + +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditBaseController.cls-meta.xml b/force-app/main/default/classes/NewAndEditBaseController.cls-meta.xml new file mode 100644 index 0000000..f928c8e --- /dev/null +++ b/force-app/main/default/classes/NewAndEditBaseController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditCampaignMemberController.cls b/force-app/main/default/classes/NewAndEditCampaignMemberController.cls new file mode 100644 index 0000000..02f349b --- /dev/null +++ b/force-app/main/default/classes/NewAndEditCampaignMemberController.cls @@ -0,0 +1,18 @@ +global class NewAndEditCampaignMemberController extends NewAndEditBaseController +{ + public String staticResourceContact {get; set;} + public NewAndEditCampaignMemberController(ApexPages.StandardController controller) { + + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('CampaignMember').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + //controller.addFields(fieldList); + //Init(controller.getRecord()); + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + } + + + @RemoteAction + global static Response saveCampaignMember(String leadJson,String transId,Boolean isNew) { + return save(new CampaignMember(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditCampaignMemberController.cls-meta.xml b/force-app/main/default/classes/NewAndEditCampaignMemberController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/NewAndEditCampaignMemberController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditCaseController.cls b/force-app/main/default/classes/NewAndEditCaseController.cls new file mode 100644 index 0000000..b27867a --- /dev/null +++ b/force-app/main/default/classes/NewAndEditCaseController.cls @@ -0,0 +1,146 @@ +/* + * Author: Mingjie Yin + * Created Date: 02/07/2022 + * Purpose: Utility class for describe layouts + * Test Class: NewAndEditCaseController + * History: + * 02/07/2022 - Mingjie Yin - Initial Code. + * + * */ +global without sharing class NewAndEditCaseController { + public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;} + public String awsToken{set;get;} + public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); + public static String sobjectTypeValue = 'Case'; + public Boolean isNewMode{set;get;} + public String rtTypeId {get; set;} + public String AWSDataId{set;get;} + public String contactId{set;get;}//For Lookup field + public List<String> encryptedAPIList{set;get;} + public String staticResource {get; set;} + public String staticResourceContact {get; set;} + public String requiredFieldAPIListStr {get; set;} + public String fieldAPIToLabelMapStr {get; set;} + public String Input_Required_Field_Msg{set;get;} + public String PIPL_Name_Label{set;get;} + public String PIPL_Input_Account_Error_Msg{set;get;} + public String sobjectPrefix{set;get;} + public String sobjecttypeForFrontEnd{set;get;} + public String contactsInfo {set;get;}//key sfid;value awsid + public NewAndEditCaseController(ApexPages.StandardController controller) { + isNewMode = true; + Input_Required_Field_Msg = Label.Input_Required_Field_Msg; + PIPL_Name_Label = Label.PIPL_Name_Label; + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + sobjecttypeForFrontEnd = sobjectTypeValue; + //鑾峰彇鎵�鏈夊瓧娈� + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Case').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + SObject obj = controller.getRecord(); + if(obj.Id != null){ + //鏇存柊 + isNewMode = false; + Case caseData = [select Id,RecordTypeId,AWS_Data_Id__c,ContactId,Contact.AWS_Data_Id__c from Case where id =: obj.Id]; + rtTypeId = caseData.RecordTypeId; + AWSDataId = caseData.AWS_Data_Id__c; + System.debug('AWSDataId=' + AWSDataId); + Map<String,String> sfIdToAWSIdMap = new Map<String,String>(); + if(caseData.ContactId != null){ + sfIdToAWSIdMap.put(String.valueof(caseData.ContactId).subString(0,15),caseData.Contact.AWS_Data_Id__c); + } + // sfIdToAWSIdMap.put(String.valueof(caseData.ContactId).subString(0,15),caseData.Contact.AWS_Data_Id__c); + + contactsInfo = JSON.serialize(sfIdToAWSIdMap); + }else{ + //鏂板缓 + rtTypeId = ApexPages.currentPage().getParameters().get('RecordType'); + obj.put('OwnerId',UserInfo.getUserId()); + } + LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Case','classic'); + layoutSections = LayoutWrapperValue.layoutSections; + List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList; + Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap; + requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList); + fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap); + PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Case'); + staticResource = JSON.serialize(piIntegration); + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + encryptedAPIList = piIntegration.PIFields; + sobjectPrefix = piIntegration.sobjectPrefix; + } + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + @RemoteAction + global static Response saveCase(String caseJson,String transId,Boolean isNew) { + System.debug('Case Info:' + JSON.serialize(caseJson)); + //1. Prepare the payload for Case + Schema.SObjectType caseSchema = schemaMap.get(sobjectTypeValue); + Map<String, Schema.SObjectField> fieldAPIToTypeMap = caseSchema.getDescribe().fields.getMap(); + Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(caseJson); + Case caseInfo = new Case(); + //鑷畾涔夋牸寮忚浆鎹� + for (String fieldAPI: fieldValueMap.keySet()) { + system.debug('field API'+fieldAPI); + Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType(); + String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isBlank(fieldValue)){ + continue; + } + if(String.valueOf(fielddataType)=='DATE'){ + caseInfo.put(fieldAPI, Date.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)).replace('/', '-'))); + }else if(String.valueOf(fielddataType)=='DATETIME'){ + String dt = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isNotBlank(dt)&&dt.contains('T')){ + dt = dt.replace('T',' '); + caseInfo.put(fieldAPI, Datetime.valueOfGmt(dt)); + } + }else if(String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){ + caseInfo.put(fieldAPI, Decimal.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)))); + } else if(String.valueof(fielddataType)=='BOOLEAN'){ + caseInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + }else { + caseInfo.put(fieldAPI, String.valueOf(fieldValueMap.get(fieldAPI))); + } + } + + //2. Save Record Process + String status = 'success'; + Response resp = new Response(); + Savepoint sp = Database.setSavepoint(); + String rid = ''; + try{ + System.debug('abcde'); + if(isNew){ + System.debug('caseInfozhj = ' + caseInfo); + insert caseInfo; + }else{ + System.debug('into update'); + String awsDataId = (String)caseInfo.get('AWS_Data_Id__c'); + System.debug('awsDataId = ' + awsDataId); + Case[] cases = [select id from Case where AWS_Data_Id__c =:awsDataId]; + System.debug('Cases[0].id = ' + cases[0].id); + caseInfo.put('Id',cases[0].id);//For testing; + update caseInfo; + } + rid=caseInfo.Id; + PIHelper.saveTransLog(sobjectTypeValue,(String)caseInfo.get('AWS_Data_Id__c'),rid,transId,caseJson ,status,''); + resp.recordId = caseInfo.Id; + resp.message = ''; + resp.status = status; + System.debug('resp from sfdx back-end' + resp); + return resp; + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + status = 'fail'; + PIHelper.saveTransLog(sobjectTypeValue,(String)caseInfo.get('AWS_Data_Id__c'),rid,transId,caseJson,status,e.getMessage()); + resp.message = e.getMessage(); + resp.status = status; + return resp; + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditCaseController.cls-meta.xml b/force-app/main/default/classes/NewAndEditCaseController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/NewAndEditCaseController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditContactController.cls b/force-app/main/default/classes/NewAndEditContactController.cls new file mode 100644 index 0000000..59c3e6e --- /dev/null +++ b/force-app/main/default/classes/NewAndEditContactController.cls @@ -0,0 +1,52 @@ +global class NewAndEditContactController extends NewAndEditBaseController +{ + public String unifiedIContactID{set;get;} + + public NewAndEditContactController(ApexPages.StandardController controller) { + + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Contact').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + Init(controller.getRecord()); + String contactId = controller.getRecord().Id; + if(contactId != null){ + Contact c = [select UnifiedI_Contact_ID__c from Contact where Id =:contactId ]; + system.debug('Contact c = '+c); + unifiedIContactID = c.UnifiedI_Contact_ID__c; + } + + // AWSToSobjectNonEncryptedMap.put('lastName', 'LastName'); + // AWSToSobjectNonEncryptedMap.put('phone', 'Phone'); + // AWSToSobjectNonEncryptedMap.put('email', 'Email'); + // AWSToSobjectNonEncryptedMap.put('medicalStaffFullName', 'MedicalStaff_Full_name__c'); + // AWSToSobjectNonEncryptedMap.put('mobilePhone', 'MobilePhone'); + // AWSToSobjectNonEncryptedMap.put('title', 'Title'); + // AWSToSobjectNonEncryptedMap.put('olyAssistantType', 'OLY_Assistant_Type__c'); + // AWSToSobjectNonEncryptedMap.put('jobCategoryPicklist', 'Job_Category_picklist__c'); + // AWSToSobjectNonEncryptedMap.put('type', 'Type__c'); + // AWSToSobjectNonEncryptedMap.put('contactAddress', 'Contact_address__c'); + // AWSToSobjectNonEncryptedMap.put('contactType', 'ContactType__c'); + // AWSToSobjectNonEncryptedMap.put('doctorDivision1', 'Doctor_Division1__c'); + // AWSToSobjectNonEncryptedMap.put('uniqueNumber', 'UniqueNumber__c'); + + // AWSToSobjectEncryptedMap.put('lastNameEncrypt', 'LastName_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('phoneEncrypt', 'Phone_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('emailEncrypt', 'Email_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('medicalStaffFullNameEncrypt', 'MedicalStaff_Full_name_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('mobilePhoneEncrypt', 'MobilePhone_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('titleEncrypt', 'Title_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('olyAssistantTypeEncrypt', 'OLY_Assistant_Type_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('jobCategoryPicklistEncrypt', 'Job_Category_picklist_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('typeEncrypt', 'Type_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('contactAddressEncrypt', 'Contact_address_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('contactTypeEncrypt', 'ContactType_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('doctorDivision1Encrypt', 'Doctor_Division1_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('uniqueNumberEncrypt', 'UniqueNumber_Encrypted__c'); + } + + + @RemoteAction + global static Response saveContact(String leadJson,String transId,Boolean isNew) { + return save(new Contact(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditContactController.cls-meta.xml b/force-app/main/default/classes/NewAndEditContactController.cls-meta.xml new file mode 100644 index 0000000..f928c8e --- /dev/null +++ b/force-app/main/default/classes/NewAndEditContactController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditEventController.cls b/force-app/main/default/classes/NewAndEditEventController.cls new file mode 100644 index 0000000..7d8c2b2 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditEventController.cls @@ -0,0 +1,44 @@ +/* + * Author: Yanan Chen + * Created Date: 02/15/2022 + * Purpose: Utility class for describe layouts + * Test Class: NewAndEditEventController + * History: + * 02/15/2022 - Yanan Chen - Initial Code. + * + * */ +global class NewAndEditEventController extends NewAndEditBaseController { + public String contactAWSIds{set;get;} + public String staticResources {get; set;} + public NewAndEditEventController (ApexPages.StandardController controller) { + + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Event').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + Init(controller.getRecord()); + //1. get 璁块棶瀵硅薄ID + //query event by controller.getRecord().Id; + Event event = [SELECT Id, Visitor1_ID__c, Visitor2_ID__c, Visitor3_ID__c, Visitor4_ID__c, Visitor5_ID__c FROM Event WHERE Id =:controller.getRecord().Id]; + System.debug('event: ' + event); + Set<String> contactIds = new Set<String>(); + List<String> conAWSIds = new List<String>(); + contactIds.add(event.Visitor1_ID__c); + contactIds.add(event.Visitor2_ID__c); + contactIds.add(event.Visitor3_ID__c); + contactIds.add(event.Visitor4_ID__c); + contactIds.add(event.Visitor5_ID__c); + List<Contact> conListForReport = new List<Contact>([select id,AWS_Data_Id__c from Contact where id in:contactIds and AWS_Data_Id__c!='']); + for(Contact con:conListForReport){ + conAWSIds.add(con.AWS_Data_Id__c); + } + contactAWSIds = JSON.serialize(conAWSIds); + system.debug('Contact AWSIDs:'+contactAWSIds); + staticResources = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + } + + + // @RemoteAction + // global static Response saveEvent(String leadJson,String transId,Boolean isNew) { + // return save(new Event(),leadJson,transId,isNew); + // } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditEventController.cls-meta.xml b/force-app/main/default/classes/NewAndEditEventController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditEventController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditInquiryFormController.cls b/force-app/main/default/classes/NewAndEditInquiryFormController.cls new file mode 100644 index 0000000..b3d2e0c --- /dev/null +++ b/force-app/main/default/classes/NewAndEditInquiryFormController.cls @@ -0,0 +1,36 @@ +global class NewAndEditInquiryFormController extends NewAndEditBaseController +{ + // public String contactsInfo {set;get;}//key sfid;value awsid + // public String leadsInfo {set;get;}//key sfid;value awsid + public String PIPL_Input_Account_Error_Msg{set;get;} + public String contactId{set;get;}//For Lookup field + public String leadId{set;get;}//For Lead Lookup + public String staticResourceContact {get; set;} + public String staticResourceLead {get; set;} + public NewAndEditInquiryFormController(ApexPages.StandardController controller) { + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Inquiry_form__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + // contact lookup + LookUpOverrideFields.add('Contact_Name__c'); + LookUpOverrideFields.add('Lead_link__c'); + Init(controller.getRecord()); + //娣诲姞椤� + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + SObject obj = controller.getRecord(); + if(obj.Id == null){ + //鍒濆鍖栧姞杞藉�� + obj.put('OwnerId',UserInfo.getUserId()); + } + //contact淇℃伅锛堟悳绱㈡煡璇uery url鐢級 + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + //Lead淇℃伅锛堟悳绱㈡煡璇uery url鐢級 + staticResourceLead = JSON.serialize(PIHelper.getPIIntegrationInfo('Lead')); + } + + + @RemoteAction + global static Response saveInquiryForm(String leadJson,String transId,Boolean isNew) { + return save(new Inquiry_form__c(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditInquiryFormController.cls-meta.xml b/force-app/main/default/classes/NewAndEditInquiryFormController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/NewAndEditInquiryFormController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditInspectionReportController.cls b/force-app/main/default/classes/NewAndEditInspectionReportController.cls new file mode 100644 index 0000000..6ca96d4 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditInspectionReportController.cls @@ -0,0 +1,25 @@ +global class NewAndEditInspectionReportController extends NewAndEditBaseController +{ + public NewAndEditInspectionReportController(ApexPages.StandardController controller) { + + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Inspection_Report__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + Init(controller.getRecord()); + + //AWSToSobjectNonEncryptedMap.put('responsiblePersonHP', 'Responsible_Person__c'); + //AWSToSobjectNonEncryptedMap.put('technicianHP', 'Technician_HP__c'); + //AWSToSobjectNonEncryptedMap.put('callerPhone', 'phone__c'); + + //AWSToSobjectEncryptedMap.put('responsiblePersonHPEncrypt', 'Responsible_Person_Encrypted__c'); + //AWSToSobjectEncryptedMap.put('technicianHPEncrypt', 'Technician_HP_Encrypted__c'); + //AWSToSobjectEncryptedMap.put('callerPhoneEncrypt', 'phone_Encrypted__c'); + //system.debug('layoutEncryptedAPIList'); + } + + + @RemoteAction + global static Response saveInspectionReport(String leadJson,String transId,Boolean isNew) { + return save(new Inspection_Report__c(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditInspectionReportController.cls-meta.xml b/force-app/main/default/classes/NewAndEditInspectionReportController.cls-meta.xml new file mode 100644 index 0000000..f928c8e --- /dev/null +++ b/force-app/main/default/classes/NewAndEditInspectionReportController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditQISController.cls b/force-app/main/default/classes/NewAndEditQISController.cls new file mode 100644 index 0000000..83f7535 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditQISController.cls @@ -0,0 +1,12 @@ +global with sharing class NewAndEditQISController extends NewAndEditBaseController{ + public NewAndEditQISController(ApexPages.StandardController controller) { + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('QIS_Report__c').getDescribe().fields.getMap().keyset()); + controller.addFields(fieldList); + Init(controller.getRecord()); + } + + @RemoteAction + global static Response saveQISReport(String leadJson,String transId,Boolean isNew) { + return save(new QIS_Report__c(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditQISController.cls-meta.xml b/force-app/main/default/classes/NewAndEditQISController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/NewAndEditQISController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditRepairSubOrderController.cls b/force-app/main/default/classes/NewAndEditRepairSubOrderController.cls new file mode 100644 index 0000000..0c99dfb --- /dev/null +++ b/force-app/main/default/classes/NewAndEditRepairSubOrderController.cls @@ -0,0 +1,40 @@ +/* + * Author: Yanan Chen + * Created Date: 02/14/2022 + * Purpose: Utility class for describe layouts + * Test Class: NewAndEditRepairSubOrderController + * History: + * 02/14/2022 - Yanan Chen - Initial Code. + * + * */ +global class NewAndEditRepairSubOrderController extends NewAndEditBaseController +{ + public String contactsInfo {set;get;}//key sfid;value awsid + public String PIPL_Input_Account_Error_Msg{set;get;} + public String contactId{set;get;}//For Lookup field + public String staticResourceContact {get; set;} + public NewAndEditRepairSubOrderController(ApexPages.StandardController controller) { + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('RepairSubOrder__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + LookUpOverrideFields.add('Receiver__c'); + LookUpOverrideFields.add('Applicanter__c'); + //contactId = LookUpOverrideFieldsMapJson; + Init(controller.getRecord()); + + //娣诲姞椤� + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + SObject obj = controller.getRecord(); + if(obj.Id == null){ + //鍒濆鍖栧姞杞藉�� + obj.put('OwnerId',UserInfo.getUserId()); + } + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + } + + + @RemoteAction + global static Response saveRepairSubOrder(String leadJson,String transId,Boolean isNew) { + return save(new RepairSubOrder__c(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditRepairSubOrderController.cls-meta.xml b/force-app/main/default/classes/NewAndEditRepairSubOrderController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/NewAndEditRepairSubOrderController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditReportController.cls b/force-app/main/default/classes/NewAndEditReportController.cls new file mode 100644 index 0000000..53ca9f1 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditReportController.cls @@ -0,0 +1,160 @@ +global without sharing class NewAndEditReportController { + public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;} + public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); + public static String sobjectTypeValue = 'Report__c'; + public Boolean isNewMode{set;get;} + public String rtTypeId {get; set;} + public String AWSDataId{set;get;} + public String contactId{set;get;}//For Lookup field + public List<String> encryptedAPIList{set;get;} + public String staticResource {get; set;} + public String staticResourceContact {get; set;} + public String requiredFieldAPIListStr {get; set;} + public String fieldAPIToLabelMapStr {get; set;} + public String requiredErrorMsg{set;get;} + public String contactsInfo {set;get;} + public String PIPL_Input_Account_Error_Msg{set;get;} + public String SaveAndNewButtonUrl{get;private set;} + public String sobjectPrefix{get;private set;} + public String sobjecttypeForFrontEnd{set;get;} + public String sobjectId{set;get;} + public NewAndEditReportController(ApexPages.StandardController controller) { + sobjectId = [SELECT CustomObjectId,CustomObjectName FROM CustomObjectUserLicenseMetrics where CustomObjectName ='Report' limit 1].CustomObjectId; + isNewMode = true; + requiredErrorMsg = Label.Input_Required_Field_Msg; + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + sobjecttypeForFrontEnd = sobjectTypeValue; + //鑾峰彇鎵�鏈夊瓧娈� + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Report__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + SObject obj = controller.getRecord(); + if(obj.Id != null){ + //鏇存柊 + isNewMode = false; + Report__c ReportData = [select Id,RecordTypeId,AWS_Data_Id__c,Practitioner1__c,Practitioner1__r.AWS_Data_Id__c, + Practitioner2__c,Practitioner2__r.AWS_Data_Id__c,Practitioner3__c,Practitioner3__r.AWS_Data_Id__c, + Practitioner4__c,Practitioner4__r.AWS_Data_Id__c,Practitioner5__c,Practitioner5__r.AWS_Data_Id__c, + Person_In_Charge__c,Person_In_Charge__r.AWS_Data_Id__c + from Report__c where id =: obj.Id]; + system.debug('ReportData = ' + ReportData); + + rtTypeId = ReportData.RecordTypeId; + AWSDataId = ReportData.AWS_Data_Id__c; + Map<String,String> sfIdToAWSIdMap = new Map<String,String>(); + if(ReportData.Practitioner1__r.Id != null && ReportData.Practitioner1__r.AWS_Data_Id__c!=null){ + sfIdToAWSIdMap.put(String.valueof(ReportData.Practitioner1__r.Id).subString(0,15),ReportData.Practitioner1__r.AWS_Data_Id__c); + } + if(ReportData.Practitioner2__r.Id != null && ReportData.Practitioner2__r.AWS_Data_Id__c!=null){ + sfIdToAWSIdMap.put(String.valueof(ReportData.Practitioner2__r.Id).subString(0,15),ReportData.Practitioner2__r.AWS_Data_Id__c); + } + if(ReportData.Practitioner3__r.Id != null && ReportData.Practitioner3__r.AWS_Data_Id__c!=null){ + sfIdToAWSIdMap.put(String.valueof(ReportData.Practitioner3__r.Id).subString(0,15),ReportData.Practitioner3__r.AWS_Data_Id__c); + } + if(ReportData.Practitioner4__r.Id != null && ReportData.Practitioner4__r.AWS_Data_Id__c!=null){ + sfIdToAWSIdMap.put(String.valueof(ReportData.Practitioner4__r.Id).subString(0,15),ReportData.Practitioner4__r.AWS_Data_Id__c); + } + if(ReportData.Practitioner5__r.Id != null && ReportData.Practitioner5__r.AWS_Data_Id__c!=null){ + sfIdToAWSIdMap.put(String.valueof(ReportData.Practitioner5__r.Id).subString(0,15),ReportData.Practitioner5__r.AWS_Data_Id__c); + } + if(ReportData.Person_In_Charge__r.Id != null && ReportData.Person_In_Charge__r.AWS_Data_Id__c!=null){ + sfIdToAWSIdMap.put(String.valueof(ReportData.Person_In_Charge__r.Id).subString(0,15),ReportData.Person_In_Charge__r.AWS_Data_Id__c); + } + contactsInfo = JSON.serialize(sfIdToAWSIdMap); + }else{ + //鏂板缓 + rtTypeId = ApexPages.currentPage().getParameters().get('RecordType'); + obj.put('OwnerId',UserInfo.getUserId()); + } + LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Report__c','classic'); + layoutSections = LayoutWrapperValue.layoutSections; + List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList; + Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap; + requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList); + fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap); + PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Report__c'); + staticResource = JSON.serialize(piIntegration); + encryptedAPIList = piIntegration.PIFields; + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + sobjectPrefix = piIntegration.sobjectPrefix; + } + + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + + @RemoteAction + global static Response saveReport(String reportJson,String transId,Boolean isNew) { + System.debug('report Info:' + JSON.serialize(reportJson)); + //System.debug('rtTypeId: ' + rtTypeId); + //1. Prepare the payload for report + Schema.SObjectType reportSchema = schemaMap.get(sobjectTypeValue); + Map<String, Schema.SObjectField> fieldAPIToTypeMap = reportSchema.getDescribe().fields.getMap(); + Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(reportJson); + Report__c reportInfo = new Report__c(); + + System.debug('鑷畾涔夋牸寮忚浆鎹㈠紑濮�'); + //鑷畾涔夋牸寮忚浆鎹� + for (String fieldAPI: fieldValueMap.keySet()) { + System.debug('field API'+fieldAPI); + Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType(); + String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isBlank(fieldValue)){ + continue; + } + if(String.valueOf(fielddataType)=='DATE'){ + reportInfo.put(fieldAPI, Date.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)).replace('/', '-'))); + }else if(String.valueOf(fielddataType)=='DATETIME'){ + String dt = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isNotBlank(dt)&&dt.contains('T')){ + dt = dt.replace('T',' '); + reportInfo.put(fieldAPI, Datetime.valueOfGmt(dt)); + } + }else if(String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){ + reportInfo.put(fieldAPI, Decimal.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)))); + } else if(String.valueof(fielddataType)=='BOOLEAN'){ + reportInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + }else { + reportInfo.put(fieldAPI, String.valueOf(fieldValueMap.get(fieldAPI))); + } + } + System.debug('鑷畾涔夋牸寮忚浆鎹㈢粨鏉�'); + + //2. Save Record Process + String status = 'success'; + Response resp = new Response(); + Savepoint sp = Database.setSavepoint(); + String rid = ''; + try{ + if(isNew){ + System.debug('reportInfo = ' + reportInfo); + insert reportInfo; + }else{ + System.debug('into update'); + String awsDataId = (String)reportInfo.get('AWS_Data_Id__c'); + System.debug('awsDataId = ' + awsDataId); + report__c[] reports = [select id from report__c where AWS_Data_Id__c =:awsDataId]; + System.debug('reports[0].id = ' + reports[0].id); + reportInfo.put('Id',reports[0].id);//For testing; + update reportInfo; + } + rid=reportInfo.Id; + PIHelper.saveTransLog(sobjectTypeValue,(String)reportInfo.get('AWS_Data_Id__c'),rid,transId,reportJson ,status,''); + resp.recordId = reportInfo.Id; + // resp.message = 'success savereport'; + resp.status = status; + return resp; + + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + status = 'fail'; + PIHelper.saveTransLog(sobjectTypeValue,(String)reportInfo.get('AWS_Data_Id__c'),rid,transId,reportJson,status,e.getMessage()); + resp.message = e.getMessage(); + resp.status = status; + return resp; + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditReportController.cls-meta.xml b/force-app/main/default/classes/NewAndEditReportController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/NewAndEditReportController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewAndEditTenderinformationController.cls b/force-app/main/default/classes/NewAndEditTenderinformationController.cls new file mode 100644 index 0000000..83a9d42 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditTenderinformationController.cls @@ -0,0 +1,45 @@ +global class NewAndEditTenderinformationController extends NewAndEditBaseController +{ + + public NewAndEditTenderinformationController(ApexPages.StandardController controller) { + + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Tender_information__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + Init(controller.getRecord()); + + // AWSToSobjectNonEncryptedMap.put('lastName', 'LastName'); + // AWSToSobjectNonEncryptedMap.put('phone', 'Phone'); + // AWSToSobjectNonEncryptedMap.put('email', 'Email'); + // AWSToSobjectNonEncryptedMap.put('medicalStaffFullName', 'MedicalStaff_Full_name__c'); + // AWSToSobjectNonEncryptedMap.put('mobilePhone', 'MobilePhone'); + // AWSToSobjectNonEncryptedMap.put('title', 'Title'); + // AWSToSobjectNonEncryptedMap.put('olyAssistantType', 'OLY_Assistant_Type__c'); + // AWSToSobjectNonEncryptedMap.put('jobCategoryPicklist', 'Job_Category_picklist__c'); + // AWSToSobjectNonEncryptedMap.put('type', 'Type__c'); + // AWSToSobjectNonEncryptedMap.put('contactAddress', 'Contact_address__c'); + // AWSToSobjectNonEncryptedMap.put('contactType', 'ContactType__c'); + // AWSToSobjectNonEncryptedMap.put('doctorDivision1', 'Doctor_Division1__c'); + // AWSToSobjectNonEncryptedMap.put('uniqueNumber', 'UniqueNumber__c'); + + // AWSToSobjectEncryptedMap.put('lastNameEncrypt', 'LastName_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('phoneEncrypt', 'Phone_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('emailEncrypt', 'Email_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('medicalStaffFullNameEncrypt', 'MedicalStaff_Full_name_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('mobilePhoneEncrypt', 'MobilePhone_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('titleEncrypt', 'Title_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('olyAssistantTypeEncrypt', 'OLY_Assistant_Type_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('jobCategoryPicklistEncrypt', 'Job_Category_picklist_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('typeEncrypt', 'Type_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('contactAddressEncrypt', 'Contact_address_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('contactTypeEncrypt', 'ContactType_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('doctorDivision1Encrypt', 'Doctor_Division1_Encrypted__c'); + // AWSToSobjectEncryptedMap.put('uniqueNumberEncrypt', 'UniqueNumber_Encrypted__c'); + } + + + @RemoteAction + global static Response saveTenderinformation(String leadJson,String transId,Boolean isNew) { + return save(new Tender_information__c(),leadJson,transId,isNew); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewAndEditTenderinformationController.cls-meta.xml b/force-app/main/default/classes/NewAndEditTenderinformationController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/NewAndEditTenderinformationController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewConsumApplyController.cls b/force-app/main/default/classes/NewConsumApplyController.cls new file mode 100644 index 0000000..c8efb33 --- /dev/null +++ b/force-app/main/default/classes/NewConsumApplyController.cls @@ -0,0 +1,139 @@ +/** + * @description : + * @author : ChangeMeIn@UserSettingsUnder.SFDoc + * @group : + * @last modified on : 03-10-2022 + * @last modified by : ChangeMeIn@UserSettingsUnder.SFDoc +**/ +global without sharing class NewConsumApplyController { + public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;} + public String awsToken{set;get;} + public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); + public static String sobjectTypeValue = 'Consum_Apply__c'; + public Boolean isNewMode{set;get;} + public String rtTypeId {get; set;} + public String AWSDataId{set;get;} + public List<String> encryptedAPIList{set;get;} + public String staticResource {get; set;} + public String staticResourceContact {get; set;} + public String requiredFieldAPIListStr {get; set;} + public String fieldAPIToLabelMapStr {get; set;} + public String Input_Required_Field_Msg{set;get;} + public String requiredErrorMsg{set;get;} + public String contactsInfo {set;get;} + public String contactId{set;get;} + public String PIPL_Input_Account_Error_Msg{set;get;} + public NewConsumApplyController(ApexPages.StandardController controller) { + isNewMode = true; + Input_Required_Field_Msg = Label.Input_Required_Field_Msg; + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + //鑾峰彇鎵�鏈夊瓧娈� + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Consum_Apply__c').getDescribe().fields.getMap().keyset()); + controller.addFields(fieldList); + SObject obj = controller.getRecord(); + if(obj.Id != null){ + //鏇存柊 + isNewMode = false; + Consum_Apply__c consumApplyData = [select Id,RecordTypeId,AWS_Data_Id__c,Loaner_medical_Staff__c,Loaner_medical_Staff__r.AWS_Data_Id__c from Consum_Apply__c where id =: obj.Id]; + rtTypeId = consumApplyData.RecordTypeId; + AWSDataId = consumApplyData.AWS_Data_Id__c; + Map<String,String> sfIdToAWSIdMap = new Map<String,String>(); + // if(consumApplyData.Loaner_medical_Staff__c != null && consumApplyData.Loaner_medical_Staff__c != '') { + if(consumApplyData.Loaner_medical_Staff__r.Id != null){ + sfIdToAWSIdMap.put(String.valueof(consumApplyData.Loaner_medical_Staff__r.Id).subString(0,15),consumApplyData.Loaner_medical_Staff__r.AWS_Data_Id__c); + } + // sfIdToAWSIdMap.put(String.valueof(consumApplyData.Contact_Name__r.Id).subString(0,15),consumApplyData.Loaner_medical_Staff__r.AWS_Data_Id__c); + contactsInfo = JSON.serialize(sfIdToAWSIdMap); + }else{ + //鏂板缓 + rtTypeId = ApexPages.currentPage().getParameters().get('RecordType'); + obj.put('OwnerId',UserInfo.getUserId()); + } + LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Consum_Apply__c','classic'); + layoutSections = LayoutWrapperValue.layoutSections; + List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList; + Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap; + requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList); + fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap); + staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Consum_Apply__c')); + encryptedAPIList = PIHelper.getPIIntegrationInfo('Consum_Apply__c').PIFields; + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + } + + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + + @RemoteAction + global static Response saveConsumApply(String consumApplyJson,String transId,Boolean isNew) { + System.debug('Consum_Apply__c Info:' + JSON.serialize(consumApplyJson)); + //1. Prepare the payload for Consum_Apply__c + Schema.SObjectType consumApplySchema = schemaMap.get(sobjectTypeValue); + Map<String, Schema.SObjectField> fieldAPIToTypeMap = consumApplySchema.getDescribe().fields.getMap(); + system.debug(fieldAPIToTypeMap); + Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(consumApplyJson); + Consum_Apply__c consumApplyInfo = new Consum_Apply__c(); + //鑷畾涔夋牸寮忚浆鎹� + for (String fieldAPI: fieldValueMap.keySet()) { + system.debug('field API='+fieldAPI); + Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType(); + String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); + system.debug('Field Type:'+fielddataType+' field Value='+fieldValue); + if(String.valueOf(fielddataType)=='DATE'){ + consumApplyInfo.put(fieldAPI,(String.isBlank(fieldValue)||String.isEmpty(fieldValue))? null:Date.valueOf(fieldValue.replace('/', '-'))); + }else if(String.valueOf(fielddataType)=='DATETIME'){ + if(String.isNotBlank(fieldValue)&&fieldValue.contains('T')){ + fieldValue = fieldValue.replace('T',' '); + consumApplyInfo.put(fieldAPI, Datetime.valueOfGmt(fieldValue)); + }else{ + consumApplyInfo.put(fieldAPI, null); + } + }else if(String.valueof(fielddataType)=='CURRENCY'|| String.valueof(fielddataType)=='PERCENT'||String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){ + consumApplyInfo.put(fieldAPI, (String.isBlank(fieldValue)||String.isEmpty(fieldValue))?0:Decimal.valueOf(fieldValue)); + } else if(String.valueof(fielddataType)=='BOOLEAN'){ + consumApplyInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + }else { + consumApplyInfo.put(fieldAPI,fieldValue); + } + } + + //2. Save Record Process + String status = 'success'; + Response resp = new Response(); + Savepoint sp = Database.setSavepoint(); + String rid = ''; + try{ + System.debug('abcde'); + if(isNew){ + System.debug('consumApplyInfozhj = ' + consumApplyInfo); + insert consumApplyInfo; + System.debug('consumApplyInfo.Id' + consumApplyInfo.Id); + }else{ + System.debug('into update'); + String awsDataId = (String)consumApplyInfo.get('AWS_Data_Id__c'); + System.debug('awsDataId = ' + awsDataId); + Consum_Apply__c[] ConsumApplys = [select id from Consum_Apply__c where AWS_Data_Id__c =:awsDataId]; + System.debug('ConsumApplys[0].id = ' + ConsumApplys[0].id); + consumApplyInfo.put('Id',ConsumApplys[0].id);//For testing; + update consumApplyInfo; + } + rid=consumApplyInfo.Id; + PIHelper.saveTransLog(sobjectTypeValue,rid,transId, (String)consumApplyInfo.get('AWS_Data_Id__c'),consumApplyJson ,status,''); + resp.recordId = consumApplyInfo.Id; + resp.message = ''; + resp.status = status; + System.debug('resp from sfdx back-end' + resp); + return resp; + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + status = 'fail'; + PIHelper.saveTransLog(sobjectTypeValue,rid,transId, (String)consumApplyInfo.get('AWS_Data_Id__c'),consumApplyJson,status,e.getMessage()); + resp.message = e.getMessage(); + resp.status = status; + return resp; + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewConsumApplyController.cls-meta.xml b/force-app/main/default/classes/NewConsumApplyController.cls-meta.xml new file mode 100644 index 0000000..f928c8e --- /dev/null +++ b/force-app/main/default/classes/NewConsumApplyController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewConsumApplyEquipSetDetailController.cls b/force-app/main/default/classes/NewConsumApplyEquipSetDetailController.cls new file mode 100644 index 0000000..99d2209 --- /dev/null +++ b/force-app/main/default/classes/NewConsumApplyEquipSetDetailController.cls @@ -0,0 +1,125 @@ +global without sharing class NewConsumApplyEquipSetDetailController { + public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;} + public String awsToken{set;get;} + public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); + public static String sobjectTypeValue = 'Consum_Apply_Equipment_Set_Detail__c'; + public Boolean isNewMode{set;get;} + public String rtTypeId {get; set;} + public String AWSDataId{set;get;} + public List<String> encryptedAPIList{set;get;} + public String staticResource {get; set;} + public String requiredFieldAPIListStr {get; set;} + public String fieldAPIToLabelMapStr {get; set;} + public String Input_Required_Field_Msg{set;get;} + public String requiredErrorMsg{set;get;} + public String sobjecttypeForFrontEnd{set;get;} + public String sobjectPrefix{set;get;} + public NewConsumApplyEquipSetDetailController(ApexPages.StandardController controller) { + isNewMode = true; + Input_Required_Field_Msg = Label.Input_Required_Field_Msg; + sobjecttypeForFrontEnd = sobjectTypeValue; + //鑾峰彇鎵�鏈夊瓧娈� + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Consum_Apply_Equipment_Set_Detail__c').getDescribe().fields.getMap().keyset()); + controller.addFields(fieldList); + SObject obj = controller.getRecord(); + if(obj.Id != null){ + //鏇存柊 + isNewMode = false; + Consum_Apply_Equipment_Set_Detail__c consumApplyData = [select Id,AWS_Data_Id__c from Consum_Apply_Equipment_Set_Detail__c where id =: obj.Id]; + AWSDataId = consumApplyData.AWS_Data_Id__c; + }else{ + //鏂板缓 + rtTypeId = ApexPages.currentPage().getParameters().get('RecordType'); + } + LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Consum_Apply_Equipment_Set_Detail__c','classic'); + layoutSections = LayoutWrapperValue.layoutSections; + List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList; + Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap; + requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList); + fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap); + PIHelper.PIIntegration piIntegration =PIHelper.getPIIntegrationInfo('Consum_Apply_Equipment_Set_Detail__c'); + staticResource = JSON.serialize(piIntegration); + encryptedAPIList = piIntegration.PIFields; + sobjectPrefix = piIntegration.sobjectPrefix; + } + + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + + @RemoteAction + global static Response saveConsumApply(String consumApplyJson,String transId,Boolean isNew) { + System.debug('Consum_Apply_Equipment_Set_Detail__c Info:' + JSON.serialize(consumApplyJson)); + //1. Prepare the payload for Consum_Apply_Equipment_Set_Detail__c + Schema.SObjectType consumApplySchema = schemaMap.get(sobjectTypeValue); + Map<String, Schema.SObjectField> fieldAPIToTypeMap = consumApplySchema.getDescribe().fields.getMap(); + system.debug(fieldAPIToTypeMap); + Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(consumApplyJson); + Consum_Apply_Equipment_Set_Detail__c consumApplyInfo = new Consum_Apply_Equipment_Set_Detail__c(); + //鑷畾涔夋牸寮忚浆鎹� + for (String fieldAPI: fieldValueMap.keySet()) { + system.debug('field API'+fieldAPI); + String fieldValue = String.valueOf(fieldAPIToTypeMap.get(fieldAPI)); + if(String.isBlank(fieldValue)){ + continue; + } + Schema.DescribeFieldResult fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe(); + Schema.DisplayType fieldDatas = fielddataType.getType(); + if(String.valueOf(fielddatas)=='DATE'){ + consumApplyInfo.put(fieldAPI, Date.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)).replace('/', '-'))); + }else if(String.valueOf(fielddatas)=='DATETIME'){ + String dt = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isNotBlank(dt)&&dt.contains('T')){ + dt = dt.replace('T',' '); + consumApplyInfo.put(fieldAPI, Datetime.valueOfGmt(dt)); + } + }else if(String.valueOf(fielddatas)=='Number'||String.valueOf(fielddatas)=='DOUBLE'){ + // ||String.valueOf(fielddatas)=='Decimal' + consumApplyInfo.put(fieldAPI, Decimal.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)))); + } else if(String.valueof(fielddatas)=='BOOLEAN'){ + consumApplyInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + }else { + consumApplyInfo.put(fieldAPI, String.valueOf(fieldValueMap.get(fieldAPI))); + } + } + + //2. Save Record Process + String status = 'success'; + Response resp = new Response(); + Savepoint sp = Database.setSavepoint(); + String rid = ''; + try{ + System.debug('abcde'); + if(isNew){ + System.debug('consumApplyInfozhj = ' + consumApplyInfo); + insert consumApplyInfo; + System.debug('consumApplyInfo.Id' + consumApplyInfo.Id); + }else{ + System.debug('into update'); + String awsDataId = (String)consumApplyInfo.get('AWS_Data_Id__c'); + System.debug('awsDataId = ' + awsDataId); + Consum_Apply_Equipment_Set_Detail__c[] ConsumApplys = [select id from Consum_Apply_Equipment_Set_Detail__c where AWS_Data_Id__c =:awsDataId]; + System.debug('ConsumApplys[0].id = ' + ConsumApplys[0].id); + consumApplyInfo.put('Id',ConsumApplys[0].id);//For testing; + update consumApplyInfo; + } + rid=consumApplyInfo.Id; + PIHelper.saveTransLog(sobjectTypeValue,(String)consumApplyInfo.get('AWS_Data_Id__c'),rid,transId,consumApplyJson,status,''); + resp.recordId = consumApplyInfo.Id; + resp.message = 'success saveConsumApply'; + resp.status = status; + System.debug('respzhj = ' + resp); + return resp; + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + status = 'fail'; + PIHelper.saveTransLog(sobjectTypeValue,(String)consumApplyInfo.get('AWS_Data_Id__c'),rid,transId,consumApplyJson,status,e.getMessage()); + resp.message = e.getMessage(); + resp.status = status; + return resp; + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewConsumApplyEquipSetDetailController.cls-meta.xml b/force-app/main/default/classes/NewConsumApplyEquipSetDetailController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/NewConsumApplyEquipSetDetailController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewListOfConsumablesController.cls b/force-app/main/default/classes/NewListOfConsumablesController.cls new file mode 100644 index 0000000..c287515 --- /dev/null +++ b/force-app/main/default/classes/NewListOfConsumablesController.cls @@ -0,0 +1,3 @@ +public class NewListOfConsumablesController { + +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewListOfConsumablesController.cls-meta.xml b/force-app/main/default/classes/NewListOfConsumablesController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/NewListOfConsumablesController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/NewRepairController.cls b/force-app/main/default/classes/NewRepairController.cls new file mode 100644 index 0000000..e0391de --- /dev/null +++ b/force-app/main/default/classes/NewRepairController.cls @@ -0,0 +1,148 @@ +/* + *@Description: + *@Author: Dennis Rodman + *@Date: 2022-03-10 10:26:47 +*/ +global without sharing class NewRepairController { + public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;} + public String awsToken{set;get;} + public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); + public static String sobjectTypeValue = 'Repair__c'; + public Boolean isNewMode{set;get;} + public String rtTypeId {get; set;} + public String AWSDataId{set;get;} + public String DecryptAWSDataId{set;get;} + public String ContactAWSDataId{set;get;} + public List<String> encryptedAPIList{set;get;} + public String staticResource {get; set;} + public String staticResourceContact {get; set;} + public String staticResourceAddress {get; set;} + public String requiredFieldAPIListStr {get; set;} + public String fieldAPIToLabelMapStr {get; set;} + public String Input_Required_Field_Msg{set;get;} + public String PIPL_Name_Label{set;get;} + public String PIPL_Input_Account_Error_Msg{set;get;} + public String sobjectPrefix{set;get;} + public String sobjecttypeForFrontEnd{set;get;} + public String sobjectId{set;get;} + public NewRepairController(ApexPages.StandardController controller) { + sobjectId = [SELECT CustomObjectId,CustomObjectName FROM CustomObjectUserLicenseMetrics where CustomObjectName ='Repair' limit 1].CustomObjectId; + isNewMode = true; + Input_Required_Field_Msg = Label.Input_Required_Field_Msg; + PIPL_Name_Label = Label.PIPL_Name_Label; + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + sobjecttypeForFrontEnd = sobjectTypeValue; + //鑾峰彇鎵�鏈夊瓧娈� + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Repair__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + SObject obj = controller.getRecord(); + if(obj.Id != null){ + //鏇存柊 + isNewMode = false; + Repair__c repairData = [select Id,RecordTypeId,AWS_Data_Id__c,Address_AWS_Data_Id__c,Contact_AWS_Data_Id__c,Address_Contacts_Encrypt__c,Address_Contacts_Name_Encrypt__c,Address_Telephone_Encrypt__c,Address_ZipCode_Encrypt__c,Detailed_Address_Encrypt__c from Repair__c where id =: obj.Id]; + rtTypeId = repairData.RecordTypeId; + AWSDataId = repairData.AWS_Data_Id__c; + DecryptAWSDataId = String.valueOf(repairData.Address_AWS_Data_Id__c); + ContactAWSDataId = String.valueOf(repairData.Contact_AWS_Data_Id__c); + }else{ + //鏂板缓 + rtTypeId = ApexPages.currentPage().getParameters().get('RecordType'); + if(String.isBlank(rtTypeId)||String.isEmpty(rtTypeId)){ + List<RecordType> rtList = new List<RecordType>([select Id,DeveloperName from RecordType where SobjectType ='Repair__c' and DeveloperName ='Repair']); + rtTypeId = rtList[0].Id; + } + } + LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Repair__c','classic'); + layoutSections = LayoutWrapperValue.layoutSections; + List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList; + Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap; + requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList); + fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap); + PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Repair__c'); + PIHelper.PIIntegration piIntegrationAddress = PIHelper.getPIIntegrationInfo('Address__c'); + PIHelper.PIIntegration piIntegrationContact = PIHelper.getPIIntegrationInfo('Contact'); + staticResource = JSON.serialize(piIntegration); + staticResourceAddress = JSON.serialize(piIntegrationAddress); + staticResourceContact = JSON.serialize(piIntegrationContact); + encryptedAPIList = piIntegration.PIFields; + sobjectPrefix = piIntegration.sobjectPrefix; + } + + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + + @RemoteAction + global static Response saveRepair(String repairJson,String transId,Boolean isNew) { + System.debug('Repair__c Info:' + JSON.serialize(repairJson)); + //1. Prepare the payload for Repair__c + Schema.SObjectType repairSchema = schemaMap.get(sobjectTypeValue); + Map<String, Schema.SObjectField> fieldAPIToTypeMap = repairSchema.getDescribe().fields.getMap(); + Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(repairJson); + Repair__c repairInfo = new Repair__c(); + //鑷畾涔夋牸寮忚浆鎹� + for (String fieldAPI: fieldValueMap.keySet()) { + system.debug('field API'+fieldAPI); + Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType(); + String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isBlank(fieldValue)){ + continue; + } + if(String.valueOf(fielddataType)=='DATE'){ + repairInfo.put(fieldAPI, Date.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)).replace('/', '-'))); + }else if(String.valueOf(fielddataType)=='DATETIME'){ + String dt = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isNotBlank(dt)&&dt.contains('T')){ + dt = dt.replace('T',' '); + repairInfo.put(fieldAPI, Datetime.valueOfGmt(dt)); + } + }else if(String.valueOf(fielddataType)=='PERCENT'||String.valueOf(fielddataType)=='CURRENCY'||String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){ + repairInfo.put(fieldAPI, Decimal.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)))); + } else if(String.valueof(fielddataType)=='BOOLEAN'){ + repairInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + }else { + repairInfo.put(fieldAPI, String.valueOf(fieldValueMap.get(fieldAPI))); + } + } + + //2. Save Record Process + String status = 'success'; + Response resp = new Response(); + Savepoint sp = Database.setSavepoint(); + String rid = ''; + try{ + System.debug('abcde'); + if(isNew){ + System.debug('repairInfozhj = ' + repairInfo); + insert repairInfo; + }else{ + System.debug('into update'); + String awsDataId = (String)repairInfo.get('AWS_Data_Id__c'); + System.debug('awsDataId = ' + awsDataId); + Repair__c[] repairs = [select id from Repair__c where AWS_Data_Id__c =:awsDataId]; + System.debug('repairs[0].id = ' + repairs[0].id); + repairInfo.put('Id',repairs[0].id);//For testing; + update repairInfo; + } + rid=repairInfo.Id; + PIHelper.saveTransLog(sobjectTypeValue,rid,transId, (String)repairInfo.get('AWS_Data_Id__c'),repairJson ,status,''); + resp.recordId = repairInfo.Id; + resp.message = ''; + resp.status = status; + System.debug('resp from sfdx back-end' + resp); + return resp; + + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + status = 'fail'; + PIHelper.saveTransLog(sobjectTypeValue,rid,transId, (String)repairInfo.get('AWS_Data_Id__c'),repairJson,status,e.getMessage()); + resp.message = e.getMessage(); + resp.status = status; + return resp; + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/NewRepairController.cls-meta.xml b/force-app/main/default/classes/NewRepairController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/NewRepairController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/OnCallController.cls b/force-app/main/default/classes/OnCallController.cls new file mode 100644 index 0000000..f6beda8 --- /dev/null +++ b/force-app/main/default/classes/OnCallController.cls @@ -0,0 +1,129 @@ +global without sharing class OnCallController { + public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;} + public String awsToken{set;get;} + public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); + public static String sobjectTypeValue = 'On_Call__c'; + public Boolean isNewMode{set;get;} + public String rtTypeId {get; set;} + public String AWSDataId{set;get;} + public List<String> encryptedAPIList{set;get;} + public String staticResource {get; set;} + public String staticResourceContact {get; set;} + public String requiredFieldAPIListStr {get; set;} + public String fieldAPIToLabelMapStr {get; set;} + public String Input_Required_Field_Msg{set;get;} + public String PIPL_Name_Label{set;get;} + public String PIPL_Input_Account_Error_Msg{set;get;} + public String sobjectPrefix{set;get;} + public String sobjecttypeForFrontEnd{set;get;} + // public String sobjectId{set;get;} + public OnCallController(ApexPages.StandardController controller) { + // sobjectId = [SELECT CustomObjectId,CustomObjectName FROM CustomObjectUserLicenseMetrics where CustomObjectName ='OnCall' limit 1].CustomObjectId; + isNewMode = true; + Input_Required_Field_Msg = Label.Input_Required_Field_Msg; + PIPL_Name_Label = Label.PIPL_Name_Label; + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + sobjecttypeForFrontEnd = sobjectTypeValue; + //鑾峰彇鎵�鏈夊瓧娈� + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('On_Call__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + SObject obj = controller.getRecord(); + if(obj.Id != null){ + //鏇存柊 + isNewMode = false; + On_Call__c onCallData = [select Id,AWS_Data_Id__c from On_Call__c where id =: obj.Id]; + AWSDataId = onCallData.AWS_Data_Id__c; + }else{ + //鏂板缓 + rtTypeId = null; + } + LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'On_Call__c','classic'); + layoutSections = LayoutWrapperValue.layoutSections; + List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList; + Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap; + requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList); + fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap); + PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('On_Call__c'); + staticResource = JSON.serialize(piIntegration); + encryptedAPIList = piIntegration.PIFields; + sobjectPrefix = piIntegration.sobjectPrefix; + } + + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + + @RemoteAction + global static Response saveOnCall(String onCallJson,String transId,Boolean isNew) { + System.debug('On_Call__c Info:' + JSON.serialize(onCallJson)); + //1. Prepare the payload for On_Call__c + Schema.SObjectType onCallSchema = schemaMap.get(sobjectTypeValue); + Map<String, Schema.SObjectField> fieldAPIToTypeMap = onCallSchema.getDescribe().fields.getMap(); + Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(onCallJson); + On_Call__c onCallInfo = new On_Call__c(); + //鑷畾涔夋牸寮忚浆鎹� + for (String fieldAPI: fieldValueMap.keySet()) { + system.debug('field API'+fieldAPI); + Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType(); + String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isBlank(fieldValue)){ + continue; + } + if(String.valueOf(fielddataType)=='DATE'){ + onCallInfo.put(fieldAPI, Date.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)).replace('/', '-'))); + }else if(String.valueOf(fielddataType)=='DATETIME'){ + String dt = String.valueOf(fieldValueMap.get(fieldAPI)); + if(String.isNotBlank(dt)&&dt.contains('T')){ + dt = dt.replace('T',' '); + onCallInfo.put(fieldAPI, Datetime.valueOfGmt(dt)); + } + }else if(String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){ + onCallInfo.put(fieldAPI, Decimal.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)))); + } else if(String.valueof(fielddataType)=='BOOLEAN'){ + onCallInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + }else { + onCallInfo.put(fieldAPI, String.valueOf(fieldValueMap.get(fieldAPI))); + } + } + + //2. Save Record Process + String status = 'success'; + Response resp = new Response(); + Savepoint sp = Database.setSavepoint(); + String rid = ''; + try{ + System.debug('abcde'); + if(isNew){ + System.debug('onCallInfozhj = ' + onCallInfo); + insert onCallInfo; + }else{ + System.debug('into update'); + String awsDataId = (String)onCallInfo.get('AWS_Data_Id__c'); + System.debug('awsDataId = ' + awsDataId); + On_Call__c[] onCalls = [select id from On_Call__c where AWS_Data_Id__c =:awsDataId]; + System.debug('onCalls[0].id = ' + onCalls[0].id); + onCallInfo.put('Id',onCalls[0].id);//For testing; + update onCallInfo; + } + rid=onCallInfo.Id; + PIHelper.saveTransLog(sobjectTypeValue,rid,transId, (String)onCallInfo.get('AWS_Data_Id__c'),onCallJson ,status,''); + resp.recordId = onCallInfo.Id; + resp.message = ''; + resp.status = status; + System.debug('resp from sfdx back-end' + resp); + return resp; + + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + status = 'fail'; + PIHelper.saveTransLog(sobjectTypeValue,rid,transId, (String)onCallInfo.get('AWS_Data_Id__c'),onCallJson,status,e.getMessage()); + resp.message = e.getMessage(); + resp.status = status; + return resp; + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/OnCallController.cls-meta.xml b/force-app/main/default/classes/OnCallController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/OnCallController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/Option.cls b/force-app/main/default/classes/Option.cls new file mode 100644 index 0000000..12e1c7e --- /dev/null +++ b/force-app/main/default/classes/Option.cls @@ -0,0 +1,5 @@ +public class Option { + @AuraEnabled public string label{get;set;} + @AuraEnabled public string value{get;set;} + @AuraEnabled public boolean Selected{get;set;} +} \ No newline at end of file diff --git a/force-app/main/default/classes/Option.cls-meta.xml b/force-app/main/default/classes/Option.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/Option.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/PIHelper.cls b/force-app/main/default/classes/PIHelper.cls new file mode 100644 index 0000000..48cc2cd --- /dev/null +++ b/force-app/main/default/classes/PIHelper.cls @@ -0,0 +1,216 @@ +/* + * Author: Bubba Li + * Created Date: 01/26/2022 + * Purpose: Utility class for PI + * Test Class: PIHelper + * History: + * 01/26/2022 - Bubba Li - Initial Code. + * + * */ +global without sharing class PIHelper { + public static String getObjectKeyPrefix(String objName){ + try{ + schema.sObjectType sObjType = Schema.getGlobalDescribe().get(objName); + return (sObjType.getDescribe().getKeyPrefix()); + }catch(Exception e){ + system.debug('Exception from get key prefix:'+e.getMessage()); + return ''; + } + } + // confirm file transaction + @future(callout =true) + public static void confirmFileTrans(String module,Integer isSuccess, String sfRecordId ,String transId ,String token,String transUrl){ + Boolean result =false; + Transaction_Log__c traLog = new Transaction_Log__c(); + traLog.Module__c = 'ConfirmFileTransaction '+module; + traLog.Interface_URL__c = transUrl; + traLog.TransId__c = transId; + traLog.SFRecordId__c=sfRecordId; + try { + Http http = new Http(); + HttpRequest request = new HttpRequest(); + request.setEndpoint(transUrl); + request.setMethod('POST'); + TransRequestBody requestBody =new TransRequestBody(); + requestBody.isSuccess=isSuccess; + requestBody.sfRecordId=sfRecordId; + requestBody.txId =transId; + request.setBody(JSON.serialize(requestBody)); + system.debug('request---'+request.tostring()); + HttpResponse response = http.send(request); + system.debug('token--'+token); + system.debug('confirm result--'+response.getBody()); + Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody()); + result = (Boolean)results.get('success'); + System.debug('result = ' + result); + traLog.Status__c = 'success'; + traLog.Response__c=response.getBody(); + } catch (Exception e) { + traLog.Status__c = 'fail'; + traLog.Response__c = e.getMessage(); + } + insert traLog; + } + // confirm tx transaction + + public static void confirmTrans(String module,Integer isSuccess, String sfRecordId ,String transId ,String token,String transUrl,List<idList> idList){ + Boolean result =false; + Transaction_Log__c traLog = new Transaction_Log__c(); + traLog.Module__c = 'Confirm Transaction '+module; + traLog.Interface_URL__c = transUrl; + traLog.TransId__c = transId; + if (!String.isEmpty(sfRecordId)) { + traLog.SFRecordId__c=sfRecordId; + }else { + traLog.SFRecordId__c=JSON.serialize(idList); + } + + try { + Http http = new Http(); + HttpRequest request = new HttpRequest(); + request.setEndpoint(transUrl); + request.setMethod('POST'); + TransactionRequestBody requestBody =new TransactionRequestBody(); + requestBody.isSuccess=isSuccess; + requestBody.sfRecordId=sfRecordId; + requestBody.idList=idList; + requestBody.txId =transId; + request.setBody(JSON.serialize(requestBody)); + system.debug('request---'+request.tostring()); + HttpResponse response = http.send(request); + system.debug('confirm result--'+response.getBody()); + Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody()); + result = (Boolean)results.get('success'); + System.debug('result = ' + result); + traLog.Status__c = 'success'; + traLog.Response__c=response.getBody(); + } catch (Exception e) { + traLog.Status__c = 'fail'; + traLog.Response__c = e.getMessage(); + } + insert traLog; + } + // Use this log method + public static void saveTransLog(String module,String awsDataId,String sfId, String transId,String content,String status,String respMsg){ + Transaction_Log__c traLog = new Transaction_Log__c(); + traLog.AWS_Data_Id__c = awsDataId; + traLog.SFRecordId__c = sfId; + traLog.Module__c = 'Upsert SF ' + module; + traLog.TransId__c = transId; + traLog.Request__c = content; + traLog.Status__c = status; + traLog.Response__c = respMsg; + traLog.Interface_URL__c = traLog.Module__c; + insert traLog; + } + public static PIIntegration getPIIntegrationInfo(String sobjectType){ + PIIntegration piIntegration = new PIIntegration(); + //鏌ヨurl + PI_Policy_Configuration__c config = [select Full_New_URL__c,Full_Search_URL__c,Full_Update_URL__c,Full_Undelete_URL__c,Full_Read_URL__c,Full_Delete_URL__c,Full_View_Unified_Contact_URL__c,TransactionURL__c from PI_Policy_Configuration__c where Sobject_Type__c =: sobjectType]; + System.debug('config = ' + config); + + //鑾峰彇appid鍜宎ppsecret + AWS_Integration_Info__mdt awsConfiguration = [SELECT App_Id__c,Token_URL__c,App_Secret__c,Host_URL__c FROM AWS_Integration_Info__mdt WHERE DeveloperName = 'AWS_Default_Configuration']; + if (awsConfiguration == null) { + System.debug('AWS_Integration_Info__mdt娌¢厤缃�'); + return null; + } + String awsAppId = awsConfiguration.App_Id__c; + String awsAppSecret = awsConfiguration.App_Secret__c; + + System.debug('awsAppId = ' + awsAppId); + System.debug('awsAppSecret = ' + awsAppSecret); + System.debug('Host_URL__c = ' + awsConfiguration.Host_URL__c); + System.debug('Token URL = ' + awsConfiguration.Token_URL__c); + + //鑾峰彇token + String token = ''; + try{ + Http http = new Http(); + HttpRequest request = new HttpRequest(); + String url = awsConfiguration.Token_URL__c; + request.setEndpoint(url); + request.setMethod('GET'); + HttpResponse response = http.send(request); + Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody()); + token = (String)results.get('object'); + System.debug('token = ' + token); + }catch(Exception e){ + Transaction_Log__c traLog = new Transaction_Log__c(); + traLog.Module__c = 'Get Token'; + traLog.Status__c = 'fail'; + traLog.Response__c = e.getMessage(); + traLog.Interface_URL__c = awsConfiguration.Token_URL__c; + insert traLog; + } + + //Insert Get Token Log + + //鑾峰彇鏁忔劅瀛楁 + piIntegration.PIDetails = [select id,PI_Policy_Configuration__r.Full_New_URL__c, Enable_Encrypt__c, SF_Field_API_Name__c,SF_Field_Encrypted_API__c, AWS_Field_API__c,AWS_Encrypted_Field_API__c,Field_Type__c from PI_Field_Policy_Detail__c where PI_Policy_Configuration_Name__c =:sobjectType and Enable_Encrypt__c=true]; + List<String> vLookUpFields = new List<String>(); + List<String> PIFields = new List<String>(); + for (PI_Field_Policy_Detail__c PIDetail : piIntegration.PIDetails) { + if(PIDetail.Field_Type__c == 'Reference'){ + vLookUpFields.add(PIDetail.SF_Field_API_Name__c); + } + PIFields.add(PIDetail.SF_Field_API_Name__c); + } + + System.debug('vLookUpFields = ' + vLookUpFields.toString()); + System.debug('PIFields = ' + PIFields.toString()); + + //濉厖鏁版嵁 + piIntegration.newUrl = config.Full_New_URL__c; + piIntegration.updateUrl = config.Full_Update_URL__c; + piIntegration.queryUrl = config.Full_Read_URL__c; + piIntegration.deleteUrl = config.Full_Delete_URL__c; + piIntegration.undeleteUrl = config.Full_Undelete_URL__c; + piIntegration.viewUnifiedContactUrl = config.Full_View_Unified_Contact_URL__c; + piIntegration.transactionURL = config.TransactionURL__c; + piIntegration.hostUrl = awsConfiguration.Host_URL__c; + piIntegration.searchUrl = config.Full_Search_URL__c; + piIntegration.token = token; + piIntegration.awsAppId = awsAppId; + piIntegration.awsAppSecret = awsAppSecret; + piIntegration.vLookUpFields = vLookUpFields; + piIntegration.PIFields = PIFields; + piIntegration.sobjectPrefix = getObjectKeyPrefix(sobjectType); + System.debug('piIntegration' + piIntegration); + return piIntegration; + } + global class PIIntegration{ + public String sobjectPrefix{set;get;} + public String searchUrl{set;get;} + public String newUrl{set;get;} + public String updateUrl{set;get;} + public String queryUrl{set;get;} + public String deleteUrl{set;get;} + public String undeleteUrl{set;get;} + public String viewUnifiedContactUrl{set;get;} + public String hostUrl{set;get;} + public String token{set;get;} + public String awsAppId{set;get;} + public String awsAppSecret{set;get;} + public String transactionUrl{set;get;} + public List<String> vLookUpFields{set;get;} + public List<String> PIFields{set;get;} + public List<PI_Field_Policy_Detail__c > PIDetails{set;get;} + } + global class TransRequestBody{ + public Integer isSuccess{set;get;} + public String sfRecordId{set;get;} + public String txId{set;get;} + + } + global class TransactionRequestBody{ + public Integer isSuccess{set;get;} + public String sfRecordId{set;get;} + public String txId{set;get;} + public List<idList> idList{set;get;} + } + global class idList{ + public String awsId{set;get;} + public String sfRecordId{set;get;} + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/PIHelper.cls-meta.xml b/force-app/main/default/classes/PIHelper.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/PIHelper.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/RentalApplyController.cls b/force-app/main/default/classes/RentalApplyController.cls new file mode 100644 index 0000000..8fa1e82 --- /dev/null +++ b/force-app/main/default/classes/RentalApplyController.cls @@ -0,0 +1,153 @@ +global without sharing class RentalApplyController { + public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;} + public String awsToken{set;get;} + public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe(); + public static String sobjectTypeValue = 'Rental_Apply__c'; + public Boolean isNewMode{set;get;} + public String rtTypeId {get; set;} + public String AWSDataId{set;get;} + public List<String> encryptedAPIList{set;get;} + public String staticResource {get; set;} + public String staticResourceContact {get; set;} + public String requiredFieldAPIListStr {get; set;} + public String fieldAPIToLabelMapStr {get; set;} + public String Input_Required_Field_Msg{set;get;} + public String requiredErrorMsg{set;get;} + public String contactsInfo {set;get;} + public String contactId{set;get;} + public String PIPL_Input_Account_Error_Msg{set;get;} + public RentalApplyController(ApexPages.StandardController controller) { + isNewMode = true; + Input_Required_Field_Msg = Label.Input_Required_Field_Msg; + PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg; + //鑾峰彇鎵�鏈夊瓧娈� + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Rental_Apply__c').getDescribe().fields.getMap().keyset()); + controller.addFields(fieldList); + SObject obj = controller.getRecord(); + if(obj.Id != null){ + //鏇存柊 + isNewMode = false; + Rental_Apply__c rentalApplyData = [select Id,RecordTypeId,AWS_Data_Id__c,Loaner_medical_Staff__c,Loaner_medical_Staff__r.AWS_Data_Id__c from Rental_Apply__c where id =: obj.Id]; + rtTypeId = rentalApplyData.RecordTypeId; + AWSDataId = rentalApplyData.AWS_Data_Id__c; + Map<String,String> sfIdToAWSIdMap = new Map<String,String>(); + sfIdToAWSIdMap.put(String.valueof(rentalApplyData.Loaner_medical_Staff__r.Id).subString(0,15),rentalApplyData.Loaner_medical_Staff__r.AWS_Data_Id__c); + contactsInfo = JSON.serialize(sfIdToAWSIdMap); + }else{ + //鏂板缓 + rtTypeId = ApexPages.currentPage().getParameters().get('RecordType'); + } + LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Rental_Apply__c','classic'); + layoutSections = LayoutWrapperValue.layoutSections; + List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList; + Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap; + requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList); + fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap); + staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Rental_Apply__c')); + encryptedAPIList = PIHelper.getPIIntegrationInfo('Rental_Apply__c').PIFields; + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + } + + global class Response{ + public String recordId{set;get;} + public String message{set;get;} + public String status{set;get;} + } + + @RemoteAction + global static Response saveRentalApply(String rentalApplyJson,String transId,Boolean isNew) { + System.debug('Rental_Apply__c Info:' + JSON.serialize(rentalApplyJson)); + //1. Prepare the payload for Rental_Apply__c + Schema.SObjectType rentalApplySchema = schemaMap.get(sobjectTypeValue); + Map<String, Schema.SObjectField> fieldAPIToTypeMap = rentalApplySchema.getDescribe().fields.getMap(); + system.debug(fieldAPIToTypeMap); + Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(rentalApplyJson); + Rental_Apply__c rentalApplyInfo = new Rental_Apply__c(); + //鑷畾涔夋牸寮忚浆鎹� + for (String fieldAPI: fieldValueMap.keySet()) { + system.debug('field API='+fieldAPI); + Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType(); + String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); + system.debug('Field Type:'+fielddataType+' field Value='+fieldValue); + if(String.valueOf(fielddataType)=='DATE'){ + rentalApplyInfo.put(fieldAPI,(String.isBlank(fieldValue)||String.isEmpty(fieldValue))? null:Date.valueOf(fieldValue.replace('/', '-'))); + }else if(String.valueOf(fielddataType)=='DATETIME'){ + if(String.isNotBlank(fieldValue)&&fieldValue.contains('T')){ + fieldValue = fieldValue.replace('T',' '); + rentalApplyInfo.put(fieldAPI, Datetime.valueOfGmt(fieldValue)); + }else{ + rentalApplyInfo.put(fieldAPI, null); + } + }else if(String.valueof(fielddataType)=='CURRENCY'|| String.valueof(fielddataType)=='PERCENT'||String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){ + rentalApplyInfo.put(fieldAPI, (String.isBlank(fieldValue)||String.isEmpty(fieldValue))?0:Decimal.valueOf(fieldValue)); + } else if(String.valueof(fielddataType)=='BOOLEAN'){ + rentalApplyInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + }else { + rentalApplyInfo.put(fieldAPI,fieldValue); + } + // system.debug('field API'+fieldAPI); + // String fieldValue = String.valueOf(fieldAPIToTypeMap.get(fieldAPI)); + // if(String.isBlank(fieldValue) || String.isEmpty(fieldValue)){ + // continue; + // } + // Schema.DescribeFieldResult fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe(); + // Schema.DisplayType fieldDatas = fielddataType.getType(); + // system.debug('fieldValue='+fieldValue); + // if(String.valueOf(fielddatas)=='DATE'){ + // rentalApplyInfo.put(fieldAPI, Date.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)).replace('/', '-'))); + // }else if(String.valueOf(fielddatas)=='DATETIME'){ + // String dt = String.valueOf(fieldValueMap.get(fieldAPI)); + // if(String.isNotBlank(dt)&&dt.contains('T')){ + // dt = dt.replace('T',' '); + // rentalApplyInfo.put(fieldAPI, Datetime.valueOfGmt(dt)); + // } + // }else if(String.valueOf(fielddatas)=='Number'||String.valueOf(fielddatas)=='DOUBLE'){ + // system.debug('decimal error:'+ String.valueOf(fieldValueMap.get(fieldAPI))); + // rentalApplyInfo.put(fieldAPI, decimal.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)))); + // } else if(String.valueof(fielddatas)=='BOOLEAN'){ + // rentalApplyInfo.put(fieldAPI, fieldValueMap.get(fieldAPI)); + // }else { + // rentalApplyInfo.put(fieldAPI, String.valueOf(fieldValueMap.get(fieldAPI))); + // } + } + + //2. Save Record Process + String status = 'success'; + Response resp = new Response(); + Savepoint sp = Database.setSavepoint(); + String rid = ''; + try{ + System.debug('abcde'); + if(isNew){ + System.debug('rentalApplyInfozhj = ' + rentalApplyInfo); + insert rentalApplyInfo; + System.debug('rentalApplyInfo.Id' + rentalApplyInfo.Id); + }else{ + System.debug('into update'); + String awsDataId = (String)rentalApplyInfo.get('AWS_Data_Id__c'); + System.debug('awsDataId = ' + awsDataId); + Rental_Apply__c[] RentalApplys = [select id from Rental_Apply__c where AWS_Data_Id__c =:awsDataId]; + System.debug('RentalApplys[0].id = ' + RentalApplys[0].id); + rentalApplyInfo.put('Id',RentalApplys[0].id);//For testing; + update rentalApplyInfo; + } + rid=rentalApplyInfo.Id; + // PIHelper.saveTransLog(sobjectTypeValue,transId, (String)rentalApplyInfo.get('AWS_Data_Id__c'),rentalApplyJson ,status,''); + PIHelper.saveTransLog(sobjectTypeValue,(String)rentalApplyInfo.get('AWS_Data_Id__c'),rid,transId,rentalApplyJson,status,''); + resp.recordId = rid; + resp.message = 'success saveRentalApply'; + resp.status = status; + System.debug('respzhj = ' + resp); + return resp; + } catch(Exception e) { + System.debug('into catch'+e.getMessage()); + Database.rollback(sp); + status = 'fail'; + // PIHelper.saveTransLog(sobjectTypeValue,transId, (String)rentalApplyInfo.get('AWS_Data_Id__c'),rentalApplyJson,status,e.getMessage()); + PIHelper.saveTransLog(sobjectTypeValue,(String)rentalApplyInfo.get('AWS_Data_Id__c'),rid,transId,rentalApplyJson,status,e.getMessage()); + resp.message = e.getMessage(); + resp.status = status; + return resp; + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/RentalApplyController.cls-meta.xml b/force-app/main/default/classes/RentalApplyController.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/RentalApplyController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/SObjectHelper.cls b/force-app/main/default/classes/SObjectHelper.cls new file mode 100644 index 0000000..fd949b6 --- /dev/null +++ b/force-app/main/default/classes/SObjectHelper.cls @@ -0,0 +1,445 @@ +public without sharing class SObjectHelper { + + /** + * Copy every field values from from_sobj to to_sobj, if the field is in to_sobj and the value is not null + */ + public static void MergeValue(Sobject to_sobj,Sobject from_sobj) + { + CopyTo(to_sobj,from_sobj,true); + } + + /** + * Copy every field values from from_sobj to to_sobj + */ + public static void OverwriteValue(Sobject to_sobj,Sobject from_sobj) + { + CopyTo(to_sobj,from_sobj,false); + } + + static void CopyTo(Sobject to_sobj,Sobject from_sobj, Boolean skip_from_null) + { + Map<String, Schema.SObjectField> to_sobj_map = GetFields(to_sobj.getSObjectType().getDescribe().getName()); + Map<String, Schema.SObjectField> from_sobj_map = GetFields(from_sobj.getSObjectType().getDescribe().getName()); + for (string field : from_sobj_map.keySet()) { + + object obj = from_sobj.get(field); + object obj1 = to_sobj.get(field); + + if (obj != obj1 && to_sobj_map.containsKey(field) && to_sobj_map.get(field).getDescribe().isUpdateable()) { + + if (obj != null || !skip_from_null) { + System.debug('obj='+obj); + System.debug('obj1='+obj1); + to_sobj.put(field, obj); + } + } + } + } + + + + + private static Map<string,Map<String, Schema.SObjectField>> sobject_field_map = new Map<string,Map<String, Schema.SObjectField>>(); + + public static Map<String, Schema.SObjectField> GetFieldMap(string obj_name) + { + Map<String, Schema.SObjectField> fm = null; + if(string.isBlank(obj_name))return fm; + + if(sobject_field_map.containsKey(obj_name)) + { + fm = sobject_field_map.get(obj_name); + } + else + { + fm = GetFields(obj_name); + if (fm != null) { + sobject_field_map.put(obj_name, fm); + } + } + return fm; + } +/* + private static Map<string,Set<string>> sobject_common_fields = new Map<string,Set<string>>(); + + // get sobject fields that not be assigned in FieldPermission, they were stardard fields + public static Set<string> GetCommonFields(string obj_name) + { + Set<string> fields = null; + if(string.isBlank(obj_name))return fields; + + if(sobject_common_fields.containsKey(obj_name)) + { + fields = sobject_common_fields.get(obj_name); + } + else + { + Map<String, Schema.SObjectField> all_fields = GetFieldMap(obj_name); + Id profile_id = UserUtility.GetSysAdminProfileId(); + List<FieldPermissions> lfp = [SELECT Id, ParentId, SobjectType, Field, PermissionsEdit, PermissionsRead, SystemModstamp FROM FieldPermissions + where parentId in (select id from permissionset where PermissionSet.Profile.Id = :profile_id) and sobjecttype = :obj_name ]; + Set<string> admin_s = new Set<string>(); + + for(FieldPermissions fp : lfp) + { + if(fp.PermissionsRead) + { + admin_s.add(fp.Field.replace(fp.SobjectType+'.','')); + } + } + + // if a field not in admin's permission, the field is a common(standard) field + for (string f : all_fields.keySet()) { + if (!admin_s.contains(f) && !f.endsWith('__c')) { + if (fields == null) { + fields = new Set<string>(); + } + fields.add(f); + } + } + + if (fields != null) { + sobject_common_fields.put(obj_name, fields); + } + } + return fields; + } + + public static Set<string> GetCurrentProfileAccessableFields(string obj_name) + { + return GetProfileAccessableFields(UserInfo.getProfileId(), obj_name); + } + + private static Map<Id,Map<string,List<FieldPermissions>>> profile_field_permission_buffer = new Map<Id,Map<string,List<FieldPermissions>>>(); + + public static Set<string> GetProfileAccessableFields(Id profile_id, string obj_name) + { + List<FieldPermissions> lfp = null; + if(!profile_field_permission_buffer.containsKey(profile_id) || !profile_field_permission_buffer.get(profile_id).containsKey(obj_name)){ + lfp = [SELECT Id, ParentId, SobjectType, Field, PermissionsEdit, PermissionsRead, SystemModstamp FROM FieldPermissions + where parentId in (select id from permissionset where PermissionSet.Profile.Id = :profile_id) and sobjecttype = :obj_name ]; + system.debug(string.format('profile {0} object {1} updated ', new object[]{profile_id,obj_name,lfp.size()})); + + Map<string,List<FieldPermissions>> temp = null; + if(profile_field_permission_buffer.containsKey(profile_id)) + { + temp = profile_field_permission_buffer.get(profile_id); + } + else{ + temp = new Map<string,List<FieldPermissions>>(); + profile_field_permission_buffer.put(profile_id,temp); + } + + temp.put(obj_name,lfp); + } + else{ + lfp = profile_field_permission_buffer.get(profile_id).get(obj_name); + } + Set<string> ls = new Set<string>(); + for(FieldPermissions fp : lfp) + { + if(fp.PermissionsRead) + { + ls.add(fp.Field.replace(fp.SobjectType+'.','')); + } + } + + Set<string> css = GetCommonFields(obj_name); + if (css != null) { + ls.addAll(css); + } + + return ls; + }*/ + + public static Map<string,FieldInfo> GetFieldInfos(string obj_name) + { + Map<string,Schema.SObjectField> fields_map = SObjecthelper.GetFieldMap(obj_name); + if(fields_map == null) + { + return null; + } + Map<string,FieldInfo> res = new Map<string,FieldInfo>(); + Map<string,FieldInfo> result = new Map<string,FieldInfo>(); + FieldInfo temp = null; + for(string s : fields_map.keySet()) + { + + Schema.DescribeFieldResult dfr = fields_map.get(s).getDescribe(); + temp = new FieldInfo(); + temp.Name = dfr.getName(); + temp.Label = dfr.getLabel(); + + // resolve 'Business Phone' bug + if(obj_name.toLowerCase() == 'contact' && temp.Name =='Phone' && temp.Label =='Business Phone'){ + temp.Label = 'Phone'; + } + + Schema.DisplayType dt = dfr.getType(); + temp.TypeEnumName = dt.name(); + + + //temp.DisplayType = dt; + if((dt == schema.DisplayType.MULTIPICKLIST) || (dt == schema.DisplayType.PICKLIST) ) + { + temp.Options = new List<Option>(); + List<Schema.PicklistEntry> pick_list_values = dfr.getPickListValues(); + for (Schema.PicklistEntry a : pick_list_values) { + if (!a.isActive()) { + continue; + } + + Option lv = new Option(); + lv.label = a.getLabel(); + lv.value = a.getValue(); + temp.Options.add(lv); + } + } + + if(dt == schema.DisplayType.REFERENCE ) + { + temp.References = new List<Option>(); + for(Schema.SObjectType reference : dfr.getReferenceTo()) { + System.debug('Lookup reference object name: ' + reference.getDescribe().getName()); + System.debug('Lookup reference object label: ' + reference.getDescribe().getLabel()); + Option lv = new Option(); + lv.label = reference.getDescribe().getLabel(); + lv.value = reference.getDescribe().getName(); + temp.References.add(lv); + } + List<Schema.PicklistEntry> pick_list_values = dfr.getPickListValues(); + for (Schema.PicklistEntry a : pick_list_values) { + if (!a.isActive()) { + continue; + } + + + } + } + + res.put(s,temp); + } + + return res; + } + + public static Map<String, Schema.SObjectField> GetFields(Sobject sobj ){ + return GetFields(sobj.getSObjectType().getDescribe().getName()); + } + + public static Map<String, Schema.SObjectField> GetFields(string obj_name ) + { + Map<String, Schema.SObjectType> mss = Schema.getGlobalDescribe(); + if(mss.containsKey(obj_name)){ + return Transform(mss.get(obj_name).getDescribe().fields.getMap()); + } + else{ + return null; + } + } + + public static Map<String, Schema.FieldSet> GetFieldSets(string obj_name ) + { + Map<String, Schema.SObjectType> mss = Schema.getGlobalDescribe(); + if(!mss.containsKey(obj_name))return null; + Map<String, Schema.FieldSet> mssfs = mss.get(obj_name).getDescribe().fieldSets.getMap(); + return mssfs; + } + + public static Map<String, Schema.FieldSetMember> GetFieldSet(string obj_name,string field_set_name ) + { + Map<String, Schema.FieldSet> mssfs = GetFieldSets(obj_name); + if(!mssfs.containsKey(field_set_name))return null; + Map<String, Schema.FieldSetMember> result = new Map<String, Schema.FieldSetMember>(); + for(Schema.FieldSetMember member : mssfs.get(field_set_name).getFields()){ + Schema.SObjectField ssf = member.getSObjectField(); + result.put(ssf.getDescribe().getName(),member); + } + return result; + } + + static Map<String, Schema.SObjectField> Transform(Map<String, Schema.SObjectField> mssof){ + if(mssof == null)return null; + Map<String, Schema.SObjectField> result = new Map<String, Schema.SObjectField>(); + for(string key : mssof.keySet()){ + result.put(mssof.get(key).getDescribe().getName(),mssof.get(key)); + } + return result; + } + /* + static Map<String, Schema.FieldSet> Transform(Map<String, Schema.FieldSet> mssfs){ + if(mssfs == null)return null; + Map<String, Schema.FieldSet> result = new Map<String, Schema.FieldSet>(); + for(string key : mssfs.keySet()){ + result.put(mssfs.get(key).getName(),mssfs.get(key)); + } + return result; + }*/ + + public static Map<string,string> GetPicklistLabelValueMap(string objectName, string fieldName){ + + List<Schema.PicklistEntry> temp = GetPicklistEntryList(objectName,fieldName); + if(temp == null)return null; + + Map<string,string> res = new Map<string,string>(); + + for(Schema.PicklistEntry pe : temp){ + res.put(pe.getLabel(),pe.getValue()); + } + return res; + } + + public static Map<string,string> GetPicklistValueLabelMap(string objectName, string fieldName){ + + List<Schema.PicklistEntry> temp = GetPicklistEntryList(objectName,fieldName); + if(temp == null)return null; + + Map<string,string> res = new Map<string,string>(); + + for(Schema.PicklistEntry pe : temp){ + res.put(pe.getValue(),pe.getLabel()); + } + return res; + } + + public static List<Schema.PicklistEntry> GetPicklistEntryList(string objectName, string fieldName){ + + Map<String,String> picklistMap = new Map<String,String>(); + Schema.SObjectType targetSobjectType = Schema.getGlobalDescribe().get(objectName); + Schema.DescribeSObjectResult objectDescribe = targetSobjectType.getDescribe(); + Map<String, Schema.SObjectField> fieldMap = objectDescribe.fields.getMap(); + if(!fieldMap.containsKey(fieldName))return null; + List<Schema.PicklistEntry> picklistEntries = fieldMap.get(fieldName).getDescribe().getPickListValues(); + return picklistEntries; + } + + + + + + + public static string GetFieldDescription(string object_name, string field_name){ + + if(string.isBlank(object_name) || String.isBlank(field_name))return null; + + // List<FieldDefinition> fd = [Select Label, QualifiedApiName, Description from FieldDefinition Where EntityDefinition.QualifiedApiName=:object_name and QualifiedApiName=:field_name]; + List<FieldDefinition> fds = GetFieldDefinitions(object_name); + for(FieldDefinition fd : fds) + { + if(fd.QualifiedApiName == field_name){ + return fd.Description; + } + } + return null; + } + + public static List<FieldDefinition> GetFieldDefinitions(string object_name){ + return [Select Label, QualifiedApiName, Description from FieldDefinition Where EntityDefinition.QualifiedApiName=:object_name]; + } + + /* + public static Schema.FieldSet GetFieldSet(string obj_name,string fieldset_name ) + { + Map<String, Schema.FieldSet> msf = GetFieldSets(obj_name); + if(msf.containsKey(fieldset_name))return msf.get(fieldset_name); + return null; + } + + public static Schema.FieldSet GetFieldSetByName(string obj_name,string fieldset_name ) + { + Map<String, Schema.FieldSet> msf = GetFieldSets(obj_name); + for(string key : msf.keyset()) + { + if(msf.get(key).getName() == fieldset_name ) + { + return msf.get(key); + } + } + return null; + }*/ + + + /** + * get sobject field value, support forign field if it was queried + * e.g. GetSObjectField(lead_obj,'Owner.Name') + */ + public static object GetSObjectField(object o,string f_str){ + return GetSObjectField((sobject)o,f_str); + } + + /** + * get sobject field value, support forign field if it was queried + * e.g. GetSObjectField(lead_obj,'Owner.Name') + */ + public static object GetSObjectField(sobject o,string f_str){ + List<string> fields = f_str.split('\\.'); + //system.debug('fields = ' + fields); + sobject temp = o; + Object result = null; + for(integer i =0; i < fields.size();i++){ + + if(temp == null) return null; + + if(i==fields.size()-1){ + result = temp.get(fields[i]); + } + else{ + temp = temp.getSObject(fields[i]); + } + + /* + if(result instanceof SObject){ + temp = (SObject)result; + continue; + } + break;*/ + } + + return result; + } + + /* + public static Schema.FieldSet GetFieldSetByLabel(string obj_name,string fieldset_lable ) + { + Map<String, Schema.FieldSet> msf = GetFieldSets(obj_name); + for(string key : msf.keyset()) + { + if(msf.get(key).getLabel() == fieldset_lable ) + { + return msf.get(key); + } + } + return null; + }*/ + + public static List<string> GetMultiPickListOptions(string val){ + return GetOptions(val); + } + + public static List<string> GetOptions(string val){ + if(val == null)return new List<string>(); + return ValidMultiPickListValue(val).split(';'); + } + + public static string AppendValueToMultiPickList(string old_val,string val){ + return ValidMultiPickListValue(old_val+';'+val); + } + + public static string ValidMultiPickListValue( string val ){ + if(string.isBlank(val))return val; + return ValidMultiPickListValue(val.split(';')); + } + + public static string ValidMultiPickListValue( List<string> vals ){ + if(vals == null ) vals = new List<string>(); + Set<string> ss = new Set<string>(vals); + List<string> ls = new List<string>(); + for(string s : ss){ + if(string.isBlank(s)){ + continue; + } + ls.add(s); + } + return string.join(ls, ';'); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/SObjectHelper.cls-meta.xml b/force-app/main/default/classes/SObjectHelper.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/SObjectHelper.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/SearchContactController.cls b/force-app/main/default/classes/SearchContactController.cls new file mode 100644 index 0000000..aa95550 --- /dev/null +++ b/force-app/main/default/classes/SearchContactController.cls @@ -0,0 +1,61 @@ +/* + * Author: Bubba Li + * Created Date: 02/08/2022 + * Purpose: SearchContactController + * Test Class: SearchContactController + * History: + * 02/08/2022 - Bubba Li - Initial Code. + * + * */ +public without sharing class SearchContactController { + public String searchKeyWord{set;get;} + public String staticResource {get; set;} + public String contactAWSIds {set;get;} + public String contactsInfo {set;get;} + public String PIPL_Search_Contact_Label{set;get;} + public SearchContactController() { + String accountId = ApexPages.currentPage().getParameters().get('accountId'); + PIPL_Search_Contact_Label = Label.PIPL_Search_Contact_Label; + //1. Query Contact by accountId + List<Contact> conList = new List<Contact>(); + system.debug('Account Id from Front-end:'+accountId); + if(String.isNotBlank(accountId) && String.isNotEmpty(accountId)){ + conList = new List<Contact>([select Id,AWS_Data_Id__c from Contact where AccountId=:accountId and AWS_Data_Id__c!='']); + } + //2. Prepare the Contact Info + Map<String,Contact> awsIdToContactMap = new Map<String,Contact>(); + List<String> conAWSIds = new List<String>(); + for(Contact con:conList){ + conAWSIds.add(con.AWS_Data_Id__c); + awsIdToContactMap.put(con.AWS_Data_Id__c,con); + } + contactsInfo = JSON.serialize(awsIdToContactMap); + contactAWSIds = JSON.serialize(conAWSIds); + staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + } + + @RemoteAction + public static Response searchContacts(String awsContactIds) { + Response resp = new Response(); + resp.status = 'fail'; + if(String.isBlank(awsContactIds)||String.isEmpty(awsContactIds)){ + return resp; + } + List<String> awsDataIds = (List<String>) JSON.deserialize(awsContactIds, List<String>.class); + Map<String,Contact> awsIdToContactMapTemp = new Map<String,Contact>(); + List<Contact> conListTemp = new List<Contact>([select Id,AWS_Data_Id__c from Contact where AWS_Data_Id__c in:awsDataIds]); + for(Contact con:conListTemp){ + awsIdToContactMapTemp.put(con.AWS_Data_Id__c,con); + } + if(awsIdToContactMapTemp.keySet().size()>0){ + resp.status = 'success'; + resp.message = JSON.serialize(awsIdToContactMapTemp); + } + return resp; + } + + public class Response{ + public String message{set;get;} + public String status{set;get;} + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/SearchContactController.cls-meta.xml b/force-app/main/default/classes/SearchContactController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/SearchContactController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/SearchLeadController.cls b/force-app/main/default/classes/SearchLeadController.cls new file mode 100644 index 0000000..c752de2 --- /dev/null +++ b/force-app/main/default/classes/SearchLeadController.cls @@ -0,0 +1,53 @@ +public without sharing class SearchLeadController { + public String searchKeyWord{set;get;} + public String staticResource {get; set;} + public String leadAWSIds {set;get;} + public String leadsInfo {set;get;} + public String PIPL_Search_Contact_Label{set;get;} + public SearchLeadController() { + // String accountId = ApexPages.currentPage().getParameters().get('accountId'); + PIPL_Search_Contact_Label = Label.PIPL_Search_Contact_Label; + //1. Query Contact by accountId + List<Lead> leadList = new List<Lead>(); + // system.debug('Account Id from Front-end:'+accountId); + // if(String.isNotBlank(accountId) && String.isNotEmpty(accountId)){ + // leadList = new List<Lead>([select Id,AWS_Data_Id__c from Lead where AccountId=:accountId and AWS_Data_Id__c!='']); + // } + leadList = new List<Lead>([select Id,AWS_Data_Id__c from Lead where AWS_Data_Id__c!='']); + //2. Prepare the Contact Info + Map<String,Lead> awsIdToLeadMap = new Map<String,Lead>(); + List<String> leAWSIds = new List<String>(); + for(Lead le:leadList){ + leAWSIds.add(le.AWS_Data_Id__c); + awsIdToLeadMap.put(le.AWS_Data_Id__c,le); + } + leadsInfo = JSON.serialize(awsIdToLeadMap); + leadAWSIds = JSON.serialize(leAWSIds); + staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Lead')); + } + + @RemoteAction + public static Response searchLeads(String awsLeadIds) { + Response resp = new Response(); + resp.status = 'fail'; + if(String.isBlank(awsLeadIds)||String.isEmpty(awsLeadIds)){ + return resp; + } + List<String> awsDataIds = (List<String>) JSON.deserialize(awsLeadIds, List<String>.class); + Map<String,Lead> awsIdToLeadMapTemp = new Map<String,Lead>(); + List<Lead> leadListTemp = new List<Lead>([select Id,AWS_Data_Id__c from Lead where AWS_Data_Id__c in:awsDataIds]); + for(Lead le:leadListTemp){ + awsIdToLeadMapTemp.put(le.AWS_Data_Id__c,le); + } + if(awsIdToLeadMapTemp.keySet().size()>0){ + resp.status = 'success'; + resp.message = JSON.serialize(awsIdToLeadMapTemp); + } + return resp; + } + + public class Response{ + public String message{set;get;} + public String status{set;get;} + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/SearchLeadController.cls-meta.xml b/force-app/main/default/classes/SearchLeadController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/SearchLeadController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/SoqlHelper.cls b/force-app/main/default/classes/SoqlHelper.cls new file mode 100644 index 0000000..1aaee51 --- /dev/null +++ b/force-app/main/default/classes/SoqlHelper.cls @@ -0,0 +1,136 @@ +public class SoqlHelper { + + public static string DistinctQueryFields(string sql) + { + string query_fields = sql; + if (query_fields == null) { + return null; + } + query_fields = query_fields.trim(); + Integer sel_i = query_fields.indexOfIgnoreCase('select '); + string sel = 'select '; + + if ( sel_i < 0) { + sel = ''; + } + + string whe = ''; + Integer whe_i = query_fields.indexOfIgnoreCase(' from '); + if ( whe_i >= 0) { + whe = query_fields.substring(whe_i); + } + string query = query_fields.substring(sel_i < 0 ? 0 : sel.length(), whe_i < 0 ? query_fields.length() : whe_i); + Set<string> ss = new Set<string>(); + for(string f : query.split(',')){ + string s = f.trim().toLowerCase(); + //System.debug('s='+s); + ss.add(s); + } + + return sel + QueryFields(ss) + whe; + + } + + public static string WId(string wid){ + return '\'' + wid + '\''; + } + + public static string QueryFields(Set<string> lo){ + return QueryFields(new List<string>(lo)); + } + + public static string QueryFields(List<object> lo){ + return string.join(lo, ','); + } + + public static string ToInCondition(List<AggregateResult> lar ,string key) + { + if(lar==null || lar.size() == 0) + { + return null; + } + + string ss = ' ( '; + boolean b = true; + for(AggregateResult ar : lar) + { + if(ar.get(key)==null)continue; + if( b ) + { + b = false; + ss += '\''+ar.get(key)+'\''; + } + else + { + ss += ',\''+ar.get(key)+'\''; + } + + } + ss+=') '; + return ss; + } + + public static string ToInCondition(Set<string> so){ + return ToInCondition(new List<string>(so)); + } + + public static string ToInCondition(List<object> lo) + { + Set<object> so = new Set<object>(lo); + lo = new List<object>(so); + return '(\''+ string.join(lo, '\',\'')+'\')'; + } + + public static void InsertList(List<Sobject> so_list) + { + if(so_list == null || so_list.size() == 0)return; + insert so_list; + } + + public static void UpdateList(List<Sobject> so_list) + { + if(so_list == null || so_list.size() == 0)return; + update so_list; + } + + public static Map<string,Database.UpsertResult> UpsertList(List<Sobject> so_list, Schema.SObjectField field) + { + Map<string,Database.UpsertResult> mid = new Map<string,Database.UpsertResult>(); + if(so_list == null || so_list.size() == 0)return mid; + List<Database.UpsertResult> urList2 = Database.upsert( so_list, field, false); + + Set<String> accBasicRecordIdSet = new Set<String>(); + integer index = 0; + string errorString = ''; + string field_str = field.getDescribe().getName(); + for(Database.UpsertResult ur : urList2){ + if(!ur.IsSuccess()){ + object fv = so_list[index].get(field_str); + + mid.put(fv+'',ur); + errorString = ''; + for(Database.Error errs: ur.getErrors()){ + errorString += errs.getMessage() + ';'; + } + //LogHelper.CreateRunTimeLog('runtime error', errorString, false, fv+''); + } + index++; + } + return mid; + } + + public static void DeleteList(List<Sobject> so_list) + { + if(so_list == null || so_list.size() == 0)return; + delete so_list; + } + + + @future + public static void DeleteListAsync(List<Id> id_list) + { + if(id_list == null || id_list.size() == 0)return; + Database.delete(id_list); + } + +} \ No newline at end of file diff --git a/force-app/main/default/classes/SoqlHelper.cls-meta.xml b/force-app/main/default/classes/SoqlHelper.cls-meta.xml new file mode 100644 index 0000000..40d6793 --- /dev/null +++ b/force-app/main/default/classes/SoqlHelper.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/TestClass.cls b/force-app/main/default/classes/TestClass.cls new file mode 100644 index 0000000..b0a0bb3 --- /dev/null +++ b/force-app/main/default/classes/TestClass.cls @@ -0,0 +1,41 @@ +public without sharing class TestClass +{ + public static List<Metadata.LayoutSection> GetLayoutSections(string object_name, string layout_name){ + List<String> componentNameList = new List<String>{object_name+'-'+layout_name}; + //閫氳繃Metadata.Operations.retrieve鑾峰彇metadata + //Metadata.Layout -> Metadata.LayoutSection -> Metadata.LayoutColumn objects -> Metadata.LayoutItem objects + List<Metadata.Metadata> componentList = Metadata.Operations.retrieve(Metadata.MetadataType.Layout, componentNameList); + if(componentList?.size() > 0){ + Metadata.Layout layout = (Metadata.Layout) componentList.get(0); + List<Metadata.LayoutSection> layoutSectionList = layout.layoutSections; + return layoutSectionList; + } + else{ + return null; + } + + } + + public static void Foo(){ + string query = 'SELECT Layout.Name, Layout.TableEnumOrId, ProfileId, Profile.Name, RecordTypeId FROM ProfileLayout where recordtypeid=\'01210000000QfWdAAK\''; + + String baseURL = URL.getSalesforceBaseUrl().toExternalForm()+'/services/data/v41.0/tooling/query?q='+ query.replace(' ', '+'); + HttpResponse resp = null; + HttpRequest req = new HttpRequest(); + req.setMethod('GET'); + req.setHeader('Authorization', 'Bearer ' + UserInfo.getsessionid()); + req.setEndpoint(baseURL); + Http client = new Http(); + resp = client.send(req); + Map<string,object> mso = (Map<string,object>)JSON.deserializeUntyped(resp.getBody()); + for(string key : mso.keySet()){ + system.debug('key='+key); + system.debug(mso.get(key)); + } + mso = (Map<string,object>)(((List<object>)mso.get('records'))[0]); + for(string key : mso.keySet()){ + system.debug('key='+key); + system.debug(mso.get(key)); + } + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/TestClass.cls-meta.xml b/force-app/main/default/classes/TestClass.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/TestClass.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/TestController.cls b/force-app/main/default/classes/TestController.cls new file mode 100644 index 0000000..4279e5e --- /dev/null +++ b/force-app/main/default/classes/TestController.cls @@ -0,0 +1,15 @@ +public without sharing class TestController extends NewAndEditBaseController +{ + public TestController(ApexPages.StandardController controller) { + + List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Inquiry_form__c').getDescribe().fields.getMap().keyset()); + // Add fields to controller. This is to avoid the SOQL error in visualforce page + controller.addFields(fieldList); + LookUpOverrideFields.add('Contact_Name__c'); + //娣诲姞椤� + Init(controller.getRecord()); + system.debug(LookUpOverrideFieldsMapJson); + } + + +} \ No newline at end of file diff --git a/force-app/main/default/classes/TestController.cls-meta.xml b/force-app/main/default/classes/TestController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/TestController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/classes/ViewParticipantsController.cls b/force-app/main/default/classes/ViewParticipantsController.cls new file mode 100644 index 0000000..f88d12b --- /dev/null +++ b/force-app/main/default/classes/ViewParticipantsController.cls @@ -0,0 +1,6 @@ +global class ViewParticipantsController { + public String staticResourceContact {get; set;} + public ViewParticipantsController(ApexPages.StandardController controller) { + staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/ViewParticipantsController.cls-meta.xml b/force-app/main/default/classes/ViewParticipantsController.cls-meta.xml new file mode 100644 index 0000000..dd61d1f --- /dev/null +++ b/force-app/main/default/classes/ViewParticipantsController.cls-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexClass> diff --git a/force-app/main/default/pages/B_Test.page b/force-app/main/default/pages/B_Test.page new file mode 100644 index 0000000..e036be2 --- /dev/null +++ b/force-app/main/default/pages/B_Test.page @@ -0,0 +1,304 @@ +<apex:page id="Page" controller="B_Test" sidebar="false" showHeader="false" action="{!init}"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script type="text/javascript"> + var staticResources = JSON.parse('{!staticResource}'); + var awsResult = [{ +聽聽聽聽聽聽聽聽聽聽聽聽"dataId":聽"942720697313001472", +聽聽聽聽聽聽聽聽聽聽聽聽"isDelete":聽0, +聽聽聽聽聽聽聽聽聽聽聽聽"lastName":聽"寮犱笁12312321", +聽聽聽聽聽聽聽聽聽聽聽聽"phone":聽"2988a8e6bcc90e83f54f81bc841aa822", +聽聽聽聽聽聽聽聽聽聽聽聽"email":聽"d0152175c99a1c050f46d0d23996ff987b738add75e73c476b65611ba4a2b1b5", +聽聽聽聽聽聽聽聽聽聽聽聽"medicalStaffFullName":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"mobilePhone":聽"2988a8e6bcc90e83f54f81bc841aa822", +聽聽聽聽聽聽聽聽聽聽聽聽"title":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"olyAssistantType":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"jobCategoryPicklist":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"type":聽"3b13e2b5c5fd4003a931a38dcaf1c545", +聽聽聽聽聽聽聽聽聽聽聽聽"contactAddress":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"contactType":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"doctorDivision1":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"uniqueNumber":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"lastNameEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"phoneEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"emailEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"medicalStaffFullNameEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"mobilePhoneEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"titleEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"olyAssistantTypeEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"jobCategoryPicklistEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"typeEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"contactAddressEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"contactTypeEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"doctorDivision1Encrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"uniqueNumberEncrypt":聽null +聽聽聽聽聽聽聽聽},{ +聽聽聽聽聽聽聽聽聽聽聽聽"dataId":聽"942720697313001472", +聽聽聽聽聽聽聽聽聽聽聽聽"isDelete":聽0, +聽聽聽聽聽聽聽聽聽聽聽聽"lastName":聽"鏉庡洓12312321", +聽聽聽聽聽聽聽聽聽聽聽聽"phone":聽"2988a8e6bcc90e83f54f81bc841aa822", +聽聽聽聽聽聽聽聽聽聽聽聽"email":聽"d0152175c99a1c050f46d0d23996ff987b738add75e73c476b65611ba4a2b1b5", +聽聽聽聽聽聽聽聽聽聽聽聽"medicalStaffFullName":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"mobilePhone":聽"2988a8e6bcc90e83f54f81bc841aa822", +聽聽聽聽聽聽聽聽聽聽聽聽"title":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"olyAssistantType":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"jobCategoryPicklist":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"type":聽"3b13e2b5c5fd4003a931a38dcaf1c545", +聽聽聽聽聽聽聽聽聽聽聽聽"contactAddress":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"contactType":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"doctorDivision1":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"uniqueNumber":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"lastNameEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"phoneEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"emailEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"medicalStaffFullNameEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"mobilePhoneEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"titleEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"olyAssistantTypeEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"jobCategoryPicklistEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"typeEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"contactAddressEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"contactTypeEncrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"doctorDivision1Encrypt":聽null, +聽聽聽聽聽聽聽聽聽聽聽聽"uniqueNumberEncrypt":聽null +聽聽聽聽聽聽聽聽}]; + + + var now_edit_id = ''; + function sobjectToAws(){ + return { + "LastName":"寮犱笁", + "Phone":"13800138000" + } + } + + function searchContactJs() { + blockme(); + searchContact(); + } + + function editContactJs(conid) { + blockme(); + now_edit_id=conid; + editContact(conid); + } + + function editSaveJs() { + blockme(); + ProcessPI({},GetEditObj()); + } + + function editClearJs() { + blockme(); + editClear(); + } + + function setContact(line) { + var openLine = '{!openLine}'; + var cm = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':contact'; + var cmid = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':contactId'; + + + var conid = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':conId')).value(); + var conname = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':conName')).value(); + + j$(escapeVfId(cmid),window.opener.document).val(conid); + j$(escapeVfId(cm),window.opener.document).val(conname); + + // SWAG-BB44G7 璁剧疆鎵�鍦ㄧ瀹ゅ悕瀛楀拰id鐨勪綅缃拰鍐呭 start + var department = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':department'; + var departmentid = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':departmentid'; + var departmentHidden = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':departmentHidden'; + var departmentHiddenId = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':departmentHiddenId'; + var accid = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':accountid')).value(); + var accName = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':accountName')).value(); + + j$(escapeVfId(department),window.opener.document).val(accName); + j$(escapeVfId(departmentid),window.opener.document).val(accid); + j$(escapeVfId(departmentHidden),window.opener.document).val(accName); + j$(escapeVfId(departmentHiddenId),window.opener.document).val(accid); + + + // SWAG-BB44G7 璁剧疆鎵�鍦ㄧ瀹ゅ悕瀛楀拰id鐨勪綅缃拰鍐呭 end + + window.close(); + } + + jQuery(function(){ + alert("Init杩斿洖涔嬪悗锛岀户缁煡璇WS"); + + }) + + + +/* + function insertOrUpdateBack(payloadJson, r, isNewMode){ + + payloadJson.LastName = r.object[0].lastName; + payloadJson.Phone = r.object[0].phone; + payloadJson.LastName_Encrypted__c = r.object[0].lastNameEncrypted; + payloadJson.Phone_Encrypted__c = r.object[0].phoneEncrypted; + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + return payloadJson; + }*/ + + var aws_result = {}; + function GetAWSResultObj(){ + if(aws_result && aws_result.object && aws_result.object.length > 0){ + return aws_result.object[0]; + } + return null; + } + function ProcessPI(sobjJson, payloadForNewPI) { + //blockme(); + let url = staticResources.newUrl + if (now_edit_id) { + url = staticResources.updateUrl + } + AWSService.post(staticResources.updateUrl, payloadForNewPI, function(result){ + aws_result = result; + SetEditObj(); + saveNew(); + }, staticResources.token); + } + + function Trans(){ + let status = aws_result.status == '0'; + + AWSService.sfdcBack({status:status}, aws_result, aws_result.txId, staticResources.token, staticResources.transactionURL,function(){ + unblockUI(); + }) + } + + + </script> + + <apex:form id="allForm"> + + + <apex:actionFunction name="searchContact" action="{!searchContact}" rerender="allForm" onComplete="unblockUI();"> + </apex:actionFunction> + <apex:actionFunction name="editContact" action="{!editContact}" rerender="allForm" onComplete="unblockUI();assignUnencrypted()"> + <apex:param name="firstParam" assignTo="{!conId}" value="" /> + </apex:actionFunction> + <apex:actionFunction name="saveNew" action="{!saveNew}" rerender="allForm" onComplete="Trans();"> + </apex:actionFunction> + <apex:actionFunction name="editClear" action="{!editClear}" rerender="allForm" onComplete="unblockUI();"> + </apex:actionFunction> + + <apex:outputPanel id="allPanel"> + <apex:pageBlock id="searchBlock" title="妫�绱㈡潯浠�"> + <table class="linetable" border="0" style="border-collapse: collapse;width:600px;table-layout:fixed;"> + <colgroup> + <col width="50px" /> + <col width="150px" /> + <col width="50px" /> + <col width="150px" /> + <col width="200px" /> + </colgroup> + <tr> + <td>{!$ObjectType.Contact.fields.LastName.Label}</td> + <td><apex:inputField value="{!searchCon.Search_LastName__c}" style="width: 90%"/></td> + <td>{!$ObjectType.Contact.fields.FirstName.Label}</td> + <td><apex:inputField value="{!searchCon.Search_FirstName__c}" style="width: 90%"/></td> + <td><input type="button" value="妫�绱�" onclick="searchContactJs(); return null;" /></td> + </tr> + </table> + </apex:pageBlock> + + <apex:pageBlock id="listBlock" title="妫�绱㈢粨鏋�"> + <div style="height: 200px; overflow-y: auto; overflow-x: hidden;"> + <table class="edittable" border="0" style="border-collapse: collapse;width:580px;table-layout:fixed;"> + <colgroup> + <col width="50px" /> + <col width="100px" /> + <col width="380px" /> + <col width="50px" /> + </colgroup> + <tr> + <th>No.</th> + <th>{!$ObjectType.Contact.fields.Name.Label}</th> + <th>{!$ObjectType.Contact.fields.AccountName__c.Label}</th> + <th>鎿嶄綔</th> + </tr> + <apex:repeat id="lineinfo" value="{!lineInfoList}" var="lineinfo"> + <tr> + <td>{!lineinfo.lineNo} + <apex:inputHidden id="conId" value="{!lineinfo.con.id}"/> + <apex:inputHidden id="conName" value="{!lineinfo.con.name}"/> + <apex:inputHidden id="accountName" value="{!lineinfo.con.AccountName__c}"/> + <apex:inputHidden id="accountid" value="{!lineinfo.con.accountid}"/> + </td> + <td><a href="#" onclick="setContact('{!lineinfo.lineNo}');">{!lineinfo.con.Name}</a></td> + <td>{!lineinfo.con.AccountName__c}</td> + <td><input style="width:90%;" type="button" value="缂栬緫" onclick="editContactJs('{!lineinfo.con.Id}'); return null;" /></td> + </tr> + </apex:repeat> + </table> + </div> + </apex:pageBlock> + <script> + function assignUnencrypted(){ + let obj = sobjectToAws(); + document.getElementById("Page:allForm:editBlock:Search_LastName__c").value = obj.LastName; + document.getElementById("Page:allForm:editBlock:Phone").value = obj.Phone; + } + + function GetEditObj(){ + return JSON.stringify([{ + lastName : document.getElementById("Page:allForm:editBlock:Search_LastName__c").value, + phone : document.getElementById("Page:allForm:editBlock:Phone").value, + dataId:document.getElementById("Page:allForm:editBlock:AWS_Data_Id__c").value, + }]); + } + + function SetEditObj(){ + let obj = GetAWSResultObj(); + if(obj){ + document.getElementById("Page:allForm:editBlock:Search_LastName__c").value = obj.lastName; + document.getElementById("Page:allForm:editBlock:LastName_Encrypted__c").value = obj.lastNameEncrypt; + document.getElementById("Page:allForm:editBlock:Phone").value = obj.phone; + document.getElementById("Page:allForm:editBlock:Phone_Encrypted__c").value = obj.phoneEncrypt; + } + + } + </script> + <apex:pageBlock id="editBlock" title="鑱旂郴浜虹紪杈�"> + <apex:pageBlockButtons location="top"> + <apex:commandButton onclick="editClearJs();" value="娓呯┖" rerender="dummy"/> + <apex:commandButton onclick="editSaveJs();" value="淇濆瓨" rerender="dummy"/> + </apex:pageBlockButtons> + + <apex:inputHidden id="LastName_Encrypted__c" value="{!newCon.LastName_Encrypted__c}"/> + <apex:inputHidden id="Phone_Encrypted__c" value="{!newCon.Phone_Encrypted__c}"/> + <apex:inputHidden id="AWS_Data_Id__c" value="{!newCon.AWS_Data_Id__c}"/> + <table class="edittable" border="0" style="border-collapse: collapse; width:600px; table-layout:fixed;"> + <colgroup> + <col width="50px" /> + <col width="150px" /> + <col width="50px" /> + <col width="150px" /> + <col width="50px" /> + <col width="150px" /> + </colgroup> + <tr> + <td>{!$ObjectType.Contact.fields.LastName.Label}</td> + <td><span><div class="requiredInput"><div class="requiredBlock"></div> + <apex:inputField id="Search_LastName__c" value="{!newCon.Search_LastName__c}" style="width: 90%"/> + </div></span></td> + + <td>{!$ObjectType.Contact.fields.Phone.Label}</td> + <td><apex:inputField id="Phone" value="{!newCon.Phone}" style="width: 90%"/></td> + </tr> + <tr> + <td>{!$ObjectType.Contact.fields.Supplement__c.Label}</td> + <td colspan="5"><apex:inputField id="Supplement__c" value="{!newCon.Supplement__c}" style="width: 95%; resize: none; height: 50px"/></td> + </tr> + </table> + </apex:pageBlock> + + </apex:outputPanel> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/B_Test.page-meta.xml b/force-app/main/default/pages/B_Test.page-meta.xml new file mode 100644 index 0000000..6dd5fce --- /dev/null +++ b/force-app/main/default/pages/B_Test.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>B_Test</label> +</ApexPage> diff --git a/force-app/main/default/pages/ConsumApplyUploadPdf.page b/force-app/main/default/pages/ConsumApplyUploadPdf.page new file mode 100644 index 0000000..d628e99 --- /dev/null +++ b/force-app/main/default/pages/ConsumApplyUploadPdf.page @@ -0,0 +1,190 @@ +<!-- 璇ラ〉闈㈢敤浜嶭ead瀵硅薄涓婁紶PDF锛屾湭鏉ュ鏋滆娣诲姞鍏朵粬瀵硅薄鐨勪笂浼燩DF鍔熻兘锛屽鍒惰椤甸潰锛屽皢**standardController**淇敼涓哄叾浠栧璞PI鍚嶇О鍗冲彲 --> +<apex:page standardController="Consum_Apply__c" extensions="FileUploadController" id="page" lightningStyleSheets="true"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script> + var staticResources = JSON.parse('{!staticResource}'); + var parentId = '{!parentId}'; + var uploadUrl = staticResources.newUrl; + var key; + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:theForm:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'message errorM3'; + } + + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:theForm:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + function getFileContent(event) { + var fileObject = document.getElementById("page:theForm:block:uploadSection:file"); + var reader = new FileReader(); + var data = reader.readAsDataURL(fileObject.files[0]); + debugger + console.log(event); + } + function getBase64(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); + } + function disableButtonStatus() { + let btnNode = document.getElementById('uploadFileId'); + btnNode.classList.add("btnDisabled"); + } + + function enableButtonStatus() { + let btnNode = document.getElementById('uploadFileId'); + btnNode.classList.remove("btnDisabled"); + } + + function uploadFile() { + disableButtonStatus(); + var fileObject = document.getElementById("file").files[0]; + getBase64(fileObject).then( + data => { + console.log(data); + uploadFileToAWS(data, (fileObject.size).toString(), fileObject.name); + + } + ); + } + function confirmTrans(transId, isSuccess) { + + fetch(staticResources.updateUrl, { + method: 'POST', + body: JSON.stringify({ 'txId': transId, "isSuccess": isSuccess }), + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then(data => { + console.log("confirmTrans-" + JSON.stringify(data)); + document.getElementById("file").files[0].name = ''; + enableButtonStatus(); + refreshFiles(); + return data.status; + }) + + } + function calculateFileSize(fileObject) { + if (fileObject.size > 20971520) { + alertErrorMessage('鏂囦欢杩囧ぇ锛岃閫夋嫨灏忎簬20mb鐨勬枃浠�'); + } + } + function uploadFileToAWS(data, size, fileName) { + console.log("body=" + JSON.stringify({ 'file': data, "size": size, 'fileName': fileName })); + + fetch(uploadUrl, { + method: 'POST', + body: JSON.stringify({ 'file': data, "size": size, 'fileName': fileName }), + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then(result => { + + console.log("result" + JSON.stringify(result)); + + if (result.success == true) { + key = result.object; + + Visualforce.remoting.Manager.invokeAction( + '{!$RemoteAction.FileUploadController.saveFile}', + fileName, key, result.txId, parentId, + function (resultvalue, event) { + + + + //2. show file list + if (resultvalue.status == 'fail') { + alertErrorMessage(resultvalue.message); + //1. Confirm trans + confirmTrans(result.txId, 0); + } else { + alertErrorMessage('涓婁紶鎴愬姛'); + confirmTrans(result.txId, 1); + } + + // window.location.reload(); + }, + { escape: true } + ); + + console.log('key' + key); + } else { + alertErrorMessage('涓婁紶澶辫触璇风◢鍚庡啀璇曪紒'); + } + }).catch((error) => { + console.error('Error:', error); + }) + debugger + } + function downPdf(fileUrl) { + window.open(fileUrl,'_blank'); + } + + </script> + <style> + .pdf .num { + width: 30%; + } + + .pdf.name { + width: 30% + } + + .pdf.downLink { + width: 40% + } + </style> + <apex:form id="theForm"> + <apex:actionFunction name="refreshFiles" action="{!refreshFiles}" reRender="pdf,uploadSection"/> + <br/> + <br/> + <apex:pageBlock id="block"> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + <apex:pageBlockSection id="uploadSection"> + <!-- <apex:inputFile id="file" value="{!documentData.body}" filename="{!documentData.name}" /> --> + <input type="file" id="file" name="filename"/> + <input class="btn" id='uploadFileId' type="Button" value="纭涓婁紶" onclick="uploadFile()" /> + </apex:pageBlockSection> + </apex:pageBlock> + <apex:pageBlock title="PDF鍒楄〃" id="pdf"> + <!-- <apex:pageBlockSection > --> + <!-- show uploated file list --> + <apex:pageBlockTable value="{!fileList}" var="file" align="center" columns="3" columnsWidth="30%,30%,40%"> + <apex:column id="name" headerValue="鏂囦欢鍚嶇О"> + <apex:outputLink value="/{!file.Id}" target="_blank">{!file.FileName__c}</apex:outputLink> + </apex:column> + <!-- <apex:column id="num" headerValue="鐖惰褰曢摼鎺�"> + <apex:outputLink value="/{!file.ParentRecordId__c}" target="_blank">{!file.ParentRecordId__c}</apex:outputLink> + </apex:column> --> + <apex:column id="previewLink" headerValue="棰勮閾炬帴"> + <apex:outputLink value="{!file.ViewLink__c}" target="{!file.ViewLink__c}">棰勮閾炬帴 + </apex:outputLink> + </apex:column> + <apex:column id="downLink" headerValue="涓嬭浇閾炬帴"> + <!-- <apex:outputLink value= "{!file.DownloadLink__c}" target="{!file.DownloadLink__c}">涓嬭浇閾炬帴 + </apex:outputLink> --> + <input class="btn" id='downloadFileButton' type="Button" value="涓嬭浇" onclick="downPdf('{!file.DownloadLink__c}')" /> + </apex:column> + </apex:pageBlockTable> + <!-- </apex:pageBlockSection> --> + </apex:pageBlock> + </apex:form> + +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ConsumApplyUploadPdf.page-meta.xml b/force-app/main/default/pages/ConsumApplyUploadPdf.page-meta.xml new file mode 100644 index 0000000..68da06b --- /dev/null +++ b/force-app/main/default/pages/ConsumApplyUploadPdf.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ConsumApplyUploadPdf</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditASEActivity.page b/force-app/main/default/pages/NewAndEditASEActivity.page new file mode 100644 index 0000000..e93ab70 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditASEActivity.page @@ -0,0 +1,526 @@ +<apex:page standardController="ASEActivity__c" extensions="NewAndEditASEActivityController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f in config.AWSToSobjectNonEncryptedMap){ + let ele = GetEleByClass(config.ApiPrefix + "_"+ config.AWSToSobjectNonEncryptedMap[f]); + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele && data.object[f]){ + let arr = data.object[f].split(';'); + + // 缁欓殣钘忕殑select璧嬪�� + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + + // 鍒╃敤鎸夐挳缁欐樉绀虹殑select璧嬪�� + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + + + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + // document.querySelector("[data-id='Phone']").value = data.object.phone; + // document.querySelector("[data-id='Email']").value = data.object.email; + }, + updateMethod:"NewAndEditASEActivityController.saveASEActivity", + insertMethod:"NewAndEditASEActivityController.saveASEActivity" + } + + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormElement(tag_name){ + return ['input','select','textarea'].indexOf(tag_name)>-1; + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + // let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='CustomerTel__c']"; + // //Email + // let email = document.querySelector(textEmail); + // if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + // error_msg += ';閭欢鏍煎紡閿欒'; + // } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + + let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + let ele = nodelist[index]; + let field_api_name = GetEleApiName(ele); + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormElement(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name'+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + let targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets; + } else { + result[field_api_name] = ele.value; + } + } + return result; + } + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + unblockUI(); + }; + + + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveSobjectProcess(save_and_new) { + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. ASEActivity to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + + var newSearchContactWindow = null; + var contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + + function searchContact(contactNodeId){ + // errorMsg 闅愯棌 + if(document.getElementsByClassName("errorMsg").length > 0){ + document.getElementsByClassName("errorMsg")[0].style.display="none"; + } + + let accountValue = ""; + let suffixUrl = ""; + if (document.querySelector("[data-id='Department__c']")) { + let accountNodeId = document.querySelector("[data-id='Department__c']").id + '_lkid'; + accountValue = document.getElementById(accountNodeId).value; + } + console.log('accountValue = ' + accountValue); + if(accountValue !='000000000000000'){ + suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + }else{ + suffixUrl = "?contactId="+contactNodeId; + } + let baseUrl = "/apex/SearchContactPage"; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + } + + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page:form:contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id='ReporterASE__c']").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id='ReporterASE__c']").value = contactInfo.Name; + } + + + function replaceSearchContactLookup() { + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + if (!{!isNewMode}) { + //1. Query Contact from AWS by AWSDataId + queryContactName() + } + let parentNode = document.querySelector("[data-id='ReporterASE__c']").parentNode; + document.querySelector("[data-id='ReporterASE__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='ReporterASE__c']").parentNode.children[2]); + } + + function queryContactName() { + let sfId = document.getElementById(document.querySelector("[data-id='ReporterASE__c']").id + '_lkid').value; + let contactsInfo = JSON.parse('{!LookUpOverrideFieldsMapJson}'); + let dataId = contactsInfo[sfId]; + let queryContactBack = function(data){ + //To Do later + console.log('ContactData = ' + data.object); + + document.querySelector("[data-id='ReporterASE__c']").value = data.object.lastName; + } + AWSService.query(staticResourcesContact.queryUrl, dataId, queryContactBack, staticResources.token); + // let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + // fetch(url, { + // method: 'GET', + // headers: { + // 'Content-Type': 'application/json', + // 'pi-token': staticResources.token + // } + // }).then((data) => { + // return data.json(); + // }).then((result) => { + // document.querySelector("[data-id='ReporterASE__c']").value = result.object.lastName; + // }) + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <apex:inputHidden value="{!contactId}" id="contactId"/> + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!ASEActivity__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QuerySobjectFromAWS(); + } + //Replace Vlookup Field + replaceSearchContactLookup(); + document.querySelectorAll("[data-id='OwnerId']")[0].classList.add("disabledbutton"); + document.querySelectorAll("[data-id='OwnerId']")[1].classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditASEActivity.page-meta.xml b/force-app/main/default/pages/NewAndEditASEActivity.page-meta.xml new file mode 100644 index 0000000..89cb45e --- /dev/null +++ b/force-app/main/default/pages/NewAndEditASEActivity.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditASEActivity</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditAddress.page b/force-app/main/default/pages/NewAndEditAddress.page new file mode 100644 index 0000000..d8e3c51 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditAddress.page @@ -0,0 +1,427 @@ +<apex:page standardController="Address__c" extensions="NewAndEditAddressController" id="page"> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var redirectMode = 'Save';//1. Save 2. SaveAndNew + var requiredAPIToChangedLabelMap = new Map(); + requiredAPIToChangedLabelMap.set('LastName', '{!PIPL_Name_Label}'); + console.log('{!contactsInfo}'); + var VLookUpFields = new Set(['Contacts__c', 'Province__c', 'City__c', 'Customer__c']); + function ProcessPI(addressJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(addressJson, payloadForNewPI) + }else { + UpdatePIToAWS(addressJson, payloadForNewPI) + } + } + + function enableButton(obj){ + obj.classList.remove("btnDisabled"); + } + + function disableButton(obj){ + obj.classList.add("btnDisabled"); + } + + function disableButtonStatus(){ + let btnList = document.getElementsByClassName('btn'); + for(let i=0;i<btnList.length;i++){ + disableButton(btnList[i]); + } + } + + function enableButtonStatus(){ + let btnList = document.getElementsByClassName('btn'); + for(let i=0;i<btnList.length;i++){ + enableButton(btnList[i]); + } + } + + function getPIPayload(addressJson) { + let addressPayloadList = []; + let Telephone = addressJson.Telephone__c; + let ZipCode = addressJson.ZipCode__c; + let DetailedAddress = addressJson.Detailed_Address__c; + let addressPIData = new Object(); + addressPIData.telephone = Telephone; + addressPIData.zipCode = ZipCode; + addressPIData.detailedAddress = DetailedAddress; + addressPIData.sfRecordId = ''; + console.log('Address PI Data:' + addressPIData); + addressPayloadList.push(addressPIData); + console.log(JSON.stringify(addressPayloadList)); + return JSON.stringify(addressPayloadList); + } + + function validateFieldValueFormate() { + let error_msg = ''; + // let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='Telephone__c']"; + //Email + // let email = document.querySelector(textEmail); + // if(email && !/^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/.test(email.value)){ + // error_msg += ';閭欢鏍煎紡閿欒'; + // } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getAddressInformation() { + + let nodelist = document.querySelectorAll("[data-id]"); + let result = {} + result.RecordTypeId = '{!rtTypeId}'; + for (let index = 0; index < nodelist.length; index++) { + if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) { + console.log(nodelist[index].id.indexOf('lkwgt')); + if (nodelist[index].id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = nodelist[index].id + '_lkid'; + let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value; + result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue; + } + } else if (nodelist[index].type == 'checkbox') { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked; + } else if (nodelist[index].type == 'select-multiple') { + //nodelist[index].getAttribute("data-id") + let multiple = nodelist[index].getAttribute("data-id"); + let targets = document.querySelector("[data-id=" + multiple + "]").parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[nodelist[index].getAttribute("data-id")] = targets; + } else { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].value; + } + let x = index + 1; + if (x <= nodelist.length - 1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) { + index++; + } + } + return result; + } + function QueryAddressFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + console.log('data = ' + data); + document.querySelector("[data-id='Telephone__c']").value = data.object.telephone; + document.querySelector("[data-id='ZipCode__c']").value = data.object.zipCode; + document.querySelector("[data-id='Detailed_Address__c']").value = data.object.detailedAddress; + unblockUI(); + }; + + var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + payloadJson.Telephone__c = r.object[0].telephone; + payloadJson.ZipCode__c = r.object[0].zipCode; + payloadJson.Detailed_Address__c = r.object[0].detailedAddress; + payloadJson.Telephone_Encrypted__c = r.object[0].telephoneEncrypt; + payloadJson.ZipCode_Encrypted__c = r.object[0].zipCodeEncrypt; + payloadJson.Detailed_Address_Encrypted__c = r.object[0].detailedAddressEncrypt; + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + } + + var redirectCallBack = function redirectCallBack(sfId,errorMessage) { + if(sfId){ + if(redirectMode == 'Save'){ + window.open('/' + sfId, '_self'); + }else if(redirectMode == 'SaveAndNew'){ + window.open('/' + sfId + '/e?retURL=%2F' + sfId + '=%2Fo', '_self'); + } + }else{ + // alert(errorMessage); + alertErrorMessage(errorMessage); + } + } + + + function UpdatePIToAWS(addressJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewAndEditAddressController.saveAddress}'; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, addressJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + } + + function NewPIToAWS(addressJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewAndEditAddressController.saveAddress}'; + AWSService.insert(staticResources.newUrl, addressJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + } + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + let fieldAPIValue = requiredFieldAPIList[i] + let fieldLabelValue = fieldAPIToLabelMap[fieldAPIValue]; + if (requiredAPIToChangedLabelMap.has(fieldAPIValue)) { + fieldLabelValue = requiredAPIToChangedLabelMap.get(fieldAPIValue); + } + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveAddressProcess(saveMode) { + + disableButtonStatus(); + redirectMode = saveMode; + console.log('redirectMode'+redirectMode); + hiddenErrorMsgNode(); + //1. Get Address Information from Form + let addressJson = getAddressInformation(); + //2. Validate the Address field value formate, for example the email formate or phone formate + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(addressJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('{!Input_Required_Field_Msg}'+checkRequiredFieldMsgResult); + return + } + //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(addressJson); + + //4. Address to AWS + ProcessPI(addressJson, payloadForNewPI); + } + + function alertErrorMessage(errorMsg) { + enableButtonStatus(); + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsg = '閿欒锛氭棤鏁堟暟鎹��'+'\n' + errorMsg; + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + unblockUI(); + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + var newSearchContactWindow = null; + var contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + function searchContact(contactNodeId) { + //1. Check account value + let accountNodeId = document.querySelector("[data-id='Customer__c']").id + '_lkid'; + let accountValue = document.getElementById(accountNodeId).value; + console.log(accountValue); + if (accountValue != '000000000000000') { + let baseUrl = "/apex/SearchContactPage"; + let suffixUrl = "?contactId=" + contactNodeId + "&accountId=" + accountValue; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl + suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + } else { + //alertErrorMessage('{!PIPL_Input_Account_Error_Msg}'); + alertErrorMessage('璇峰厛閫夋嫨瀹㈡埛'); + } + } + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page:form:contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id='Contacts__c']").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id='Contacts__c']").value = contactInfo.Name; + } + function replaceSearchContactLookup() { + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + if (!{!isNewMode}) { + //1. Query Contact from AWS by AWSDataId + queryContactName() + // document.querySelector("[data-id='Contacts__c']").value = '鐜嬪'; + } + let parentNode = document.querySelector("[data-id='Contacts__c']").parentNode; + document.querySelector("[data-id='Contacts__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Contacts__c']").parentNode.children[2]); + } + + function queryContactName() { + let sfId = document.getElementById(document.querySelector("[data-id='Contacts__c']").id + '_lkid').value; + let contactsInfo = JSON.parse('{!contactsInfo}'); + let dataId = contactsInfo[sfId]; + let queryContactBack = function(data){ + //To Do later + console.log('ContactData = ' + data.object); + + document.querySelector("[data-id='Contacts__c']").value = data.object.lastName; + } + AWSService.query(staticResourcesContact.queryUrl, dataId, queryContactBack, staticResources.token); + // let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + // fetch(url, { + // method: 'GET', + // headers: { + // 'Content-Type': 'application/json', + // 'pi-token': staticResources.token + // } + // }).then((data) => { + // return data.json(); + // }).then((result) => { + // document.querySelector("[data-id='Contacts__c']").value = result.object.lastName; + // }) + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="鏀惰揣鍦板潃" class="pageTitleIcon" title="鏀惰揣鍦板潃" /> + <h1 class="pageType">鏀惰揣鍦板潃缂栬緫 + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> 鏂板缓鏀惰揣鍦板潃</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target=address_edit.htm&section=Address&language=zh_CN&release=234.18.14&instance=CS58&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <apex:inputHidden value="{!contactId}" id="contactId"/> + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">鏀惰揣鍦板潃缂栬緫</h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveAddressProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveAddressProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + <br/> + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" showHeader="{!layoutSection.useHeader}" collapsible="{!layoutSection.allowCollapse}" + columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField html-data-id="{!layoutField.fieldAPI}" value="{!Address__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Address Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme();//for loading search by Li Jun 20220218 + QueryAddressFromAWS(); + } + //Replace Vlookup Field + replaceSearchContactLookup(); + //3. Set Readonly Attribute + // document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveAddressProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveAddressProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditAddress.page-meta.xml b/force-app/main/default/pages/NewAndEditAddress.page-meta.xml new file mode 100644 index 0000000..c737fbf --- /dev/null +++ b/force-app/main/default/pages/NewAndEditAddress.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditAddress</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditAgencyContact.page b/force-app/main/default/pages/NewAndEditAgencyContact.page new file mode 100644 index 0000000..639f9dc --- /dev/null +++ b/force-app/main/default/pages/NewAndEditAgencyContact.page @@ -0,0 +1,511 @@ +<apex:page standardController="Agency_Contact__c" extensions="NewAndEditAgencyContactController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script> + + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + if('{!rtTypeId}'){ + payloadJson.RecordTypeId = '{!rtTypeId}'; + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f in config.AWSToSobjectNonEncryptedMap){ + let ele = GetEleByClass(config.ApiPrefix + "_"+ config.AWSToSobjectNonEncryptedMap[f]); + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele && data.object[f]){ + let arr = data.object[f].split(';'); + + // 缁欓殣钘忕殑select璧嬪�� + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + + // 鍒╃敤鎸夐挳缁欐樉绀虹殑select璧嬪�� + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + + + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + // document.querySelector("[data-id='Phone']").value = data.object.phone; + // document.querySelector("[data-id='Email']").value = data.object.email; + }, + updateMethod:"NewAndEditAgencyContactController.saveContact", + insertMethod:"NewAndEditAgencyContactController.saveContact" + } + + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormElement(tag_name){ + return ['input','select','textarea'].indexOf(tag_name)>-1; + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='Phone']"; + //Email + let email = document.querySelector(textEmail); + if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + error_msg += ';閭欢鏍煎紡閿欒'; + } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + + let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + let ele = nodelist[index]; + let field_api_name = GetEleApiName(ele); + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormElement(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name'+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + let targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets; + } else { + result[field_api_name] = ele.value; + } + } + return result; + } + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + unblockUI(); + }; + + + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveSobjectProcess(save_and_new) { + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. lead to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + var newSearchContactWindow = null; + var contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page_form_contactId\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + //鑷畾涔塴ookup鏌ヨ + function searchContact(contactNodeId){ + let accountValue = ""; + // if (document.querySelector("[data-id='Account__c']")) { + // let accountNodeId = document.querySelector("[data-id='Account__c']").id + '_lkid'; + // accountValue = document.getElementById(accountNodeId).value; + // } + console.log(accountValue); + if(true || accountValue !='000000000000000'){ + let baseUrl = "/apex/SearchContactPage"; + let suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + }else{ + alertErrorMessage('{!$Label.PIPL_Input_Account_Error_Msg}'); + } + } + //绐楀彛鍏抽棴鏃跺彂鐢� + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page_form_contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id='Contact__c']").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id='Contact__c']").value = contactInfo.Name; + } + + //鏇挎崲vlookup + function replaceSearchContactLookup() { + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + if (!{!isNewMode}) { + //1. Query Contact from AWS by AWSDataId + // document.querySelector("[data-id='ContactId']").value = '鐜嬪'; + queryContactName() + } + let parentNode = document.querySelector("[data-id='Contact__c']").parentNode; + document.querySelector("[data-id='Contact__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Contact__c']").parentNode.children[2]); + } + + function queryContactName() { + let sfId = document.getElementById(document.querySelector("[data-id='Contact__c']").id + '_lkid').value; + let contactsInfo = JSON.parse('{!LookUpOverrideFieldsMapJson}'); + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + document.querySelector("[data-id='Contact__c']").value = result.object.lastName; + }) + } + + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <input type="hidden" id="page_form_contactId"/> + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!Agency_Contact__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QuerySobjectFromAWS(); + } + + //Replace Vlookup Field + replaceSearchContactLookup(); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditAgencyContact.page-meta.xml b/force-app/main/default/pages/NewAndEditAgencyContact.page-meta.xml new file mode 100644 index 0000000..ec2bd99 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditAgencyContact.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditAgencyContact</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditCampaignMember.page b/force-app/main/default/pages/NewAndEditCampaignMember.page new file mode 100644 index 0000000..8f0d120 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditCampaignMember.page @@ -0,0 +1,421 @@ +<apex:page standardController="CampaignMember__c" extensions="NewAndEditCampaignMemberController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script> + + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f in config.AWSToSobjectNonEncryptedMap){ + let ele = GetEleByClass(config.ApiPrefix + "_"+ config.AWSToSobjectNonEncryptedMap[f]); + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele && data.object[f]){ + let arr = data.object[f].split(';'); + + // 缁欓殣钘忕殑select璧嬪�� + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + + // 鍒╃敤鎸夐挳缁欐樉绀虹殑select璧嬪�� + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + }, + updateMethod:"NewAndEditCampaignMemberController.saveCampaignMember", + insertMethod:"NewAndEditCampaignMemberController.saveCampaignMember" + } + + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormElement(tag_name){ + return ['input','select','textarea'].indexOf(tag_name)>-1; + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='Phone']"; + //Email + let email = document.querySelector(textEmail); + if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + error_msg += ';閭欢鏍煎紡閿欒'; + } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + + let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + let ele = nodelist[index]; + let field_api_name = GetEleApiName(ele); + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormElement(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name'+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + let targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets; + } else { + result[field_api_name] = ele.value; + } + } + return result; + } + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + }; + + + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveSobjectProcess(save_and_new) { + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. lead to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!CampaignMember__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + QuerySobjectFromAWS(); + } + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditCampaignMember.page-meta.xml b/force-app/main/default/pages/NewAndEditCampaignMember.page-meta.xml new file mode 100644 index 0000000..c9cad86 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditCampaignMember.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditCampaignMember</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditCase.page b/force-app/main/default/pages/NewAndEditCase.page new file mode 100644 index 0000000..092954e --- /dev/null +++ b/force-app/main/default/pages/NewAndEditCase.page @@ -0,0 +1,442 @@ +<apex:page standardController="Case" extensions="NewAndEditCaseController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var redirectMode = "Save"; + var requiredAPIToChangedLabelMap = new Map(); + requiredAPIToChangedLabelMap.set('LastName', '{!PIPL_Name_Label}'); + console.log('{!contactsInfo}'); + var VLookUpFields = new Set(['Account__c', 'ContactId', 'Asset__c', 'prod__c', 'Competitor_info__c', 'AccountId', 'Field1_staff__c']); + //鍒ゆ柇insert or update + function ProcessPI(caseJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(caseJson, payloadForNewPI) + }else { + UpdatePIToAWS(caseJson, payloadForNewPI) + } + } + //闃叉鎸夐挳閲嶅鐐瑰嚮 + function enableButton(obj){ + obj.classList.remove("btnDisabled"); + } + + function disableButton(obj){ + obj.classList.add("btnDisabled"); + } + + function disableButtonStatus(){ + let btnList = document.getElementsByClassName('btn'); + for(let i=0;i<btnList.length;i++){ + disableButton(btnList[i]); + } + } + + function enableButtonStatus(){ + let btnList = document.getElementsByClassName('btn'); + for(let i=0;i<btnList.length;i++){ + enableButton(btnList[i]); + } + } + + //鑾峰彇鍔犲瘑瀛楁 + function getPIPayload(caseJson) { + let casePayloadList = []; + let CicTelephone = caseJson.cic_telephone__c; + let CaseCustomer = caseJson.CASE_CUSTOMER__c; + let CustomerManual = caseJson.Customer_manual__c; + let casePIData = new Object(); + casePIData.cicTelephone = CicTelephone; + casePIData.caseCustomer = CaseCustomer; + casePIData.customerManual = CustomerManual; + casePIData.sfRecordId = ''; + console.log('Case PI Data:' + casePIData); + casePayloadList.push(casePIData); + console.log(JSON.stringify(casePayloadList)); + return JSON.stringify(casePayloadList); + } + //鍒ゆ柇鏁版嵁鏍煎紡 + function validateFieldValueFormate() { + //let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='cic_telephone__c']"; + if (!document.querySelector("[data-id='Account__c']")) { + return true; + } + //Email + //let email = document.querySelector(textEmail).value; + let phone = document.querySelector(textPhone).value; + if (phone == "") { + return true; + } + //let regEmail = /^[\w-]{3,12}@[\da-zA-Z]{2,6}\.[a-zA-Z]+$/; + let regPhone = /^1[3|5|8|7][0-9]\d{4,8}$/; + + //let emailFormate = regEmail.test(email); + let phoneFormate = regPhone.test(phone); + + //console.log(emailFormate); + console.log(phoneFormate); + //if (emailFormate == true && phoneFormate == true) { + if (phoneFormate == true) { + return true; + } else { + return false; + } + } + //鑾峰彇琛ㄥ崟鏁版嵁 + function getCaseInformation() { + + let nodelist = document.querySelectorAll("[data-id]"); + let result = {} + result.RecordTypeId = '{!rtTypeId}' + for (let index = 0; index < nodelist.length; index++) { + if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) { + console.log(nodelist[index].id.indexOf('lkwgt')); + if (nodelist[index].id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = nodelist[index].id + '_lkid'; + let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value; + result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue; + } + } else if (nodelist[index].type == 'checkbox') { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked; + } else if (nodelist[index].type == 'select-multiple') { + //nodelist[index].getAttribute("data-id") + let multiple = nodelist[index].getAttribute("data-id"); + let targets = document.querySelector("[data-id=" + multiple + "]").parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[nodelist[index].getAttribute("data-id")] = targets; + } else { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].value; + } + let x = index + 1; + if (x <= nodelist.length-1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) { + index++; + } + } + //閽堝id鐨勬墜鍔ㄦ坊鍔� + if (document.getElementById("page:form:block:j_id31:0:j_id32:j_id33:1:j_id34_lkid") && (!result.hasOwnProperty("Field1_staff__c") || !result["Field1_staff__c"])){ + if(document.getElementById("page:form:block:j_id31:0:j_id32:j_id33:1:j_id34_lkid").value != '000000000000000'){ + result["Field1_staff__c"] = document.getElementById("page:form:block:j_id31:0:j_id32:j_id33:1:j_id34_lkid").value; + } + } + + return result; + } + //鏌ヨ + function QueryCaseFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + //闇�瑕佽В瀵嗗瓧娈� + var queryBack = function queryBack(data) { + console.log('data = ' + data); + document.querySelector("[data-id='cic_telephone__c']").value = data.object.cicTelephone; + document.querySelector("[data-id='CASE_CUSTOMER__c']").value = data.object.caseCustomer; + document.querySelector("[data-id='Customer_manual__c']").value = data.object.customerManual; + }; + + var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + payloadJson.cic_telephone__c = r.object[0].cicTelephone; + payloadJson.CASE_CUSTOMER__c = r.object[0].caseCustomer; + payloadJson.Customer_manual__c = r.object[0].customerManual; + payloadJson.cic_telephone_Encrypted__c = r.object[0].cicTelephoneEncrypt; + payloadJson.CASE_CUSTOMER_Encrypted__c = r.object[0].caseCustomerEncrypt; + payloadJson.Customer_manual_Encrypted__c = r.object[0].customerManualEncrypt; + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + } + //鍥炶皟鍑芥暟锛岀偣鍑诲悗浜嬩欢 + var redirectCallBack = function redirectCallBack(sfId,errorMessage) { + if(sfId){ + if(redirectMode == 'Save'){ + window.open('/' + sfId, '_self'); + }else if(redirectMode == 'SaveAndNew'){ + window.open('/setup/ui/recordtypeselect.jsp?ent='+'{!sobjecttypeForFrontEnd}'+'&retURL=/'+'{!sobjectPrefix}'+'/o&save_new_url=/'+'{!sobjectPrefix}'+'/e?retURL=%2F'+'{!sobjectPrefix}'+'%2Fo','_self'); + }else if(redirectMode == 'SaveAndClose'){ + window.open('/' + sfId + '/s?retURL=%2F' + sfId + '&co=1', '_self'); + } + }else{ + alertErrorMessage(errorMessage); + } + } + //update to AWS + function UpdatePIToAWS(caseJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewAndEditCaseController.saveCase}'; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, caseJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack, redirectCallBack); + } + //insert to AWS + function NewPIToAWS(caseJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewAndEditCaseController.saveCase}'; + AWSService.insert(staticResources.newUrl, caseJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack, redirectCallBack); + } + //蹇呭~瀛楁 + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for (i = 0; i < requiredFieldAPIList.length; i++) { + if (formData[requiredFieldAPIList[i]]) { + continue; + } else { + let fieldAPIValue = requiredFieldAPIList[i] + let fieldLabelValue = fieldAPIToLabelMap[fieldAPIValue]; + if (requiredAPIToChangedLabelMap.has(fieldAPIValue)) { + fieldLabelValue = requiredAPIToChangedLabelMap.get(fieldAPIValue); + } + if (blankRequiredFields == '') { + blankRequiredFields = blankRequiredFields + fieldLabelValue; + } else { + blankRequiredFields = blankRequiredFields + ',' + fieldLabelValue; + } + + } + } + return blankRequiredFields; + } + //鎸夐挳鐐瑰嚮浜嬩欢 + function saveCaseProcess(saveMode) { + disableButtonStatus(); + redirectMode = saveMode; + console.log('redirectMode'+redirectMode); + hiddenErrorMsgNode(); + //1. Get Case Information from Form + let caseJson = getCaseInformation(); + //2. Validate the Case field value formate, for example the email formate or phone formate + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (!validationResultMessage) { + //Popup error message. - To Do After POC + //alertErrorMessage('閭鏍煎紡杈撳叆鏈夎锛岃閲嶆柊杈撳叆锛�'); + alertErrorMessage('鎵嬫満鏍煎紡杈撳叆鏈夎锛岃閲嶆柊杈撳叆锛�'); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(caseJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('{!Input_Required_Field_Msg}'+checkRequiredFieldMsgResult); + return + } + //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(caseJson); + + //4. Case to AWS + ProcessPI(caseJson, payloadForNewPI); + } + //error 鎶ラ敊 + function alertErrorMessage(errorMsg) { + enableButtonStatus(); + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsg = '閿欒锛氭棤鏁堟暟鎹��'+'\n' + errorMsg; + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + unblockUI(); + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + var newSearchContactWindow = null; + var contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + //鑷畾涔塴ookup鏌ヨ + function searchContact(contactNodeId){ + let accountValue = ""; + if (document.querySelector("[data-id='Account__c']")) { + let accountNodeId = document.querySelector("[data-id='Account__c']").id + '_lkid'; + accountValue = document.getElementById(accountNodeId).value; + } + console.log(accountValue); + if(accountValue !='000000000000000'){ + let baseUrl = "/apex/SearchContactPage"; + let suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + }else{ + alertErrorMessage('{!PIPL_Input_Account_Error_Msg}'); + } + } + //绐楀彛鍏抽棴鏃跺彂鐢� + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page:form:contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id='ContactId']").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id='ContactId']").value = contactInfo.Name; + } + //鏇挎崲vlookup + function replaceSearchContactLookup() { + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + if (!{!isNewMode}) { + //1. Query Contact from AWS by AWSDataId + // document.querySelector("[data-id='ContactId']").value = '鐜嬪'; + queryContactName() + } + let parentNode = document.querySelector("[data-id='ContactId']").parentNode; + document.querySelector("[data-id='ContactId']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='ContactId']").parentNode.children[2]); + } + + function queryContactName() { + let sfId = document.getElementById(document.querySelector("[data-id='ContactId']").id + '_lkid').value; + let contactsInfo = JSON.parse('{!contactsInfo}'); + let dataId = contactsInfo[sfId]; + // let queryContactBack = function(data){ + // //To Do later + // console.log('ContactData = ' + data.object); + + // document.querySelector("[data-id='ContactId']").value = data.object.lastName; + // } + // AWSService.query(staticResourcesContact.queryUrl, dataId, queryContactBack, staticResources.token); + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + document.querySelector("[data-id='ContactId']").value = result.object.lastName; + }) + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="CIC" class="pageTitleIcon" title="CIC" /> + <h1 class="pageType">CIC缂栬緫 + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> 鏂板缓CIC</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target=cases_edit.htm&section=Cases&language=zh_CN&release=234.18.14&instance=CS58&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <apex:inputHidden value="{!contactId}" id="contactId"/> + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">CIC缂栬緫</h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveCaseProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞跺叧闂�" onclick="saveCaseProcess('SaveAndClose')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveCaseProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + <br/> + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" showHeader="{!layoutSection.useHeader}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField html-data-id="{!layoutField.fieldAPI}" value="{!Case[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Case Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QueryCaseFromAWS(); + unblockUI(); + } + //Replace Vlookup Field + replaceSearchContactLookup(); + //3. Set Readonly Attribute + document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton"); + document.querySelector("[data-id='RecordTypeId']").classList.add("disabledbutton"); + //闇�瑕侀殣钘� + // document.querySelector("[data-id='SuppliedEmail']").classList.add("displayblock"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButton" id="bottomButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveCaseProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞跺叧闂�" onclick="saveCaseProcess('SaveAndClose')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveCaseProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditCase.page-meta.xml b/force-app/main/default/pages/NewAndEditCase.page-meta.xml new file mode 100644 index 0000000..16f39cf --- /dev/null +++ b/force-app/main/default/pages/NewAndEditCase.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditCase</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditContact.page b/force-app/main/default/pages/NewAndEditContact.page new file mode 100644 index 0000000..0a78a75 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditContact.page @@ -0,0 +1,485 @@ +<apex:page standardController="Contact" extensions="NewAndEditContactController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script> + + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectNonEncryptedMapKeySet:{!AWSToSobjectNonEncryptedMapKeySet}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + leadPIData.medicalStaffFullName = leadPIData.lastName;// 瀹屾垚field update workflow + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + if('{!rtTypeId}'){ + payloadJson.RecordTypeId = '{!rtTypeId}'; + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f of config.AWSToSobjectNonEncryptedMapKeySet){ + let ele = document.getElementById(api_id_map[config.AWSToSobjectNonEncryptedMap[f]]) + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele ){ + //_unselected + let v = ''; + if(data.object[f]){ + v = data.object[f]; + } + + let arr = v.split(';'); + + // 娓呯┖宸叉湁閫夐」 + /* + let sl = document.getElementById(ele.id + '_selected'); + if(sl){ + for(let op of sl.options){ + op.selected = true; + } + let la = document.getElementById(ele.id + '_left_arrow'); + if(la){ + la.click(); + } + } + + // 璧嬪�兼柊閫夐」 + let us = document.getElementById(ele.id + '_unselected'); + if(us){ + for(let op of us.options){ + op.selected = arr.indexOf(op.value)>-1; + } + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + }*/ + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + if(ele.type.indexOf("select")>-1 && ele.value){ + jQuery(ele).change() + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + + + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + // document.querySelector("[data-id='Phone']").value = data.object.phone; + // document.querySelector("[data-id='Email']").value = data.object.email; + }, + updateMethod:"NewAndEditContactController.saveContact", + insertMethod:"NewAndEditContactController.saveContact" + } + + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormTag(tag_name){ + return ['input','select','textarea'].indexOf(tag_name.toLowerCase())>-1; + } + + function IsFormElement(e){ + return IsFormTag(e.tagName); + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='Phone']"; + //Email + let email = document.querySelector(textEmail); + if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + error_msg += ';閭欢鏍煎紡閿欒'; + } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + //api_id_map +//let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index in api_id_map) { + let ele = document.getElementById(api_id_map[index]); + let field_api_name = index; + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormTag(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name'+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + let targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets; + } else { + result[field_api_name] = ele.value; + } + + // let e1 = document.getElementById(api_id_map[field_api_name]); + // if(!result[field_api_name] && e1 && e1.value){ + // result[field_api_name] = e1.value; + // } + } + return result; + } + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + unblockUI(); + }; + + + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveSobjectProcess(save_and_new) { + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. lead to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!Contact[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + var init_nodes = document.getElementsByClassName("PIBackApi"); + var api_id_map={}; + for(let e of init_nodes){ + if(IsFormElement(e)){ + if(e.getAttribute("multiple") != 'multiple' || e.style.display == 'none' && e.id.indexOf('selected') < 0){ + api_id_map[GetEleApiName(e)] = e.id; + } + + } + } + console.log(api_id_map); + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QuerySobjectFromAWS(); + } + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditContact.page-meta.xml b/force-app/main/default/pages/NewAndEditContact.page-meta.xml new file mode 100644 index 0000000..1f3f827 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditContact.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditContact</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditInquiryForm.page b/force-app/main/default/pages/NewAndEditInquiryForm.page new file mode 100644 index 0000000..ddf818a --- /dev/null +++ b/force-app/main/default/pages/NewAndEditInquiryForm.page @@ -0,0 +1,607 @@ +<apex:page standardController="Inquiry_form__c" extensions="NewAndEditInquiryFormController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + AWSService.sfSessionId = '{!GETSESSIONID()}'; + //閰嶇疆鏂规硶 + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f in config.AWSToSobjectNonEncryptedMap){ + let ele = GetEleByClass(config.ApiPrefix + "_"+ config.AWSToSobjectNonEncryptedMap[f]); + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele && data.object[f]){ + let arr = data.object[f].split(';'); + + // 缁欓殣钘忕殑select璧嬪�� + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + + // 鍒╃敤鎸夐挳缁欐樉绀虹殑select璧嬪�� + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + + + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + // document.querySelector("[data-id='Phone']").value = data.object.phone; + // document.querySelector("[data-id='Email']").value = data.object.email; + }, + updateMethod:"NewAndEditInquiryFormController.saveInquiryForm", + insertMethod:"NewAndEditInquiryFormController.saveInquiryForm" + } + + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + var staticResourcesLead = JSON.parse('{!staticResourceLead}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormElement(tag_name){ + return ['input','select','textarea'].indexOf(tag_name)>-1; + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + let textEmail = "[data-id='Email__c']"; + let textPhone = "[data-id='Phone__c']"; + if (document.querySelector("[data-id='Email__c']").value != "" && document.querySelector("[data-id='Email__c']").value != null) { + //Email + let email = document.querySelector(textEmail); + if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + error_msg += ';閭欢鏍煎紡閿欒'; + } + } + + if (document.querySelector("[data-id='Phone__c']").value != "" && document.querySelector("[data-id='Phone__c']").value != null) { + let phone = document.querySelector(textPhone); + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + + let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + let ele = nodelist[index]; + let field_api_name = GetEleApiName(ele); + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormElement(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name '+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + let targets = ""; + //InquiryForm鐗规畩澶勭悊 + if(multiple == "Product1__c" || multiple == "Request1__c"){ + targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[2].rows[1].cells[2].innerText; + }else{ + targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + } + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets; + } else { + result[field_api_name] = ele.value; + } + } + return result; + } + //鏌ヨ 瑙e瘑 + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + //鏌ヨ 杩斿洖 + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + }; + //鏂板缓/鏇存敼 杩斿洖 + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + //鏇存柊 to AWS + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + //鏂板缓 to AWS + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + //蹇呭~瀛楁 + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + //鎸夐挳鐐瑰嚮鏂规硶 + function saveSobjectProcess(save_and_new) { + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. Inquiry to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + + var newSearchContactWindow = null; + var contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + //鑷畾涔塴ookup鏌ヨ + function searchContact(contactNodeId){ + // errorMsg 闅愯棌 + if(document.getElementsByClassName("errorMsg").length > 0){ + document.getElementsByClassName("errorMsg")[0].style.display="none"; + } + + let accountValue = ""; + let suffixUrl = ""; + if (document.querySelector("[data-id='Hospital_Name__c']")) { + let accountNodeId = document.querySelector("[data-id='Hospital_Name__c']").id + '_lkid'; + accountValue = document.getElementById(accountNodeId).value; + } + console.log(accountValue); + if(accountValue !='000000000000000'){ + suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + }else{ + suffixUrl = "?contactId="+contactNodeId; + } + let baseUrl = "/apex/SearchContactPage"; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + } + //绐楀彛鍏抽棴鏃跺彂鐢� + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page:form:contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id='Contact_Name__c']").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id='Contact_Name__c']").value = contactInfo.Name; + } + + //鏇挎崲vlookup + function replaceSearchContactLookup() { + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + if (!{!isNewMode}) { + //1. Query Contact from AWS by AWSDataId + queryContactName() + } + let parentNode = document.querySelector("[data-id='Contact_Name__c']").parentNode; + document.querySelector("[data-id='Contact_Name__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Contact_Name__c']").parentNode.children[2]); + } + + function queryContactName() { + let sfId = document.getElementById(document.querySelector("[data-id='Contact_Name__c']").id + '_lkid').value; + let contactsInfo = JSON.parse('{!LookUpOverrideFieldsMapJson}'); + let dataId = contactsInfo[sfId]; + // let queryContactBack = function(data){ + // //To Do later + // console.log('ContactData = ' + data.object); + + // document.querySelector("[data-id='Contact_Name__c']").value = data.object.lastName; + // } + // AWSService.query(staticResourcesContact.queryUrl, dataId, queryContactBack, staticResources.token); + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + document.querySelector("[data-id='Contact_Name__c']").value = result.object.lastName; + }) + } + + //For Lead Search + var leadHtmlString = '<img src="/img/s.gif" onclick="searchLead(\'page:form:leadId\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + var newSearchLeadWindow = null; + //绐楀彛鍏抽棴鏃跺彂鐢� + function closeLeadPopupWindow() { + if (null != newSearchLeadWindow) { + newSearchLeadWindow.close(); + } + let leadInfoStr = document.getElementById('page:form:leadId').value; + console.log('closePopup:'+leadInfoStr); + let leadInfo = JSON.parse(leadInfoStr); + let leadNodeId = document.querySelector("[data-id='Lead_link__c']").id + '_lkid'; + document.getElementById(leadNodeId).value = leadInfo.LeadId; + document.querySelector("[data-id='Lead_link__c']").value = leadInfo.Name; + } + function searchLead(leadNodeId){ + // let accountValue = ""; + // let suffixUrl = ""; + let suffixUrl = "?leadId="+leadNodeId; + let baseUrl = "/apex/SearchLeadPage"; + let newSearchLeadParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchLeadWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchLeadParam); + if (window.focus) { + newSearchLeadWindow.focus(); + } + return false; + } + //鏇挎崲鏌ユ壘Lead + function replaceSearchLeadLookup() { + let lookUpNode = htmlToElement(leadHtmlString); + console.log(lookUpNode); + if (!{!isNewMode}) { + //1. Query Lead from AWS by AWSDataId + queryLeadName() + } + let parentNode = document.querySelector("[data-id='Lead_link__c']").parentNode; + document.querySelector("[data-id='Lead_link__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Lead_link__c']").parentNode.children[2]); + } + function queryLeadName() { + let sfId = document.getElementById(document.querySelector("[data-id='Lead_link__c']").id + '_lkid').value; + let leadsInfo = JSON.parse('{!LookUpOverrideFieldsMapJson}'); + let dataId = leadsInfo[sfId]; + // let queryLeadBack = function(data){ + // //To Do later + // console.log('ContactData = ' + data.object); + + // document.querySelector("[data-id='Lead_link__c']").value = data.object.lastName; + // } + // AWSService.query(staticResourcesLead.queryUrl, dataId, queryLeadBack, staticResources.token); + let url = staticResourcesLead.queryUrl + '?dataId=' + dataId; + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + document.querySelector("[data-id='Lead_link__c']").value = result.object.lastName; + }) + } + + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <apex:inputHidden value="{!contactId}" id="contactId"/> + <apex:inputHidden value="{!leadId}" id="leadId"/> + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!Inquiry_form__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QuerySobjectFromAWS(); + unblockUI(); + } + //Replace Contact Vlookup Field + replaceSearchContactLookup(); + //Replace Lead Vlookup Field + replaceSearchLeadLookup(); + document.querySelectorAll("[data-id='OwnerId']")[0].classList.add("disabledbutton"); + document.querySelectorAll("[data-id='OwnerId']")[1].classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditInquiryForm.page-meta.xml b/force-app/main/default/pages/NewAndEditInquiryForm.page-meta.xml new file mode 100644 index 0000000..9dde4a7 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditInquiryForm.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditInquiryForm</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditInspectionReport.page b/force-app/main/default/pages/NewAndEditInspectionReport.page new file mode 100644 index 0000000..5038294 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditInspectionReport.page @@ -0,0 +1,436 @@ +<apex:page standardController="Inspection_Report__c" extensions="NewAndEditInspectionReportController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script> + + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f in config.AWSToSobjectNonEncryptedMap){ + let ele = GetEleByClass(config.ApiPrefix + "_"+ config.AWSToSobjectNonEncryptedMap[f]); + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele && data.object[f]){ + let arr = data.object[f].split(';'); + + // 缁欓殣钘忕殑select璧嬪�� + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + + // 鍒╃敤鎸夐挳缁欐樉绀虹殑select璧嬪�� + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + + + //document.querySelector("[data-id='Responsible_Person__c']").value = data.object.responsiblePersonHP; + //document.querySelector("[data-id='phone__c']").value = data.object.callerPhone; + //document.querySelector("[data-id='Email']").value = data.object.email; + }, + updateMethod:"NewAndEditInspectionReportController.saveInspectionReport", + insertMethod:"NewAndEditInspectionReportController.saveInspectionReport" + } + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormElement(tag_name){ + return ['input','select','textarea'].indexOf(tag_name)>-1; + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='Phone']"; + //Email + let email = document.querySelector(textEmail); + if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + error_msg += ';閭欢鏍煎紡閿欒'; + } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + + let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + let ele = nodelist[index]; + console.log('ele:'+ele) + let field_api_name = GetEleApiName(ele); + console.log('field_api_name:'+field_api_name) + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormElement(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name'+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + let targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets; + } else { + result[field_api_name] = ele.value; + } + + } + //let reporter = GetEleApiName(nodelist[5]) + //console.log('reporter:'+reporter); + result['Reporter__c'] = document.getElementById('page:form:block:j_id50:0:j_id51:j_id52:4:j_id53_lkid').value; + return result; + } + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + unblockUI(); + }; + + + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveSobjectProcess(save_and_new) { + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + console.log('sobjJson:'+sobjJson); + console.log('check:'+checkRequiredFieldMsgResult); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. lead to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!Inspection_Report__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QuerySobjectFromAWS(); + } + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditInspectionReport.page-meta.xml b/force-app/main/default/pages/NewAndEditInspectionReport.page-meta.xml new file mode 100644 index 0000000..42cf234 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditInspectionReport.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditInspectionReport</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditQIS.page b/force-app/main/default/pages/NewAndEditQIS.page new file mode 100644 index 0000000..63b4410 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditQIS.page @@ -0,0 +1,558 @@ +<apex:page standardController="QIS_Report__c" extensions="NewAndEditQISController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script> + + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectNonEncryptedMapKeySet:{!AWSToSobjectNonEncryptedMapKeySet}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + leadPIData.medicalStaffFullName = leadPIData.lastName;// 瀹屾垚field update workflow + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f of config.AWSToSobjectNonEncryptedMapKeySet){ + let ele = document.getElementById(api_id_map[config.AWSToSobjectNonEncryptedMap[f]]) + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele && data.object[f]){ + let arr = data.object[f].split(';'); + + // 缁欓殣钘忕殑select璧嬪�� + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + + // 鍒╃敤鎸夐挳缁欐樉绀虹殑select璧嬪�� + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + if(ele.type.indexOf("select")>-1 && ele.value){ + jQuery(ele).change() + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + + + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + // document.querySelector("[data-id='Phone']").value = data.object.phone; + // document.querySelector("[data-id='Email']").value = data.object.email; + }, + updateMethod:"NewAndEditQISController.saveQISReport", + insertMethod:"NewAndEditQISController.saveQISReport" + } + + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormTag(tag_name){ + return ['input','select','textarea'].indexOf(tag_name.toLowerCase())>-1; + } + + function IsFormElement(e){ + return IsFormTag(e.tagName); + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + //let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='Caller_phone__c']"; + //Email + // let email = document.querySelector(textEmail); + // if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + // error_msg += ';閭欢鏍煎紡閿欒'; + // } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + //api_id_map +//let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index in api_id_map) { + let ele = document.getElementById(api_id_map[index]); + let field_api_name = index; + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormTag(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name'+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + let targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets; + } else { + result[field_api_name] = ele.value; + } + + // let e1 = document.getElementById(api_id_map[field_api_name]); + // if(!result[field_api_name] && e1 && e1.value){ + // result[field_api_name] = e1.value; + // } + } + //璧嬪�煎瘜鏂囨湰鍖哄煙 + //闂鍐呭鎻忚堪锛堝浘鐗囷級-FSE-OCSM-OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:4:j_id51:j_id52:15:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.problem_detail_photo__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:4:j_id51:j_id52:15:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //闂鍐呭鎻忚堪锛堝浘鐗囷級-OSH鍥炵瓟瀹屾瘯-鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:5:j_id51:j_id52:15:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.problem_detail_photo__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:5:j_id51:j_id52:15:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖1 - OCSM-鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:14:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_1__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:14:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖2-OCSM-鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:14:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_2__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:14:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖3 -OCSM-鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:14:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_3__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:14:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖4 -OCSM-鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:14:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_4__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:14:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH1 - OCSM + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:19:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_1__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:19:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH2-OCSM + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:19:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_2__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:19:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH3 -OCSM + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:19:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_3__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:19:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH4 -OCSM + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:19:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_4__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:19:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH1 - OSH鍥炵瓟瀹屾瘯 + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:18:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_1__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:18:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH2-OSH鍥炵瓟瀹屾瘯 + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:18:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_2__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:18:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH3 -OSH鍥炵瓟瀹屾瘯 + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:18:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_3__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:18:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH4 -OSH鍥炵瓟瀹屾瘯 + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:18:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_4__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:18:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖1 - OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:13:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_1__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:13:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖2-OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:13:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_2__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:13:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖3 -OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:13:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_3__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:13:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖4 -OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:13:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_4__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:13:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH1 - OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:16:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_1__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:16:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH2-OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:16:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_2__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:16:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH3 -OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:16:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_3__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:16:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH4 -OSH + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:16:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_4__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:16:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH1 -鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:17:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_1__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:17:j_id51:j_id52:0:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH2-鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:17:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_2__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:17:j_id51:j_id52:1:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH3 -鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:17:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_3__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:17:j_id51:j_id52:2:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖OSH4 -鐜板満缁撴-final + if(document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:17:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']")){ + result.Photo_OSH_4__c = document.querySelector("[title = 'RTF 绶ㄨ集鍣�, page:form:block:j_id50:17:j_id51:j_id52:3:j_id53:textAreaDelegate_problem_detail_photo__c']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + return result; + } + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + unblockUI(); + }; + + + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveSobjectProcess(save_and_new) { + + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. lead to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!QIS_Report__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + var init_nodes = document.getElementsByClassName("PIBackApi"); + var api_id_map={}; + for(let e of init_nodes){ + if(IsFormElement(e)){ + api_id_map[GetEleApiName(e)] = e.id; + } + } + console.log(api_id_map); + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QuerySobjectFromAWS(); + } + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditQIS.page-meta.xml b/force-app/main/default/pages/NewAndEditQIS.page-meta.xml new file mode 100644 index 0000000..3ff5f53 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditQIS.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditQIS</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditRepairSubOrder.page b/force-app/main/default/pages/NewAndEditRepairSubOrder.page new file mode 100644 index 0000000..2a393ec --- /dev/null +++ b/force-app/main/default/pages/NewAndEditRepairSubOrder.page @@ -0,0 +1,575 @@ +<apex:page standardController="RepairSubOrder__c" extensions="NewAndEditRepairSubOrderController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f in config.AWSToSobjectNonEncryptedMap){ + let ele = GetEleByClass(config.ApiPrefix + "_"+ config.AWSToSobjectNonEncryptedMap[f]); + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele && data.object[f]){ + let arr = data.object[f].split(';'); + + // 缁欓殣钘忕殑select璧嬪�� + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + + // 鍒╃敤鎸夐挳缁欐樉绀虹殑select璧嬪�� + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + + + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + // document.querySelector("[data-id='Phone']").value = data.object.phone; + // document.querySelector("[data-id='Email']").value = data.object.email; + }, + updateMethod:"NewAndEditRepairSubOrderController.saveRepairSubOrder", + insertMethod:"NewAndEditRepairSubOrderController.saveRepairSubOrder" + } + + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormTag(tag_name){ + return ['input','select','textarea'].indexOf(tag_name.toLowerCase())>-1; + } + + function IsFormElement(tag_name){ + return ['input','select','textarea'].indexOf(tag_name)>-1; + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + // let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='RepairApplicantTel__c']"; + //Email + // let email = document.querySelector(textEmail); + // if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + // error_msg += ';閭欢鏍煎紡閿欒'; + // } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + + let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + let ele = nodelist[index]; + let field_api_name = GetEleApiName(ele); + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormElement(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name'+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + let targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets; + } else { + result[field_api_name] = ele.value; + } + } + return result; + } + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + unblockUI(); + }; + + + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveSobjectProcess(save_and_new) { + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. RepairSubOrder to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + + //鏇挎崲vlookup + var newSearchContactWindow = null; + var closeField = ''; + + function replaceSearchContactLookup() { + if (!{!isNewMode}) { + //1. Query Contact from AWS by AWSDataId + queryContactName() + } + if(document.querySelector("[data-id='Receiver__c']") != null){ + let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\',\'Receiver__c\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + let parentNode = document.querySelector("[data-id='Receiver__c']").parentNode; + document.querySelector("[data-id='Receiver__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Receiver__c']").parentNode.children[2]); + } + if(document.querySelector("[data-id='Applicanter__c']") != null){ + let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\',\'Applicanter__c\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + let parentNode = document.querySelector("[data-id='Applicanter__c']").parentNode; + document.querySelector("[data-id='Applicanter__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Applicanter__c']").parentNode.children[2]); + } + } + + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + + function queryContactName() { + let contactsInfo = JSON.parse('{!LookUpOverrideFieldsMapJson}'); + if(document.querySelector("[data-id='Receiver__c']") != null){ + let sfId = document.getElementById(document.querySelector("[data-id='Receiver__c']").id + '_lkid').value; + let dataId = contactsInfo[sfId]; + queryContactNameFetch(dataId, 'Receiver__c'); + + } + if(document.querySelector("[data-id='Applicanter__c']") != null){ + let sfId = document.getElementById(document.querySelector("[data-id='Applicanter__c']").id + '_lkid').value; + let dataId = contactsInfo[sfId]; + queryContactNameFetch(dataId, 'Applicanter__c'); + + } + } + function queryContactNameFetch(dataId, filedId){ + let queryContactBack = function(data){ + //To Do later + console.log('ContactData = ' + data.object); + + document.querySelector("[data-id="+filedId+"]").value = data.object.lastName; + } + AWSService.query(staticResourcesContact.queryUrl, dataId, queryContactBack, staticResources.token); + // fetch(url, { + // method: 'GET', + // headers: { + // 'Content-Type': 'application/json', + // 'pi-token': staticResources.token + // } + // }).then((data) => { + // return data.json(); + // }).then((result) => { + // if(result.object){ + // document.querySelector("[data-id="+filedId+"]").value = result.object.lastName; + // } + // }) + } + + + //鑷畾涔塴ookup鏌ヨ + function searchContact(contactNodeId,field){ + closeField = field; + let accountValue = ""; + if (document.querySelector("[data-id='Department__c']")) { + let accountNodeId = document.querySelector("[data-id='Department__c']").id + '_lkid'; + accountValue = document.getElementById(accountNodeId).value; + } + console.log('accountValue = ' + accountValue); + if(accountValue !='000000000000000'){ + suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + }else{ + suffixUrl = "?contactId="+contactNodeId; + } + let baseUrl = "/apex/SearchContactPage"; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + // if(true || accountValue !='000000000000000'){ + // let baseUrl = "/apex/SearchContactPage"; + // let suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + // let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + // newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + // if (window.focus) { + // newSearchContactWindow.focus(); + // } + // return false; + // }else{ + // alertErrorMessage('璇峰厛閫夋嫨绉戝!'); + // } + } + + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page:form:contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id="+closeField+"]").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id="+closeField+"]").value = contactInfo.Name; + + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <apex:inputHidden value="{!contactId}" id="contactId"/> + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!RepairSubOrder__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + var init_nodes = document.getElementsByClassName("PIBackApi"); + var api_id_map={}; + for(let e of init_nodes){ + if(IsFormElement(e)){ + api_id_map[GetEleApiName(e)] = e.id; + } + } + console.log(api_id_map); + + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QuerySobjectFromAWS(); + } + //Replace Vlookup Field + replaceSearchContactLookup(); + //3. Set Readonly Attribute + document.querySelectorAll("[data-id='OwnerId']")[0].classList.add("disabledbutton"); + document.querySelectorAll("[data-id='OwnerId']")[1].classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditRepairSubOrder.page-meta.xml b/force-app/main/default/pages/NewAndEditRepairSubOrder.page-meta.xml new file mode 100644 index 0000000..59ac902 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditRepairSubOrder.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditRepairSubOrder</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditReport.page b/force-app/main/default/pages/NewAndEditReport.page new file mode 100644 index 0000000..7b10a4b --- /dev/null +++ b/force-app/main/default/pages/NewAndEditReport.page @@ -0,0 +1,590 @@ +<apex:page standardController="Report__c" extensions="NewAndEditReportController" id="page"> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + + <script> + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + var redirectMode = 'Save';//1. Save 2. SaveAndNew + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var VLookUpFields = new Set(['Hospital_Reference__c', 'Department_Class_Ref__c', 'Daily_Report__c', 'OwnerId','Hospital_Department__c', + 'Competition_Company_Name__c','Report_OPDPlan__c','Loaner_request_no1__c','Practitioner1__c','Practitioner2__c','Practitioner3__c','Practitioner4__c', + 'Practitioner5__c','Opportunity1__c', + 'Opportunity2__c','Product01__c','Product1__c','Product2__c','Product3__c','Product4__c','Product5__c','Order_No__c','Person_In_Charge__c']); + var closeField = ''; + // var myCkeditor = null; + // try { + // myCkeditor = CKEDITOR; + // } catch (error) { + // console.log('娌℃湁CKEDITOR') + // } + + + //閿欒鎻愮ず + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:j_id5:msgContent"); + errorMsg = '閿欒锛氭棤鏁堟暟鎹��'+'\n' + errorMsg; + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + unblockUI(); + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:j_id5:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + + //1銆傝幏鍙栨墍鏈夊瓧娈靛�� + function getReportInformation() { + let nodelist = document.querySelectorAll("[data-id]"); + let result = {} + result.RecordTypeId = '{!rtTypeId}'; + for (let index = 0; index < nodelist.length; index++) { + if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) { + console.log(nodelist[index].id.indexOf('lkwgt')); + if (nodelist[index].id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = nodelist[index].id + '_lkid'; + let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value; + result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue; + } + } else if (nodelist[index].type == 'checkbox') { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked; + } else if (nodelist[index].type == 'select-multiple') { + //nodelist[index].getAttribute("data-id") + let multiple = nodelist[index].getAttribute("data-id"); + let targets = document.querySelector("[data-id=" + multiple + "]").nextSibling.children[0].children[1].children[2].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[nodelist[index].getAttribute("data-id")] = targets; + } else { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].value; + } + let x = index + 1; + if (x <= nodelist.length - 1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) { + index++; + } + } + //鎵嬫湳鍒嗙被1 + result.Technical_Category1__c = document.getElementById('page:form:j_id30:j_id60:4:j_id61:j_id62:2:j_id63')!=null?document.getElementById('page:form:j_id30:j_id60:4:j_id61:j_id62:2:j_id63').value:''; + //鎵嬫湳鍒嗙被2 + result.Technical_Category2__c = document.getElementById('page:form:j_id30:j_id60:4:j_id61:j_id62:4:j_id63')!=null?document.getElementById('page:form:j_id30:j_id60:4:j_id61:j_id62:4:j_id63').value:''; + //鐩殑2 + if(document.getElementById('page:form:j_id30:j_id60:3:j_id61:j_id62:1:j_id63')){ + result.Purpose2__c = document.getElementById('page:form:j_id30:j_id60:3:j_id61:j_id62:1:j_id63').value; + } + if(document.getElementById('page:form:j_id30:j_id60:2:j_id61:j_id62:1:j_id63')){ + result.Purpose2__c = document.getElementById('page:form:j_id30:j_id60:2:j_id61:j_id62:1:j_id63').value; + } + //瀵屾枃鏈璧嬪�� + //鐢ㄦ埛绛惧瓧鐨勭収鐗� + if(document.querySelector("[aria-describedby = 'cke_34']")){ + result.Customer_sigh_photo__c = document.querySelector("[aria-describedby = 'cke_34']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖1 Photo1__c + if(document.querySelector("[aria-describedby = 'cke_42']")){ + result.Photo1__c = document.querySelector("[aria-describedby = 'cke_42']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖2 Photo2__c + if(document.querySelector("[aria-describedby = 'cke_75']")){ + result.Photo2__c = document.querySelector("[aria-describedby = 'cke_75']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //鐓х墖3 Photo3__c + if(document.querySelector("[aria-describedby = 'cke_108']")){ + result.Photo3__c = document.querySelector("[aria-describedby = 'cke_108']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //瀵瑰簲缁撴灉 VOC_follow_up_result__c cke_38 + if(document.querySelector("[aria-describedby = 'cke_38']")){ + result.VOC_follow_up_result__c = document.querySelector("[aria-describedby = 'cke_38']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + //瀵瑰簲缁撴灉绗竴娆� VOC_follow_up_result1__c cke_71 + if(document.querySelector("[aria-describedby = 'cke_71']")){ + result.VOC_follow_up_result1__c = document.querySelector("[aria-describedby = 'cke_71']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + return result; + } + + //2.楠岃瘉瑙勫垯 + function validateFieldValueFormate() { + //VOC_Informer_Contact__c,Caller_phone_c__c + let error_msg = ''; + let textEmail = "[data-id=' Follow_staff_email__c']"; + let textPhone1 = "[data-id='VOC_Informer_Contact__c']"; + let textPhone2 = "[data-id='Caller_phone_c__c']"; + //Email + let email = document.querySelector(textEmail); + if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + error_msg += ';瀵瑰簲鑰�(閭)鏍煎紡閿欒'; + } + + let phone1 = document.querySelector(textPhone1); + if(phone1 && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone1.value)){ + error_msg += ';淇℃伅鎻愪緵浜鸿仈绯绘柟寮忥紙鐢佃瘽锛夊彿鐮侀敊璇�'; + } + + let phone2 = document.querySelector(textPhone2); + if(phone2 && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone2.value)){ + error_msg += ';鑱旂郴鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + //3.楠岃瘉蹇呭~瀛楁 + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + + //4.鑾峰彇瑕佸姞瀵嗙殑瀛楁 + function getPIPayload(reportJson) { + let reportPayloadList = []; + let reportPIData = new Object(); + reportPIData.vocInformerName = document.querySelector("[data-id='VOC_Informer_Name__c']")!=null?document.querySelector("[data-id='VOC_Informer_Name__c']").value:''; + reportPIData.callerPhone = document.querySelector("[data-id='Caller_phone_c__c']")!=null?document.querySelector("[data-id='Caller_phone_c__c']").value:''; + reportPIData.vocInformerContact = document.querySelector("[data-id='VOC_Informer_Contact__c']")!=null?document.querySelector("[data-id='VOC_Informer_Contact__c']").value:''; + reportPIData.personInChargeText = document.querySelector("[data-id='Person_In_Charge_Text__c']")!=null?document.querySelector("[data-id='Person_In_Charge_Text__c']").value:''; + reportPIData.professorSighText = document.querySelector("[data-id='Professor_sigh_text__c']")!=null?document.querySelector("[data-id='Professor_sigh_text__c']").value:''; + reportPIData.staffInfoManual = document.querySelector("[data-id='Staff_Info_Manual_c__c']")!=null?document.querySelector("[data-id='Staff_Info_Manual_c__c']").value:''; + reportPIData.responsiblePersonHP = document.querySelector("[data-id='Responsible_Person_HP_c__c']")!=null?document.querySelector("[data-id='Responsible_Person_HP_c__c']").value:''; + reportPIData.practitioner1Part = document.querySelector("[data-id='Practitioner1_Part__c']")!=null?document.querySelector("[data-id='Practitioner1_Part__c']").value:''; + reportPIData.practitioner2Part = document.querySelector("[data-id='Practitioner2_Part__c']")!=null?document.querySelector("[data-id='Practitioner2_Part__c']").value:''; + reportPIData.practitioner3Part = document.querySelector("[data-id='Practitioner3_Part__c']")!=null?document.querySelector("[data-id='Practitioner3_Part__c']").value:''; + reportPIData.practitioner4Part = document.querySelector("[data-id='Practitioner4_Part__c']")!=null?document.querySelector("[data-id='Practitioner4_Part__c']").value:''; + reportPIData.practitioner5Part = document.querySelector("[data-id='Practitioner5_Part__c']")!=null?document.querySelector("[data-id='Practitioner5_Part__c']").value:''; + reportPIData.age = document.querySelector("[data-id='age__c']")!=null?document.querySelector("[data-id='age__c']").value:''; + reportPIData.medicalHistory = document.querySelector("[data-id='Medical_History__c']")!=null?document.querySelector("[data-id='Medical_History__c']").value:''; + reportPIData.sex = document.querySelector("[data-id='sex__c']")!=null?document.querySelector("[data-id='sex__c']").value:''; + reportPayloadList.push(reportPIData); + return JSON.stringify(reportPayloadList); + } + + + + //5.鏂板缓鎴栫紪杈� + function ProcessPI(reportJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(reportJson, payloadForNewPI) + }else { + UpdatePIToAWS(reportJson, payloadForNewPI) + } + } + + //鏂板缓 + function NewPIToAWS(reportJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewAndEditReportController.saveReport}'; + AWSService.insert(staticResources.newUrl, reportJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack, redirectCallBack); + } + + //缂栬緫 + function UpdatePIToAWS(reportJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewAndEditReportController.saveReport}'; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, reportJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + } + + //鏌ヨ + function QueryLeadFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + + var queryBack = function queryBack(data) { + console.log('awsDataId = '+'{!AWSDataId}') + console.log('data = ' + JSON.stringify(data)); + var i = 0; + //璧嬪�� + document.querySelector("[data-id='VOC_Informer_Name__c']")!=null?document.querySelector("[data-id='VOC_Informer_Name__c']").value=data.object.vocInformerName.replace(/"/g,""):i++; + document.querySelector("[data-id='Caller_phone_c__c']")!=null?document.querySelector("[data-id='Caller_phone_c__c']").value=data.object.callerPhone.replace(/"/g,""):i++; + document.querySelector("[data-id='VOC_Informer_Contact__c']")!=null?document.querySelector("[data-id='VOC_Informer_Contact__c']").value=data.object.vocInformerContact.replace(/"/g,""):i++; + document.querySelector("[data-id='Person_In_Charge_Text__c']")!=null?document.querySelector("[data-id='Person_In_Charge_Text__c']").value=data.object.personInChargeText.replace(/"/g,""):i++; + document.querySelector("[data-id='Professor_sigh_text__c']")!=null?document.querySelector("[data-id='Professor_sigh_text__c']").value=data.object.professorSighText.replace(/"/g,""):i++; + document.querySelector("[data-id='Staff_Info_Manual_c__c']")!=null?document.querySelector("[data-id='Staff_Info_Manual_c__c']").value=data.object.staffInfoManual.replace(/"/g,""):i++; + document.querySelector("[data-id='Responsible_Person_HP_c__c']")!=null?document.querySelector("[data-id='Responsible_Person_HP_c__c']").value=data.object.responsiblePersonHP.replace(/"/g,""):i++; + document.querySelector("[data-id='Practitioner1_Part__c']")!=null?document.querySelector("[data-id='Practitioner1_Part__c']").value=data.object.practitioner1Part.replace(/"/g,""):i++; + document.querySelector("[data-id='Practitioner2_Part__c']")!=null?document.querySelector("[data-id='Practitioner2_Part__c']").value=data.object.practitioner2Part.replace(/"/g,""):i++; + document.querySelector("[data-id='Practitioner3_Part__c']")!=null?document.querySelector("[data-id='Practitioner3_Part__c']").value=data.object.practitioner3Part.replace(/"/g,""):i++; + document.querySelector("[data-id='Practitioner4_Part__c']")!=null?document.querySelector("[data-id='Practitioner4_Part__c']").value=data.object.practitioner4Part.replace(/"/g,""):i++; + document.querySelector("[data-id='Practitioner5_Part__c']")!=null?document.querySelector("[data-id='Practitioner5_Part__c']").value=data.object.practitioner5Part.replace(/"/g,""):i++; + document.querySelector("[data-id='age__c']")!=null?document.querySelector("[data-id='age__c']").value=data.object.age.replace(/"/g,""):i++; + document.querySelector("[data-id='Medical_History__c']")!=null?document.querySelector("[data-id='Medical_History__c']").value=data.object.medicalHistory.replace(/"/g,""):i++; + document.querySelector("[data-id='sex__c']")!=null?document.querySelector("[data-id='sex__c']").value=data.object.sex.replace(/"/g,""):i++; + }; + + //鏇挎崲vlookup + function replaceSearchContactLookup() { + if (!{!isNewMode}) { + queryContactName(); + } + if(document.querySelector("[data-id='Practitioner1__c']") != null){ + let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\',\'Practitioner1__c\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + let lookUpNode = htmlToElement(contactHtmlString); + let parentNode = document.querySelector("[data-id='Practitioner1__c']").parentNode; + document.querySelector("[data-id='Practitioner1__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Practitioner1__c']").parentNode.children[2]); + } + if(document.querySelector("[data-id='Practitioner2__c']") != null){ + let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\',\'Practitioner2__c\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + let lookUpNode = htmlToElement(contactHtmlString); + let parentNode = document.querySelector("[data-id='Practitioner2__c']").parentNode; + document.querySelector("[data-id='Practitioner2__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Practitioner2__c']").parentNode.children[2]); + } + if(document.querySelector("[data-id='Practitioner3__c']") != null){ + let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\',\'Practitioner3__c\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + let lookUpNode = htmlToElement(contactHtmlString); + let parentNode = document.querySelector("[data-id='Practitioner3__c']").parentNode; + document.querySelector("[data-id='Practitioner3__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Practitioner3__c']").parentNode.children[2]); + } + if(document.querySelector("[data-id='Practitioner4__c']") != null){ + let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\',\'Practitioner4__c\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + let lookUpNode = htmlToElement(contactHtmlString); + let parentNode = document.querySelector("[data-id='Practitioner4__c']").parentNode; + document.querySelector("[data-id='Practitioner4__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Practitioner4__c']").parentNode.children[2]); + } + if(document.querySelector("[data-id='Practitioner5__c']") != null){ + let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\',\'Practitioner5__c\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + let lookUpNode = htmlToElement(contactHtmlString); + let parentNode = document.querySelector("[data-id='Practitioner5__c']").parentNode; + document.querySelector("[data-id='Practitioner5__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Practitioner5__c']").parentNode.children[2]); + } + if(document.querySelector("[data-id='Person_In_Charge__c']") != null){ + let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\',\'Person_In_Charge__c\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + let lookUpNode = htmlToElement(contactHtmlString); + let parentNode = document.querySelector("[data-id='Person_In_Charge__c']").parentNode; + document.querySelector("[data-id='Person_In_Charge__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Person_In_Charge__c']").parentNode.children[2]); + } + } + var newSearchContactWindow = null; + + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + function queryContactName() { + let contactsInfo = JSON.parse('{!contactsInfo}'); + if(document.querySelector("[data-id='Practitioner1__c']") != null){ + let sfId = document.getElementById(document.querySelector("[data-id='Practitioner1__c']").id + '_lkid').value; + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + queryContactNameFetch(url,'Practitioner1__c'); + } + if(document.querySelector("[data-id='Practitioner2__c']") != null){ + let sfId = document.getElementById(document.querySelector("[data-id='Practitioner2__c']").id + '_lkid').value; + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + queryContactNameFetch(url,'Practitioner2__c'); + } + if(document.querySelector("[data-id='Practitioner3__c']") != null){ + let sfId = document.getElementById(document.querySelector("[data-id='Practitioner3__c']").id + '_lkid').value; + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + queryContactNameFetch(url,'Practitioner3__c'); + } + if(document.querySelector("[data-id='Practitioner4__c']") != null){ + let sfId = document.getElementById(document.querySelector("[data-id='Practitioner4__c']").id + '_lkid').value; + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + queryContactNameFetch(url,'Practitioner4__c'); + } + if(document.querySelector("[data-id='Practitioner5__c']") != null){ + let sfId = document.getElementById(document.querySelector("[data-id='Practitioner5__c']").id + '_lkid').value; + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + queryContactNameFetch(url,'Practitioner5__c'); + } + if(document.querySelector("[data-id='Person_In_Charge__c']") != null){ + let sfId = document.getElementById(document.querySelector("[data-id='Person_In_Charge__c']").id + '_lkid').value; + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + queryContactNameFetch(url,'Person_In_Charge__c'); + } + } + + function queryContactNameFetch(url,filedId){ + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + if(result.object){ + document.querySelector("[data-id="+filedId+"]").value = result.object.lastName; + } + }) + } + + //鑷畾涔塴ookup鏌ヨ + function searchContact(contactNodeId,field){ + closeField = field; + let accountValue = ""; + if (document.querySelector("[data-id='Hospital_Department__c']")) { + let accountNodeId = document.querySelector("[data-id='Hospital_Department__c']").id + '_lkid'; + accountValue = document.getElementById(accountNodeId).value; + } + console.log(accountValue); + if(accountValue !='000000000000000'){ + let baseUrl = "/apex/SearchContactPage"; + let suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + }else{ + alertErrorMessage('{!PIPL_Input_Account_Error_Msg}'); + } + } + //绐楀彛鍏抽棴鏃跺彂鐢� + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page:form:contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id="+closeField+"]").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id="+closeField+"]").value = contactInfo.Name; + } + + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + + //鏂板缓缂栬緫鍥炶皟鍑芥暟 + var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + console.log('Result from AWS' + result); + console.log('payloadJson=' + payloadJson); + payloadJson.VOC_Informer_Name__c = result.object[0].vocInformerName; + payloadJson.Caller_phone_c__c = result.object[0].callerPhone; + payloadJson.VOC_Informer_Contact__c = result.object[0].vocInformerContact; + payloadJson.Person_In_Charge_Text__c = result.object[0].personInChargeText; + payloadJson.Staff_Info_Manual_c__c = result.object[0].staffInfoManual; + payloadJson.Responsible_Person_HP_c__c = result.object[0].responsiblePersonHP; + payloadJson.Professor_sigh_text__c = result.object[0].professorSighText; + payloadJson.Practitioner1_Part__c = result.object[0].practitioner1Part; + payloadJson.Practitioner2_Part__c = result.object[0].practitioner2Part; + payloadJson.Practitioner3_Part__c = result.object[0].practitioner3Part; + payloadJson.Practitioner4_Part__c = result.object[0].practitioner4Part; + payloadJson.Practitioner5_Part__c = result.object[0].practitioner5Part; + payloadJson.age__c = result.object[0].age; + payloadJson.Medical_History__c = result.object[0].medicalHistory; + payloadJson.sex__c = result.object[0].sex; + + payloadJson.VOC_Informer_Name_Encrypted__c = result.object[0].vocInformerNameEncrypt; + payloadJson.Caller_phone_c_Encrypted__c = result.object[0].callerPhoneEncrypt; + payloadJson.VOC_Informer_Contact_Encrypted__c = result.object[0].vocInformerContactEncrypt; + payloadJson.Person_In_Charge_Text_Encrypted__c = result.object[0].personInChargeTextEncrypt; + payloadJson.Professor_sigh_text_Encrypted__c = result.object[0].professorSighTextEncrypt; + payloadJson.Staff_Info_Manual_c_Encrypted__c = result.object[0].staffInfoManualEncrypt; + payloadJson.Responsible_Person_HP_c_Encrypted__c = result.object[0].responsiblePersonHPEncrypt; + payloadJson.Practitioner1_Part_Encrypted__c = result.object[0].practitioner1PartEncrypt; + payloadJson.Practitioner2_Part_Encrypted__c = result.object[0].practitioner2PartEncrypt; + payloadJson.Practitioner3_Part_Encrypted__c = result.object[0].practitioner3PartEncrypt; + payloadJson.Practitioner4_Part_Encrypted__c = result.object[0].practitioner4PartEncrypt; + payloadJson.Practitioner5_Part_Encrypted__c = result.object[0].practitioner5PartEncrypt; + payloadJson.age_Encrypted__c = result.object[0].ageEncrypt; + payloadJson.Medical_History_Encrypted__c = result.object[0].medicalHistoryEncrypt; + payloadJson.sex_Encrypted__c = result.object[0].sexEncrypt; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = result.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + } + + //璺宠浆椤甸潰 + var redirectCallBack = function redirectCallBack(sfId,errorMessage) { + if(sfId){ + if(redirectMode == 'Save'){ + window.open('/' + sfId, '_self'); + }else if(redirectMode == 'SaveAndNew'){ + window.open('/setup/ui/recordtypeselect.jsp?ent=' + '{!sobjectId}' + '&retURL=/' + '{!sobjectPrefix}' + '/o&save_new_url=/' + '{!sobjectPrefix}' + '/e?retURL=%2F' + '{!sobjectPrefix}' + '%2Fo', '_self'); + } + }else{ + alertErrorMessage(errorMessage); + } + } + + //鐐瑰嚮淇濆瓨鎸夐挳 + function saveReportProcess(saveMode) { + redirectMode = saveMode; + console.log('redirectMode' + redirectMode); + hiddenErrorMsgNode(); + //1. Get report Information from Form + let reportJson = getReportInformation(); + //2. Validate the report field value formate, for example the email formate or phone formate + let validationResultMessage = validateFieldValueFormate(); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // 3. Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(reportJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('{!requiredErrorMsg}'+checkRequiredFieldMsgResult); + return + } + //4. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(reportJson); + console.log('鍔犲瘑瀛楁锛�'+payloadForNewPI); + + //5. report to AWS + ProcessPI(reportJson, payloadForNewPI); + } + </script> + + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="鎶ュ憡涔�" class="pageTitleIcon" title="鎶ュ憡涔�" /> + <h1 class="pageType">鎶ュ憡涔� + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> 鏂板缓鎶ュ憡涔�</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target=leads_edit.htm&section=Leads&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <apex:inputHidden value="{!contactId}" id="contactId" /> + <!-- Error Msg--> + <!-- <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> --> + <apex:pageblock > + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">鎶ュ憡涔︾紪杈�</h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveReportProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveReportProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + <br/> + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" showHeader="{!layoutSection.useHeader}" collapsible="{!layoutSection.allowCollapse}" + columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField html-data-id="{!layoutField.fieldAPI}" styleClass="{!layoutField.fieldAPI}" value="{!Report__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Lead Page:' + {!isNewMode}); + if (!{!isNewMode}) { + QueryLeadFromAWS(); + } + //Replace Vlookup Field + replaceSearchContactLookup(); + //3. Set Readonly Attribute + document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveReportProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveReportProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditReport.page-meta.xml b/force-app/main/default/pages/NewAndEditReport.page-meta.xml new file mode 100644 index 0000000..436e109 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditReport.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditReport</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewAndEditTenderinformation.page b/force-app/main/default/pages/NewAndEditTenderinformation.page new file mode 100644 index 0000000..8cfa411 --- /dev/null +++ b/force-app/main/default/pages/NewAndEditTenderinformation.page @@ -0,0 +1,434 @@ +<apex:page standardController="Tender_information__c" extensions="NewAndEditTenderinformationController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script> + + var config = {}; + config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + SaveAndNew:false, + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson}, + SobjectToAWSModel:function (sobjJson) { + let leadPayloadList = []; + let leadPIData = {}; + + for(let f in config.AWSToSobjectMap){ + if(sobjJson.hasOwnProperty(config.AWSToSobjectMap[f])){ + leadPIData[f] = sobjJson[config.AWSToSobjectMap[f]] + } + else{ + console.log(config.AWSToSobjectMap[f] + 'is not in sobjJson'); + } + } + + + leadPIData.sfRecordId = ''; + console.log('Sobject PI Data:' + leadPIData); + leadPayloadList.push(leadPIData); + console.log(JSON.stringify(leadPayloadList)); + return JSON.stringify(leadPayloadList); + }, + insertOrUpdateBack:function(payloadJson, r, isNewMode){ + + for(let f in config.AWSToSobjectMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + for(let f in config.AWSToSobjectEncryptedMap){ + if(r.object[0].hasOwnProperty(f)){ + payloadJson[config.AWSToSobjectEncryptedMap[f]] = r.object[0][f]; + } + else{ + console.log(f + 'is not in r.object[0]'); + } + } + + //payloadJson.AWS_Data_Id__c = r.object[0].dataId; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + return payloadJson; + }, + queryBack:function (data) { + console.log('data = ' + data); + if(data.object){ + for(let f in config.AWSToSobjectNonEncryptedMap){ + let ele = GetEleByClass(config.ApiPrefix + "_"+ config.AWSToSobjectNonEncryptedMap[f]); + if(data.object.hasOwnProperty(f) && ele){ + + // 澶氶�夌壒娈婂鐞� + if(ele.type == 'select-multiple'){ + //let me = GetEleByClass(config.ApiPrefix+'_'+field_api_name); + if(ele && data.object[f]){ + let arr = data.object[f].split(';'); + + // 缁欓殣钘忕殑select璧嬪�� + for(let op of ele.options){ + op.selected = arr.indexOf(op.value)>-1; + } + + // 鍒╃敤鎸夐挳缁欐樉绀虹殑select璧嬪�� + let ra = document.getElementById(ele.id + '_right_arrow'); + if(ra){ + ra.click(); + } + + } + }else{ + ele.value = data.object[f]; + } + + } + else{ + console.log(f + 'is not in data.object'); + } + } + } + else{ + console.log('data.object = ' + data.object); + } + + + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + // document.querySelector("[data-id='Phone']").value = data.object.phone; + // document.querySelector("[data-id='Email']").value = data.object.email; + }, + updateMethod:"NewAndEditTenderinformationController.saveTenderinformation", + insertMethod:"NewAndEditTenderinformationController.saveTenderinformation" + } + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + console.log('{!staticResource}'); + var VLookUpFields = {! VLookUpFieldsJson}; + function ProcessPI(sobjJson, payloadForNewPI) { + blockme(); + if ({!isNewMode}) { + NewPIToAWS(sobjJson, payloadForNewPI) + }else { + UpdatePIToAWS(sobjJson, payloadForNewPI) + } + } + + var GetEleByClass = function(class_name){ + let eles = document.getElementsByClassName(class_name); + if(eles.length > 0) return eles[0]; + return null; + } + + var GetEleApiName = function(ele){ + for(let c of ele.classList){ + if(c.indexOf(config.ApiPrefix+'_')>-1){ + return c.replace(config.ApiPrefix+'_',''); + } + } + return ''; + } + + function IsFormElement(tag_name){ + return ['input','select','textarea'].indexOf(tag_name)>-1; + } + + function getPIPayload(sobjJson) { + return config.SobjectToAWSModel(sobjJson); + } + + function validateFieldValueFormate() { + let error_msg = ''; + let textEmail = "[data-id='Email']"; + let textPhone = "[data-id='Phone']"; + //Email + let email = document.querySelector(textEmail); + if(email && !/^[\w-]{3,12}@[\da-zA-Z]{2,16}\.[a-zA-Z]+$/.test(email.value)){ + error_msg += ';閭欢鏍煎紡閿欒'; + } + let phone = document.querySelector(textPhone); + + if(phone && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){ + error_msg += ';鐢佃瘽鍙风爜閿欒'; + } + + for(let e of document.getElementsByTagName('select')){ + for(let op of e.options){ + if(op.value == "*****" && op.selected){ + error_msg += ';涓嬫媺妗嗕笉鑳戒富鍔ㄩ�夋嫨瀵嗘枃閫夐」'; + } + } + } + + if(error_msg.length>0 && error_msg[0]== ';'){ + error_msg = error_msg.substring(1); + } + + return error_msg; + } + + function getSobjectInformation() { + + let nodelist = document.getElementsByClassName(config.ApiPrefix); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + let ele = nodelist[index]; + let field_api_name = GetEleApiName(ele); + let tag_name = ele.tagName.toLowerCase(); + if(!IsFormElement(tag_name)){ + console.log('tag_name='+tag_name+',field_api_name'+field_api_name+' is not a form element'); + continue; + } + + if (VLookUpFields.indexOf(field_api_name)>=0) { + console.log(ele.id.indexOf('lkwgt')); + if (ele.id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = ele.id + '_lkid'; + let vlook_ele = document.getElementById(vlookUpNodeId); + let v = ''; + if(vlook_ele){ + v = vlook_ele.value; + }else{ + v = ele.value; + } + + if(v && v != "000000000000000"){ + result[field_api_name] = v; + } + + } + } else if (ele.type == 'checkbox') { + result[field_api_name] = ele.checked; + } else if (ele.type == 'select-multiple') { + //field_api_name + let multiple = field_api_name; + //let targets = GetEleByClass(config.ApiPrefix+'_'+field_api_name).parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + let targets = []; + for(let i = 0; i < ele.selectedOptions.length; i++) { + //let ele = nodelist[i]; + //targets = targets.replace(ele.selectedOptions[i].value,";"); + targets.push(ele.selectedOptions[i].value); + } + //targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[field_api_name] = targets.join(";"); + } else { + result[field_api_name] = ele.value; + } + } + return result; + } + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + function queryBack(data) { + console.log('data = ' + data); + config.queryBack(data); + unblockUI(); + }; + + + function insertOrUpdateBack(payloadJson, result, isNewMode) { + console.log(result); + let r = result; + console.log('Result from AWS' + r); + console.log('payloadJson=' + payloadJson); + return config.insertOrUpdateBack(payloadJson, r, isNewMode); + } + + function redirectCallBack(sfId,errorMsg) { + unblockUI(); + if(errorMsg){ + alertErrorMessage(errorMsg); + } + else{ + if(config.SaveAndNew){ + window.open('{! SaveAndNewButtonUrl }','_self'); + }else{ + window.open('/' + sfId, '_self'); + } + } + + } + + function UpdatePIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.updateMethod; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, sobjJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack,redirectCallBack); + + } + + function NewPIToAWS(sobjJson, payloadForNewPI) { + let controllerSaveMethod = config.insertMethod; + AWSService.insert(staticResources.newUrl, sobjJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack,redirectCallBack); + + } + + + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for(i = 0;i<requiredFieldAPIList.length;i++){ + if(formData[requiredFieldAPIList[i]]){ + continue; + }else{ + if(blankRequiredFields == ''){ + blankRequiredFields =blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + }else{ + blankRequiredFields =blankRequiredFields+',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + function saveSobjectProcess(save_and_new) { + if(save_and_new){ + config.SaveAndNew = true; + } + + hiddenErrorMsgNode(); + //1. Get Sobject Information from Form + let sobjJson = getSobjectInformation(); + //2. Validate the Sobject field value formate, for example the email formate or phone formate + + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage(validationResultMessage); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(sobjJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('requiredErrorMsg' + checkRequiredFieldMsgResult); + return + } + // //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(sobjJson); + + // //4. Get Authentication Information for AWS + // loadAWSAuthentication(); + + // //5. lead to AWS + ProcessPI(sobjJson, payloadForNewPI); + // awsToken = TestToken; + // NewPIToAWS(sobjJson,awsToken, payloadForNewPI) + } + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + } + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="{! SobjectLabel}" class="pageTitleIcon" title="{! SobjectLabel}" /> + <h1 class="pageType">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText> + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> <apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText>{! SobjectLabel}</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target={!sobjectTypeValue}s_edit.htm&section={!sobjectTypeValue}s&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + + <apex:pageblock id="block"> + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">{! SobjectLabel}<apex:outputText rendered="{!isNewMode}">{!$Label.New}</apex:outputText><apex:outputText rendered="{!not(isNewMode)}">{!$Label.Edit}</apex:outputText></h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess(1)" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Error Msg--> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField styleClass="{!ApiPrefix} {!ApiPrefix}_{!layoutField.fieldAPI}" html-data-id="{!layoutField.fieldAPI}" value="{!Tender_information__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + sfdcPage.appendToOnloadQueue(function () { + //1. Set Last Name label + //document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '濮撳悕'; + //2. Query AWS Data by dataId + console.log('Mode for Sobject Page:' + {!isNewMode}); + if (!{!isNewMode}) { + bolckme(); + QuerySobjectFromAWS(); + } + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="{!$Label.Save}" onclick="saveSobjectProcess()" /> + <input class="btn" type="Button" value="{!$Label.SaveAndNew}" onclick="saveSobjectProcess()" /> + <apex:commandButton action="{!cancel}" value="{!$Label.Cancel}" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewAndEditTenderinformation.page-meta.xml b/force-app/main/default/pages/NewAndEditTenderinformation.page-meta.xml new file mode 100644 index 0000000..1995d9f --- /dev/null +++ b/force-app/main/default/pages/NewAndEditTenderinformation.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewAndEditTenderinformation</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewConsumApply.page b/force-app/main/default/pages/NewConsumApply.page new file mode 100644 index 0000000..46a0c55 --- /dev/null +++ b/force-app/main/default/pages/NewConsumApply.page @@ -0,0 +1,402 @@ +<apex:page standardController="Consum_Apply__c" extensions="NewConsumApplyController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + //Initial Required Information + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var VLookUpFields = new Set(['Loaner_medical_Staff__c', 'Hospital__c', 'Strategic_dept__c', 'Account__c', 'QIS_number__c', 'OPDPlan__c', 'Campaign__c', 'Rental_Apply__c', 'Shipment_address__c', 'Dealer__c', 'Old_Consum_Apply__c', 'DeliverySlip__c', 'OwnerId', 'OPD__c']); + var userVLookUpFields = ['Person_In_Charge__c', 'applyUser__c', 'CC_EmailUser__c', 'Assign_Person__c', 'Consum_Assistant__c', 'Consum_Assistant2__c', 'Consum_Assistant3__c', 'SalesManager__c', 'ZongjianApprovalManager__c', 'BuchangApprovalManagerSales__c', 'TongkuoZongjian__c']; + var redirectMode = 'Save'; + + //Redirect Required Parameter + var redirectCallBack = function redirectCallBack(sfId,errorMessage) { + if(sfId){ + if (redirectMode == 'Save') { + window.open('/' + sfId, '_self'); + } else if (redirectMode == 'SaveAndNew') { + window.open('/a3i/e', '_self'); + } + }else{ + // alert(errorMessage); + alertErrorMessage(errorMessage); + } + } + + //Query Required Parameter + var queryBack = function queryBack(data) { + console.log('data = ' + data); + document.querySelector("[data-id='Phone_number__c']").value = data.object.phoneNumber; + document.querySelector("[data-id='direct_shippment_address__c']").value = data.object.directShippmentAddress; + unblockUI(); + }; + + //Check If Insert Or Update + var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) { + debugger + console.log(result); + let r = result; + console.log('Result from AWS' + JSON.stringify(r)); + console.log('payloadJson=' + JSON.stringify(payloadJson)); + payloadJson.Phone_number__c = r.object[0].phoneNumber; + payloadJson.direct_shippment_address__c = r.object[0].directShippmentAddress; + payloadJson.Phone_Number_Encrypt__c = r.object[0].phoneNumberEncrypt; + payloadJson.Direct_Shippment_Address_Encrypt__c = r.object[0].directShippmentAddressEncrypt; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + debugger + return payloadJson; + } + + // New Or Edit + function ProcessPI(consumApplyJson, payloadForNewPI) { + blockme(); + if ({!isNewMode + }) { + NewPIToAWS(consumApplyJson, payloadForNewPI) + }else { + UpdatePIToAWS(consumApplyJson, payloadForNewPI) + } + } + + //Get Sensitive Information + function getPIPayload(consumApplyJson) { + let consumApplyPayloadList = []; + let phoneNumber = consumApplyJson.Phone_number__c; + let directShippmentAddress = consumApplyJson.direct_shippment_address__c; + let consumApplyPIData = new Object(); + consumApplyPIData.phoneNumber = phoneNumber; + consumApplyPIData.directShippmentAddress = directShippmentAddress; + consumApplyPIData.sfRecordId = ''; + console.log('consumApply PI Data:' + JSON.stringify(consumApplyPIData)); + consumApplyPayloadList.push(consumApplyPIData); + console.log(JSON.stringify(consumApplyPayloadList)); + return JSON.stringify(consumApplyPayloadList); + } + + //Check Validate Field Value + function validateFieldValueFormate() { + return true; + // let textEmail = "[data-id='Loaner_centre_mail_address__c']"; + // let textPhone = "[data-id='Phone_number__c']"; + // //Email + // let email = document.querySelector(textEmail).value; + // let phone = document.querySelector(textPhone).value; + + // let regEmail = /^[\w-]{3,12}@[\da-zA-Z]{2,6}\.[a-zA-Z]+$/; + // let regPhone = /^1[3|5|8|7][0-9]\d{4,8}$/; + + // let emailFormate = regEmail.test(email); + // let phoneFormate = regPhone.test(phone); + + // console.log(emailFormate); + // console.log(phoneFormate); + + // if (emailFormate == true && phoneFormate == true) { + // return true; + // } else { + // return false; + // } + } + + //Get Page Information + function getConsumApplyInformation() { + let nodelist = document.querySelectorAll("[data-id]"); + let result = {} + //瀵屾枃鏈� + if(document.querySelector("[aria-describedby = 'cke_34']")){ + result.HP_received_sign_rich__c = document.querySelector("[aria-describedby = 'cke_34']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + for (let index = 0; index < nodelist.length; index++) { + if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) { + console.log(nodelist[index].id.indexOf('lkwgt')); + if (nodelist[index].id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = nodelist[index].id + '_lkid'; + let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value; + result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue; + } + } else if (nodelist[index].type == 'checkbox') { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked; + } else if (nodelist[index].type == 'select-multiple') { + //nodelist[index].getAttribute("data-id") + let multiple = nodelist[index].getAttribute("data-id"); + let targets = document.querySelector("[data-id=" + multiple + "]").parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[nodelist[index].getAttribute("data-id")] = targets; + } else { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].value; + } + let x = index + 1; + if (x <= nodelist.length - 1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) { + index++; + } + } + for (let i = 0; i < userVLookUpFields.length; i++) { + let userVlookUpNodeValue = document.querySelector("[data-id='" + userVLookUpFields[i] + "']").children[1].value; + console.log('userVlookUpNodeValue:'+userVlookUpNodeValue); + if(userVlookUpNodeValue!='000000000000000'){ + result[userVLookUpFields[i]] = userVlookUpNodeValue; + } + } + console.log(JSON.stringify(result)); + return result; + } + + //Query from AWS + function QueryConsumApplyFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + + //Update Sensitive Information to AWS + function UpdatePIToAWS(consumApplyJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewConsumApplyController.saveConsumApply}'; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, consumApplyJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack, redirectCallBack); + } + + //Insert Sensitive Information to AWS + function NewPIToAWS(consumApplyJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewConsumApplyController.saveConsumApply}'; + AWSService.insert(staticResources.newUrl, consumApplyJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack, redirectCallBack); + } + + //Check Required Fields + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for (i = 0; i < requiredFieldAPIList.length; i++) { + if (formData[requiredFieldAPIList[i]]) { + continue; + } else { + if (blankRequiredFields == '') { + blankRequiredFields = blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } else { + blankRequiredFields = blankRequiredFields + ',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + + //Base Process + function saveConsumApplyProcess(saveMode) { + redirectMode = saveMode; + console.log('redirectMode' + redirectMode); + hiddenErrorMsgNode(); + //1. Get consumApply Information from Form + let consumApplyJson = getConsumApplyInformation(); + //2. Validate the consumApply field value formate, for example the email formate or phone formate + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (!validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage('閭鏍煎紡杈撳叆鏈夎锛岃閲嶆柊杈撳叆锛�'); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(consumApplyJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('{!Input_Required_Field_Msg}' + checkRequiredFieldMsgResult); + return + } + //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(consumApplyJson); + + //4. consumApply to AWS + ProcessPI(consumApplyJson, payloadForNewPI); + } + + //Alert Error Message + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsg = '閿欒锛氭棤鏁堟暟鎹��' + '\n' + errorMsg; + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + unblockUI(); + } + + //Hide Error Message + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + //鏇挎崲vlookup + function replaceSearchContactLookup() { + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + if (!{!isNewMode}) { + queryContactName(); + } + let parentNode = document.querySelector("[data-id='Loaner_medical_Staff__c']").parentNode; + document.querySelector("[data-id='Loaner_medical_Staff__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Loaner_medical_Staff__c']").parentNode.children[2]); + } + var newSearchContactWindow = null; + var contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + function queryContactName() { + let sfId = document.getElementById(document.querySelector("[data-id='Loaner_medical_Staff__c']").id + '_lkid').value; + let contactsInfo = JSON.parse('{!contactsInfo}'); + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + document.querySelector("[data-id='Loaner_medical_Staff__c']").value = result.object.lastName; + }) + } + //鑷畾涔塴ookup鏌ヨ + function searchContact(contactNodeId){ + let accountValue = ""; + if (document.querySelector("[data-id='Account__c']")) { + let accountNodeId = document.querySelector("[data-id='Account__c']").id + '_lkid'; + accountValue = document.getElementById(accountNodeId).value; + } + console.log(accountValue); + if(accountValue !='000000000000000'){ + let baseUrl = "/apex/SearchContactPage"; + let suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + }else{ + alertErrorMessage('{!PIPL_Input_Account_Error_Msg}'); + } + } + //绐楀彛鍏抽棴鏃跺彂鐢� + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page:form:contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id='Loaner_medical_Staff__c']").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id='Loaner_medical_Staff__c']").value = contactInfo.Name; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="鑰楁潗澶囧搧鐢宠" class="pageTitleIcon" title="鑰楁潗澶囧搧鐢宠" /> + <h1 class="pageType">鑰楁潗澶囧搧鐢宠缂栬緫 + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> 鏂板缓鑰楁潗澶囧搧鐢宠</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target=consumApplys_edit.htm&section=consumApplys&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <apex:inputHidden value="{!contactId}" id="contactId"/> + <!-- Error Msg--> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + <apex:pageblock > + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">鑰楁潗澶囧搧鐢宠缂栬緫</h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveConsumApplyProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveConsumApplyProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField html-data-id="{!layoutField.fieldAPI}" value="{!Consum_Apply__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + //Append Page + sfdcPage.appendToOnloadQueue(function () { + //2. Query AWS Data by dataId + console.log('Mode for consumApply Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QueryConsumApplyFromAWS(); + }; + //Replace Vlookup Field + replaceSearchContactLookup(); + document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveConsumApplyProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveConsumApplyProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewConsumApply.page-meta.xml b/force-app/main/default/pages/NewConsumApply.page-meta.xml new file mode 100644 index 0000000..51a02be --- /dev/null +++ b/force-app/main/default/pages/NewConsumApply.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewConsumApply</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewConsumApplyEquipmentSetDetail.page b/force-app/main/default/pages/NewConsumApplyEquipmentSetDetail.page new file mode 100644 index 0000000..044e42b --- /dev/null +++ b/force-app/main/default/pages/NewConsumApplyEquipmentSetDetail.page @@ -0,0 +1,300 @@ +<apex:page standardController="Consum_Apply_Equipment_Set_Detail__c" extensions="NewConsumApplyEquipSetDetailController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + //Initial Required Information + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var VLookUpFields = new Set(['Consum_Apply__c','Consum_Apply_Equipment_Set__c','Asset__c','Canceled__c','DeliverySlip__c','Return_DeliverySlip__c']); + var userVLookUpFields = ['Follower_User__c','Consum_Assign_Person__c','Asset_Center_Confirm_Staff__c','Return_Operator__c','Return_wh_chenk_staff__c','Cancel_Mem__c','Lost_item_check_staff__c','Lost_item_check_staff_Final__c']; + var redirectMode = 'Save'; + + //Redirect Required Parameter + var redirectCallBack = function redirectCallBack(sfId, errorMessage) { + if (sfId) { + if (redirectMode == 'Save') { + window.open('/' + sfId, '_self'); + } else if (redirectMode == 'SaveAndNew') { + window.open('/setup/ui/recordtypeselect.jsp?ent=' + '{!sobjecttypeForFrontEnd}' + '&retURL=/' + '{!sobjectPrefix}' + '/o&save_new_url=/' + '{!sobjectPrefix}' + '/e?retURL=%2F' + '{!sobjectPrefix}' + '%2Fo', '_self'); + } + } else { + // alert(errorMessage); + alertErrorMessage(errorMessage); + } + } + + //Query Required Parameter + var queryBack = function queryBack(data) { + console.log('data = ' + data); + document.querySelector("[data-id='Trial_User__c']").value = data.object.trialUser; + unblockUI(); + }; + + //Check If Insert Or Update + var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) { + debugger + console.log(result); + let r = result; + console.log('Result from AWS' + JSON.stringify(r)); + console.log('payloadJson=' + JSON.stringify(payloadJson)); + payloadJson.Trial_User__c = r.object[0].trialUser; + payloadJson.Trail_User_Encrypt__c = r.object[0].trialUserEncrypt; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + debugger + return payloadJson; + } + + // New Or Edit + function ProcessPI(consumApplyJson, payloadForNewPI) { + blockme(); + if ({!isNewMode + }) { + NewPIToAWS(consumApplyJson, payloadForNewPI) + }else { + UpdatePIToAWS(consumApplyJson, payloadForNewPI) + } + } + + //Get Sensitive Information + function getPIPayload(consumApplyJson) { + let consumApplyPayloadList = []; + let trialUser = consumApplyJson.Trial_User__c; + let consumApplyPIData = new Object(); + consumApplyPIData.trialUser = trialUser; + consumApplyPIData.sfRecordId = ''; + console.log('consumApply PI Data:' + JSON.stringify(consumApplyPIData)); + consumApplyPayloadList.push(consumApplyPIData); + console.log(JSON.stringify(consumApplyPayloadList)); + return JSON.stringify(consumApplyPayloadList); + } + + //Check Validate Field Value + function validateFieldValueFormate() { + return true; + } + + //Get Page Information + function getConsumApplyInformation() { + let nodelist = document.querySelectorAll("[data-id]"); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) { + console.log(nodelist[index].id.indexOf('lkwgt')); + if (nodelist[index].id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = nodelist[index].id + '_lkid'; + let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value; + result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue; + } + } else if (nodelist[index].type == 'checkbox') { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked; + } else if (nodelist[index].type == 'select-multiple') { + //nodelist[index].getAttribute("data-id") + let multiple = nodelist[index].getAttribute("data-id"); + let targets = document.querySelector("[data-id=" + multiple + "]").parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[nodelist[index].getAttribute("data-id")] = targets; + } else { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].value; + } + let x = index + 1; + if (x <= nodelist.length - 1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) { + index++; + } + } + for (let i = 0; i < userVLookUpFields.length; i++) { + let userVlookUpNodeValue = document.querySelector("[data-id='" + userVLookUpFields[i] + "']").children[1].value; + console.log('userVlookUpNodeValue:'+userVlookUpNodeValue); + if(userVlookUpNodeValue!='000000000000000'){ + result[userVLookUpFields[i]] = userVlookUpNodeValue; + } + } + console.log(JSON.stringify(result)); + return result; + } + + //Query from AWS + function QueryConsumApplyFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + + //Update Sensitive Information to AWS + function UpdatePIToAWS(consumApplyJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewConsumApplyEquipSetDetailController.saveConsumApply}'; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, consumApplyJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack, redirectCallBack); + } + + //Insert Sensitive Information to AWS + function NewPIToAWS(consumApplyJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewConsumApplyEquipSetDetailController.saveConsumApply}'; + AWSService.insert(staticResources.newUrl, consumApplyJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack, redirectCallBack); + } + + //Check Required Fields + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for (i = 0; i < requiredFieldAPIList.length; i++) { + if (formData[requiredFieldAPIList[i]]) { + continue; + } else { + if (blankRequiredFields == '') { + blankRequiredFields = blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } else { + blankRequiredFields = blankRequiredFields + ',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + + //Base Process + function saveConsumApplyProcess(saveMode) { + redirectMode = saveMode; + console.log('redirectMode' + redirectMode); + hiddenErrorMsgNode(); + //1. Get consumApply Information from Form + let consumApplyJson = getConsumApplyInformation(); + //2. Validate the consumApply field value formate, for example the email formate or phone formate + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (!validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage('閭鏍煎紡杈撳叆鏈夎锛岃閲嶆柊杈撳叆锛�'); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(consumApplyJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('{!Input_Required_Field_Msg}' + checkRequiredFieldMsgResult); + return + } + //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(consumApplyJson); + + //4. consumApply to AWS + ProcessPI(consumApplyJson, payloadForNewPI); + } + + //Alert Error Message + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsg = '閿欒锛氭棤鏁堟暟鎹��' + '\n' + errorMsg; + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + unblockUI(); + } + + //Hide Error Message + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="鑰楁潗澶囧搧閰嶅涓�瑙堟槑缁�" class="pageTitleIcon" title="鑰楁潗澶囧搧閰嶅涓�瑙堟槑缁�" /> + <h1 class="pageType">鑰楁潗澶囧搧閰嶅涓�瑙堟槑缁嗙紪杈� + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription">鏂板缓鑰楁潗澶囧搧閰嶅涓�瑙堟槑缁�</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target=consumApplys_edit.htm&section=consumApplys&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <!-- Error Msg--> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + <apex:pageblock > + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">鑰楁潗澶囧搧閰嶅涓�瑙堟槑缁嗙紪杈�</h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveConsumApplyProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveConsumApplyProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField html-data-id="{!layoutField.fieldAPI}" value="{!Consum_Apply_Equipment_Set_Detail__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + //Append Page + sfdcPage.appendToOnloadQueue(function () { + //2. Query AWS Data by dataId + console.log('Mode for consumApply Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QueryConsumApplyFromAWS(); + }; + document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveConsumApplyProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveConsumApplyProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewConsumApplyEquipmentSetDetail.page-meta.xml b/force-app/main/default/pages/NewConsumApplyEquipmentSetDetail.page-meta.xml new file mode 100644 index 0000000..abb57fa --- /dev/null +++ b/force-app/main/default/pages/NewConsumApplyEquipmentSetDetail.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewConsumApplyEquipmentSetDetail</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewListOfConsumables.page b/force-app/main/default/pages/NewListOfConsumables.page new file mode 100644 index 0000000..f654d6a --- /dev/null +++ b/force-app/main/default/pages/NewListOfConsumables.page @@ -0,0 +1,2 @@ +<apex:page > +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewListOfConsumables.page-meta.xml b/force-app/main/default/pages/NewListOfConsumables.page-meta.xml new file mode 100644 index 0000000..39b292b --- /dev/null +++ b/force-app/main/default/pages/NewListOfConsumables.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewListOfConsumables</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewOnCall.page b/force-app/main/default/pages/NewOnCall.page new file mode 100644 index 0000000..8e63d39 --- /dev/null +++ b/force-app/main/default/pages/NewOnCall.page @@ -0,0 +1,298 @@ +<apex:page standardController="On_Call__c" extensions="OnCallController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + //Initial Required Information + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var VLookUpFields = new Set(['segment__c','Hospital__c','Oncall_Equipment__c','OwnerId']); + var redirectMode = 'Save'; + + //Redirect Required Parameter + var redirectCallBack = function redirectCallBack(sfId, errorMessage) { + if (sfId) { + if (redirectMode == 'Save') { + window.open('/' + sfId, '_self'); + } else if (redirectMode == 'SaveAndNew') { + window.open('/setup/ui/recordtypeselect.jsp?ent=' + '{!sobjecttypeForFrontEnd}' + '&retURL=/' + '{!sobjectPrefix}' + '/o&save_new_url=/' + '{!sobjectPrefix}' + '/e?retURL=%2F' + '{!sobjectPrefix}' + '%2Fo', '_self'); + } + } else { + // alert(errorMessage); + alertErrorMessage(errorMessage); + } + } + + //Query Required Parameter + var queryBack = function queryBack(data) { + console.log('data = ' + data); + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id1:0:j_id2']").value = data.object.callerPhone; + document.querySelector("[data-id='Responsible_Person_HP__c']").value = data.object.responsiblePersonHP; + unblockUI(); + }; + + //Check If Insert Or Update + var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) { + debugger + console.log(result); + let r = result; + console.log('Result from AWS' + JSON.stringify(r)); + console.log('payloadJson=' + JSON.stringify(payloadJson)); + payloadJson.Caller_phone__c = r.object[0].callerPhone; + payloadJson.Responsible_Person_HP__c = r.object[0].responsiblePersonHP; + payloadJson.Caller_Phone_Encrypt__c = r.object[0].callerPhoneEncrypt; + payloadJson.Responsible_PersonHP_Encrypt__c = r.object[0].responsiblePersonHPEncrypt; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + debugger + return payloadJson; + } + + // New Or Edit + function ProcessPI(onCallJson, payloadForNewPI) { + blockme(); + if ({!isNewMode + }) { + NewPIToAWS(onCallJson, payloadForNewPI) + }else { + UpdatePIToAWS(onCallJson, payloadForNewPI) + } + } + + //Get Sensitive Information + function getPIPayload(onCallJson) { + let onCallPayloadList = []; + let callerPhone = onCallJson.Caller_phone__c; + let responsiblePersonHP = onCallJson.Responsible_Person_HP__c; + let onCallPIData = new Object(); + onCallPIData.callerPhone = callerPhone; + onCallPIData.responsiblePersonHP = responsiblePersonHP; + onCallPIData.sfRecordId = ''; + console.log('onCall PI Data:' + JSON.stringify(onCallPIData)); + onCallPayloadList.push(onCallPIData); + console.log(JSON.stringify(onCallPayloadList)); + return JSON.stringify(onCallPayloadList); + } + + //Check Validate Field Value + function validateFieldValueFormate() { + return true; + } + + //Get Page Information + function getOnCallInformation() { + let nodelist = document.querySelectorAll("[data-id]"); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) { + console.log(nodelist[index].id.indexOf('lkwgt')); + if (nodelist[index].id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = nodelist[index].id + '_lkid'; + let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value; + result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue; + } + } else if (nodelist[index].type == 'checkbox') { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked; + } else if (nodelist[index].type == 'select-multiple') { + //nodelist[index].getAttribute("data-id") + let multiple = nodelist[index].getAttribute("data-id"); + let targets = document.querySelector("[data-id=" + multiple + "]").parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[nodelist[index].getAttribute("data-id")] = targets; + } else { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].value; + } + let x = index + 1; + if (x <= nodelist.length - 1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) { + index++; + } + } + console.log(JSON.stringify(result)); + return result; + } + + //Query from AWS + function QueryOnCallFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + + //Update Sensitive Information to AWS + function UpdatePIToAWS(onCallJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.OnCallController.saveOnCall}'; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, onCallJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack, redirectCallBack); + } + + //Insert Sensitive Information to AWS + function NewPIToAWS(onCallJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.OnCallController.saveOnCall}'; + AWSService.insert(staticResources.newUrl, onCallJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack, redirectCallBack); + } + + //Check Required Fields + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for (i = 0; i < requiredFieldAPIList.length; i++) { + if (formData[requiredFieldAPIList[i]]) { + continue; + } else { + if (blankRequiredFields == '') { + blankRequiredFields = blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } else { + blankRequiredFields = blankRequiredFields + ',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + + //Base Process + function saveOnCallProcess(saveMode) { + redirectMode = saveMode; + console.log('redirectMode' + redirectMode); + hiddenErrorMsgNode(); + //1. Get onCall Information from Form + let onCallJson = getOnCallInformation(); + //2. Validate the onCall field value formate, for example the email formate or phone formate + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (!validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage('閭鏍煎紡杈撳叆鏈夎锛岃閲嶆柊杈撳叆锛�'); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(onCallJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('{!Input_Required_Field_Msg}' + checkRequiredFieldMsgResult); + return + } + //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(onCallJson); + + //4. onCall to AWS + ProcessPI(onCallJson, payloadForNewPI); + } + + //Alert Error Message + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsg = '閿欒锛氭棤鏁堟暟鎹��' + '\n' + errorMsg; + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + unblockUI(); + } + + //Hide Error Message + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="OnCall" class="pageTitleIcon" title="OnCall" /> + <h1 class="pageType">OnCall缂栬緫 + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription">鏂板缓OnCall</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target=onCalls_edit.htm&section=onCalls&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <!-- Error Msg--> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + <apex:pageblock > + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">OnCall缂栬緫</h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveOnCallProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveOnCallProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField html-data-id="{!layoutField.fieldAPI}" value="{!On_Call__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + //Append Page + sfdcPage.appendToOnloadQueue(function () { + //2. Query AWS Data by dataId + console.log('Mode for onCall Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QueryOnCallFromAWS(); + }; + document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveOnCallProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveOnCallProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewOnCall.page-meta.xml b/force-app/main/default/pages/NewOnCall.page-meta.xml new file mode 100644 index 0000000..276c499 --- /dev/null +++ b/force-app/main/default/pages/NewOnCall.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewOnCall</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewRentalApply.page b/force-app/main/default/pages/NewRentalApply.page new file mode 100644 index 0000000..02d03e3 --- /dev/null +++ b/force-app/main/default/pages/NewRentalApply.page @@ -0,0 +1,387 @@ +<apex:page standardController="Rental_Apply__c" extensions="RentalApplyController" id="page"> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + //Initial Required Information + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var VLookUpFields = new Set(['OwnerId','OPDPlan__c','Zsq_Rental_Apply__c','Loaner_medical_Staff__c','Hospital__c','Strategic_dept__c','Account__c','Repair__c','Campaign__c','QIS_number__c','QISRepair__c','NewRepair__c','Follow_UP_Opp__c','Statu_Achievements__c','Shipment_address__c','Dealer__c','Old_Rental_Apply__c','OPD__c']); + var userVLookUpFields = ['Person_In_Charge__c','applyUser__c','Rental_Assistant__c','Assign_Person__c','ZongjianApprovalManager__c','BuchangApprovalManager__c','JingliApprovalManager__c','BuchangApprovalManagerSales__c','SalesManager__c']; + var redirectMode = 'Save'; + + //Redirect Required Parameter + var redirectCallBack = function redirectCallBack(sfId,errorMessage) { + if(sfId){ + if (redirectMode == 'Save') { + window.open('/' + sfId, '_self'); + } else if (redirectMode == 'SaveAndNew') { + window.open('/a3i/e', '_self'); + } + }else{ + // alert(errorMessage); + alertErrorMessage(errorMessage); + } + } + + //Query Required Parameter + var queryBack = function queryBack(data) { + console.log('data = ' + data); + document.querySelector("[data-id='Phone_number__c']").value = data.object.phoneNumber; + document.querySelector("[data-id='direct_shippment_address__c']").value = data.object.directShippmentAddress; + unblockUI(); + }; + + //Check If Insert Or Update + var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) { + debugger + console.log(result); + let r = result; + console.log('Result from AWS' + JSON.stringify(r)); + console.log('payloadJson=' + JSON.stringify(payloadJson)); + payloadJson.Phone_number__c = r.object[0].phoneNumber; + payloadJson.direct_shippment_address__c = r.object[0].directShippmentAddress; + payloadJson.Phone_Number_Encrypt__c = r.object[0].phoneNumberEncrypt; + payloadJson.Direct_Shippment_Address_Encrypt__c = r.object[0].directShippmentAddressEncrypt; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + debugger + return payloadJson; + } + + // New Or Edit + function ProcessPI(rentalApplyJson, payloadForNewPI) { + blockme(); + if ({!isNewMode + }) { + NewPIToAWS(rentalApplyJson, payloadForNewPI) + }else { + UpdatePIToAWS(rentalApplyJson, payloadForNewPI) + } + } + + //Get Sensitive Information + function getPIPayload(rentalApplyJson) { + let rentalApplyPayloadList = []; + let phoneNumber = rentalApplyJson.Phone_number__c; + let directShippmentAddress = rentalApplyJson.direct_shippment_address__c; + let rentalApplyPIData = new Object(); + rentalApplyPIData.phoneNumber = phoneNumber; + rentalApplyPIData.directShippmentAddress = directShippmentAddress; + rentalApplyPIData.sfRecordId = ''; + console.log('rentalApply PI Data:' + JSON.stringify(rentalApplyPIData)); + rentalApplyPayloadList.push(rentalApplyPIData); + console.log(JSON.stringify(rentalApplyPayloadList)); + return JSON.stringify(rentalApplyPayloadList); + } + + //Check Validate Field Value + function validateFieldValueFormate() { + return true; + } + + //Get Page Information + function getRentalApplyInformation() { + let nodelist = document.querySelectorAll("[data-id]"); + let result = {} + //瀵屾枃鏈� + if(document.querySelector("[aria-describedby = 'cke_34']")){ + result.HP_received_sign_rich__c = document.querySelector("[aria-describedby = 'cke_34']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + } + for (let index = 0; index < nodelist.length; index++) { + if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) { + console.log(nodelist[index].id.indexOf('lkwgt')); + if (nodelist[index].id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = nodelist[index].id + '_lkid'; + let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value; + result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue; + } + } else if (nodelist[index].type == 'checkbox') { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked; + } else if (nodelist[index].type == 'select-multiple') { + //nodelist[index].getAttribute("data-id") + let multiple = nodelist[index].getAttribute("data-id"); + let targets = document.querySelector("[data-id=" + multiple + "]").parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[nodelist[index].getAttribute("data-id")] = targets; + } else { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].value; + } + let x = index + 1; + if (x <= nodelist.length - 1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) { + index++; + } + } + for (let i = 0; i < userVLookUpFields.length; i++) { + let userVlookUpNodeValue = document.querySelector("[data-id='" + userVLookUpFields[i] + "']").children[1].value; + console.log('userVlookUpNodeValue:'+userVlookUpNodeValue); + if(userVlookUpNodeValue!='000000000000000'){ + result[userVLookUpFields[i]] = userVlookUpNodeValue; + } + } + //page:form:j_id30:j_id34:2:j_id35:j_id36:2:j_id37 + //page:form:j_id27:j_id31:2:j_id32:j_id33:2:j_id34 + result.demo_purpose2__c = document.querySelector("[id='page:form:j_id30:j_id34:2:j_id35:j_id36:2:j_id37']").value; + result.ToAgency__c = document.querySelector("[id='page:form:j_id30:j_id34:0:j_id35:j_id36:14:j_id37']").value; + result.Loaner_cancel_reason__c = document.querySelector("[id='page:form:j_id30:j_id34:0:j_id35:j_id36:14:j_id37']").value; + console.log(JSON.stringify(result)); + return result; + } + + //Query from AWS + function QueryRentalApplyFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + + //Update Sensitive Information to AWS + function UpdatePIToAWS(rentalApplyJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.RentalApplyController.saveRentalApply}'; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, rentalApplyJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack, redirectCallBack); + } + + //Insert Sensitive Information to AWS + function NewPIToAWS(rentalApplyJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.RentalApplyController.saveRentalApply}'; + AWSService.insert(staticResources.newUrl, rentalApplyJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack, redirectCallBack); + } + + //Check Required Fields + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for (i = 0; i < requiredFieldAPIList.length; i++) { + if (formData[requiredFieldAPIList[i]]) { + continue; + } else { + if (blankRequiredFields == '') { + blankRequiredFields = blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } else { + blankRequiredFields = blankRequiredFields + ',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + + //Base Process + function saveRentalApplyProcess(saveMode) { + redirectMode = saveMode; + console.log('redirectMode' + redirectMode); + hiddenErrorMsgNode(); + //1. Get rentalApply Information from Form + let rentalApplyJson = getRentalApplyInformation(); + //2. Validate the rentalApply field value formate, for example the email formate or phone formate + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (!validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage('閭鏍煎紡杈撳叆鏈夎锛岃閲嶆柊杈撳叆锛�'); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(rentalApplyJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('{!Input_Required_Field_Msg}' + checkRequiredFieldMsgResult); + return + } + //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(rentalApplyJson); + + //4. rentalApply to AWS + ProcessPI(rentalApplyJson, payloadForNewPI); + } + + //Alert Error Message + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsg = '閿欒锛氭棤鏁堟暟鎹��' + '\n' + errorMsg; + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + unblockUI(); + } + + //Hide Error Message + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + //鏇挎崲vlookup + function replaceSearchContactLookup() { + let lookUpNode = htmlToElement(contactHtmlString); + console.log(lookUpNode); + if (!{!isNewMode}) { + queryContactName(); + } + let parentNode = document.querySelector("[data-id='Loaner_medical_Staff__c']").parentNode; + document.querySelector("[data-id='Loaner_medical_Staff__c']").removeAttribute("onchange"); + parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Loaner_medical_Staff__c']").parentNode.children[2]); + } + var newSearchContactWindow = null; + var contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\')" alt="Reference Document Number Lookup" class="lookupIcon" title="Reference Document Number Lookup (New Window)"/>'; + function htmlToElement(html) { + var template = document.createElement('template'); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + return template.content.firstChild; + } + function queryContactName() { + let sfId = document.getElementById(document.querySelector("[data-id='Loaner_medical_Staff__c']").id + '_lkid').value; + let contactsInfo = JSON.parse('{!contactsInfo}'); + let dataId = contactsInfo[sfId]; + let url = staticResourcesContact.queryUrl + '?dataId=' + dataId; + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + document.querySelector("[data-id='Loaner_medical_Staff__c']").value = result.object.lastName; + }) + } + //鑷畾涔塴ookup鏌ヨ + function searchContact(contactNodeId){ + let accountValue = ""; + if (document.querySelector("[data-id='Account__c']")) { + let accountNodeId = document.querySelector("[data-id='Account__c']").id + '_lkid'; + accountValue = document.getElementById(accountNodeId).value; + } + console.log(accountValue); + if(accountValue !='000000000000000'){ + let baseUrl = "/apex/SearchContactPage"; + let suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue; + let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no'; + newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam); + if (window.focus) { + newSearchContactWindow.focus(); + } + return false; + }else{ + alertErrorMessage('{!PIPL_Input_Account_Error_Msg}'); + } + } + //绐楀彛鍏抽棴鏃跺彂鐢� + function closePopupWindow() { + if (null != newSearchContactWindow) { + newSearchContactWindow.close(); + } + let contactInfoStr = document.getElementById('page:form:contactId').value; + console.log('closePopup:'+contactInfoStr); + let contactInfo = JSON.parse(contactInfoStr); + let contactNodeId = document.querySelector("[data-id='Loaner_medical_Staff__c']").id + '_lkid'; + document.getElementById(contactNodeId).value = contactInfo.ContactId; + document.querySelector("[data-id='Loaner_medical_Staff__c']").value = contactInfo.Name; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="澶囧搧鍊熷嚭鐢宠" class="pageTitleIcon" title="澶囧搧鍊熷嚭鐢宠" /> + <h1 class="pageType">澶囧搧鍊熷嚭鐢宠缂栬緫 + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription"> 鏂板缓澶囧搧鍊熷嚭鐢宠</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target=rentalApplys_edit.htm&section=rentalApplys&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <apex:inputHidden value="{!contactId}" id="contactId"/> + <!-- Error Msg--> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + <apex:pageblock > + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">澶囧搧鍊熷嚭鐢宠缂栬緫</h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveRentalApplyProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveRentalApplyProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField html-data-id="{!layoutField.fieldAPI}" value="{!Rental_Apply__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + //Append Page + sfdcPage.appendToOnloadQueue(function () { + //2. Query AWS Data by dataId + console.log('Mode for rentalApply Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QueryRentalApplyFromAWS(); + }; + //Replace Vlookup Field + replaceSearchContactLookup(); + document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveRentalApplyProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveRentalApplyProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewRentalApply.page-meta.xml b/force-app/main/default/pages/NewRentalApply.page-meta.xml new file mode 100644 index 0000000..e5ffeb2 --- /dev/null +++ b/force-app/main/default/pages/NewRentalApply.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewRentalApply</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewRepair.page b/force-app/main/default/pages/NewRepair.page new file mode 100644 index 0000000..a47b202 --- /dev/null +++ b/force-app/main/default/pages/NewRepair.page @@ -0,0 +1,327 @@ +<apex:page standardController="Repair__c" extensions="NewRepairController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/> + <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/> + <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <style> + .disabledbutton { + pointer-events: none; + opacity: 0.4; + } + </style> + <script> + //Initial Required Information + var staticResources = JSON.parse('{!staticResource}'); + var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}'); + var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}'); + var VLookUpFields = new Set(['Delivered_Product__c','Hospital__c','Department_Class__c','Account__c','Dealer__c','Incharge_Staff_Contact__c','Maintenance_Contract__c','VM_Maintenance_Contract__c','Repair_Quotation_Id__c','RepairSubOrder__c','On_Call_ID__c','QIS_ID__c','InsReport__c','NFM108_Receipt__c','Rental_Apply_Equipment_Set_Detail__c']); + var userVLookUpFields = ['Incharge_Staff__c','Repair_Authenticator__c','OCSM_RC_CordingUser__c','OSH_Affirmant__c','OSHRAConfirmUser__c']; + var redirectMode = 'Save'; + + //Redirect Required Parameter + var redirectCallBack = function redirectCallBack(sfId, errorMessage) { + if (sfId) { + if (redirectMode == 'Save') { + window.open('/' + sfId, '_self'); + } else if (redirectMode == 'SaveAndNew') { + window.open('/setup/ui/recordtypeselect.jsp?ent=' + '{!sobjectId}' + '&retURL=/' + '{!sobjectPrefix}' + '/o&save_new_url=/' + '{!sobjectPrefix}' + '/e?retURL=%2F' + '{!sobjectPrefix}' + '%2Fo', '_self'); + } + } else { + // alert(errorMessage); + alertErrorMessage(errorMessage); + } + } + + //Query Required Parameter + var queryBack = function queryBack(data) { + console.log('data = ' + data); + document.querySelector("[data-id='address_Contacts__c']").value = data.object.addressContacts; + document.querySelector("[data-id='address_Contacts_Name__c']").value = data.object.addressContactsName; + document.querySelector("[data-id='address_Telephone__c']").value = data.object.addressTelephone; + document.querySelector("[data-id='address_ZipCode__c']").value = data.object.addressZipCode; + document.querySelector("[data-id='Detailed_Address__c']").value = data.object.detailedAddress; + document.querySelector("[data-id='RepairApplicant__c']").value = data.object.repairApplicant; + unblockUI(); + }; + + //Check If Insert Or Update + var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) { + debugger + console.log(result); + let r = result; + console.log('Result from AWS' + JSON.stringify(r)); + console.log('payloadJson=' + JSON.stringify(payloadJson)); + payloadJson.address_Contacts__c = r.object[0].addressContacts; + payloadJson.address_Contacts_Name__c = r.object[0].addressContactsName; + payloadJson.address_Telephone__c = r.object[0].addressTelephone; + payloadJson.address_ZipCode__c = r.object[0].addressZipCode; + payloadJson.Detailed_Address__c = r.object[0].detailedAddress; + payloadJson.RepairApplicant__c = r.object[0].repairApplicant; + payloadJson.Address_Contacts_Encrypt__c = r.object[0].addressContactsEncrypt; + payloadJson.Address_Contacts_Name_Encrypt__c = r.object[0].addressContactsNameEncrypt; + payloadJson.Address_Telephone_Encrypt__c = r.object[0].addressTelephoneEncrypt; + payloadJson.Address_ZipCode_Encrypt__c = r.object[0].addressZipCodeEncrypt; + payloadJson.Detailed_Address_Encrypt__c = r.object[0].detailedAddressEncrypt; + payloadJson.Repair_Applicant_Encrypt__c = r.object[0].repairApplicantEncrypt; + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + if (isNewMode) { + payloadJson.AWS_Data_Id__c = r.object[0].dataId; + } else { + payloadJson.AWS_Data_Id__c = '{!AWSDataId}'; + } + debugger + return payloadJson; + } + + // New Or Edit + function ProcessPI(repairJson, payloadForNewPI) { + blockme(); + if ({!isNewMode + }) { + NewPIToAWS(repairJson, payloadForNewPI) + }else { + UpdatePIToAWS(repairJson, payloadForNewPI) + } + } + + //Get Sensitive Information + function getPIPayload(repairJson) { + let repairPayloadList = []; + let addressContacts = repairJson.address_Contacts__c; + let addressContactsName = repairJson.address_Contacts_Name__c; + let addressTelephone = repairJson.address_Telephone__c; + let addressZipCode = repairJson.address_ZipCode__c; + let detailedAddress = repairJson.Detailed_Address__c; + let repairApplicant = repairJson.RepairApplicant__c; + let repairPIData = new Object(); + repairPIData.addressContacts = addressContacts; + repairPIData.addressContactsName = addressContactsName; + repairPIData.addressTelephone = addressTelephone; + repairPIData.addressZipCode = addressZipCode; + repairPIData.detailedAddress = detailedAddress; + repairPIData.repairApplicant = repairApplicant; + repairPIData.sfRecordId = ''; + console.log('repair PI Data:' + JSON.stringify(repairPIData)); + repairPayloadList.push(repairPIData); + console.log(JSON.stringify(repairPayloadList)); + return JSON.stringify(repairPayloadList); + } + + //Check Validate Field Value + function validateFieldValueFormate() { + return true; + } + + //Get Page Information + function getRepairInformation() { + let nodelist = document.querySelectorAll("[data-id]"); + let result = {} + for (let index = 0; index < nodelist.length; index++) { + if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) { + console.log(nodelist[index].id.indexOf('lkwgt')); + if (nodelist[index].id.indexOf('lkwgt') == -1) { + let vlookUpNodeId = nodelist[index].id + '_lkid'; + let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value; + result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue; + } + } else if (nodelist[index].type == 'checkbox') { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked; + } else if (nodelist[index].type == 'select-multiple') { + //nodelist[index].getAttribute("data-id") + let multiple = nodelist[index].getAttribute("data-id"); + let targets = document.querySelector("[data-id=" + multiple + "]").parentNode.children[1].children[0].children[1].children[2].children[0].innerText; + targets = targets.replace(/\n/g, ";"); + console.log('targets = ' + targets); + result[nodelist[index].getAttribute("data-id")] = targets; + } else { + result[nodelist[index].getAttribute("data-id")] = nodelist[index].value; + } + let x = index + 1; + if (x <= nodelist.length - 1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) { + index++; + } + } + for (let i = 0; i < userVLookUpFields.length; i++) { + let userVlookUpNodeValue = document.querySelector("[data-id='" + userVLookUpFields[i] + "']").children[1].value; + console.log('userVlookUpNodeValue:'+userVlookUpNodeValue); + if(userVlookUpNodeValue!='000000000000000'){ + result[userVLookUpFields[i]] = userVlookUpNodeValue; + } + } + result.work_location_select__c = document.querySelector("[id='page:form:j_id30:j_id34:0:j_id35:j_id36:18:j_id37']").value; + // result.ProblemDescription__c = document.querySelector("[aria-describedby = 'cke_34']").contentWindow.document.getElementsByTagName('body')[0].innerHTML + console.log(JSON.stringify(result)); + return result; + } + + //Query from AWS + function QueryRepairFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + + //Update Sensitive Information to AWS + function UpdatePIToAWS(repairJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewRepairController.saveRepair}'; + let obj = JSON.parse(payloadForNewPI); + obj[0].dataId = '{!AWSDataId}'; + let payloadForNewPIJson = JSON.stringify(obj); + AWSService.update(staticResources.updateUrl, repairJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack, redirectCallBack); + } + + //Insert Sensitive Information to AWS + function NewPIToAWS(repairJson, payloadForNewPI) { + let controllerSaveMethod = '{!$RemoteAction.NewRepairController.saveRepair}'; + AWSService.insert(staticResources.newUrl, repairJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack, redirectCallBack); + } + + //Check Required Fields + function checkRequiredFieldMsg(formData) { + let blankRequiredFields = ''; + for (i = 0; i < requiredFieldAPIList.length; i++) { + if (formData[requiredFieldAPIList[i]]) { + continue; + } else { + if (blankRequiredFields == '') { + blankRequiredFields = blankRequiredFields + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } else { + blankRequiredFields = blankRequiredFields + ',' + fieldAPIToLabelMap[requiredFieldAPIList[i]]; + } + + } + } + return blankRequiredFields; + } + + //Base Process + function saveRepairProcess(saveMode) { + redirectMode = saveMode; + console.log('redirectMode' + redirectMode); + hiddenErrorMsgNode(); + //1. Get repair Information from Form + let repairJson = getRepairInformation(); + //2. Validate the repair field value formate, for example the email formate or phone formate + let validationResultMessage = validateFieldValueFormate(); + console.log(validationResultMessage); + if (!validationResultMessage) { + //Popup error message. - To Do After POC + alertErrorMessage('閭鏍煎紡杈撳叆鏈夎锛岃閲嶆柊杈撳叆锛�'); + return + } + // Check Required Field + let checkRequiredFieldMsgResult = checkRequiredFieldMsg(repairJson); + if (checkRequiredFieldMsgResult) { + alertErrorMessage('{!Input_Required_Field_Msg}' + checkRequiredFieldMsgResult); + return + } + //3. Prepare the payload for New PI API To AWS - To Do + let payloadForNewPI = getPIPayload(repairJson); + + //4. repair to AWS + ProcessPI(repairJson, payloadForNewPI); + } + + //Alert Error Message + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsg = '閿欒锛氭棤鏁堟暟鎹��' + '\n' + errorMsg; + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'pbError'; + unblockUI(); + } + + //Hide Error Message + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:form:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + </script> + <div class="bPageTitle"> + <div class="ptBody"> + <div class="content"> + <img src="/img/s.gif" alt="淇悊" class="pageTitleIcon" title="淇悊" /> + <h1 class="pageType">淇悊缂栬緫 + <span class="titleSeparatingColon">:</span> + </h1> + <h2 class="pageDescription">鏂板缓淇悊</h2> + <div class="blank"> </div> + </div> + <div class="links"> + <a href="javascript:openPopupFocusEscapePounds(%27https://help.salesforce.com/apex/htdoor?loc=help&target=repairs_edit.htm&section=repairs&language=zh_CN&release=234.18.8&instance=CS117&showSplash=true%27, %27Help%27, 700, 600, %27width=700,height=600,resizable=yes,toolbar=yes,status=no,scrollbars=yes,menubar=yes,directories=no,location=no,dependant=no%27, false, false);" + title="姝ら〉闈㈢殑甯姪 锛堟柊绐楀彛锛�"> + <span class="helpLink">姝ら〉闈㈢殑甯姪</span> + <img src="/img/s.gif" alt="" class="helpIcon" /> + </a> + </div> + </div> + <div class="ptBreadcrumb"></div> + </div> + <apex:form id="form"> + <!-- Error Msg--> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + <apex:pageblock > + <div class="pbHeader"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> + <h2 class="mainTitle">淇悊缂栬緫</h2> + </td> + <td class="pbButton" id="topButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveRepairProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveRepairProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + <!-- Iterate the layoutSections, which is a list of sections --> + <apex:repeat value="{!layoutSections}" var="layoutSection"> + <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}"> + + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField"> + <apex:inputField html-data-id="{!layoutField.fieldAPI}" value="{!Repair__c[layoutField.fieldAPI]}" rendered="{!not(layoutField.isPlaceHOlder)}" + required="{!layoutField.isRequired}" /> + <apex:pageblocksectionitem rendered="{!layoutField.isPlaceHolder}"> + </apex:pageblocksectionitem> + </apex:repeat> + + </apex:pageBlockSection> + </apex:repeat> + <script> + //Append Page + sfdcPage.appendToOnloadQueue(function () { + //2. Query AWS Data by dataId + console.log('Mode for repair Page:' + {!isNewMode}); + if (!{!isNewMode}) { + blockme(); + QueryRepairFromAWS(); + }; + document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton"); + }); + </script> + <div class="pbBottomButtons"> + <table cellspacing="0" cellpadding="0" border="0"> + <tbody> + <tr> + <td class="pbTitle"> + <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" /> </td> + <td class="pbButtonb" id="bottomButtonRow"> + <input class="btn" type="Button" value="淇濆瓨" onclick="saveRepairProcess('Save')" /> + <input class="btn" type="Button" value="淇濆瓨骞舵柊寤�" onclick="saveRepairProcess('SaveAndNew')" /> + <apex:commandButton action="{!cancel}" value="鍙栨秷" /> + </td> + </tr> + </tbody> + </table> + </div> + </apex:pageblock> + + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewRepair.page-meta.xml b/force-app/main/default/pages/NewRepair.page-meta.xml new file mode 100644 index 0000000..5e9380c --- /dev/null +++ b/force-app/main/default/pages/NewRepair.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewRepair</label> +</ApexPage> diff --git a/force-app/main/default/pages/NewRepairPage.page b/force-app/main/default/pages/NewRepairPage.page new file mode 100644 index 0000000..f654d6a --- /dev/null +++ b/force-app/main/default/pages/NewRepairPage.page @@ -0,0 +1,2 @@ +<apex:page > +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/NewRepairPage.page-meta.xml b/force-app/main/default/pages/NewRepairPage.page-meta.xml new file mode 100644 index 0000000..5dd0293 --- /dev/null +++ b/force-app/main/default/pages/NewRepairPage.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>NewRepairPage</label> +</ApexPage> diff --git a/force-app/main/default/pages/RentalApplyUploadPdf.page b/force-app/main/default/pages/RentalApplyUploadPdf.page new file mode 100644 index 0000000..c749a53 --- /dev/null +++ b/force-app/main/default/pages/RentalApplyUploadPdf.page @@ -0,0 +1,190 @@ +<!-- 璇ラ〉闈㈢敤浜嶭ead瀵硅薄涓婁紶PDF锛屾湭鏉ュ鏋滆娣诲姞鍏朵粬瀵硅薄鐨勪笂浼燩DF鍔熻兘锛屽鍒惰椤甸潰锛屽皢**standardController**淇敼涓哄叾浠栧璞PI鍚嶇О鍗冲彲 --> +<apex:page standardController="Rental_Apply__c" extensions="FileUploadController" id="page" lightningStyleSheets="true"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script> + var staticResources = JSON.parse('{!staticResource}'); + var parentId = '{!parentId}'; + var uploadUrl = staticResources.newUrl; + var key; + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:theForm:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'message errorM3'; + } + + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:theForm:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + function getFileContent(event) { + var fileObject = document.getElementById("page:theForm:block:uploadSection:file"); + var reader = new FileReader(); + var data = reader.readAsDataURL(fileObject.files[0]); + debugger + console.log(event); + } + function getBase64(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); + } + function disableButtonStatus() { + let btnNode = document.getElementById('uploadFileId'); + btnNode.classList.add("btnDisabled"); + } + + function enableButtonStatus() { + let btnNode = document.getElementById('uploadFileId'); + btnNode.classList.remove("btnDisabled"); + } + + function uploadFile() { + disableButtonStatus(); + var fileObject = document.getElementById("file").files[0]; + getBase64(fileObject).then( + data => { + console.log(data); + uploadFileToAWS(data, (fileObject.size).toString(), fileObject.name); + + } + ); + } + function confirmTrans(transId, isSuccess) { + + fetch(staticResources.updateUrl, { + method: 'POST', + body: JSON.stringify({ 'txId': transId, "isSuccess": isSuccess }), + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then(data => { + console.log("confirmTrans-" + JSON.stringify(data)); + document.getElementById("file").files[0].name = ''; + enableButtonStatus(); + refreshFiles(); + return data.status; + }) + + } + function calculateFileSize(fileObject) { + if (fileObject.size > 20971520) { + alertErrorMessage('鏂囦欢杩囧ぇ锛岃閫夋嫨灏忎簬20mb鐨勬枃浠�'); + } + } + function uploadFileToAWS(data, size, fileName) { + console.log("body=" + JSON.stringify({ 'file': data, "size": size, 'fileName': fileName })); + + fetch(uploadUrl, { + method: 'POST', + body: JSON.stringify({ 'file': data, "size": size, 'fileName': fileName }), + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then(result => { + + console.log("result" + JSON.stringify(result)); + + if (result.success == true) { + key = result.object; + + Visualforce.remoting.Manager.invokeAction( + '{!$RemoteAction.FileUploadController.saveFile}', + fileName, key, result.txId, parentId, + function (resultvalue, event) { + + + + //2. show file list + if (resultvalue.status == 'fail') { + alertErrorMessage(resultvalue.message); + //1. Confirm trans + confirmTrans(result.txId, 0); + } else { + alertErrorMessage('涓婁紶鎴愬姛'); + confirmTrans(result.txId, 1); + } + + // window.location.reload(); + }, + { escape: true } + ); + + console.log('key' + key); + } else { + alertErrorMessage('涓婁紶澶辫触璇风◢鍚庡啀璇曪紒'); + } + }).catch((error) => { + console.error('Error:', error); + }) + debugger + } + function downPdf(fileUrl) { + window.open(fileUrl,'_blank'); + } + + </script> + <style> + .pdf .num { + width: 30%; + } + + .pdf.name { + width: 30% + } + + .pdf.downLink { + width: 40% + } + </style> + <apex:form id="theForm"> + <apex:actionFunction name="refreshFiles" action="{!refreshFiles}" reRender="pdf,uploadSection"/> + <br/> + <br/> + <apex:pageBlock id="block"> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + <apex:pageBlockSection id="uploadSection"> + <!-- <apex:inputFile id="file" value="{!documentData.body}" filename="{!documentData.name}" /> --> + <input type="file" id="file" name="filename"/> + <input class="btn" id='uploadFileId' type="Button" value="纭涓婁紶" onclick="uploadFile()" /> + </apex:pageBlockSection> + </apex:pageBlock> + <apex:pageBlock title="PDF鍒楄〃" id="pdf"> + <!-- <apex:pageBlockSection > --> + <!-- show uploated file list --> + <apex:pageBlockTable value="{!fileList}" var="file" align="center" columns="3" columnsWidth="30%,30%,40%"> + <apex:column id="name" headerValue="鏂囦欢鍚嶇О"> + <apex:outputLink value="/{!file.Id}" target="_blank">{!file.FileName__c}</apex:outputLink> + </apex:column> + <!-- <apex:column id="num" headerValue="鐖惰褰曢摼鎺�"> + <apex:outputLink value="/{!file.ParentRecordId__c}" target="_blank">{!file.ParentRecordId__c}</apex:outputLink> + </apex:column> --> + <apex:column id="previewLink" headerValue="棰勮閾炬帴"> + <apex:outputLink value="{!file.ViewLink__c}" target="{!file.ViewLink__c}">棰勮閾炬帴 + </apex:outputLink> + </apex:column> + <apex:column id="downLink" headerValue="涓嬭浇閾炬帴"> + <!-- <apex:outputLink value= "{!file.DownloadLink__c}" target="{!file.DownloadLink__c}">涓嬭浇閾炬帴 + </apex:outputLink> --> + <input class="btn" id='downloadFileButton' type="Button" value="涓嬭浇" onclick="downPdf('{!file.DownloadLink__c}')" /> + </apex:column> + </apex:pageBlockTable> + <!-- </apex:pageBlockSection> --> + </apex:pageBlock> + </apex:form> + +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/RentalApplyUploadPdf.page-meta.xml b/force-app/main/default/pages/RentalApplyUploadPdf.page-meta.xml new file mode 100644 index 0000000..b5f6910 --- /dev/null +++ b/force-app/main/default/pages/RentalApplyUploadPdf.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>RentalApplyUploadPdf</label> +</ApexPage> diff --git a/force-app/main/default/pages/SearchContactPage.page b/force-app/main/default/pages/SearchContactPage.page new file mode 100644 index 0000000..b88431b --- /dev/null +++ b/force-app/main/default/pages/SearchContactPage.page @@ -0,0 +1,185 @@ +<apex:page controller="SearchContactController" showHeader="false" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + + <head> + </head> + <style> + /* 1. 瀹氫箟琛ㄥ崟鏍峰紡 To Do Later*/ + + table { + border-collapse: collapse; + border-spacing: 0; + width: 98%; + margin-left: 5px; + } + </style> + + <body id="body" class="lookupTab"> + <script type="text/javascript"> + var staticResources = JSON.parse('{!staticResource}'); + var contactAWSIds = JSON.parse('{!contactAWSIds}'); + var contactsInfo = JSON.parse('{!contactsInfo}'); + var searchContactName = ''; + queryLeadFromAWS(); + function searchAWSContact(){ + console.log('Search process!'); + //1. reset table; + resetTable(); + //2. get contact name value + searchContactName = document.getElementById('page:form:lksrch').value; + queryLeadFromAWS(); + + } + function resetTable(){ + let queryResult = document.getElementById('QueryResult'); + let table = document.getElementById('table'); + if(table){ + queryResult.removeChild(table); + } + } + function preparePayloadForSearchContact(){ + let searchPayload = new Object(); + searchPayload.dataIds = contactAWSIds; + searchPayload.contactName = searchContactName; + return JSON.stringify(searchPayload); + } + function queryLeadFromAWS() { + //1. Prepare the payload for contact search + let requestSearchPayload = preparePayloadForSearchContact(); + console.log('request payload body:'+requestSearchPayload); + //2. Invoke AWS Service + fetch(staticResources.searchUrl, { + method: 'POST', + body: requestSearchPayload, + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + if(result.object&&result.object.length>0){ + initContactTable(result); + } + }) + } + + function redirectToParentPage(obj) { + var winMain = window.opener; + if (null == winMain) { + winMain = window.parent.opener; + } + let value = obj.currentTarget.innerText; + let contactInfo = new Object(); + contactInfo.Name = obj.currentTarget.innerText; + contactInfo.ContactId = obj.currentTarget.id; + var selectedContactNode = winMain.document.getElementById('{!JSENCODE($CurrentPage.parameters.contactId)}'); + selectedContactNode.value = JSON.stringify(contactInfo); + closeWindow(); + } + + function closeWindow() { + var winMain = window.opener; + if (null == winMain) { + winMain = window.parent.opener; + } + winMain.closePopupWindow(); + window.close(); + } + function refreshTable(cols,contactInfoList){ + let myTableDiv = document.getElementById("QueryResult"); + let table = document.createElement('TABLE'); + table.border = '1'; + table.id = 'table' + let tableBody = document.createElement('TBODY'); + table.appendChild(tableBody); + let headerTR = document.createElement('TR'); + tableBody.appendChild(headerTR); + for (let i = 0; i < cols.length; i++) { + let td = document.createElement('TH'); + td.width = '75'; + td.appendChild(document.createTextNode(cols[i])); + headerTR.appendChild(td); + } + //3. Init the AWS data + for (let i = 0; i < contactInfoList.length; i++) { + let tr = document.createElement('TR'); + tableBody.appendChild(tr); + let contactInfoTemp = contactInfoList[i] + for (let j = 0; j < cols.length; j++) { + let td = document.createElement('TD'); + td.width = '75'; + if(j == 0){ + td.id = contactsInfo[contactInfoTemp.AWSDataId].Id; + } + td.appendChild(document.createTextNode(contactInfoTemp[cols[j]])); + if (cols[j] == 'Name') { + td.addEventListener("click", function (obj) { + redirectToParentPage(obj); + }); + } + tr.appendChild(td); + } + } + myTableDiv.appendChild(table); + } + function initContactTable(data) { + let cols = ['Name', 'Email', 'Phone']; + let contactInfoList = []; + let awsDataIds = []; + for(var i=0;i<data.object.length;i++){ + if(data.object[i].dataId){ + let contactInfo = new Object(); + contactInfo.Name = data.object[i].lastName; + contactInfo.Email = data.object[i].email; + contactInfo.Phone = data.object[i].phone; + contactInfo.AWSDataId = data.object[i].dataId; + awsDataIds.push(contactInfo.AWSDataId); + contactInfo.sfRecordId = ''; + contactInfoList.push(contactInfo); + } + } + let AWSIdToSFIdMapValue = {}; + console.log(awsDataIds); + //Invoke SF BackEnd + Visualforce.remoting.Manager.invokeAction( + '{!$RemoteAction.SearchContactController.searchContacts}', + JSON.stringify(awsDataIds), + function (result, event) { + if(event.status){ + if(result.status = 'success'){ + contactsInfo = JSON.parse(result.message.replace(/("\;)/g,"\"")); + refreshTable(cols,contactInfoList); + }else{ + console.log('No result'); + } + } + }, + { escape: true } + ); + } + </script> + <apex:form id="form"> + <!-- Search Filter--> + <div class="lookup"> + <div class="bPageTitle"> + <div class="ptBody secondaryPalette"> + <div class="content"> + <img src="/img/s.gif" alt="" class="pageTitleIcon" title="" /> + <h1>Lookup</h1> + </div> + </div> + </div> + <div class="pBody"> + <label class="assistiveText" for="lksrch">Search</label> + <apex:inputText id="lksrch" html-placeholder="{!PIPL_Search_Contact_Label}" value="{!searchKeyWord}" /> + <input value=" Go! " type="Button" onclick="searchAWSContact()" styleClass="btn" /> + <div class="bDescription">You can use "*" as a wildcard next to other characters to improve your search results. + </div> + </div> + </div> + <div id="QueryResult"> + </div> + </apex:form> + </body> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/SearchContactPage.page-meta.xml b/force-app/main/default/pages/SearchContactPage.page-meta.xml new file mode 100644 index 0000000..1fdc8c1 --- /dev/null +++ b/force-app/main/default/pages/SearchContactPage.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>SearchContactPage</label> +</ApexPage> diff --git a/force-app/main/default/pages/SearchLeadPage.page b/force-app/main/default/pages/SearchLeadPage.page new file mode 100644 index 0000000..64275ca --- /dev/null +++ b/force-app/main/default/pages/SearchLeadPage.page @@ -0,0 +1,185 @@ +<apex:page controller="SearchLeadController" showHeader="false" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + + <head> + </head> + <style> + /* 1. 瀹氫箟琛ㄥ崟鏍峰紡 To Do Later*/ + + table { + border-collapse: collapse; + border-spacing: 0; + width: 98%; + margin-left: 5px; + } + </style> + + <body id="body" class="lookupTab"> + <script type="text/javascript"> + var staticResources = JSON.parse('{!staticResource}'); + var leadAWSIds = JSON.parse('{!leadAWSIds}'); + var leadsInfo = JSON.parse('{!leadsInfo}'); + var searchContactName = ''; + queryLeadFromAWS(); + function searchAWSContact(){ + console.log('Search process!'); + //1. reset table; + resetTable(); + //2. get contact name value + searchContactName = document.getElementById('page:form:lksrch').value; + queryLeadFromAWS(); + + } + function resetTable(){ + let queryResult = document.getElementById('QueryResult'); + let table = document.getElementById('table'); + if(table){ + queryResult.removeChild(table); + } + } + function preparePayloadForSearchLead(){ + let searchPayload = new Object(); + searchPayload.dataIds = leadAWSIds; + searchPayload.contactName = searchContactName; + return JSON.stringify(searchPayload); + } + function queryLeadFromAWS() { + //1. Prepare the payload for contact search + let requestSearchPayload = preparePayloadForSearchLead(); + console.log('request payload body:'+requestSearchPayload); + //2. Invoke AWS Service + fetch(staticResources.searchUrl, { + method: 'POST', + body: requestSearchPayload, + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then((result) => { + if(result.object&&result.object.length>0){ + initContactTable(result); + } + }) + } + + function redirectToParentPage(obj) { + var winMain = window.opener; + if (null == winMain) { + winMain = window.parent.opener; + } + let value = obj.currentTarget.innerText; + let leadInfo = new Object(); + leadInfo.Name = obj.currentTarget.innerText; + leadInfo.LeadId = obj.currentTarget.id; + var selectedContactNode = winMain.document.getElementById('{!JSENCODE($CurrentPage.parameters.leadId)}'); + selectedContactNode.value = JSON.stringify(leadInfo); + closeWindow(); + } + + function closeWindow() { + var winMain = window.opener; + if (null == winMain) { + winMain = window.parent.opener; + } + winMain.closeLeadPopupWindow(); + window.close(); + } + function refreshTable(cols,contactInfoList){ + let myTableDiv = document.getElementById("QueryResult"); + let table = document.createElement('TABLE'); + table.border = '1'; + table.id = 'table' + let tableBody = document.createElement('TBODY'); + table.appendChild(tableBody); + let headerTR = document.createElement('TR'); + tableBody.appendChild(headerTR); + for (let i = 0; i < cols.length; i++) { + let td = document.createElement('TH'); + td.width = '75'; + td.appendChild(document.createTextNode(cols[i])); + headerTR.appendChild(td); + } + //3. Init the AWS data + for (let i = 0; i < contactInfoList.length; i++) { + let tr = document.createElement('TR'); + tableBody.appendChild(tr); + let contactInfoTemp = contactInfoList[i] + for (let j = 0; j < cols.length; j++) { + let td = document.createElement('TD'); + td.width = '75'; + if(j == 0){ + td.id = leadsInfo[contactInfoTemp.AWSDataId].Id; + } + td.appendChild(document.createTextNode(contactInfoTemp[cols[j]])); + if (cols[j] == 'Name') { + td.addEventListener("click", function (obj) { + redirectToParentPage(obj); + }); + } + tr.appendChild(td); + } + } + myTableDiv.appendChild(table); + } + function initContactTable(data) { + let cols = ['Name', 'Email', 'Phone']; + let contactInfoList = []; + let awsDataIds = []; + for(var i=0;i<data.object.length;i++){ + if(data.object[i].dataId){ + let contactInfo = new Object(); + contactInfo.Name = data.object[i].lastName; + contactInfo.Email = data.object[i].email; + contactInfo.Phone = data.object[i].phone; + contactInfo.AWSDataId = data.object[i].dataId; + awsDataIds.push(contactInfo.AWSDataId); + contactInfo.sfRecordId = ''; + contactInfoList.push(contactInfo); + } + } + let AWSIdToSFIdMapValue = {}; + console.log(awsDataIds); + //Invoke SF BackEnd + Visualforce.remoting.Manager.invokeAction( + '{!$RemoteAction.SearchLeadController.searchLeads}', + JSON.stringify(awsDataIds), + function (result, event) { + if(event.status){ + if(result.status = 'success'){ + leadsInfo = JSON.parse(result.message.replace(/("\;)/g,"\"")); + refreshTable(cols,contactInfoList); + }else{ + console.log('No result'); + } + } + }, + { escape: true } + ); + } + </script> + <apex:form id="form"> + <!-- Search Filter--> + <div class="lookup"> + <div class="bPageTitle"> + <div class="ptBody secondaryPalette"> + <div class="content"> + <img src="/img/s.gif" alt="" class="pageTitleIcon" title="" /> + <h1>Lookup</h1> + </div> + </div> + </div> + <div class="pBody"> + <label class="assistiveText" for="lksrch">Search</label> + <apex:inputText id="lksrch" html-placeholder="{!PIPL_Search_Contact_Label}" value="{!searchKeyWord}" /> + <input value=" Go! " type="Button" onclick="searchAWSContact()" styleClass="btn" /> + <div class="bDescription">You can use "*" as a wildcard next to other characters to improve your search results. + </div> + </div> + </div> + <div id="QueryResult"> + </div> + </apex:form> + </body> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/SearchLeadPage.page-meta.xml b/force-app/main/default/pages/SearchLeadPage.page-meta.xml new file mode 100644 index 0000000..8b5307c --- /dev/null +++ b/force-app/main/default/pages/SearchLeadPage.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>SearchLeadPage</label> +</ApexPage> diff --git a/force-app/main/default/pages/TenderInformationUploadPdf.page b/force-app/main/default/pages/TenderInformationUploadPdf.page new file mode 100644 index 0000000..4937eb4 --- /dev/null +++ b/force-app/main/default/pages/TenderInformationUploadPdf.page @@ -0,0 +1,190 @@ +<!-- 璇ラ〉闈㈢敤浜嶭ead瀵硅薄涓婁紶PDF锛屾湭鏉ュ鏋滆娣诲姞鍏朵粬瀵硅薄鐨勪笂浼燩DF鍔熻兘锛屽鍒惰椤甸潰锛屽皢**standardController**淇敼涓哄叾浠栧璞PI鍚嶇О鍗冲彲 --> +<apex:page standardController="Tender_information__c" extensions="FileUploadController" id="page" lightningStyleSheets="true"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script> + var staticResources = JSON.parse('{!staticResource}'); + var parentId = '{!parentId}'; + var uploadUrl = staticResources.newUrl; + var key; + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:theForm:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'message errorM3'; + } + + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:theForm:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + function getFileContent(event) { + var fileObject = document.getElementById("page:theForm:block:uploadSection:file"); + var reader = new FileReader(); + var data = reader.readAsDataURL(fileObject.files[0]); + debugger + console.log(event); + } + function getBase64(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); + } + function disableButtonStatus() { + let btnNode = document.getElementById('uploadFileId'); + btnNode.classList.add("btnDisabled"); + } + + function enableButtonStatus() { + let btnNode = document.getElementById('uploadFileId'); + btnNode.classList.remove("btnDisabled"); + } + + function uploadFile() { + disableButtonStatus(); + var fileObject = document.getElementById("file").files[0]; + getBase64(fileObject).then( + data => { + console.log(data); + uploadFileToAWS(data, (fileObject.size).toString(), fileObject.name); + + } + ); + } + function confirmTrans(transId, isSuccess) { + + fetch(staticResources.updateUrl, { + method: 'POST', + body: JSON.stringify({ 'txId': transId, "isSuccess": isSuccess }), + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then(data => { + console.log("confirmTrans-" + JSON.stringify(data)); + document.getElementById("file").files[0].name = ''; + enableButtonStatus(); + refreshFiles(); + return data.status; + }) + + } + function calculateFileSize(fileObject) { + if (fileObject.size > 20971520) { + alertErrorMessage('鏂囦欢杩囧ぇ锛岃閫夋嫨灏忎簬20mb鐨勬枃浠�'); + } + } + function uploadFileToAWS(data, size, fileName) { + console.log("body=" + JSON.stringify({ 'file': data, "size": size, 'fileName': fileName })); + + fetch(uploadUrl, { + method: 'POST', + body: JSON.stringify({ 'file': data, "size": size, 'fileName': fileName }), + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then(result => { + + console.log("result" + JSON.stringify(result)); + + if (result.success == true) { + key = result.object; + + Visualforce.remoting.Manager.invokeAction( + '{!$RemoteAction.FileUploadController.saveFile}', + fileName, key, result.txId, parentId, + function (resultvalue, event) { + + + + //2. show file list + if (resultvalue.status == 'fail') { + alertErrorMessage(resultvalue.message); + //1. Confirm trans + confirmTrans(result.txId, 0); + } else { + alertErrorMessage('涓婁紶鎴愬姛'); + confirmTrans(result.txId, 1); + } + + // window.location.reload(); + }, + { escape: true } + ); + + console.log('key' + key); + } else { + alertErrorMessage('涓婁紶澶辫触璇风◢鍚庡啀璇曪紒'); + } + }).catch((error) => { + console.error('Error:', error); + }) + debugger + } + function downPdf(fileUrl) { + window.open(fileUrl,'_blank'); + } + + </script> + <style> + .pdf .num { + width: 30%; + } + + .pdf.name { + width: 30% + } + + .pdf.downLink { + width: 40% + } + </style> + <apex:form id="theForm"> + <apex:actionFunction name="refreshFiles" action="{!refreshFiles}" reRender="pdf,uploadSection"/> + <br/> + <br/> + <apex:pageBlock id="block"> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + <apex:pageBlockSection id="uploadSection"> + <!-- <apex:inputFile id="file" value="{!documentData.body}" filename="{!documentData.name}" /> --> + <input type="file" id="file" name="filename"/> + <input class="btn" id='uploadFileId' type="Button" value="纭涓婁紶" onclick="uploadFile()" /> + </apex:pageBlockSection> + </apex:pageBlock> + <apex:pageBlock title="PDF鍒楄〃" id="pdf"> + <!-- <apex:pageBlockSection > --> + <!-- show uploated file list --> + <apex:pageBlockTable value="{!fileList}" var="file" align="center" columns="3" columnsWidth="30%,30%,40%"> + <apex:column id="name" headerValue="鏂囦欢鍚嶇О"> + <apex:outputLink value="/{!file.Id}" target="_blank">{!file.FileName__c}</apex:outputLink> + </apex:column> + <!-- <apex:column id="num" headerValue="鐖惰褰曢摼鎺�"> + <apex:outputLink value="/{!file.ParentRecordId__c}" target="_blank">{!file.ParentRecordId__c}</apex:outputLink> + </apex:column> --> + <apex:column id="previewLink" headerValue="棰勮閾炬帴"> + <apex:outputLink value="{!file.ViewLink__c}" target="{!file.ViewLink__c}">棰勮閾炬帴 + </apex:outputLink> + </apex:column> + <apex:column id="downLink" headerValue="涓嬭浇閾炬帴"> + <!-- <apex:outputLink value= "{!file.DownloadLink__c}" target="{!file.DownloadLink__c}">涓嬭浇閾炬帴 + </apex:outputLink> --> + <input class="btn" id='downloadFileButton' type="Button" value="涓嬭浇" onclick="downPdf('{!file.DownloadLink__c}')" /> + </apex:column> + </apex:pageBlockTable> + <!-- </apex:pageBlockSection> --> + </apex:pageBlock> + </apex:form> + +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/TenderInformationUploadPdf.page-meta.xml b/force-app/main/default/pages/TenderInformationUploadPdf.page-meta.xml new file mode 100644 index 0000000..22f22e5 --- /dev/null +++ b/force-app/main/default/pages/TenderInformationUploadPdf.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>TenderInformationUploadPdf</label> +</ApexPage> diff --git a/force-app/main/default/pages/TestClass.page b/force-app/main/default/pages/TestClass.page new file mode 100644 index 0000000..f654d6a --- /dev/null +++ b/force-app/main/default/pages/TestClass.page @@ -0,0 +1,2 @@ +<apex:page > +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/TestClass.page-meta.xml b/force-app/main/default/pages/TestClass.page-meta.xml new file mode 100644 index 0000000..aef9406 --- /dev/null +++ b/force-app/main/default/pages/TestClass.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>TestClass</label> +</ApexPage> diff --git a/force-app/main/default/pages/TestVfPage.page b/force-app/main/default/pages/TestVfPage.page new file mode 100644 index 0000000..b88cd2d --- /dev/null +++ b/force-app/main/default/pages/TestVfPage.page @@ -0,0 +1,3 @@ +<apex:page id="page" sidebar="false" showHeader="false" standardController="Inquiry_form__c" extensions="TestController"> + {!LookUpOverrideFieldsMapJson} +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/TestVfPage.page-meta.xml b/force-app/main/default/pages/TestVfPage.page-meta.xml new file mode 100644 index 0000000..5363745 --- /dev/null +++ b/force-app/main/default/pages/TestVfPage.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>TestVfPage</label> +</ApexPage> diff --git a/force-app/main/default/pages/UploadPdf.page b/force-app/main/default/pages/UploadPdf.page new file mode 100644 index 0000000..431ef8e --- /dev/null +++ b/force-app/main/default/pages/UploadPdf.page @@ -0,0 +1,190 @@ +<!-- 璇ラ〉闈㈢敤浜嶭ead瀵硅薄涓婁紶PDF锛屾湭鏉ュ鏋滆娣诲姞鍏朵粬瀵硅薄鐨勪笂浼燩DF鍔熻兘锛屽鍒惰椤甸潰锛屽皢**standardController**淇敼涓哄叾浠栧璞PI鍚嶇О鍗冲彲 --> +<apex:page standardController="Lead" extensions="FileUploadController" id="page" lightningStyleSheets="true"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <script> + var staticResources = JSON.parse('{!staticResource}'); + var parentId = '{!parentId}'; + var uploadUrl = staticResources.newUrl; + var key; + + function alertErrorMessage(errorMsg) { + let errorMsgNode = document.getElementById("page:theForm:block:msgContent"); + errorMsgNode.innerText = errorMsg; + errorMsgNode.className = 'message errorM3'; + } + + function hiddenErrorMsgNode() { + let errorMsgNode = document.getElementById("page:theForm:block:msgContent"); + errorMsgNode.innerText = ''; + errorMsgNode.className = ''; + } + function getFileContent(event) { + var fileObject = document.getElementById("page:theForm:block:uploadSection:file"); + var reader = new FileReader(); + var data = reader.readAsDataURL(fileObject.files[0]); + debugger + console.log(event); + } + function getBase64(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result); + reader.onerror = error => reject(error); + }); + } + function disableButtonStatus() { + let btnNode = document.getElementById('uploadFileId'); + btnNode.classList.add("btnDisabled"); + } + + function enableButtonStatus() { + let btnNode = document.getElementById('uploadFileId'); + btnNode.classList.remove("btnDisabled"); + } + + function uploadFile() { + disableButtonStatus(); + var fileObject = document.getElementById("file").files[0]; + getBase64(fileObject).then( + data => { + console.log(data); + uploadFileToAWS(data, (fileObject.size).toString(), fileObject.name); + + } + ); + } + function confirmTrans(transId, isSuccess) { + + fetch(staticResources.updateUrl, { + method: 'POST', + body: JSON.stringify({ 'txId': transId, "isSuccess": isSuccess }), + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then(data => { + console.log("confirmTrans-" + JSON.stringify(data)); + document.getElementById("file").files[0].name = ''; + enableButtonStatus(); + refreshFiles(); + return data.status; + }) + + } + function calculateFileSize(fileObject) { + if (fileObject.size > 20971520) { + alertErrorMessage('鏂囦欢杩囧ぇ锛岃閫夋嫨灏忎簬20mb鐨勬枃浠�'); + } + } + function uploadFileToAWS(data, size, fileName) { + console.log("body=" + JSON.stringify({ 'file': data, "size": size, 'fileName': fileName })); + + fetch(uploadUrl, { + method: 'POST', + body: JSON.stringify({ 'file': data, "size": size, 'fileName': fileName }), + headers: { + 'Content-Type': 'application/json', + 'pi-token': staticResources.token + } + }).then((data) => { + return data.json(); + }).then(result => { + + console.log("result" + JSON.stringify(result)); + + if (result.success == true) { + key = result.object; + + Visualforce.remoting.Manager.invokeAction( + '{!$RemoteAction.FileUploadController.saveFile}', + fileName, key, result.txId, parentId, + function (resultvalue, event) { + + + + //2. show file list + if (resultvalue.status == 'fail') { + alertErrorMessage(resultvalue.message); + //1. Confirm trans + confirmTrans(result.txId, 0); + } else { + alertErrorMessage('涓婁紶鎴愬姛'); + confirmTrans(result.txId, 1); + } + + // window.location.reload(); + }, + { escape: true } + ); + + console.log('key' + key); + } else { + alertErrorMessage('涓婁紶澶辫触璇风◢鍚庡啀璇曪紒'); + } + }).catch((error) => { + console.error('Error:', error); + }) + debugger + } + function downPdf(fileUrl) { + window.open(fileUrl,'_blank'); + } + + </script> + <style> + .pdf .num { + width: 30%; + } + + .pdf.name { + width: 30% + } + + .pdf.downLink { + width: 40% + } + </style> + <apex:form id="theForm"> + <apex:actionFunction name="refreshFiles" action="{!refreshFiles}" reRender="pdf,uploadSection"/> + <br/> + <br/> + <apex:pageBlock id="block"> + <div style="text-align: center;"> + <apex:outputPanel id="errorMsg"> + <apex:pageMessages id="msgContent" escape="false" /> + </apex:outputPanel> + </div> + <apex:pageBlockSection id="uploadSection"> + <!-- <apex:inputFile id="file" value="{!documentData.body}" filename="{!documentData.name}" /> --> + <input type="file" id="file" name="filename"/> + <input class="btn" id='uploadFileId' type="Button" value="纭涓婁紶" onclick="uploadFile()" /> + </apex:pageBlockSection> + </apex:pageBlock> + <apex:pageBlock title="PDF鍒楄〃" id="pdf"> + <!-- <apex:pageBlockSection > --> + <!-- show uploated file list --> + <apex:pageBlockTable value="{!fileList}" var="file" align="center" columns="3" columnsWidth="30%,30%,40%"> + <apex:column id="name" headerValue="鏂囦欢鍚嶇О"> + <apex:outputLink value="/{!file.Id}" target="_blank">{!file.FileName__c}</apex:outputLink> + </apex:column> + <!-- <apex:column id="num" headerValue="鐖惰褰曢摼鎺�"> + <apex:outputLink value="/{!file.ParentRecordId__c}" target="_blank">{!file.ParentRecordId__c}</apex:outputLink> + </apex:column> --> + <apex:column id="previewLink" headerValue="棰勮閾炬帴"> + <apex:outputLink value="{!file.ViewLink__c}" target="{!file.ViewLink__c}">棰勮閾炬帴 + </apex:outputLink> + </apex:column> + <apex:column id="downLink" headerValue="涓嬭浇閾炬帴"> + <!-- <apex:outputLink value= "{!file.DownloadLink__c}" target="{!file.DownloadLink__c}">涓嬭浇閾炬帴 + </apex:outputLink> --> + <input class="btn" id='downloadFileButton' type="Button" value="涓嬭浇" onclick="downPdf('{!file.DownloadLink__c}')" /> + </apex:column> + </apex:pageBlockTable> + <!-- </apex:pageBlockSection> --> + </apex:pageBlock> + </apex:form> + +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/UploadPdf.page-meta.xml b/force-app/main/default/pages/UploadPdf.page-meta.xml new file mode 100644 index 0000000..6226c0b --- /dev/null +++ b/force-app/main/default/pages/UploadPdf.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>UploadPdf</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewASEActivityDecryptInfo.page b/force-app/main/default/pages/ViewASEActivityDecryptInfo.page new file mode 100644 index 0000000..2e1826e --- /dev/null +++ b/force-app/main/default/pages/ViewASEActivityDecryptInfo.page @@ -0,0 +1,85 @@ +<apex:page standardController="ASEActivity__c" extensions="NewAndEditASEActivityController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutEncryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!ASEActivity__c[encryptedAPI]}" /> + </apex:repeat> + <apex:outputField html-data-id="ReporterASE__c}" title="{!ApiPrefix}ReporterASE__c" value="{!ASEActivity__c['ReporterASE__c']}" /> + </apex:pageBlockSection> + <script> + var config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + }; + var staticResources = JSON.parse('{!staticResource}'); + var staticResourcesContact = JSON.parse('{!staticResourceContact}'); + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + + function QueryContactFromAWS() { + if('{!contactAWS}' != null && '{!contactAWS}' != ''){ + console.log('staticResourcesContact .queryUrl' + staticResourcesContact .queryUrl); + AWSService.query(staticResourcesContact .queryUrl, '{!contactAWS}', queryContactBack, staticResources.token); + } + } + + var queryContactBack = function queryContactBack(data){ + if(!data.object){ + console.log('data.object is ' + data.object); + return; + } + + let t = "[title='"+config.ApiPrefix+"ReporterASE__c']"; + let ele = document.querySelector(t); + ele.innerHTML = data.object.lastName; + ele.title=''; + + } + + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + + var queryBack = function queryBack(data) { + if(!data.object){ + console.log('data.object is ' + data.object); + return; + } + + for(let f in config.AWSToSobjectNonEncryptedMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectNonEncryptedMap[f]+"']"; + let ele = document.querySelector(t); + console.log(ele); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + // 褰撲笉鑳借嚜鍔ㄦ纭浛鎹㈠姞瀵嗘暟鎹椂闇�瑕佸湪姝ゅ娣诲姞js锛岀‖缂栫爜澶勭悊 + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QuerySobjectFromAWS(); + QueryContactFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewASEActivityDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewASEActivityDecryptInfo.page-meta.xml new file mode 100644 index 0000000..35fba37 --- /dev/null +++ b/force-app/main/default/pages/ViewASEActivityDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewASEActivityDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewAddressDecryptInfo.page b/force-app/main/default/pages/ViewAddressDecryptInfo.page new file mode 100644 index 0000000..5b8b014 --- /dev/null +++ b/force-app/main/default/pages/ViewAddressDecryptInfo.page @@ -0,0 +1,32 @@ +<apex:page standardController="Address__c" extensions="NewAndEditAddressController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!Address__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + // AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + function QueryAddressFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id1:0:j_id2']").innerHTML = data.object.telephone; + document.querySelector("[data-id='ZipCode__c']").innerHTML = data.object.zipCode; + document.querySelector("[data-id='Detailed_Address__c']").innerHTML = data.object.detailedAddress; + + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QueryAddressFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewAddressDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewAddressDecryptInfo.page-meta.xml new file mode 100644 index 0000000..0253771 --- /dev/null +++ b/force-app/main/default/pages/ViewAddressDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewAddressDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewAgencyContactDecryptInfo.page b/force-app/main/default/pages/ViewAgencyContactDecryptInfo.page new file mode 100644 index 0000000..2584e36 --- /dev/null +++ b/force-app/main/default/pages/ViewAgencyContactDecryptInfo.page @@ -0,0 +1,56 @@ +<apex:page standardController="Agency_Contact__c" extensions="NewAndEditAgencyContactController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutEncryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!Agency_Contact__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + }; + var staticResources = JSON.parse('{!staticResource}'); + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + if(!data.object){ + console.log('data.object is ' + data.object); + return; + } + + for(let f in config.AWSToSobjectNonEncryptedMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectNonEncryptedMap[f]+"']"; + let ele = document.querySelector(t); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + // 褰撲笉鑳借嚜鍔ㄦ纭浛鎹㈠姞瀵嗘暟鎹椂闇�瑕佸湪姝ゅ娣诲姞js锛岀‖缂栫爜澶勭悊 + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QuerySobjectFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewAgencyContactDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewAgencyContactDecryptInfo.page-meta.xml new file mode 100644 index 0000000..22e6f31 --- /dev/null +++ b/force-app/main/default/pages/ViewAgencyContactDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewAgencyContactDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewCaseDecryptInfo.page b/force-app/main/default/pages/ViewCaseDecryptInfo.page new file mode 100644 index 0000000..f523dec --- /dev/null +++ b/force-app/main/default/pages/ViewCaseDecryptInfo.page @@ -0,0 +1,30 @@ +<apex:page standardController="Case" extensions="NewAndEditCaseController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!Case[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var staticResources = JSON.parse('{!staticResource}'); + function QueryCaseFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id1:0:j_id2']").innerHTML = data.object.cicTelephone; + document.querySelector("[data-id='CASE_CUSTOMER__c']").innerHTML = data.object.caseCustomer; + document.querySelector("[data-id='Customer_manual__c']").innerHTML = data.object.customerManual; + + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QueryCaseFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewCaseDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewCaseDecryptInfo.page-meta.xml new file mode 100644 index 0000000..56646a0 --- /dev/null +++ b/force-app/main/default/pages/ViewCaseDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewCaseDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewConsumApplyEquipmentSetDetailDecrypt.page b/force-app/main/default/pages/ViewConsumApplyEquipmentSetDetailDecrypt.page new file mode 100644 index 0000000..2b24f9d --- /dev/null +++ b/force-app/main/default/pages/ViewConsumApplyEquipmentSetDetailDecrypt.page @@ -0,0 +1,26 @@ +<apex:page standardController="Consum_Apply_Equipment_Set_Detail__c" extensions="NewConsumApplyEquipSetDetailController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!Consum_Apply_Equipment_Set_Detail__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var staticResources = JSON.parse('{!staticResource}'); + function QueryConsumApplyFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id1:0:j_id2']").innerHTML = data.object.trialUser; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue'); + QueryConsumApplyFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewConsumApplyEquipmentSetDetailDecrypt.page-meta.xml b/force-app/main/default/pages/ViewConsumApplyEquipmentSetDetailDecrypt.page-meta.xml new file mode 100644 index 0000000..3fa8d80 --- /dev/null +++ b/force-app/main/default/pages/ViewConsumApplyEquipmentSetDetailDecrypt.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewConsumApplyEquipmentSetDetailDecrypt</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewContactDecryptInfo.page b/force-app/main/default/pages/ViewContactDecryptInfo.page new file mode 100644 index 0000000..5ac4ce9 --- /dev/null +++ b/force-app/main/default/pages/ViewContactDecryptInfo.page @@ -0,0 +1,68 @@ +<apex:page standardController="Contact" extensions="NewAndEditContactController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutEncryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!Contact[encryptedAPI]}" /> + </apex:repeat> + <apex:outputText label="缁熶竴鐢ㄦ埛Id" id="viewContactId" value="" /> + </apex:pageBlockSection> + <script> + var config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + }; + var staticResources = JSON.parse('{!staticResource}'); + console.log(staticResources) + function QuerySobjectFromAWS() { + console.log('AWSDataId:'+'{!AWSDataId}') + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + //鏌ユ壘viewContactId + AWSService.query(staticResources.viewUnifiedContactUrl, '{!unifiedIContactID}', queryBackContactId, staticResources.token); + } + var queryBack = function queryBack(data) { + if(!data.object){ + console.log('data.object is ' + data.object); + return; + } + + for(let f in config.AWSToSobjectNonEncryptedMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectNonEncryptedMap[f]+"']"; + let ele = document.querySelector(t); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + // 褰撲笉鑳借嚜鍔ㄦ纭浛鎹㈠姞瀵嗘暟鎹椂闇�瑕佸湪姝ゅ娣诲姞js锛岀‖缂栫爜澶勭悊 + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + }; + var queryBackContactId = function queryBackContactId(data) { + console.log('queryBackContactId:') + console.log(JSON.stringify(data)) + if(data.status == '0'){ + document.getElementById('page:form:pageBlock:pageBlockSection:viewContactId').innerText = data.object.viewContactId; + } + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QuerySobjectFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewContactDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewContactDecryptInfo.page-meta.xml new file mode 100644 index 0000000..e140d84 --- /dev/null +++ b/force-app/main/default/pages/ViewContactDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewContactDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewDecryptConsumApply.page b/force-app/main/default/pages/ViewDecryptConsumApply.page new file mode 100644 index 0000000..944b835 --- /dev/null +++ b/force-app/main/default/pages/ViewDecryptConsumApply.page @@ -0,0 +1,27 @@ +<apex:page standardController="Consum_Apply__c" extensions="NewConsumApplyController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!Consum_Apply__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var staticResources = JSON.parse('{!staticResource}'); + function QueryConsumApplyFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id1:0:j_id2']").innerHTML = data.object.phoneNumber; + document.querySelector("[data-id='direct_shippment_address__c']").innerHTML = data.object.directShippmentAddress; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue'); + QueryConsumApplyFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewDecryptConsumApply.page-meta.xml b/force-app/main/default/pages/ViewDecryptConsumApply.page-meta.xml new file mode 100644 index 0000000..f5dd129 --- /dev/null +++ b/force-app/main/default/pages/ViewDecryptConsumApply.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewDecryptConsumApply</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewEventDecryptInfo.page b/force-app/main/default/pages/ViewEventDecryptInfo.page new file mode 100644 index 0000000..043e210 --- /dev/null +++ b/force-app/main/default/pages/ViewEventDecryptInfo.page @@ -0,0 +1,93 @@ +<apex:page standardController="Event" extensions="NewAndEditEventController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutEncryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!Event[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + // var config = { + // SobjectName : "{!SobjectName}", + // ApiPrefix:"{!ApiPrefix}", + // AWSToSobjectMap:{!AWSToSobjectMapJson}, + // AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + // AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + // }; + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResources}'); + var contactAWSIds = JSON.parse('{!contactAWSIds}'); //AWS ContactId + var sfIdToContactInfo = {}; + + function preparePayloadForSearchContact(){ + let searchPayload = new Object(); + searchPayload.dataIds = contactAWSIds; + searchPayload.contactName = ''; + console.log('searchPayload: ' + JSON.stringify(searchPayload)); + return JSON.stringify(searchPayload); + } + + function searchContactAll(){ + let data = preparePayloadForSearchContact(); + let searchCallBack = function searchCallBack(result){ + let contacts = result.object; + console.log('contacts: ' + contacts); + if(contacts == null){ + return; + } + //璧嬪�肩粰鍓嶇椤甸潰 + for(var i=0;i<contacts.length;i++){ + // let temp = {} + // temp.lastName = contacts[i].lastName?contacts[i].lastName:''; + // console.log('temp.lastName: ' + temp.lastName); + console.log('contacts[i].lastName?contacts[i].lastName:' + contacts[i].lastName?contacts[i].lastName:''); + document.querySelector("[data-id='Visitor" + (i + 1) + "__c']").innerHTML = contacts[i].lastName?contacts[i].lastName:''; + // if(contacts[i].sfRecordId){ + // sfIdToContactInfo[contacts[i].sfRecordId] = temp; + // } + } + // console.log('AWS Result:' + JSON.stringify(sfIdToContactInfo)); + }; + AWSService.search(staticResources.searchUrl,data,searchCallBack,staticResources.token); + } + // function QuerySobjectFromAWS() { + // AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + // } + // var queryBack = function queryBack(data) { + // if(!data.object){ + // console.log('data.object is ' + data.object); + // return; + // } + + // for(let f in config.AWSToSobjectNonEncryptedMap){ + // let t = "[title='"+config.ApiPrefix+config.AWSToSobjectNonEncryptedMap[f]+"']"; + // let ele = document.querySelector(t); + // if(ele){ + // ele.title = ''; + // if(data.object.hasOwnProperty(f)){ + // ele.innerHTML = data.object[f]; + // } + // else{ + // console.log(f + 'is not in data.object'); + // } + // }else{ + // console.log('selector='+t+' not found'); + // } + + // } + // // 褰撲笉鑳借嚜鍔ㄦ纭浛鎹㈠姞瀵嗘暟鎹椂闇�瑕佸湪姝ゅ娣诲姞js锛岀‖缂栫爜澶勭悊 + // // document.querySelector("[data-id='LastName']").value = data.object.lastName; + // }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + //QuerySobjectFromAWS(); + searchContactAll(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewEventDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewEventDecryptInfo.page-meta.xml new file mode 100644 index 0000000..a6a5318 --- /dev/null +++ b/force-app/main/default/pages/ViewEventDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewEventDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewInquiryFormDecryptInfo.page b/force-app/main/default/pages/ViewInquiryFormDecryptInfo.page new file mode 100644 index 0000000..91fedea --- /dev/null +++ b/force-app/main/default/pages/ViewInquiryFormDecryptInfo.page @@ -0,0 +1,56 @@ +<apex:page standardController="Inquiry_form__c" extensions="NewAndEditInquiryFormController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutEncryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!Inquiry_form__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + }; + var staticResources = JSON.parse('{!staticResource}'); + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + if(!data.object){ + console.log('data.object is ' + data.object); + return; + } + + for(let f in config.AWSToSobjectNonEncryptedMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectNonEncryptedMap[f]+"']"; + let ele = document.querySelector(t); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + // 褰撲笉鑳借嚜鍔ㄦ纭浛鎹㈠姞瀵嗘暟鎹椂闇�瑕佸湪姝ゅ娣诲姞js锛岀‖缂栫爜澶勭悊 + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QuerySobjectFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewInquiryFormDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewInquiryFormDecryptInfo.page-meta.xml new file mode 100644 index 0000000..01852b9 --- /dev/null +++ b/force-app/main/default/pages/ViewInquiryFormDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewInquiryFormDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewInspectionReportDecryptInfo.page b/force-app/main/default/pages/ViewInspectionReportDecryptInfo.page new file mode 100644 index 0000000..05bd695 --- /dev/null +++ b/force-app/main/default/pages/ViewInspectionReportDecryptInfo.page @@ -0,0 +1,56 @@ +<apex:page standardController="Inspection_Report__c" extensions="NewAndEditInspectionReportController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutEncryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!Inspection_Report__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + }; + var staticResources = JSON.parse('{!staticResource}'); + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + if(!data.object){ + console.log('data.object is ' + data.object); + return; + } + + for(let f in config.AWSToSobjectNonEncryptedMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectNonEncryptedMap[f]+"']"; + let ele = document.querySelector(t); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + // 褰撲笉鑳借嚜鍔ㄦ纭浛鎹㈠姞瀵嗘暟鎹椂闇�瑕佸湪姝ゅ娣诲姞js锛岀‖缂栫爜澶勭悊 + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QuerySobjectFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewInspectionReportDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewInspectionReportDecryptInfo.page-meta.xml new file mode 100644 index 0000000..55ec800 --- /dev/null +++ b/force-app/main/default/pages/ViewInspectionReportDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>53.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewInspectionReportDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewLeadDecryptInfo.page b/force-app/main/default/pages/ViewLeadDecryptInfo.page new file mode 100644 index 0000000..21ae11c --- /dev/null +++ b/force-app/main/default/pages/ViewLeadDecryptInfo.page @@ -0,0 +1,32 @@ +<apex:page standardController="Lead" extensions="NewAndEditLeadController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!Lead[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var staticResources = JSON.parse('{!staticResource}'); + function QueryLeadFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + document.querySelector("[data-id='LastName']").innerHTML = data.object.lastName; + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id2:0:j_id3']").innerHTML = data.object.phone; + document.querySelector("[data-id='Email']").innerHTML = data.object.email; + + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QueryLeadFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewLeadDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewLeadDecryptInfo.page-meta.xml new file mode 100644 index 0000000..aa6ca52 --- /dev/null +++ b/force-app/main/default/pages/ViewLeadDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewLeadDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewListOfConsumablesDecrypt.page b/force-app/main/default/pages/ViewListOfConsumablesDecrypt.page new file mode 100644 index 0000000..f654d6a --- /dev/null +++ b/force-app/main/default/pages/ViewListOfConsumablesDecrypt.page @@ -0,0 +1,2 @@ +<apex:page > +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewListOfConsumablesDecrypt.page-meta.xml b/force-app/main/default/pages/ViewListOfConsumablesDecrypt.page-meta.xml new file mode 100644 index 0000000..bc48055 --- /dev/null +++ b/force-app/main/default/pages/ViewListOfConsumablesDecrypt.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewListOfConsumablesDecrypt</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewOnCallDecrypt.page b/force-app/main/default/pages/ViewOnCallDecrypt.page new file mode 100644 index 0000000..88fb2a1 --- /dev/null +++ b/force-app/main/default/pages/ViewOnCallDecrypt.page @@ -0,0 +1,27 @@ +<apex:page standardController="On_Call__c" extensions="OnCallController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!On_Call__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var staticResources = JSON.parse('{!staticResource}'); + function QueryConsumApplyFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id1:0:j_id2']").innerHTML = data.object.callerPhone; + document.querySelector("[data-id='Responsible_Person_HP__c']").innerHTML = data.object.responsiblePersonHP; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue'); + QueryConsumApplyFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewOnCallDecrypt.page-meta.xml b/force-app/main/default/pages/ViewOnCallDecrypt.page-meta.xml new file mode 100644 index 0000000..4972bde --- /dev/null +++ b/force-app/main/default/pages/ViewOnCallDecrypt.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewOnCallDecrypt</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewParticipantsDecryptInfo.page b/force-app/main/default/pages/ViewParticipantsDecryptInfo.page new file mode 100644 index 0000000..2068804 --- /dev/null +++ b/force-app/main/default/pages/ViewParticipantsDecryptInfo.page @@ -0,0 +1,28 @@ +<apex:page standardController="CampaignMember__c" extensions="ViewParticipantsController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <apex:outputText label="缁熶竴鐢ㄦ埛Id" id="viewContactId" value="" /> + </apex:pageBlockSection> + <script> + + var staticResources = JSON.parse('{!staticResourceContact}'); + console.log(staticResources) + function QuerySobjectFromAWS() { + //鏌ユ壘viewContactId + AWSService.query(staticResources.viewUnifiedContactUrl, '948578480969220097', queryBackContactId, staticResources.token); + } + var queryBackContactId = function queryBackContactId(data) { + console.log(JSON.stringify(data)) + if(data.status == '0'){ + document.getElementById('page:form:pageBlock:pageBlockSection:viewContactId').innerText = data.object.viewContactId; + } + }; + sfdcPage.appendToOnloadQueue(function () { + QuerySobjectFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewParticipantsDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewParticipantsDecryptInfo.page-meta.xml new file mode 100644 index 0000000..7f43a96 --- /dev/null +++ b/force-app/main/default/pages/ViewParticipantsDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewParticipantsDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewQISReportDecryptInfo.page b/force-app/main/default/pages/ViewQISReportDecryptInfo.page new file mode 100644 index 0000000..f3c197d --- /dev/null +++ b/force-app/main/default/pages/ViewQISReportDecryptInfo.page @@ -0,0 +1,65 @@ +<apex:page standardController="QIS_Report__c" extensions="NewAndEditQISController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!QIS_Report__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + }; + var staticResources = JSON.parse('{!staticResource}'); + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + for(let f in config.AWSToSobjectMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectMap[f]+"']"; + let ele = document.querySelector(t); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + + for(let f in config.AWSToSobjectEncryptedMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectMap[f]+"']"; + let ele = document.querySelector(t); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + QuerySobjectFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewQISReportDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewQISReportDecryptInfo.page-meta.xml new file mode 100644 index 0000000..cc55e06 --- /dev/null +++ b/force-app/main/default/pages/ViewQISReportDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewQISReportDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewRentalApplyDecrypt.page b/force-app/main/default/pages/ViewRentalApplyDecrypt.page new file mode 100644 index 0000000..40c107e --- /dev/null +++ b/force-app/main/default/pages/ViewRentalApplyDecrypt.page @@ -0,0 +1,27 @@ +<apex:page standardController="Rental_Apply__c" extensions="RentalApplyController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!Rental_Apply__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var staticResources = JSON.parse('{!staticResource}'); + function QueryConsumApplyFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id1:1:j_id2']").innerHTML = data.object.phoneNumber; + document.querySelector("[data-id='direct_shippment_address__c']").innerHTML = data.object.directShippmentAddress; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue'); + QueryConsumApplyFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewRentalApplyDecrypt.page-meta.xml b/force-app/main/default/pages/ViewRentalApplyDecrypt.page-meta.xml new file mode 100644 index 0000000..65140de --- /dev/null +++ b/force-app/main/default/pages/ViewRentalApplyDecrypt.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewRentalApplyDecrypt</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewRepairEncrypt.page b/force-app/main/default/pages/ViewRepairEncrypt.page new file mode 100644 index 0000000..133195a --- /dev/null +++ b/force-app/main/default/pages/ViewRepairEncrypt.page @@ -0,0 +1,47 @@ +<apex:page standardController="Repair__c" extensions="NewRepairController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" /> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!Repair__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + debugger; + var staticResources = JSON.parse('{!staticResource}'); + var staticResourceContact = JSON.parse('{!staticResourceContact}'); + var staticResourceAddress = JSON.parse('{!staticResourceAddress}'); + function QueryConsumApplyFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + console.log(data); + document.querySelector("[data-id='address_Contacts__c']").innerHTML = data.object.addressContacts; + document.querySelector("[data-id='address_Contacts_Name__c']").innerHTML = data.object.addressContactsName; + document.querySelector("[data-id='address_Telephone__c']").innerHTML = data.object.addressTelephone; + document.querySelector("[data-id='address_ZipCode__c']").innerHTML = data.object.addressZipCode; + document.querySelector("[data-id='Detailed_Address__c']").innerHTML = data.object.detailedAddress; + document.querySelector("[data-id='RepairApplicant__c']").innerHTML = data.object.repairApplicant; + AWSService.query(staticResourceAddress.queryUrl, '{!DecryptAWSDataId}', queryBackDecrypt, staticResourceAddress.token); + }; + var queryBackContact = function queryBack(data) { + console.log(data); + document.querySelector("[data-id='address_Contacts__c']").innerHTML = data.object.lastName; + }; + var queryBackDecrypt = function queryBack(data) { + document.querySelector("[data-id='Detailed_Address__c']").innerHTML = data.object.detailedAddress; + document.querySelector("[data-id='address_ZipCode__c']").innerHTML = data.object.zipCode; + document.querySelector("[data-id='address_Telephone__c']").innerHTML = data.object.telephone; + AWSService.query(staticResourceContact.queryUrl, '{!ContactAWSDataId}', queryBackContact, staticResourceContact.token); + } + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue'); + debugger; + QueryConsumApplyFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewRepairEncrypt.page-meta.xml b/force-app/main/default/pages/ViewRepairEncrypt.page-meta.xml new file mode 100644 index 0000000..c7673e0 --- /dev/null +++ b/force-app/main/default/pages/ViewRepairEncrypt.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewRepairEncrypt</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewRepairSubOrderDecryptInfo.page b/force-app/main/default/pages/ViewRepairSubOrderDecryptInfo.page new file mode 100644 index 0000000..17dd54b --- /dev/null +++ b/force-app/main/default/pages/ViewRepairSubOrderDecryptInfo.page @@ -0,0 +1,56 @@ +<apex:page standardController="RepairSubOrder__c" extensions="NewAndEditRepairSubOrderController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutEncryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!RepairSubOrder__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + }; + var staticResources = JSON.parse('{!staticResource}'); + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + if(!data.object){ + console.log('data.object is ' + data.object); + return; + } + + for(let f in config.AWSToSobjectNonEncryptedMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectNonEncryptedMap[f]+"']"; + let ele = document.querySelector(t); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + // 褰撲笉鑳借嚜鍔ㄦ纭浛鎹㈠姞瀵嗘暟鎹椂闇�瑕佸湪姝ゅ娣诲姞js锛岀‖缂栫爜澶勭悊 + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QuerySobjectFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewRepairSubOrderDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewRepairSubOrderDecryptInfo.page-meta.xml new file mode 100644 index 0000000..6b0a584 --- /dev/null +++ b/force-app/main/default/pages/ViewRepairSubOrderDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewRepairSubOrderDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewReportDecryptInfo.page b/force-app/main/default/pages/ViewReportDecryptInfo.page new file mode 100644 index 0000000..fbcaf7a --- /dev/null +++ b/force-app/main/default/pages/ViewReportDecryptInfo.page @@ -0,0 +1,40 @@ +<apex:page standardController="Report__c" extensions="NewAndEditReportController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!encryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" value="{!Report__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + var staticResources = JSON.parse('{!staticResource}'); + function QueryLeadFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + document.querySelector("[data-id='VOC_Informer_Name__c']").innerHTML=data.object.vocInformerName!=null?data.object.vocInformerName.replace(/"/g,""):''; + document.querySelector("[id='page:form:pageBlock:pageBlockSection:j_id1:1:j_id2']").innerHTML=data.object.callerPhone!=null?data.object.callerPhone.replace(/"/g,""):''; + document.querySelector("[data-id='VOC_Informer_Contact__c']").innerHTML=data.object.vocInformerContact!=null?data.object.vocInformerContact.replace(/"/g,""):''; + document.querySelector("[data-id='Person_In_Charge_Text__c']").innerHTML=data.object.personInChargeText!=null?data.object.personInChargeText.replace(/"/g,""):''; + document.querySelector("[data-id='Professor_sigh_text__c']").innerHTML=data.object.professorSighText!=null?data.object.professorSighText.replace(/"/g,""):''; + document.querySelector("[data-id='Staff_Info_Manual_c__c']").innerHTML=data.object.staffInfoManual!=null?data.object.staffInfoManual.replace(/"/g,""):''; + document.querySelector("[data-id='Responsible_Person_HP_c__c']").innerHTML=data.object.responsiblePersonHP!=null?data.object.responsiblePersonHP.replace(/"/g,""):''; + document.querySelector("[data-id='Practitioner1_Part__c']").innerHTML=data.object.practitioner1Part!=null?data.object.practitioner1Part.replace(/"/g,""):''; + document.querySelector("[data-id='Practitioner2_Part__c']").innerHTML=data.object.practitioner2Part!=null?data.object.practitioner2Part.replace(/"/g,""):''; + document.querySelector("[data-id='Practitioner3_Part__c']").innerHTML=data.object.practitioner3Part!=null?data.object.practitioner3Part.replace(/"/g,""):''; + document.querySelector("[data-id='Practitioner4_Part__c']").innerHTML=data.object.practitioner4Part!=null?data.object.practitioner4Part.replace(/"/g,""):''; + document.querySelector("[data-id='Practitioner5_Part__c']").innerHTML=data.object.practitioner5Part!=null?data.object.practitioner5Part.replace(/"/g,""):''; + document.querySelector("[data-id='age__c']").innerHTML=data.object.age!=null?data.object.age.replace(/"/g,""):''; + document.querySelector("[data-id='Medical_History__c']").innerHTML=data.object.medicalHistory!=null?data.object.medicalHistory.replace(/"/g,""):''; + document.querySelector("[data-id='sex__c']").innerHTML=data.object.sex!=null?data.object.sex.replace(/"/g,""):''; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('awsDataId = '+'{!AWSDataId}') + QueryLeadFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewReportDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewReportDecryptInfo.page-meta.xml new file mode 100644 index 0000000..189df72 --- /dev/null +++ b/force-app/main/default/pages/ViewReportDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewReportDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/pages/ViewTenderinformationDecryptInfo.page b/force-app/main/default/pages/ViewTenderinformationDecryptInfo.page new file mode 100644 index 0000000..3deb9e6 --- /dev/null +++ b/force-app/main/default/pages/ViewTenderinformationDecryptInfo.page @@ -0,0 +1,58 @@ +<apex:page standardController="Tender_information__c" extensions="NewAndEditTenderinformationController" id="page"> + <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/> + <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script> + <apex:form id="form"> + <apex:pageblock id="pageBlock"> + <apex:pageBlockSection showHeader="false" title="" collapsible="true" columns="2" id="pageBlockSection"> + <!--Each section has layoutFields, let's iterate them as well--> + <apex:repeat value="{!layoutEncryptedAPIList}" var="encryptedAPI"> + <apex:outputField html-data-id="{!encryptedAPI}" title="{!ApiPrefix}{!encryptedAPI}" value="{!Tender_information__c[encryptedAPI]}" /> + </apex:repeat> + </apex:pageBlockSection> + <script> + AWSService.sfSessionId = '{!GETSESSIONID()}'; + var config = { + SobjectName : "{!SobjectName}", + ApiPrefix:"{!ApiPrefix}", + AWSToSobjectMap:{!AWSToSobjectMapJson}, + AWSToSobjectNonEncryptedMap:{!AWSToSobjectNonEncryptedMapJson}, + AWSToSobjectEncryptedMap:{!AWSToSobjectEncryptedMapJson} + }; + var staticResources = JSON.parse('{!staticResource}'); + function QuerySobjectFromAWS() { + AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token); + } + var queryBack = function queryBack(data) { + if(!data.object){ + console.log('data.object is ' + data.object); + return; + } + + for(let f in config.AWSToSobjectNonEncryptedMap){ + let t = "[title='"+config.ApiPrefix+config.AWSToSobjectNonEncryptedMap[f]+"']"; + let ele = document.querySelector(t); + if(ele){ + ele.title = ''; + if(data.object.hasOwnProperty(f)){ + ele.innerHTML = data.object[f]; + } + else{ + console.log(f + 'is not in data.object'); + } + }else{ + console.log('selector='+t+' not found'); + } + + } + // 褰撲笉鑳借嚜鍔ㄦ纭浛鎹㈠姞瀵嗘暟鎹椂闇�瑕佸湪姝ゅ娣诲姞js锛岀‖缂栫爜澶勭悊 + // document.querySelector("[data-id='LastName']").value = data.object.lastName; + }; + sfdcPage.appendToOnloadQueue(function () { + console.log('sfdcPage.appendToOnloadQueue') + // document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].innerText = '濮撳悕' + QuerySobjectFromAWS(); + }); + </script> + </apex:pageblock> + </apex:form> +</apex:page> \ No newline at end of file diff --git a/force-app/main/default/pages/ViewTenderinformationDecryptInfo.page-meta.xml b/force-app/main/default/pages/ViewTenderinformationDecryptInfo.page-meta.xml new file mode 100644 index 0000000..371abd6 --- /dev/null +++ b/force-app/main/default/pages/ViewTenderinformationDecryptInfo.page-meta.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexPage xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>54.0</apiVersion> + <availableInTouch>false</availableInTouch> + <confirmationTokenRequired>false</confirmationTokenRequired> + <label>ViewTenderinformationDecryptInfo</label> +</ApexPage> diff --git a/force-app/main/default/triggers/FileAddressTrigger.trigger b/force-app/main/default/triggers/FileAddressTrigger.trigger new file mode 100644 index 0000000..861b577 --- /dev/null +++ b/force-app/main/default/triggers/FileAddressTrigger.trigger @@ -0,0 +1,13 @@ +trigger FileAddressTrigger on FileAddress__c (before delete) { + List<FileAddress__c> fileAddressList = trigger.old; + Set<String> deleteFiles = new Set<String>(); + for(FileAddress__c fd:fileAddressList){ + if(String.isNotBlank(fd.AWS_File_Key__c)&&String.isNotEmpty(fd.AWS_File_Key__c)){ + deleteFiles.add(fd.AWS_File_Key__c); + } + } + if(!deleteFiles.isEmpty()){ + system.debug('DeleteFiles Value:'+JSON.serialize(deleteFiles)); + AWSServiceTool.deleteFileAddress(deleteFiles); + } +} \ No newline at end of file diff --git a/force-app/main/default/triggers/FileAddressTrigger.trigger-meta.xml b/force-app/main/default/triggers/FileAddressTrigger.trigger-meta.xml new file mode 100644 index 0000000..23257e1 --- /dev/null +++ b/force-app/main/default/triggers/FileAddressTrigger.trigger-meta.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ApexTrigger xmlns="http://soap.sforce.com/2006/04/metadata"> + <apiVersion>52.0</apiVersion> + <status>Active</status> +</ApexTrigger> -- Gitblit v1.9.1