Loading
Nonprofit Cloud
目录
选择筛选器

          没有结果
          没有结果
          以下是一些搜索提示

          检查关键字的拼写。
          使用更普遍的搜索词。
          选择更少的筛选器,并扩大搜索范围。

          搜索所有 Salesforce 帮助
          在非营利组织的礼品条目网格模板中配置列组件

          在非营利组织的礼品条目网格模板中配置列组件

          设置组件列,以使用自定义 Lightning Web 组件在礼品条目网格模板中显示和编辑行为。

          所需的 Edition

          所需版本
          适用于:Lightning Experience

          适用于:带 Education Cloud 的 EnterprisePerformanceUnlimitedDeveloper Edition

          适用于:带 Nonprofit Cloud 的 EnterpriseUnlimitedDeveloper Edition

          所需用户权限
          配置列组件:

          Fundraising 访问权限集

          或者

          Education Cloud 完全访问权限集

          1. 在显示列中,对于要配置的列,单击编辑列
          2. 选择组件作为列类型。
          3. 输入列标签。
          4. 从单元格显示组件中,选择代表显示组件的 Lightning Web 组件。
          5. 从单元格编辑组件中,选择代表编辑组件的 Lightning Web 组件。
          6. 从字段 API 名称中,选择要映射到 Lightning Web 组件的字段。
          7. 保存更改。

          示例:使用自定义组件匹配和填充数据

          创建自定义组件,使用条形码选项从默认模板覆盖捐赠者列。当用户在编辑组件中输入值时,系统会在自定义条形码对象中查找匹配值。如果找到匹配项,该记录中的值会填充礼品条目网格中的其他列。

          所需版本
          适用于:Lightning Experience

          适用于:带 Education Cloud 的 EnterprisePerformanceUnlimitedDeveloper Edition

          适用于:带 Nonprofit Cloud 的 EnterpriseUnlimitedDeveloper Edition

          单元格显示组件

          默认情况下,“指定”列组件显示空值。如果一个指定与礼品条目行相关联,列组件会将金额连接到该指定,并将其显示在网格中,例如 100 美元。如果有两个或多个指定,网格将显示汇总值,例如 2 个指定。

          单元格显示组件有以下要求:

          • JavaScriptjs 文件中的 tagName 值。
          • @api 参数充当从网格传递的入站属性。

          在此示例中,显示组件会显示条形码列。在输入任何数据之前,将显示为待处理。当系统找到匹配值时,列会更新以显示捐赠者的姓名。

          giftEntryGridBarCodeDisplayColumn.html

          <template>
              <p>{columnDisplayValue}</p>
          </template>
          

          giftEntryGridBarCodeDisplayColumn.js

          import { api, LightningElement } from 'lwc';
          
          export default class GiftEntryGridBarCodeDisplayColumn extends LightningElement {
              /**
               * params is the only inbound property passed to this component from Gift Entry Grid
               */
              @api params;
          
              /**
               * Example Method:
               * This getter function displays various fields in a display component
               * that is specified in the yaml file configuration.
               * @returns {*|string}
               */
              get columnDisplayValue() {
                  let response = this.params?.data?.properties?.barCodeValue;
                  if (this.params?.data?.LastName) {
                      response = this.params?.data?.FirstName + " " + this.params?.data?.LastName;
                      if (this.params?.data?.Salutation) {
                          response = this.params?.data?.Salutation + " " + response;
                      }
                  }
                  return response || '(pending)';
              }
          }
          // Tagname is required for the component to function
          GiftEntryGridBarCodeDisplayColumn.tagName = 'c-gift-entry-grid-bar-code-display-column';
          

          单元格编辑组件

          在默认模板中,“指定”列的编辑组件的 Lightning 输入字段的功能与查找字段相似。在用户输入值时,系统会在自定义条形码对象中查找匹配值。如果找到匹配项,该记录中的值会填充礼品条目网格中的其他列。

          单元格编辑组件有以下要求:

          • JavaScript 文件中的 tagName 参数。
          • JavaScript 文件中设置为真的 isPopup 参数。
          • 使用@salesforce/messageChannel/lightning__giftEntryGridComponentAction的礼品输入网格 Lightning 信息服务渠道。
          • 以下示例中调用的其他方法和变量。

          giftEntryGridBarCodeColumnComponent.html

          <template>
              <lightning-input
                  label="Bar Code"
                  name="barCode"
                  value={barCode}
                  onblur={handleBarCodeChanged}
                  onerror={handleError}
                  placeholder="Scan bar code here"
                  variant="label-hidden">
              </lightning-input>
          </template>
          

          giftEntryGridBarCodeColumnComponent.js

          import { LightningElement, api } from 'lwc';
          import { ShowToastEvent } from 'lightning/platformShowToastEvent';
          
          /**
           * Apex controller used by this example to handle data queries, etc.
           */
          import getBarCodeScanData from '@salesforce/apex/GiftEntryBarCodeScanLookupController.getBarCodeScanData';
          
          /**
           * Lightning Message Service to enable this component to communicate back to Gift Entry Grid
           */
          import { publish, createMessageContext } from 'lightning/messageService';
          import GiftEntryGridComponentAction from "@salesforce/messageChannel/lightning__giftEntryGridComponentAction";
          const messageContext = createMessageContext();
          
          
          const DEFAULT_GIFT_AMOUNT = 100.00;
          const DEFAULT_PAYMENT_METHOD = "Credit Card";
          
          export default class GiftEntryGridBarCodeColumnComponent extends LightningElement {
          
              /**
               * Required for the underlying grid component to properly render this as a gift entry grid cell
               */
              static delegatesFocus = true;
          
              /**
               * The data entry property used in this example
               */
              @api barCode = "";
          
              /**
               * The column definition as defined within the underlying grid component
               * Set from data in params in the connectedCallback.
               */
              _columnDefinition;
          
              /**
               * Contains properties that represent each field on the GiftEntry record/row within the grid. 
               * Set from data in params in the connectedCallback.
               */
              _rowData = {};
          
              /**
               * _params is the only inbound property passed to this component from Gift Entry Grid
               * The properties retrieved in the example below are the primary ones required for grid functionality
               */
              _params;
              @api
              get params() {
                  return this._params;
              }
              set params(value) {
                  this._params = value;
                  this._rowData = this._params?.data;
                  this._columnDefinition = this._params?.colDef;
                  const _headerLabel = this._columnDefinition?.headerName; // informational
          
                  // Useful mechanism to pull in the previously entered barcode as the default value
                  // Values in the `properties` object of the row are transient for the current session only. They persist until the page is closed/refreshed
                  if (this._rowData && this._rowData?.properties?.barCode) {
                      this.barCode = this._rowData?.properties?.barCode;
                  }
              }
          
              /**
               * Recommended Method: Ensures the column width is set properly on load
               */
              connectedCallback() {
                  this.template.host.style.setProperty('--min-width', this._params?.column?.actualWidth + 'px');
              }
          
              /**
               * Example Method:
               * Handle a change to the entered bar code in the field
               * @param {*} event 
               */
              handleBarCodeChanged(event) {
                  event.stopPropagation();
          
                  try {
                      if (event.target?.value && event.target?.value !== "") {
                          this.sendDataBackToGrid(event.target.value);
                      } else if (event.target?.value === "") {
                          this.clearCurrentRowOfAllData();
                      }
                  } catch (e) {
                      this.dispatchEvent(
                          new ShowToastEvent({
                              title: 'Error',
                              message: 'An error occurred while querying the entered barcode: ' + (e.body?.message || e.message),
                              variant: 'error'
                          })
                      );
                  }
                  this.applyFocus();
              }
          
              /**
               * Example Method:
               * Call the apex controller with the entered bar code
               * Parse the response and pass that data back to GiftEntryGrid using the Lightning Message Service channel
               * @param {*} barCode 
               */
              async sendDataBackToGrid(barCode) {
                  // Call the Apex controller to query and retrieve data
                  const result = await getBarCodeScanData({ barcodeValue: barCode });
                  if (result && result !== null) {
          
                      // Convert the query result from the apex controller into an object of GiftEntry fields to apply to the row in the grid
                      const giftEntryFields = this.buildResponse(result);
              
                      // Build the "message" obhect to send back to Gift Entry Grid following the documented contract
                      const message = {
                          action: "ColumnEdit",                       // Required property
                          componentName: this.tagName,                // Required property (use as is)
                          colId: this._columnDefinition.colId,        // Required property (use as is)
                          details: {                                  // Optional property - include if there is data to write to the row in Gift Entry
                              rowId: this.params?.data?.id,           // Required (use as is)
                              rowIndex: this.params?.data?.rowIndex,  // Required (use as is)
                              giftEntryFields,                        // Required - all GiftEntry fields to write to rowData
                              rowProperties: {                        // Optional - use this to persist values in memory in the grid for use elsewhere, such as the Display Component
                                  barCode,                                // Example: Used to persist the value of the barcode on the row temporarily to retrieve elsewhere
                                  barCodeValue: result.donorName  // Example: This is used by GiftEntryGridColumnDisplay
                              },
                              matchingGiftTransactionId: result?.matchingGiftTransactionId,         // Optional, to set a matching gift on the row
                              matchingGiftTransactionName: result?.matchingGiftTransactionName      // Optional, to set a matching gift on the row
                          }
                      }
                      publish(messageContext, GiftEntryGridComponentAction, message);
                  }
              }
          
              /**
               * Example Method:
               * Clear out the entire row if the barCode is set to null
               */
              clearCurrentRowOfAllData() {
          
                  const giftEntryFields = {
                      DonorId: null,
                      Donor: null,
                      GiftType: "Individual"
                  };
                  if (this.params && this.params.data) {
                      const keepKeys = ['id', 'Id', 'rowId', 'rowIndex', 'properties', 'GiftType'];
                      Object.keys(this.params.data).forEach(key => {
                          if (!keepKeys.includes(key)) {
                              giftEntryFields[key] = null;
                          }
                      });
                  }
          
                  const message = {
                      action: "ColumnEdit",                       // Required property
                      componentName: this.tagName,                // Required property (use as is)
                      colId: this._columnDefinition.colId,        // Required property (use as is)
                      details: {                                  // Optional property - include if there is data to write to the row in Gift Entry
                          rowId: this.params?.data?.id,           // Required (use as is)
                          rowIndex: this.params?.data?.rowIndex,  // Required (use as is)
                          giftEntryFields,
                          rowProperties: {
                              barCode : null,
                              barCodeValue: null
                          }
                      }
                  };     
                  publish(messageContext, GiftEntryGridComponentAction, message);
              }
          
              /**
               * Example Method:
               * 
               * Notes
               * - Lookup fields such as Campaign and OutreachSourceCode should be represented as an object with "id" and "name" to allow them
               *   render properly in the grid. This does not apply to DonorId
               * - Pick List fields, such as PaymentMethod, can a string representing the pick list API Name or an object as {apiName: x, value: y}
               * - To take advantage of Gift Entry Grid's built in Donor logic that retrieves all donor fields, including custom mapped fields, the
               *   response object should include a property for DonorId and GiftType ("Individual" or "Organizational" only)
               * - Any field on GiftEntry can be included in this resonse and it will populate fields on the grid
               * @param {*} result from call to Apex with query results
               * @returns an object that represents fields on the GiftEntry object to be updated on the GiftEntryGrid row
               */
              buildResponse(result) {
                  const response = {
                      GiftType: result.giftType,  // Required to use the built-in donor logic
                      DonorId: result.donorid,    // Required to use the built-in donor logic
          
                      // Examples(s) Populate other fields on the row 
                      GiftReceivedDate: new Date().toISOString().split('T')[0],
                      PaymentMethod: DEFAULT_PAYMENT_METHOD,
                      GiftAmount: DEFAULT_GIFT_AMOUNT,
          
                      CampaignId: result.campaign,
                      Campaign: {
                          id: result.campaign,
                          Name: result.campaignName
                      },
          
                      OutreachSourceCodeId: result.outreachSourceCode,
                      OutreachSourceCode: {
                          id: result.outreachSourceCode,
                          Name: result.outreachSourceCodeName
                      }
                  };
          
                  return response;
              }
          
          
              /**
               * For keyboard accessibility, allows the lookup component to be focused on keyboard tabbing
               */
              applyFocus() {
                  const _gridElement = this.template.querySelector('lightning-input');
                  return new Promise((resolve) => {
                      Promise.resolve().then(() => {
                          _gridElement.focus();
                          resolve();
                      });
                  });
              }
          
              /**
               * Example Method
               */
              handleError(event) {
                  event.stopPropagation();
              }
          }
          // Required Properties for Column Components:
          GiftEntryGridBarCodeColumnComponent.tagName = 'c-gift-entry-grid-bar-code-column-component';
          GiftEntryGridBarCodeColumnComponent.isPopup = true;
          

          查询和传递回数据

          使用此 Apex 代码查询数据并将其传递回礼品条目网格自定义组件。

          GiftEntryGridBarCodeScannerLookupController.apex

          
          
          /**
           * Salesforce Fundraising - Gift Entry Grid Custom Component Example
           * 
           * Controller class for handling barcode scan data lookup from a column component
           */
          public with sharing class GiftEntryBarCodeScanLookupController {
              
              /**
               * Wrapper class to return the selected donor and any other info that would be applied to the grid row
               */
              public class ReponseObject {
                  @AuraEnabled public String barCode { get; set; }
                  @AuraEnabled public String giftType { get; set; }
                  @AuraEnabled public String donorid { get; set; }
                  @AuraEnabled public String donorName { get; set; }
                  @AuraEnabled public String campaign { get; set; }
                  @AuraEnabled public String campaignName { get; set; }
                  @AuraEnabled public String giftDesignation { get; set; }
                  @AuraEnabled public String giftDesignationName { get; set; }
                  @AuraEnabled public String outreachSourceCode { get; set; }
                  @AuraEnabled public String outreachSourceCodeName { get; set; }
                  @AuraEnabled public String matchingGiftTransactionId { get; set; }
                  @AuraEnabled public String matchingGiftTransactionName { get; set; }
                  @AuraEnabled public Double amount { get; set; }
              }
              
              /**
               * Retrieves barcode scan data based on the provided barcode value
               * @param barcodeValue The barcode value to search for
               * @return ReponseObject object with all fields or null if not found
               */
              @AuraEnabled(cacheable=false)
              public static ReponseObject getBarCodeScanData(String barcodeValue) {        
          
                  try {
                      if (String.isBlank(barcodeValue)) {
                          return null;
                      }
                      
                      // Query the BarCodeScanData__c object for the matching barcode
                      // Include related fields from Donor (Account), Campaign, and Outreach Source Code
                      List<BarCodeScanData__c> results = [
                          SELECT Id, 
                                 BarCode__c,
                                 Donor__c,
                                 Donor__r.Name,
                                 Donor__r.IsPersonAccount,
                                 Campaign__c,
                                 Campaign__r.Name,
                                 OutreachSourceCode__c,
                                 OutreachSourceCode__r.Name
                          FROM BarCodeScanData__c 
                          WHERE BarCode__c = :barcodeValue 
                          LIMIT 1
                      ];
          
                      if (results.isEmpty()) {
                          return null;
                      }
          
                      BarCodeScanData__c barCodeRecord = results[0];
                      ReponseObject response = new ReponseObject();
                      
                      // a value for DonorId and GiftType required for the donor logic to work
                      response.donorid = barCodeRecord.Donor__c; 
                      response.giftType = (barCodeRecord.Donor__r.IsPersonAccount ? 'Individual' : 'Organizational');
          
                      // Extra fields used within this example component
                      response.barCode = barCodeRecord.BarCode__c;
                      response.donorName = barCodeRecord.Donor__r?.Name;
                      response.campaign = barCodeRecord.Campaign__c;
                      response.campaignName = barCodeRecord.Campaign__r?.Name;
                      response.outreachSourceCode = barCodeRecord.OutreachSourceCode__c;
                      response.outreachSourceCodeName = barCodeRecord.OutreachSourceCode__r?.Name;                
          
                      // Is there an unpaid gift transaction installment for a commitment for this donor?
                      // If so, populate the GiftTransactionId field to simulate selecting a matching gift
                      List<GiftTransaction> matchingGifts = [
                          SELECT Id, Name,
                              OriginalAmount, TransactionDueDate, 
                              CampaignId, Campaign.Name, 
                              OutreachSourceCodeId, OutreachSourceCode.Name,
                              GiftCommitmentId
                          FROM GiftTransaction
                          WHERE DonorId = :response.donorid
                              AND Status = 'Unpaid'
                          ORDER BY TransactionDueDate ASC
                          LIMIT 1
                      ];
                      if (matchingGifts.size() > 0) {
                          response.matchingGiftTransactionId = matchingGifts[0].Id;
                          response.matchingGiftTransactionName = matchingGifts[0].Name;
                          response.amount = matchingGifts[0].OriginalAmount;
                          response.campaign = matchingGifts[0].CampaignId;
                          response.campaignName = matchingGifts[0].Campaign.Name;
                          response.outreachSourceCode = matchingGifts[0].OutreachSourceCodeId;
                          response.outreachSourceCodeName = matchingGifts[0].OutreachSourceCode.Name;   
                      }
          
                      return response;
                      
                  } catch (Exception e) {
                      // Log the error and throw a user-friendly exception
                      System.debug(LoggingLevel.ERROR, 'Error in getBarCodeScanData: ' + e.getMessage());
                      throw new AuraHandledException('Error retrieving barcode scan data: ' + e.getMessage());
                  }
              }
          }
          
           
          正在加载
          Salesforce Help | Article