Pages

Friday 26 April 2013

Add Custom View to lookup window when click on the "Add Existing Button"

Add the following script to the JS file (I borrowed the fetchXml and layoutXml combination from SDK document).
function addExistingFromSubGridCustom(params) {

    var relName = params.gridControl.getParameter("relName"),
        roleOrd = params.gridControl.getParameter("roleOrd"),
        viewId = "{00000000-0000-0000-0000-000000000001}"; // a dummy view ID
    
    var customView = {
        fetchXml: params.fetchXml,
        id: viewId, 
        layoutXml: params.layoutXml,
        name: "Filtered Lookup View",
        recordType: params.gridTypeCode,
        Type: 0
    };

    var lookupItems = LookupObjects(null, "multi", params.gridTypeCode, 0, null, "", null, null, null, null, null, null, viewId, [customView]);
    if (lookupItems && lookupItems.items.length > 0) {
        AssociateObjects(crmFormSubmit.crmFormSubmitObjectType.value, crmFormSubmit.crmFormSubmitId.value, params.gridTypeCode, lookupItems, IsNull(roleOrd) || roleOrd == 2, "", relName);
    }
}

function addExistingFromSubGridAccount(gridTypeCode, gridControl) {
    addExistingFromSubGridCustom({
        gridTypeCode: gridTypeCode,
        gridControl: gridControl,
        fetchXml: "<fetch version='1.0' " +
                       "output-format='xml-platform' " +
                       "mapping='logical'>" +
                   "<entity name='account'>" +
                   "<attribute name='name' />" +
                   "<attribute name='address1_city' />" +
                   "<order attribute='name' " +
                           "descending='false' />" +
                   "<filter type='and'>" +
                       "<condition attribute='ownerid' " +
                                   "operator='eq-userid' />" +
                       "<condition attribute='statecode' " +
                                   "operator='eq' " +
                                   "value='0' />" +
                   "</filter>" +
                   "<attribute name='primarycontactid' />" +
                   "<attribute name='telephone1' />" +
                   "<attribute name='accountid' />" +
                   "<link-entity alias='accountprimarycontactidcontactcontactid' " +
                                   "name='contact' " +
                                   "from='contactid' " +
                                   "to='primarycontactid' " +
                                   "link-type='outer' " +
                                   "visible='false'>" +
                       "<attribute name='emailaddress1' />" +
                   "</link-entity>" +
                   "</entity>" +
               "</fetch>",
        layoutXml: "<grid name='resultset' " +
                             "object='1' " +
                             "jump='name' " +
                             "select='1' " +
                             "icon='1' " +
                             "preview='1'>" +
                         "<row name='result' " +
                              "id='accountid'>" +
                           "<cell name='name' " +
                                 "width='300' />" +
                           "<cell name='telephone1' " +
                                 "width='100' />" +
                           "<cell name='address1_city' " +
                                 "width='100' />" +
                           "<cell name='primarycontactid' " +
                                 "width='150' />" +
                           "<cell name='accountprimarycontactidcontactcontactid.emailaddress1' " +
                                 "width='150' " +
                                 "disableSorting='1' />" +
                         "</row>" +
                       "</grid>"

    });
}
 
Customize CRM Ribbon to Hook up the JS Function
  1. In CRM, create a new solution, and add account entity (the entity in the sub-grid) to the solution.
  2. Export the solution to a .zip file, and extract the file somewhere in your local file system.
  3. Open the customizations.xml from the extracted file, and locate RibbonDiffXml section in the file, under the account entity.


          <RibbonDiffXml>
            <CustomActions />
            <Templates>
              <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
            </Templates>
            <CommandDefinitions />
            <RuleDefinitions>
              <TabDisplayRules />
              <DisplayRules />
              <EnableRules />
            </RuleDefinitions>
            <LocLabels />
          </RibbonDiffXml>
  4. What we need to change is the CommandDefinitions part, which we can get the template code from applicationribbon.xml file (or <entityname>ribbon.xml if it's a system entity) in CRM SDK's resources\exportedribbonxml folder.
  5. In applicationribbon.xml file (or <entityname>ribbon.xml), locate <CommandDefinition Id="Mscrm.AddExistingRecordFromSubGridAssociated"> line (You can search by addExistingFromSubGridAssociated to get there).
  6. Copy the xml content under <CommandDefinition Id="Mscrm.AddExistingRecordFromSubGridAssociated"> (including itself and its closing tag as well) to the customizations.xml file, so it should look like this.
  7. Modify the JavaScriptFunction part to point to the custom JS function that we previously developed, so it should be something like this:


    The following is the final customization xml.
      <CommandDefinition Id="Mscrm.AddExistingRecordFromSubGridAssociated">
        <EnableRules>
          <EnableRule Id="Mscrm.AppendPrimary" />
          <EnableRule Id="Mscrm.AppendToPrimary" />
          <EnableRule Id="Mscrm.EntityFormIsEnabled" />
        </EnableRules>
        <DisplayRules>
          <DisplayRule Id="Mscrm.AddExisting" />
          <DisplayRule Id="Mscrm.ShowForManyToManyGrids" />
          <DisplayRule Id="Mscrm.AppendPrimary" />
          <DisplayRule Id="Mscrm.AppendToPrimary" />
          <DisplayRule Id="Mscrm.AppendSelected" />
          <DisplayRule Id="Mscrm.AppendToSelected" />
          <DisplayRule Id="Mscrm.CanWriteSelected" />
        </DisplayRules>
        <Actions>
          <JavaScriptFunction FunctionName="addExistingFromSubGridAccount" Library="$webresource:new_Project">
            <CrmParameter Value="SelectedEntityTypeCode" />
            <CrmParameter Value="SelectedControl" />
          </JavaScriptFunction>
        </Actions>
      </CommandDefinition>
    Note that your JS webresource name could be in different format. You can find out that by openning the web resource in CRM, which tells you the path to the web resource file.

  8. Save the file, and zip it back to the original solution export file.
  9. Import the solution file, and publish changes. If everything goes OK, you will see a filtered lookup like the following.
 
 

No comments:

Post a Comment