Skip to content

Commit db09508

Browse files
committed
MS Dynamics - Marketing Forms picker
1 parent 1a433b5 commit db09508

32 files changed

+1198
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
.dynOverlayGroup {
2+
margin-bottom: 1rem;
3+
}
4+
5+
.dynFormsList {
6+
list-style-type: none;
7+
margin: 0;
8+
margin-top: 10px;
9+
}
10+
11+
.dynFormsList a {
12+
display: block;
13+
position: relative;
14+
padding: .25rem .375rem .25rem 1.5rem;
15+
}
16+
17+
.dynFormsList a:hover {
18+
text-decoration: none;
19+
background-color: #eee;
20+
}
21+
22+
.dynFormsList a i {
23+
position: absolute;
24+
top: .4rem;
25+
left: .25rem;
26+
}
27+
28+
.dynFormsList .formLine {
29+
display: block;
30+
}
31+
32+
.dynSettings {
33+
padding-top: 4px;
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
function configurationController($scope, notificationsService, umbracoCmsIntegrationsCrmDynamicsResource) {
2+
var vm = this;
3+
4+
vm.oauthConfig = {};
5+
6+
umbracoCmsIntegrationsCrmDynamicsResource.checkOAuthConfiguration().then(function(response) {
7+
8+
if (response) {
9+
vm.oauthConfig.isConnected = true;
10+
vm.oauthConfig.fullName = response.fullName;
11+
}
12+
});
13+
14+
vm.onConnectClick = function () {
15+
16+
umbracoCmsIntegrationsCrmDynamicsResource.getAuthorizationUrl().then(function (response) {
17+
vm.authWindow = window.open(response,
18+
"Authorize", "width=900,height=700,modal=yes,alwaysRaised=yes");
19+
});
20+
}
21+
22+
vm.onRevokeToken = function () {
23+
24+
umbracoCmsIntegrationsCrmDynamicsResource.revokeAccessToken().then(function () {
25+
vm.oauthConfig.isConnected = false;
26+
notificationsService.success("Dynamics Configuration", "OAuth connection revoked.");
27+
});
28+
}
29+
30+
// authorization listener
31+
window.addEventListener("message", function (event) {
32+
if (event.data.type === "hubspot:oauth:success") {
33+
34+
umbracoCmsIntegrationsCrmDynamicsResource.getAccessToken(event.data.code).then(function (response) {
35+
if (response.startsWith("Error:")) {
36+
notificationsService.error("Dynamics Configuration", response);
37+
} else {
38+
vm.oauthConfig.isConnected = true;
39+
40+
notificationsService.success("Dynamics Configuration", "OAuth connected.");
41+
42+
umbracoCmsIntegrationsCrmDynamicsResource.getSystemUserFullName().then(function(response) {
43+
vm.oauthConfig.fullName = response;
44+
});
45+
}
46+
});
47+
48+
}
49+
}, false);
50+
}
51+
52+
angular.module("umbraco")
53+
.controller("Umbraco.Cms.Integrations.Crm.Dynamics.ConfigurationController", configurationController);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
angular.module('umbraco.resources').factory('umbracoCmsIntegrationsCrmDynamicsResource',
2+
function ($http, umbRequestHelper) {
3+
4+
const apiEndpoint = "backoffice/UmbracoCmsIntegrationsCrmDynamics/Forms";
5+
6+
return {
7+
getAuthorizationUrl: function () {
8+
return umbRequestHelper.resourcePromise(
9+
$http.get(`${apiEndpoint}/GetAuthorizationUrl`),
10+
"Failed");
11+
},
12+
getAccessToken: function (authorizationCode) {
13+
return umbRequestHelper.resourcePromise(
14+
$http.post(`${apiEndpoint}/GetAccessToken`, { code: authorizationCode }),
15+
"Failed");
16+
},
17+
revokeAccessToken: function () {
18+
return umbRequestHelper.resourcePromise(
19+
$http.post(`${apiEndpoint}/RevokeAccessToken`),
20+
"Failed");
21+
},
22+
getSystemUserFullName: function () {
23+
return umbRequestHelper.resourcePromise(
24+
$http.get(`${apiEndpoint}/GetSystemUserFullName`),
25+
"Failed");
26+
},
27+
getForms: function () {
28+
return umbRequestHelper.resourcePromise(
29+
$http.get(`${apiEndpoint}/GetForms`),
30+
"Failed");
31+
},
32+
checkOAuthConfiguration: function () {
33+
return umbRequestHelper.resourcePromise(
34+
$http.get(`${apiEndpoint}/CheckOAuthConfiguration`),
35+
"Failed");
36+
}
37+
};
38+
}
39+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
function formPickerController($scope, editorService, notificationsService, umbracoCmsIntegrationsCrmDynamicsResource) {
2+
var vm = this;
3+
4+
vm.loading = false;
5+
vm.dynamicsFormsList = [];
6+
vm.searchTerm = "";
7+
8+
loadForms();
9+
10+
vm.openDynamicsFormPickerOverlay = function () {
11+
12+
var options = {
13+
title: "Dynamics - Marketing Forms",
14+
subtitle: "Select a form",
15+
view: "/App_Plugins/UmbracoCms.Integrations/Crm/Dynamics/views/formpickereditor.html",
16+
size: "medium",
17+
selectForm: function (form) {
18+
//vm.saveForm(form);
19+
20+
editorService.close();
21+
},
22+
close: function () {
23+
editorService.close();
24+
}
25+
};
26+
27+
editorService.open(options);
28+
};
29+
30+
function loadForms() {
31+
umbracoCmsIntegrationsCrmDynamicsResource.getForms().then(function (response) {
32+
if (response) {
33+
response.value.forEach(item => {
34+
vm.dynamicsFormsList.push({
35+
id: item.msdyncrm_marketingformid,
36+
name: item.msdyncrm_name
37+
});
38+
});
39+
console.log(vm.dynamicsFormsList);
40+
}
41+
});
42+
}
43+
}
44+
45+
angular.module("umbraco")
46+
.controller("Umbraco.Cms.Integrations.Crm.Dynamics.FormPickerController", formPickerController);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"javascript": [
3+
"~/App_Plugins/UmbracoCms.Integrations/Crm/Dynamics/js/configuration.controller.js",
4+
"~/App_Plugins/UmbracoCms.Integrations/Crm/Dynamics/js/formpicker.controller.js",
5+
"~/App_Plugins/UmbracoCms.Integrations/Crm/Dynamics/js/dynamics.resource.js"
6+
],
7+
"css": [
8+
"~/App_Plugins/UmbracoCms.Integrations/Crm/Dynamics/css/styles.css"
9+
]
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<div ng-controller="Umbraco.Cms.Integrations.Crm.Dynamics.ConfigurationController as vm">
2+
<p ng-if="vm.oauthConfig && vm.oauthConfig.isConnected"><b>Connected:</b> {{ vm.oauthConfig.fullName }} </p>
3+
<p ng-if="!vm.oauthConfig || !vm.oauthConfig.isConnected"><b>Disconnected</b></p>
4+
<div>
5+
<umb-button action="vm.onConnectClick()"
6+
type="button"
7+
button-style="primary"
8+
state="init"
9+
label="Connect"
10+
disabled="vm.oauthConfig.isConnected">
11+
</umb-button>
12+
<umb-button action="vm.onRevokeToken()"
13+
type="button"
14+
button-style="danger"
15+
state="init"
16+
label="Revoke"
17+
disabled="!vm.oauthConfig.isConnected">
18+
</umb-button>
19+
</div>
20+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<div ng-controller="Umbraco.Cms.Integrations.Crm.Dynamics.FormPickerController as vm">
2+
3+
<umb-load-indicator ng-if="vm.loading">
4+
</umb-load-indicator>
5+
6+
<umb-node-preview ng-if="model.value"
7+
name="model.value.name"
8+
icon="model.icon"
9+
description="model.value.fields"
10+
allow-remove="true" ,
11+
on-remove="vm.remove()">
12+
</umb-node-preview>
13+
14+
<a ng-if="!model.value && !vm.loading"
15+
class="umb-node-preview-add"
16+
href=""
17+
ng-click="vm.openDynamicsFormPickerOverlay()"
18+
prevent-default>
19+
<localize key="general_add">Add</localize>
20+
</a>
21+
22+
<div ng-if="vm.error" class="alert alert-warning">
23+
{{ vm.error }}
24+
</div>
25+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<div ng-controller="Umbraco.Cms.Integrations.Crm.Dynamics.FormPickerController as vm">
2+
<umb-editor-view>
3+
<umb-editor-container>
4+
<umb-box>
5+
<umb-box-header title="{{ model.title }}" description="{{ model.subtitle }}"></umb-box-header>
6+
<umb-box-content>
7+
<div class="dynOverlayGroup">
8+
<div class="form-search">
9+
<i class="icon-search"></i>
10+
<input type="text" class="-full-width-input" ng-model="vm.searchTerm" placeholder="Type to search..." umb-auto-focus="" aria-invalid="false">
11+
</div>
12+
</div>
13+
<div class="dynOverlayGroup">
14+
<ul class="dynFormsList">
15+
<li ng-repeat="form in vm.dynamicsFormsList | orderBy:'name' | filter:vm.searchTerm" ng-click="model.pickForm(form)" class="ng-scope" role="button" tabindex="0">
16+
<a href="" ng-attr-title="form.name">
17+
<i class="icon-umb-contour"></i>
18+
<span class="formLine">{{form.name}}</span>
19+
</a>
20+
</li>
21+
</ul>
22+
</div>
23+
</umb-box-content>
24+
</umb-box>
25+
</umb-editor-container>
26+
27+
<umb-editor-footer>
28+
<umb-editor-footer-content-right>
29+
<umb-button type="button"
30+
button-style="link"
31+
label-key="general_close"
32+
shortcut="esc"
33+
action="model.close()">
34+
</umb-button>
35+
</umb-editor-footer-content-right>
36+
</umb-editor-footer>
37+
38+
</umb-editor-view>
39+
</div>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Collections.Specialized;
2+
3+
namespace Umbraco.Cms.Integrations.Crm.Dynamics.Configuration
4+
{
5+
public class DynamicsSettings
6+
{
7+
public DynamicsSettings() { }
8+
9+
public DynamicsSettings(NameValueCollection appSettings)
10+
{
11+
InstanceUrl = appSettings[Constants.UmbracoCmsIntegrationsCrmDynamicsInstanceUrlKey];
12+
}
13+
14+
public string InstanceUrl { get; set; }
15+
}
16+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+

2+
namespace Umbraco.Cms.Integrations.Crm.Dynamics
3+
{
4+
public class Constants
5+
{
6+
public const string DynamicsOAuthConfigurationTable = "dynamicsOAuthConfiguration";
7+
8+
public const string MigrationPlanName = "DynamicsOAuthMigrationPlan";
9+
10+
public const string TargetStateName = "dynamicsOAuthConfiguration-db";
11+
12+
public const string UmbracoCmsIntegrationsCrmDynamicsInstanceUrlKey = "Umbraco.Cms.Integrations.Crm.Dynamics.InstanceUrl";
13+
14+
public static class Configuration
15+
{
16+
public const string Settings = "Umbraco:Cms:Integrations:Crm:Dynamics:Settings";
17+
}
18+
}
19+
}

0 commit comments

Comments
 (0)