Метод mount() из библиотеки DocusignJS требует атрибут Id, но LWC в Salesforce не может иметь фиксированные значения идентификатора

Я пытаюсь создать встроенную систему подписи на облачном сайте 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 будет невозможно (или крайне сложно).

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Метод mount() является частью специального средства встроенной подписи, которое мы называем Фокусированный просмотр (который вы нашли в сообщении блога). Для этого метода требуется, чтобы вы знали идентификатор элемента, поскольку он понадобится Docusign для настройки уникального пользовательского интерфейса встроенной подписи Focused View. Есть еще один способ встроенной подписи, где Docusign просто предоставляет вам URL-адрес, и вы можете использовать этот URL-адрес по своему усмотрению. Вы можете просто иметь кнопку с внутренним кодом, который генерирует этот URL-адрес, а затем отправляет пользователя на этот веб-сайт (позже он будет перенаправлен обратно на ваш веб-сайт). Обратите внимание, что вы также можете использовать Apex Toolkit, но он еще не поддерживает фокусированный просмотр, поэтому вам снова нужно использовать «обычную» встроенную подпись, а не библиотеку Docusign.Js.

Спасибо за ответ! Как вы увидите из моей кодовой базы, в настоящее время я использую набор инструментов Apex для создания URL-адреса для подписи, и похоже, что единственным вариантом будет перенаправление пользователя на URL-адрес для подписи и возвращение Docusign к нам.

Prateek Mathur 27.06.2024 05:33

Подскажите, пожалуйста, как мне оттуда построить? Мне нужно прочитать подписанный документ и автоматически загрузить его в корзину S3.

Prateek Mathur 27.06.2024 05:34

Возможно, вам захочется рассмотреть некоторые новые технологии Docusign и создать приложение-расширение, которое будет архивировать файлы.

Inbar Gazit 27.06.2024 06:32

developers.docusign.com/extension-apps/build-an-extension-ap‌​p

Inbar Gazit 27.06.2024 06:32
github.com/docusign/…
Inbar Gazit 27.06.2024 06:33

Вы можете создать приложение, которое загружает (архивирует) в корзину S3.

Inbar Gazit 27.06.2024 06:33

Возможно, добавить церемонию подписания целевого представления внутри компонента iframe LWC? См. https://javascript.plainenglish.io/how-to-build-a-reusable-iframe-with-lightning-web-comComponents-76a2ad27286

Спасибо за ответ! Я уже пробовал отображать URL-адрес подписи DocuSign в iFrame, и это очень неприятно для пользователя, поскольку DocuSign перезагрузит весь iFrame, как только пользователь завершит подписание.

Prateek Mathur 27.06.2024 05:20

если вы используете docusign.js, ваша включающая страница может перехватить событие SessionComplete, а затем отправить сообщение на родительскую страницу, чтобы закрыть iframe.

Larry K 27.06.2024 16:12

Другие вопросы по теме