From 8c8e411731def40792ed97c6c1ebf8547290acec Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Thu, 8 Feb 2024 15:21:11 +0200 Subject: [PATCH 1/4] add example --- Gemfile | 1 + Gemfile.lock | 6 + app/assets/javascripts/search.js | 3 + .../weg001_create_instance_controller.rb | 56 +++++++ app/services/jwt_auth/jwt_creator.rb | 5 + app/services/utils.rb | 10 ++ .../webforms/eg001_create_instance_service.rb | 153 ++++++++++++++++++ app/views/ds_common/index.html.erb | 2 + .../weg001_create_instance/get.html.erb | 5 + .../web_form_create.html.erb | 6 + .../web_form_embed.html.erb | 59 +++++++ config/appsettings.example.yml | 3 + config/initializers/omniauth.rb | 4 + config/routes.rb | 7 + data/World_Wide_Corp_Web_Form.pdf | Bin 0 -> 45823 bytes data/web-form-config.json | 1 + 16 files changed, 321 insertions(+) create mode 100644 app/controllers/webforms/weg001_create_instance_controller.rb create mode 100644 app/services/webforms/eg001_create_instance_service.rb create mode 100644 app/views/webforms/weg001_create_instance/get.html.erb create mode 100644 app/views/webforms/weg001_create_instance/web_form_create.html.erb create mode 100644 app/views/webforms/weg001_create_instance/web_form_embed.html.erb create mode 100644 data/World_Wide_Corp_Web_Form.pdf create mode 100644 data/web-form-config.json diff --git a/Gemfile b/Gemfile index 7fb6de9..b075c11 100644 --- a/Gemfile +++ b/Gemfile @@ -73,6 +73,7 @@ gem 'docusign_click', '~> 1.4.0' gem 'docusign_esign', '~> 3.25.0' gem 'docusign_monitor', '~> 1.2.0' gem 'docusign_rooms', '~> 1.3.0' +gem 'docusign_webforms' gem 'omniauth-oauth2', '~> 1.8.0' gem 'omniauth-rails_csrf_protection' diff --git a/Gemfile.lock b/Gemfile.lock index f560a05..68590fa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -124,6 +124,11 @@ GEM json (~> 2.1, >= 2.1.0) jwt (~> 2.2, >= 2.2.1) typhoeus (~> 1.0, >= 1.0.1) + docusign_webforms (1.0.1.rc10) + addressable (~> 2.7, >= 2.7.0) + json (~> 2.1, >= 2.1.0) + jwt (~> 2.2, >= 2.2.1) + typhoeus (~> 1.0, >= 1.0.1) erubi (1.12.0) ethon (0.16.0) ffi (>= 1.15.0) @@ -341,6 +346,7 @@ DEPENDENCIES docusign_esign (~> 3.25.0) docusign_monitor (~> 1.2.0) docusign_rooms (~> 1.3.0) + docusign_webforms jbuilder (~> 2.11.5) listen (~> 3.8.0) matrix (~> 0.4.2) diff --git a/app/assets/javascripts/search.js b/app/assets/javascripts/search.js index 901fa7a..cdbd0e4 100644 --- a/app/assets/javascripts/search.js +++ b/app/assets/javascripts/search.js @@ -6,6 +6,7 @@ const DS_SEARCH = (function () { ROOMS: "rooms", ADMIN: "admin", CONNECT: "connect", + WEBFORMS: "webforms", } const processJSONData = function () { @@ -142,6 +143,8 @@ const DS_SEARCH = (function () { return "eg"; case API_TYPES.CONNECT: return "cneg"; + case API_TYPES.WEBFORMS: + return "weg"; } } diff --git a/app/controllers/webforms/weg001_create_instance_controller.rb b/app/controllers/webforms/weg001_create_instance_controller.rb new file mode 100644 index 0000000..642c318 --- /dev/null +++ b/app/controllers/webforms/weg001_create_instance_controller.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +class Webforms::Weg001CreateInstanceController < EgController + before_action -> { check_auth('WebForms') } + before_action -> { @example = Utils::ManifestUtils.new.get_example(@manifest, 1, 'WebForms') } + + def create_web_form_template + args = { + template_name: 'Web Form Example Template', + account_id: session[:ds_account_id], + base_path: session[:ds_base_path], + access_token: session[:ds_access_token] + } + + web_form_template_id = Webforms::Eg001CreateInstanceService.new(args).create_web_form_template + Utils::FileUtils.new.replace_template_id(File.join('data', Rails.application.config.web_form_config_file), web_form_template_id) + session[:web_form_template_id] = web_form_template_id + + redirect_to '/weg001webForm' + end + + def create_web_form_instance + args = { + form_name: 'Web Form Example Template', + client_user_id: '1234-5678-abcd-ijkl', + account_id: session[:ds_account_id], + base_path: Rails.application.config.webforms_host, + access_token: session[:ds_access_token] + } + create_instance_service = Webforms::Eg001CreateInstanceService.new(args) + web_forms = create_instance_service.list_web_forms + results = create_instance_service.create_web_form_instance web_forms.items.first.id + + @integration_key = Rails.application.config.integration_key + @form_url = results.form_url + @instance_token = results.instance_token + render 'webforms/weg001_create_instance/web_form_embed' + end + + def get + additional_page = @example['AdditionalPage'].find { |p| p['Name'] == 'create_web_form_template' } + @example['ExampleDescription'] = additional_page['ResultsPageText'] + + render 'webforms/weg001_create_instance/get' + end + + def get_web_form_create_view + redirect_to '/weg001' if session[:web_form_template_id].nil? + + additional_page = @example['AdditionalPage'].find { |p| p['Name'] == 'create_web_form' } + @title = @example['ExampleName'] + @description = additional_page['ResultsPageText'] + + render 'webforms/weg001_create_instance/web_form_create' + end +end diff --git a/app/services/jwt_auth/jwt_creator.rb b/app/services/jwt_auth/jwt_creator.rb index 6f60b77..59fd2ea 100644 --- a/app/services/jwt_auth/jwt_creator.rb +++ b/app/services/jwt_auth/jwt_creator.rb @@ -17,6 +17,7 @@ def self.consent_url(state, api) scope = 'signature impersonation dtr.rooms.read dtr.rooms.write dtr.documents.read dtr.documents.write dtr.profile.read dtr.profile.write dtr.company.read dtr.company.write room_forms' if api == 'Rooms' scope = 'signature impersonation click.manage click.send' if api == 'Click' scope = 'signature impersonation organization_read group_read permission_read user_read user_write account_read domain_read identity_provider_read user_data_redact asset_group_account_read asset_group_account_clone_write asset_group_account_clone_read' if api == 'Admin' + scope = 'signature webforms_manage' if api == 'WebForms' base_uri = "#{Rails.configuration.authorization_server}/oauth/auth" response_type = 'code' @@ -45,6 +46,10 @@ def initialize(session) scope = 'signature organization_read group_read permission_read user_read user_write account_read domain_read identity_provider_read user_data_redact asset_group_account_read asset_group_account_clone_write asset_group_account_clone_read' @client_module = DocuSign_Admin end + if session[:api] == 'WebForms' + scope = 'signature webforms_manage' + @client_module = DocuSign_WebForms + end @scope = scope @api_client = create_initial_api_client(host: Rails.configuration.aud, client_module: @client_module, debugging: false) diff --git a/app/services/utils.rb b/app/services/utils.rb index bec3d57..23b8254 100644 --- a/app/services/utils.rb +++ b/app/services/utils.rb @@ -30,4 +30,14 @@ def get_user_id(args) user_info.sub end end + + class FileUtils + def replace_template_id(file_path, template_id) + content = File.read(file_path) + + content.gsub!('template-id', template_id) + + File.write(file_path, content) + end + end end diff --git a/app/services/webforms/eg001_create_instance_service.rb b/app/services/webforms/eg001_create_instance_service.rb new file mode 100644 index 0000000..cb75aaf --- /dev/null +++ b/app/services/webforms/eg001_create_instance_service.rb @@ -0,0 +1,153 @@ +# frozen_string_literal: true + +class Webforms::Eg001CreateInstanceService + attr_reader :args + + include ApiCreator + + def initialize(args) + @args = args + end + + def create_web_form_template + templates_api = create_template_api args + + options = DocuSign_eSign::ListTemplatesOptions.new + options.search_text = args[:template_name] + web_forms_templates = templates_api.list_templates(args[:account_id], options) + + if web_forms_templates.result_set_size.to_i.positive? + template_id = web_forms_templates.envelope_templates[0].template_id + else + template_req_object = make_web_forms_template + template = templates_api.create_template(args[:account_id], template_req_object) + template_id = template.template_id + end + + template_id + end + + def list_web_forms + configuration = DocuSign_WebForms::Configuration.new + configuration.host = Rails.configuration.webforms_host + + api_client = DocuSign_WebForms::ApiClient.new(configuration) + api_client.set_default_header('Authorization', "Bearer #{args[:access_token]}") + + webforms_api = DocuSign_WebForms::FormManagementApi.new(api_client) + + options = DocuSign_WebForms::ListFormsOptions.new + options.search = args[:form_name] + + webforms_api.list_forms(args[:account_id], options) + end + + def create_web_form_instance(form_id) + configuration = DocuSign_WebForms::Configuration.new + configuration.host = Rails.configuration.webforms_host + + api_client = DocuSign_WebForms::ApiClient.new(configuration) + api_client.set_default_header('Authorization', "Bearer #{args[:access_token]}") + + webforms_api = DocuSign_WebForms::FormInstanceManagementApi.new(api_client) + + web_form_values = { + 'PhoneNumber' => '555-555-5555', + 'Yes' => ['Yes'], + 'Company' => 'Tally', + 'JobTitle' => 'Programmer Writer' + } + web_form_req_object = DocuSign_WebForms::CreateInstanceRequestBody.new({ + 'clientUserId' => args[:client_user_id], + 'formValues' => web_form_values, + 'expirationOffset' => '3600' + }) + webforms_api.create_instance(args[:account_id], form_id, web_form_req_object) + end + + private + + def make_web_forms_template + template_name = args[:template_name] + doc_file = 'World_Wide_Corp_Web_Form.pdf' + base64_file_content = Base64.encode64(File.binread(File.join('data', doc_file))) + + # Create the document model + document = DocuSign_eSign::Document.new({ + # Create the DocuSign document object + 'documentBase64' => base64_file_content, + 'name' => 'World_Wide_Web_Form', # Can be different from actual file name + 'fileExtension' => 'pdf', # Many different document types are accepted + 'documentId' => '1' # A label used to reference the doc + }) + + # Create the signer recipient model + # Since these are role definitions, no name/email: + signer = DocuSign_eSign::Signer.new({ + 'roleName' => 'signer', 'recipientId' => '1', 'routingOrder' => '1' + }) + # Create fields using absolute positioning + # Create a sign_here tab (field on the document) + sign_here = DocuSign_eSign::SignHere.new( + 'documentId' => '1', 'tabLabel' => 'Signature', + 'anchorString' => '/SignHere/', 'anchorUnits' => 'pixel', + 'anchorXOffset' => '20', 'anchorYOffset' => '10' + ) + check = DocuSign_eSign::Checkbox.new( + 'documentId' => '1', 'tabLabel' => 'Yes', + 'anchorString' => '/SMS/', 'anchorUnits' => 'pixel', + 'anchorXOffset' => '20', 'anchorYOffset' => '10' + ) + text1 = DocuSign_eSign::Text.new( + 'documentId' => '1', 'tabLabel' => 'FullName', + 'anchorString' => '/FullName/', 'anchorUnits' => 'pixel', + 'anchorXOffset' => '20', 'anchorYOffset' => '10' + ) + text2 = DocuSign_eSign::Text.new( + 'documentId' => '1', 'tabLabel' => 'PhoneNumber', + 'anchorString' => '/PhoneNumber/', 'anchorUnits' => 'pixel', + 'anchorXOffset' => '20', 'anchorYOffset' => '10' + ) + text3 = DocuSign_eSign::Text.new( + 'documentId' => '1', 'tabLabel' => 'Company', + 'anchorString' => '/Company/', 'anchorUnits' => 'pixel', + 'anchorXOffset' => '20', 'anchorYOffset' => '10' + ) + text4 = DocuSign_eSign::Text.new( + 'documentId' => '1', 'tabLabel' => 'JobTitle', + 'anchorString' => '/JobTitle/', 'anchorUnits' => 'pixel', + 'anchorXOffset' => '20', 'anchorYOffset' => '10' + ) + date_signed = DocuSign_eSign::DateSigned.new( + 'documentId' => '1', 'tabLabel' => 'DateSigned', + 'anchorString' => '/Date/', 'anchorUnits' => 'pixel', + 'anchorXOffset' => '20', 'anchorYOffset' => '10' + ) + + # Add the tabs model to the signer + # The Tabs object takes arrays of the different field/tab types + signer.tabs = DocuSign_eSign::Tabs.new( + 'signHereTabs' => [sign_here], + 'checkboxTabs' => [check], + 'textTabs' => [text1, text2, text3, text4], + 'dateSignedTabs' => [date_signed] + ) + # Create top two objects + envelope_template_definition = DocuSign_eSign::EnvelopeTemplate.new( + 'description' => 'Example template created via the API', + 'shared' => 'false' + ) + + # Top object: + DocuSign_eSign::EnvelopeTemplate.new( + 'documents' => [document], + 'name' => template_name, + 'emailSubject' => 'Please sign this document', + 'envelopeTemplateDefinition' => envelope_template_definition, + 'recipients' => DocuSign_eSign::Recipients.new( + 'signers' => [signer] + ), + 'status' => 'created' + ) + end +end diff --git a/app/views/ds_common/index.html.erb b/app/views/ds_common/index.html.erb index 526f370..35cb5ae 100644 --- a/app/views/ds_common/index.html.erb +++ b/app/views/ds_common/index.html.erb @@ -53,6 +53,8 @@ "m" elsif api["Name"] == "Connect" "cn" + elsif api["Name"] == "WebForms" + "w" else "e" end %> diff --git a/app/views/webforms/weg001_create_instance/get.html.erb b/app/views/webforms/weg001_create_instance/get.html.erb new file mode 100644 index 0000000..a56f414 --- /dev/null +++ b/app/views/webforms/weg001_create_instance/get.html.erb @@ -0,0 +1,5 @@ +<%= render('partials/example_info') %> + +
+ <%= render('partials/submit_button') %> +
\ No newline at end of file diff --git a/app/views/webforms/weg001_create_instance/web_form_create.html.erb b/app/views/webforms/weg001_create_instance/web_form_create.html.erb new file mode 100644 index 0000000..6c5af78 --- /dev/null +++ b/app/views/webforms/weg001_create_instance/web_form_create.html.erb @@ -0,0 +1,6 @@ +

<%= @title %>

+

<%= sanitize @description %>

+ +
+ <%= render('partials/submit_button') %> +
\ No newline at end of file diff --git a/app/views/webforms/weg001_create_instance/web_form_embed.html.erb b/app/views/webforms/weg001_create_instance/web_form_embed.html.erb new file mode 100644 index 0000000..1354b92 --- /dev/null +++ b/app/views/webforms/weg001_create_instance/web_form_embed.html.erb @@ -0,0 +1,59 @@ + + + + + + + +
+
+

Embedded Webform Example

+
+

Web Form will render here

+
+
+
+ + + +

Continue

+ + + \ No newline at end of file diff --git a/config/appsettings.example.yml b/config/appsettings.example.yml index c6526d4..ac83a2c 100644 --- a/config/appsettings.example.yml +++ b/config/appsettings.example.yml @@ -23,6 +23,7 @@ default: &default rooms_host: "https://demo.rooms.docusign.com/restapi" monitor_host: "https://lens-d.docusign.net" admin_host: "https://api-d.docusign.net/management" + webforms_host: ".services.docusign.net/webforms/v1.1" allow_silent_authentication: true # A user can be silently authenticated if they have an # Active login session on another tab of the same browser # Set if you want a specific DocuSign AccountId, If false, the users default account will be used. @@ -34,6 +35,8 @@ default: &default doc_pdf: World_Wide_Corp_lorem.pdf doc_terms_pdf: Term_Of_Service.pdf doc_offer_letter: Offer_Letter_Demo.docx + web_form_template_file: World_Wide_Corp_Form.pdf + web_form_config_file: web-form-config.json gateway_name: "stripe" gateway_display_name: "Stripe" github_example_url: https://github.com/docusign/code-examples-ruby/tree/master/app/services/ diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index ad1e5dd..0a6c88c 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -40,12 +40,16 @@ session = strategy.session case session[:api] + when 'eSignature' + strategy.options[:authorize_params].scope = 'signature' when 'Rooms' strategy.options[:authorize_params].scope = 'signature dtr.rooms.read dtr.rooms.write dtr.documents.read dtr.documents.write dtr.profile.read dtr.profile.write dtr.company.read dtr.company.write room_forms' when 'Click' strategy.options[:authorize_params].scope = 'signature click.manage click.send' when 'Admin' strategy.options[:authorize_params].scope = 'signature organization_read group_read permission_read user_read user_write account_read domain_read identity_provider_read user_data_redact asset_group_account_read asset_group_account_clone_write asset_group_account_clone_read' + when 'WebForms' + strategy.options[:authorize_params].scope = 'signature webforms_read webforms_instance_read webforms_instance_write' end } end diff --git a/config/routes.rb b/config/routes.rb index a8bf3c8..80a483b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -235,6 +235,13 @@ post 'cneg001' => 'cneg001_validate_webhook_message#create' end + scope module: 'webforms' do + get 'weg001' => 'weg001_create_instance#get' + get 'weg001webForm' => 'weg001_create_instance#get_web_form_create_view' + post 'weg001' => 'weg001_create_instance#create_web_form_template' + post 'weg001webForm' => 'weg001_create_instance#create_web_form_instance' + end + root 'ds_common#index' # Login starts with POST'ing to: /auth/docusign diff --git a/data/World_Wide_Corp_Web_Form.pdf b/data/World_Wide_Corp_Web_Form.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d6b952766a08335d2116f0f8f746622473d4c6fa GIT binary patch literal 45823 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\"adm\":{\"path\":\"ADM.Form.SignerName\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"PhoneNumber","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"167","yPosition":"261","width":"0","height":"0","anchorString":"/PhoneNumber/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"Company","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"182","yPosition":"315","width":"0","height":"0","anchorString":"/Company/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Company\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"JobTitle","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"137","yPosition":"342","width":"0","height":"0","anchorString":"/Title/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}","tabType":"text"}],"checkboxTabs":[{"name":"Yes","tabLabel":"Yes","selected":"false","selectedOriginal":"false","requireInitialOnSharedChange":"false","bold":"false","italic":"false","underline":"false","required":"true","locked":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"237","yPosition":"288","width":"0","height":"0","anchorString":"/SMS/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}","tabType":"checkbox"}]},"signInEachLocation":"false","agentCanEditEmail":"false","agentCanEditName":"false","requireUploadSignature":"false","name":"","email":"","recipientId":"1","recipientIdGuid":"00000000-0000-0000-0000-000000000000","accessCode":"","requireIdLookup":"false","routingOrder":"1","note":"","roleName":"signer","completedCount":"0","deliveryMethod":"email","templateLocked":"false","templateRequired":"false","inheritEmailNotificationConfiguration":"false","recipientType":"signer"}],"agents":[],"editors":[],"intermediaries":[],"carbonCopies":[],"certifiedDeliveries":[],"inPersonSigners":[],"seals":[],"witnesses":[],"notaries":[],"recipientCount":"1"},"envelopeIdStamping":"true","autoNavigation":"true","allowComments":"true","disableResponsiveDocument":"true","anySigner":null,"envelopeLocation":"current_site"}]} From 681be18e0c89f392aca5479b6f7c0b29de8f8d1f Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Wed, 14 Feb 2024 12:34:23 +0200 Subject: [PATCH 2/4] specify webforms gem version & change js events --- Gemfile | 2 +- Gemfile.lock | 4 +- .../web_form_embed.html.erb | 51 +++++++++++++++---- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Gemfile b/Gemfile index b075c11..9568be4 100644 --- a/Gemfile +++ b/Gemfile @@ -73,7 +73,7 @@ gem 'docusign_click', '~> 1.4.0' gem 'docusign_esign', '~> 3.25.0' gem 'docusign_monitor', '~> 1.2.0' gem 'docusign_rooms', '~> 1.3.0' -gem 'docusign_webforms' +gem 'docusign_webforms', '~> 1.0.2.rc12' gem 'omniauth-oauth2', '~> 1.8.0' gem 'omniauth-rails_csrf_protection' diff --git a/Gemfile.lock b/Gemfile.lock index 68590fa..68fd76a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -124,7 +124,7 @@ GEM json (~> 2.1, >= 2.1.0) jwt (~> 2.2, >= 2.2.1) typhoeus (~> 1.0, >= 1.0.1) - docusign_webforms (1.0.1.rc10) + docusign_webforms (1.0.2.rc12) addressable (~> 2.7, >= 2.7.0) json (~> 2.1, >= 2.1.0) jwt (~> 2.2, >= 2.2.1) @@ -346,7 +346,7 @@ DEPENDENCIES docusign_esign (~> 3.25.0) docusign_monitor (~> 1.2.0) docusign_rooms (~> 1.3.0) - docusign_webforms + docusign_webforms (~> 1.0.2.rc12) jbuilder (~> 2.11.5) listen (~> 3.8.0) matrix (~> 0.4.2) diff --git a/app/views/webforms/weg001_create_instance/web_form_embed.html.erb b/app/views/webforms/weg001_create_instance/web_form_embed.html.erb index 1354b92..9586072 100644 --- a/app/views/webforms/weg001_create_instance/web_form_embed.html.erb +++ b/app/views/webforms/weg001_create_instance/web_form_embed.html.erb @@ -39,20 +39,51 @@ minHeight: "1500px", }, //Controls the auto resize behavior of the iframe - autoResizeHeight: true, - //These values are passed to the iframe URL as query params - tracking: { - "tracking-field": "tracking-value", - }, - //These values are passed to the iframe URL as hash params - hidden: { - "hidden-field": "hidden-value", - }, + autoResizeHeight: true }; + const webFormWidget = docusign.webforms({ url: '<%= @form_url %>', options: webFormOptions, - }) + }); + + //Basic milestones in this workflow + webFormWidget.on('ready', (event) => { + // event = { type: 'ready' }; + console.log('debug form loaded', event); + }); + + webFormWidget.on('submitted', (event) => { + // event = { type: 'submitted', envelopeId: 'abcd1234' }; + console.log('debug form submitted', event); + }); + + webFormWidget.on('signingReady', (event) => { + // event = { type: 'submitted', envelopeId: 'abcd1234' }; + console.log('debug form signingReady', event); + }); + + webFormWidget.on('sessionEnd', (event) => { + //There are 3 sessionEnd types sessionTimeout, remoteSigningInitiated, signingResult + + // event = { type: 'sessionEnd', sessionEndType: 'sessionTimeout' }; + // event = { + // type: 'sessionEnd', + // sessionEndType: 'signingResult', + // signingResultType: 'signing_complete', + // returnUrl: 'bigcorp.com', + // envelopeId: 'abcd1234', + // }; + // event = { type: 'sessionEnd', sessionEndType: 'remoteSigningInitiated', envelopeId: 'abcd1234' }; + console.log('debug form signingResult', event); + }); + + //Less commonly used events + webFormWidget.on('userActivity', (event) => { + // event = { type: 'userActivity', activityType: 'click' | 'keydown' }; + console.log('debug form userActivity', event); + }); + webFormWidget.mount("#docusign"); } loadWebform(); From 676c91b730f3797b0e011835b6e2cd600a534d1a Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Wed, 14 Feb 2024 11:53:50 -0800 Subject: [PATCH 3/4] fixing base path and scopes --- app/services/jwt_auth/jwt_creator.rb | 4 ++-- config/appsettings.example.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/services/jwt_auth/jwt_creator.rb b/app/services/jwt_auth/jwt_creator.rb index 59fd2ea..708ca2f 100644 --- a/app/services/jwt_auth/jwt_creator.rb +++ b/app/services/jwt_auth/jwt_creator.rb @@ -17,7 +17,7 @@ def self.consent_url(state, api) scope = 'signature impersonation dtr.rooms.read dtr.rooms.write dtr.documents.read dtr.documents.write dtr.profile.read dtr.profile.write dtr.company.read dtr.company.write room_forms' if api == 'Rooms' scope = 'signature impersonation click.manage click.send' if api == 'Click' scope = 'signature impersonation organization_read group_read permission_read user_read user_write account_read domain_read identity_provider_read user_data_redact asset_group_account_read asset_group_account_clone_write asset_group_account_clone_read' if api == 'Admin' - scope = 'signature webforms_manage' if api == 'WebForms' + scope = 'signature webforms_read webforms_instance_read webforms_instance_write' if api == 'WebForms' base_uri = "#{Rails.configuration.authorization_server}/oauth/auth" response_type = 'code' @@ -47,7 +47,7 @@ def initialize(session) @client_module = DocuSign_Admin end if session[:api] == 'WebForms' - scope = 'signature webforms_manage' + scope = 'signature webforms_read webforms_instance_read webforms_instance_write' @client_module = DocuSign_WebForms end diff --git a/config/appsettings.example.yml b/config/appsettings.example.yml index ac83a2c..067b8b9 100644 --- a/config/appsettings.example.yml +++ b/config/appsettings.example.yml @@ -23,7 +23,7 @@ default: &default rooms_host: "https://demo.rooms.docusign.com/restapi" monitor_host: "https://lens-d.docusign.net" admin_host: "https://api-d.docusign.net/management" - webforms_host: ".services.docusign.net/webforms/v1.1" + webforms_host: "https://apps-d.docusign.com/api/webforms/v1.1" allow_silent_authentication: true # A user can be silently authenticated if they have an # Active login session on another tab of the same browser # Set if you want a specific DocuSign AccountId, If false, the users default account will be used. From b4760dcfa6c3061d246b96346ccb274248969c39 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Thu, 15 Feb 2024 14:29:37 -0800 Subject: [PATCH 4/4] latest SDK and other changes --- Gemfile | 2 +- Gemfile.lock | 15 ++++------- .../webforms/eg001_create_instance_service.rb | 26 +++++++++---------- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/Gemfile b/Gemfile index 9568be4..c87beb2 100644 --- a/Gemfile +++ b/Gemfile @@ -73,7 +73,7 @@ gem 'docusign_click', '~> 1.4.0' gem 'docusign_esign', '~> 3.25.0' gem 'docusign_monitor', '~> 1.2.0' gem 'docusign_rooms', '~> 1.3.0' -gem 'docusign_webforms', '~> 1.0.2.rc12' +gem 'docusign_webforms', '~> 1.0.0' gem 'omniauth-oauth2', '~> 1.8.0' gem 'omniauth-rails_csrf_protection' diff --git a/Gemfile.lock b/Gemfile.lock index 68fd76a..832c8c5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -124,7 +124,7 @@ GEM json (~> 2.1, >= 2.1.0) jwt (~> 2.2, >= 2.2.1) typhoeus (~> 1.0, >= 1.0.1) - docusign_webforms (1.0.2.rc12) + docusign_webforms (1.0.0) addressable (~> 2.7, >= 2.7.0) json (~> 2.1, >= 2.1.0) jwt (~> 2.2, >= 2.2.1) @@ -138,7 +138,6 @@ GEM ruby2_keywords (>= 0.0.4) faraday-net_http (3.0.2) ffi (1.15.5) - ffi (1.15.5-x64-mingw-ucrt) globalid (1.1.0) activesupport (>= 5.0) hashie (5.0.0) @@ -178,9 +177,7 @@ GEM net-smtp (0.3.3) net-protocol nio4r (2.5.9) - nokogiri (1.15.4-x64-mingw-ucrt) - racc (~> 1.4) - nokogiri (1.15.4-x86_64-linux) + nokogiri (1.15.4-x86_64-darwin) racc (~> 1.4) oauth2 (2.0.9) faraday (>= 0.17.3, < 3.0) @@ -298,8 +295,7 @@ GEM actionpack (>= 5.2) activesupport (>= 5.2) sprockets (>= 3.0.0) - sqlite3 (1.6.4-x64-mingw-ucrt) - sqlite3 (1.6.4-x86_64-linux) + sqlite3 (1.6.4-x86_64-darwin) test-unit (3.6.1) power_assert thor (1.2.2) @@ -332,8 +328,7 @@ GEM zeitwerk (2.6.11) PLATFORMS - x64-mingw-ucrt - x86_64-linux + x86_64-darwin-21 DEPENDENCIES bootsnap (~> 1.7.3) @@ -346,7 +341,7 @@ DEPENDENCIES docusign_esign (~> 3.25.0) docusign_monitor (~> 1.2.0) docusign_rooms (~> 1.3.0) - docusign_webforms (~> 1.0.2.rc12) + docusign_webforms (~> 1.0.0) jbuilder (~> 2.11.5) listen (~> 3.8.0) matrix (~> 0.4.2) diff --git a/app/services/webforms/eg001_create_instance_service.rb b/app/services/webforms/eg001_create_instance_service.rb index cb75aaf..09a9f6d 100644 --- a/app/services/webforms/eg001_create_instance_service.rb +++ b/app/services/webforms/eg001_create_instance_service.rb @@ -29,7 +29,6 @@ def create_web_form_template def list_web_forms configuration = DocuSign_WebForms::Configuration.new - configuration.host = Rails.configuration.webforms_host api_client = DocuSign_WebForms::ApiClient.new(configuration) api_client.set_default_header('Authorization', "Bearer #{args[:access_token]}") @@ -44,7 +43,6 @@ def list_web_forms def create_web_form_instance(form_id) configuration = DocuSign_WebForms::Configuration.new - configuration.host = Rails.configuration.webforms_host api_client = DocuSign_WebForms::ApiClient.new(configuration) api_client.set_default_header('Authorization', "Bearer #{args[:access_token]}") @@ -58,10 +56,10 @@ def create_web_form_instance(form_id) 'JobTitle' => 'Programmer Writer' } web_form_req_object = DocuSign_WebForms::CreateInstanceRequestBody.new({ - 'clientUserId' => args[:client_user_id], - 'formValues' => web_form_values, - 'expirationOffset' => '3600' - }) + 'clientUserId' => args[:client_user_id], + 'formValues' => web_form_values, + 'expirationOffset' => '3600' + }) webforms_api.create_instance(args[:account_id], form_id, web_form_req_object) end @@ -74,18 +72,18 @@ def make_web_forms_template # Create the document model document = DocuSign_eSign::Document.new({ - # Create the DocuSign document object - 'documentBase64' => base64_file_content, - 'name' => 'World_Wide_Web_Form', # Can be different from actual file name - 'fileExtension' => 'pdf', # Many different document types are accepted - 'documentId' => '1' # A label used to reference the doc - }) + # Create the DocuSign document object + 'documentBase64' => base64_file_content, + 'name' => 'World_Wide_Web_Form', # Can be different from actual file name + 'fileExtension' => 'pdf', # Many different document types are accepted + 'documentId' => '1' # A label used to reference the doc + }) # Create the signer recipient model # Since these are role definitions, no name/email: signer = DocuSign_eSign::Signer.new({ - 'roleName' => 'signer', 'recipientId' => '1', 'routingOrder' => '1' - }) + 'roleName' => 'signer', 'recipientId' => '1', 'routingOrder' => '1' + }) # Create fields using absolute positioning # Create a sign_here tab (field on the document) sign_here = DocuSign_eSign::SignHere.new(