Skip to content

Commit

Permalink
Sept Sprint Update
Browse files Browse the repository at this point in the history
  • Loading branch information
bobbysfdev committed Sep 27, 2024
1 parent be06f41 commit b2af5c0
Show file tree
Hide file tree
Showing 15 changed files with 803 additions and 16 deletions.
5 changes: 5 additions & 0 deletions force-app/main/default/classes/IndicatorController.cls
Original file line number Diff line number Diff line change
Expand Up @@ -343,4 +343,9 @@ public with sharing class IndicatorController {
return wrapper;
}

@AuraEnabled(Cacheable=true)
public static MetadataUtility.indicatorBundle getIndicatorBundleWrapper(String QualifiedApiName) {
return new MetadataUtility.indicatorBundle(QualifiedApiName);
}

}
147 changes: 140 additions & 7 deletions force-app/main/default/classes/MetadataUtility.cls
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,29 @@ public with sharing class MetadataUtility {

/**Wrappers**/
public class deploymentWrapper {

@AuraEnabled public Indicator_Bundle__mdt indicatorBundle;
@AuraEnabled public List<Indicator_Bundle_Item__mdt> indicatorBundleItems;
@AuraEnabled public Indicator_Item__mdt indicatorItem;
@AuraEnabled public List<Indicator_Item_Extension__mdt> indicatorItemExtensions;

public deploymentWrapper() {}

}

/**Controller Methods**/
@AuraEnabled
public static Id deployIndicatorBundles(deploymentWrapper items) {
return deployWrapperMetadata(items);
public static Id deployIndicatorBundles(String wrapper) {
System.debug(wrapper);

deploymentWrapper parsedWrapper = (MetadataUtility.deploymentWrapper) JSON.deserialize(wrapper,MetadataUtility.deploymentWrapper.class);

System.debug(parsedWrapper);

return deployWrapperMetadata(parsedWrapper);
}

/**Metadata Methods**/
private static Id deployWrapperMetadata(deploymentWrapper wrapper) {
System.debug(wrapper);
deployContainer = new Metadata.DeployContainer(); // Build New Deployment Container
if(wrapper.indicatorBundle != null) processMetadataRecords(new List<Indicator_Bundle__mdt>{wrapper.indicatorBundle},Indicator_Bundle__mdt.getSObjectType());
if(wrapper.indicatorItem != null) processMetadataRecords(new List<Indicator_Item__mdt>{wrapper.indicatorItem},Indicator_Item__mdt.getSObjectType());
Expand All @@ -47,6 +52,7 @@ public with sharing class MetadataUtility {
}

private static void processMetadataRecords(List<SObject> records,SObjectType sObjectType) {
System.debug(records);
describeSObjectResult = sObjectType.getDescribe();
for(SObject record : records) buildMetaData(record.getPopulatedFieldsAsMap()); // Build Metadata Maps and Add to Deploy Container
}
Expand All @@ -61,6 +67,9 @@ public with sharing class MetadataUtility {
String label = (String) populatedFieldsMap.get(Label_Field);

if(String.isBlank(label)) label = 'Unnamed Metadata';

System.debug(fullName+' '+label);

Metadata.CustomMetadata customMetadata = buildCustomMetadata(fullName,label);
deployContainer.addMetadata(customMetadata);
}
Expand Down Expand Up @@ -94,10 +103,10 @@ public with sharing class MetadataUtility {

Object value = null;

if(isReference || isEntityRelationshipField) {
/*if(isReference || isEntityRelationshipField) {
SObject relatedRecord;
Map<String,Object> relatedRecordPopulatedFieldMap;
String relationshipName = (isEntityRelationshipField) ? fieldName.removeEnd('__c')+'__r' : fieldResult.getRelationshipName(); /**We replace __c with __r to resolve Entity Relationship non reference**/
String relationshipName = (isEntityRelationshipField) ? fieldName.removeEnd('__c')+'__r' : fieldResult.getRelationshipName(); *//**We replace __c with __r to resolve Entity Relationship non reference**//*
if(populatedFieldsMap.containsKey(relationshipName)) {
try{
relatedRecord = (SObject) populatedFieldsMap.get(relationshipName);
Expand All @@ -108,16 +117,140 @@ public with sharing class MetadataUtility {
}
if(relatedRecordPopulatedFieldMap != null && relatedRecordPopulatedFieldMap.containsKey(QualifiedApiName_Field)) value = (String) relatedRecordPopulatedFieldMap.get(QualifiedApiName_Field);
} else if(populatedFieldsMap.containsKey(fieldName)) value = populatedFieldsMap.get(fieldName);
} else if(populatedFieldsMap.containsKey(fieldName)) value = populatedFieldsMap.get(fieldName);*/

value = populatedFieldsMap.get(fieldName);
if(value == null || value == '' && fieldResult.defaultValue != null) value = fieldResult.defaultValue;
else if(value == null || value == '' && fieldResult.defaultValueFormula != null) value = fieldResult.defaultValueFormula.removeEnd('\'').removeEnd('"').removeStart('\'').removeStart('"');

Metadata.CustomMetadataValue metadataField = new Metadata.CustomMetadataValue();
metadataField.field = fieldName;
metadataField.value = value;


System.debug(fieldName+' : '+value);

customMetadata.values.add(metadataField);
}


private static Set<String> getCustomFields(SObjectType SObjectType) {
Set<String> returnSet = new Set<String>();
if(SObjectType == null) return returnSet; /**Error No Matching Object**/
Schema.DescribeSObjectResult objResult = SObjectType.getDescribe();
for(SObjectField objectField : objResult.fields.getMap().values()) {
DescribeFieldResult fieldResult = objectField.getDescribe();
if(fieldResult.isCustom()) returnSet.add(fieldResult.getName());
}
return returnSet;
}

private static final SObjectField indicatorBundleItem_Field_Order = Indicator_Bundle_Item__mdt.Order__c;
private static final SObjectField indicatorBundleItem_Field_Item = Indicator_Bundle_Item__mdt.Indicator_Item__c;
private static final SObjectField indicatorItemExtension_Field_Item = Indicator_Item_Extension__mdt.Indicator_Item__c;

private static final SObjectField indicatorBundleItem_Field_Delete = Indicator_Bundle_Item__mdt.Delete__c;
private static final SObjectField indicatorItemExtension_Field_Delete = Indicator_Item_Extension__mdt.Delete__c;
private static final SObjectField indicatorItemExtension_Field_Priority = Indicator_Item_Extension__mdt.Priority__c;
private static final SObjectField indicatorItemExtension_Field_Indicator_Item = Indicator_Item_Extension__mdt.Indicator_Item__c;

private static final SObjectField indicatorItem_Field_Delete = Indicator_Item__mdt.Delete__c;
private static final SObjectField indicatorItem_Field_sObject = Indicator_Item__mdt.sObject__c;
private static final SObjectField indicatorItem_Field_Field = Indicator_Item__mdt.Field__c;

private static final Schema.ChildRelationship bundleItemRelationShip = Indicator_Bundle__mdt.SObjectType.getDescribe().getChildRelationships()[0];
private static Schema.ChildRelationship getItemExtensionRelationShip() {
for(Schema.ChildRelationship relationship : Indicator_Item__mdt.SObjectType.getDescribe().getChildRelationships()) {
if(relationship.getField() == indicatorItemExtension_Field_Indicator_Item) return relationship;
}
return null;
}

private static Indicator_Bundle__mdt getIndicatorBundle(String qualifiedApiName) {
Set<String> indicatorBundleFields = new Set<String>(getCustomFields(Indicator_Bundle__mdt.SObjectType));
indicatorBundleFields.addAll(new Set<String>{
'Id',
'QualifiedApiName',
'Label'
});

Set<String> indicatorBundleItemFields = new Set<String>(getCustomFields(Indicator_Bundle_Item__mdt.SObjectType));
indicatorBundleItemFields.addAll(new Set<String>{
'Id',
'QualifiedApiName',
'Label',
indicatorBundleItem_Field_Item.getDescribe().getRelationshipName()+'.QualifiedApiName'
});

String queryString = 'SELECT ';
queryString += String.join(new List<String>(indicatorBundleFields),',');

queryString += ',\n(SELECT ';
queryString += String.join(new List<String>(indicatorBundleItemFields),',') +' \nFROM '+bundleItemRelationShip.getRelationshipName();
queryString += ' \nWHERE '+indicatorBundleItem_Field_Delete.getDescribe().getName()+' != TRUE';
queryString += ' \nORDER BY '+indicatorBundleItem_Field_Order.getDescribe().getName()+' ASC NULLS LAST)';

queryString += ' \nFROM '+Indicator_Bundle__mdt.SObjectType.getDescribe().getName();
queryString += ' \nWHERE QualifiedApiName = :qualifiedApiName';

Map<String,Object> queryBindMap = new Map<String, Object>{
'qualifiedApiName' => qualifiedApiName
};

AccessLevel level = (Test.isRunningTest()) ? AccessLevel.SYSTEM_MODE : AccessLevel.USER_MODE; /**For Testing only we allow all fields**/
List<Indicator_Bundle__mdt> bundles = Database.queryWithBinds(queryString,queryBindMap,level);

if(bundles.isEmpty()) return null;
else return bundles[0];
}
private static List<Indicator_Item__mdt> getAllIndicatorItems(String sObjectName) {
Set<String> indicatorItemsFields = new Set<String>(getCustomFields(Indicator_Item__mdt.SObjectType));
indicatorItemsFields.addAll(new Set<String>{
'Id',
'QualifiedApiName',
'Label',
indicatorItem_Field_Field.getDescribe().getName().replace('__c','__r')+'.QualifiedApiName'
});

Set<String> indicatorItemExtensionFields = new Set<String>(getCustomFields(Indicator_Item_Extension__mdt.SObjectType));
indicatorItemExtensionFields.addAll(new Set<String>{
'Id',
'QualifiedApiName',
'Label',
indicatorItemExtension_Field_Item.getDescribe().getRelationshipName()+'.QualifiedApiName'
});

String queryString = 'SELECT ';
queryString += String.join(new List<String>(indicatorItemsFields),',');

queryString += ',\n(SELECT ';
queryString += String.join(new List<String>(indicatorItemExtensionFields),',') +' \nFROM '+getItemExtensionRelationShip().getRelationshipName();
queryString += ' \nWHERE '+indicatorItemExtension_Field_Delete.getDescribe().getName()+' != TRUE';
queryString += ' \nORDER BY '+indicatorItemExtension_Field_Priority.getDescribe().getName()+' ASC NULLS LAST)';

queryString += ' \nFROM '+Indicator_Item__mdt.SObjectType.getDescribe().getName();
queryString += ' \nWHERE '+indicatorItem_Field_Delete.getDescribe().getName()+' != TRUE';
queryString += ' \nAND '+indicatorItem_Field_sObject.getDescribe().getName()+' = :sObjectName';

queryString += ' \nORDER BY '+indicatorItem_Field_Field.getDescribe().getName()+' ASC';

Map<String,Object> queryBindMap = new Map<String, Object>{
'sObjectName' => sObjectName
};
AccessLevel level = (Test.isRunningTest()) ? AccessLevel.SYSTEM_MODE : AccessLevel.USER_MODE; /**For Testing only we allow all fields**/
return Database.queryWithBinds(queryString,queryBindMap,level);
}

public class indicatorBundle {
@AuraEnabled
public Indicator_Bundle__mdt bundle;
@AuraEnabled
public List<Indicator_Item__mdt> allItems;

public indicatorBundle(String qualifiedApiName) {
this.bundle = getIndicatorBundle(qualifiedApiName);
if(this.bundle != null) this.allItems = getAllIndicatorItems(this.bundle.sObject__c);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@
<c-key
bundle={bundle}
is-setup="true"
></c-key>
oneditindicator={handleEditIndicator}>
</c-key>
</lightning-layout-item>
</lightning-layout>
</template>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ import { LightningElement, wire, track } from 'lwc';
import getIndicatorConfig from '@salesforce/apex/IndicatorController.getIndicatorBundle';
import getNewCmdtUrls from '@salesforce/apex/IndicatorController.getNewCmdtUrls';
import getBundleOptions from '@salesforce/apex/IndicatorListBundleSelector.getBundleOptions';
import getIndicatorBundleWrapper from '@salesforce/apex/IndicatorController.getIndicatorBundleWrapper';

import { refreshApex } from '@salesforce/apex';

import IndicatorEditModal from "c/indicatorEditModal";
import indicatorBuilderModal from 'c/indicatorBuilderModal';

import Indicator_Bundle from "@salesforce/schema/Indicator_Bundle__mdt";
import Indicator_Item from "@salesforce/schema/Indicator_Item__mdt";
import Indicator_Item_Extension from "@salesforce/schema/Indicator_Item_Extension__mdt";

import {RefreshEvent} from "lightning/refresh";

export default class ConfigurationManager extends LightningElement {
bundleName = '';
Expand Down Expand Up @@ -67,6 +70,23 @@ export default class ConfigurationManager extends LightningElement {
this.showSpinner = false;
}

indicatorBundle
@wire(getIndicatorBundleWrapper, {QualifiedApiName : '$bundleName'})
processIndicatorBundleWrapper ({ error, data }) {
if(data){
const wrapper = JSON.parse(JSON.stringify(data));
(wrapper?.bundle?.Indicator_Bundle_Items__r || [])
.forEach(bundleItem => {
bundleItem.Indicator_Item__r = (wrapper.allItems || [])
.find(item => item.QualifiedApiName === bundleItem.Indicator_Item__r.QualifiedApiName);
})
this.indicatorBundle = wrapper;
}
else if (error) {
console.log(error)
}
}

handleChange(event) {
this.showSpinner = true;
this.bundleName = event.detail.value;
Expand All @@ -88,9 +108,31 @@ export default class ConfigurationManager extends LightningElement {
console.log(result);
});
break;
case Indicator_Item.objectApiName.replace('__c',''):
this.openModal();
break;
default:
window.open('/lightning/setup/CustomMetadata/page?address=' + event.target.value,'_blank');
}
}

modalIsOpen = false;
async openModal(indicatorId) {
let indicator = {};
if(indicatorId) indicator = this.indicatorBundle.allItems.find(item => item.Id === indicatorId) || {};

this.modalIsOpen = true;
this.modal = await indicatorBuilderModal.open({
size: 'large',
indicator
}).then((result) => {
this.modalIsOpen = false;
this.dispatchEvent(new RefreshEvent());
});
}

handleEditIndicator(event) {
this.openModal(event.detail);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ export default class EditIndicatorBundle extends LightningElement {


saveMetaDataRecord() {
deployIndicatorBundles({records: [this.indicator_Bundle]})
deployIndicatorBundles({wrapper: [this.indicator_Bundle]})
.then(result => {
console.log('deploymentId = result');
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<description>Component is used to create and edit indicator bundles</description>
<isExposed>false</isExposed>
<isExposed>true</isExposed>
<masterLabel>Edit Indicator Bundle</masterLabel>
<targets>
<target>lightning__AppPage</target>
<target>lightning__Tab</target>
</targets>
</LightningComponentBundle>
Loading

0 comments on commit b2af5c0

Please sign in to comment.