Я пытаюсь создать встроенную систему подписи на облачном сайте Salesforce Experience из LWC и пытался следовать документации, чтобы создать LWC, который может делать то же самое. Вот соответствующий код LWC —
import { LightningElement } from 'lwc';
import sendEnvelope from '@salesforce/apex/DocusignEmbeddedSigningController.sendEnvelope';
import getEmbeddedSigningUrl from '@salesforce/apex/DocusignEmbeddedSigningController.getEmbeddedSigningUrl';
import docusignjs from "@salesforce/resourceUrl/docusignjs";
import { loadScript } from "lightning/platformResourceLoader";
export default class DocusignEmbeddedSigning extends LightningElement {
template = '2d749f04-1bdb-4b70-9cef-64ab148c6ba0';
description = 'Embedded Signing';
renderedCallbackExecuted = false;
async renderedCallback() {
if (this.renderedCallbackExecuted) {
return;
}
this.renderedCallbackExecuted = true;
await Promise.all([
loadScript(this, docusignjs)
]);
let envelopeId = await sendEnvelope({template: this.template, description: this.description});
let signingUrl = await getEmbeddedSigningUrl({envId: envelopeId, url: window.location.href});
let docuSignObj = await window.DocuSign.loadDocuSign();
const signing = docuSignObj.signing({
url: signingUrl,
displayFormat: 'focused',
style: {
/** High-level variables that mirror our existing branding APIs. Reusing the branding name here for familiarity. */
branding: {
primaryButton: {
/** Background color of primary button */
backgroundColor: '#333',
/** Text color of primary button */
color: '#fff',
}
},
/** High-level components we allow specific overrides for */
signingNavigationButton: {
finishText: 'You have finished the document! Hooray!',
position: 'bottom-center'
}
}
});
signing.on('ready', (event) => {
console.info('UI is rendered');
});
signing.on('sessionEnd', (event) => {
/** The event here denotes what caused the sessionEnd to trigger, such as signing_complete, ttl_expired etc../ **/
console.info('sessionend', event);
});
signing.mount(this.template.querySelector('.docusign-agreement-container'));
}
}
Проблема в методе sigining.mount()
. Согласно документации (https://www.docusign.com/blog/developers/15-minutes-to-better-ux-enhancing-embedded-signing-focused-view и https://developers. docusign.com/docs/esign-rest-api/how-to/request-signature-focused-view/), этот метод должен получать селектор на основе идентификатора.
Но, к сожалению, платформа LWC не позволяет разработчикам указывать свои значения в атрибуте ID HTML-элементов и переопределяет их динамически генерируемыми значениями (именно поэтому я попытался использовать this.template.querySelector
для использования селектора на основе CSS).
При использовании вышеуказанного подхода вы получите следующую ошибку: [n.template.querySelector is not a function]
Затем я попробовал это — signing.mount('.docusign-agreement-container');
, и теперь в консоли браузера получаю вот такую ошибку — [DocuSign JS] Container element not found: ".docusign-agreement-container"
Вопрос. Может ли метод mount() получать другой аргумент, кроме атрибутов Id? В противном случае использование библиотеки DocuSignJS для внедрения процесса подписания в Salesforce Experience Cloud будет невозможно (или крайне сложно).
Метод mount()
является частью специального средства встроенной подписи, которое мы называем Фокусированный просмотр (который вы нашли в сообщении блога).
Для этого метода требуется, чтобы вы знали идентификатор элемента, поскольку он понадобится Docusign для настройки уникального пользовательского интерфейса встроенной подписи Focused View.
Есть еще один способ встроенной подписи, где Docusign просто предоставляет вам URL-адрес, и вы можете использовать этот URL-адрес по своему усмотрению. Вы можете просто иметь кнопку с внутренним кодом, который генерирует этот URL-адрес, а затем отправляет пользователя на этот веб-сайт (позже он будет перенаправлен обратно на ваш веб-сайт).
Обратите внимание, что вы также можете использовать Apex Toolkit, но он еще не поддерживает фокусированный просмотр, поэтому вам снова нужно использовать «обычную» встроенную подпись, а не библиотеку Docusign.Js.
Подскажите, пожалуйста, как мне оттуда построить? Мне нужно прочитать подписанный документ и автоматически загрузить его в корзину S3.
Возможно, вам захочется рассмотреть некоторые новые технологии Docusign и создать приложение-расширение, которое будет архивировать файлы.
developers.docusign.com/extension-apps/build-an-extension-app
Вы можете создать приложение, которое загружает (архивирует) в корзину S3.
Возможно, добавить церемонию подписания целевого представления внутри компонента iframe LWC? См. https://javascript.plainenglish.io/how-to-build-a-reusable-iframe-with-lightning-web-comComponents-76a2ad27286
Спасибо за ответ! Я уже пробовал отображать URL-адрес подписи DocuSign в iFrame, и это очень неприятно для пользователя, поскольку DocuSign перезагрузит весь iFrame, как только пользователь завершит подписание.
если вы используете docusign.js, ваша включающая страница может перехватить событие SessionComplete, а затем отправить сообщение на родительскую страницу, чтобы закрыть iframe.
Спасибо за ответ! Как вы увидите из моей кодовой базы, в настоящее время я использую набор инструментов Apex для создания URL-адреса для подписи, и похоже, что единственным вариантом будет перенаправление пользователя на URL-адрес для подписи и возвращение Docusign к нам.