Skip to content

Commit 76e32cb

Browse files
committed
V14: Integrations (ActiveCampaign/Forms)
- Continue implementing UI for ActiveCampaign integration for Forms
1 parent 337d44a commit 76e32cb

File tree

13 files changed

+448
-52
lines changed

13 files changed

+448
-52
lines changed

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/ActiveCampaignContactsWorkflow.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Umbraco.Forms.Core;
66
using Umbraco.Forms.Core.Enums;
77
using Umbraco.Forms.Core.Persistence.Dtos;
8+
using Umbraco.Forms.Core.Services;
89
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Configuration;
910
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Models.Dtos;
1011
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Services;
@@ -20,6 +21,7 @@ public class ActiveCampaignContactsWorkflow : WorkflowType
2021
private readonly IContactService _contactService;
2122

2223
private readonly ILogger<ActiveCampaignContactsWorkflow> _logger;
24+
private readonly IFormService _formService;
2325

2426
[Core.Attributes.Setting("Account",
2527
Description = "Please select an account",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using Microsoft.AspNetCore.Authorization;
2+
using Microsoft.AspNetCore.Mvc;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
using Umbraco.Cms.Web.Common.Authorization;
9+
using Umbraco.Cms.Web.Common.Routing;
10+
using Umbraco.Forms.Core.Services;
11+
12+
namespace Umbraco.Forms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers.Forms
13+
{
14+
[BackOfficeRoute($"{Constants.ManagementApi.RootPath}/v{{version:apiVersion}}/forms")]
15+
[ApiExplorerSettings(GroupName = Constants.ManagementApi.AccountsGroupName)]
16+
[Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)]
17+
public class FormControllerBase : ActiveCampaignControllerBase
18+
{
19+
protected readonly IFormService FormService;
20+
21+
public FormControllerBase(IFormService formService)
22+
{
23+
FormService = formService;
24+
}
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Mvc;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
using Umbraco.Cms.Core.Actions;
9+
using Umbraco.Forms.Core.Models;
10+
using Umbraco.Forms.Core.Services;
11+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Configuration;
12+
13+
14+
namespace Umbraco.Forms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers.Forms
15+
{
16+
public class GetFormFieldsController : FormControllerBase
17+
{
18+
public GetFormFieldsController(IFormService formService) : base(formService)
19+
{
20+
}
21+
22+
[HttpGet("fields")]
23+
[ProducesResponseType(typeof(List<Field>), StatusCodes.Status200OK)]
24+
public IActionResult GetFormFields(string formId)
25+
{
26+
List<Field> formFields = new List<Field>();
27+
var result = FormService.Get(new Guid(formId));
28+
if (result != null)
29+
{
30+
formFields = result.AllFields;
31+
}
32+
return Ok(formFields);
33+
}
34+
}
35+
}

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/Client/generated/services.gen.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import type { CancelablePromise } from './core/CancelablePromise';
44
import { OpenAPI } from './core/OpenAPI';
55
import { request as __request } from './core/request';
6-
import type { GetAccountsResponse, CheckApiAccessResponse, GetCustomFieldsResponse, GetContactFieldsResponse } from './types.gen';
6+
import type { GetAccountsResponse, GetFormFieldsData, GetFormFieldsResponse, CheckApiAccessResponse, GetCustomFieldsResponse, GetContactFieldsResponse } from './types.gen';
77

88
export class AccountsService {
99
/**
@@ -17,6 +17,22 @@ export class AccountsService {
1717
});
1818
}
1919

20+
/**
21+
* @param data The data for the request.
22+
* @param data.formId
23+
* @returns unknown OK
24+
* @throws ApiError
25+
*/
26+
public static getFormFields(data: GetFormFieldsData = {}): CancelablePromise<GetFormFieldsResponse> {
27+
return __request(OpenAPI, {
28+
method: 'GET',
29+
url: '/umbraco/activecampaign/management/api/v1/forms/fields',
30+
query: {
31+
formId: data.formId
32+
}
33+
});
34+
}
35+
2036
}
2137

2238
export class ContactsService {

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/Client/generated/types.gen.ts

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ export type AccountDto = {
99
name: string;
1010
};
1111

12+
export type AllowedUploadType = {
13+
type: string;
14+
name: string;
15+
checked: string;
16+
};
17+
1218
export type ApiAccessDto = {
1319
readonly account: string;
1420
readonly isApiConfigurationValid: boolean;
@@ -29,8 +35,90 @@ export type CustomFieldDto = {
2935
title: string;
3036
};
3137

38+
export type Field = {
39+
caption: string;
40+
tooltip?: string | null;
41+
/**
42+
* @deprecated
43+
*/
44+
placeholder?: string | null;
45+
cssClass?: string | null;
46+
alias: string;
47+
id: string;
48+
fieldTypeId: string;
49+
prevalueSourceId: string;
50+
dataSourceFieldKey?: string | null;
51+
containsSensitiveData: boolean;
52+
mandatory: boolean;
53+
regex?: string | null;
54+
requiredErrorMessage?: string | null;
55+
invalidErrorMessage?: string | null;
56+
condition?: FieldCondition | null;
57+
settings: {
58+
[key: string]: (string);
59+
};
60+
preValues: Array<(FieldPrevalue)>;
61+
allowedUploadTypes?: Array<(AllowedUploadType)> | null;
62+
allowMultipleFileUploads: boolean;
63+
};
64+
65+
export type FieldCondition = {
66+
id: string;
67+
enabled: boolean;
68+
actionType: FieldConditionActionType;
69+
logicType: FieldConditionLogicType;
70+
rules: Array<(FieldConditionRule)>;
71+
};
72+
73+
export enum FieldConditionActionType {
74+
SHOW = 'Show',
75+
HIDE = 'Hide'
76+
}
77+
78+
export enum FieldConditionLogicType {
79+
ALL = 'All',
80+
ANY = 'Any'
81+
}
82+
83+
export type FieldConditionRule = {
84+
id: string;
85+
field: string;
86+
operator: FieldConditionRuleOperator;
87+
value: string;
88+
};
89+
90+
export enum FieldConditionRuleOperator {
91+
IS = 'Is',
92+
IS_NOT = 'IsNot',
93+
GREATER_THEN = 'GreaterThen',
94+
LESS_THEN = 'LessThen',
95+
CONTAINS = 'Contains',
96+
CONTAINS_IGNORE_CASE = 'ContainsIgnoreCase',
97+
STARTS_WITH = 'StartsWith',
98+
STARTS_WITH_IGNORE_CASE = 'StartsWithIgnoreCase',
99+
ENDS_WITH = 'EndsWith',
100+
ENDS_WITH_IGNORE_CASE = 'EndsWithIgnoreCase',
101+
NOT_CONTAINS = 'NotContains',
102+
NOT_CONTAINS_IGNORE_CASE = 'NotContainsIgnoreCase',
103+
NOT_STARTS_WITH = 'NotStartsWith',
104+
NOT_STARTS_WITH_IGNORE_CASE = 'NotStartsWithIgnoreCase',
105+
NOT_ENDS_WITH = 'NotEndsWith',
106+
NOT_ENDS_WITH_IGNORE_CASE = 'NotEndsWithIgnoreCase'
107+
}
108+
109+
export type FieldPrevalue = {
110+
value: string;
111+
caption?: string | null;
112+
};
113+
32114
export type GetAccountsResponse = AccountCollectionResponseDto;
33115

116+
export type GetFormFieldsData = {
117+
formId?: string;
118+
};
119+
120+
export type GetFormFieldsResponse = Array<(Field)>;
121+
34122
export type CheckApiAccessResponse = ApiAccessDto;
35123

36124
export type GetCustomFieldsResponse = CustomFieldCollectionResponseDto;
@@ -48,6 +136,17 @@ export type $OpenApiTs = {
48136
};
49137
};
50138
};
139+
'/umbraco/activecampaign/management/api/v1/forms/fields': {
140+
get: {
141+
req: GetFormFieldsData;
142+
res: {
143+
/**
144+
* OK
145+
*/
146+
200: Array<(Field)>;
147+
};
148+
};
149+
};
51150
'/umbraco/activecampaign/management/api/v1/contacts/api-access': {
52151
get: {
53152
res: {

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/Client/src/context/activecampaign.context.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ export class ActiveCampaignContext extends UmbControllerBase {
3939
async getCustomFields() {
4040
return await this.#repository.getCustomFields();
4141
}
42+
43+
async getFormFields(id: string) {
44+
return await this.#repository.getFormFields(id);
45+
}
4246
}
4347

4448
export default ActiveCampaignContext;

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/Client/src/lang/en.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ export default {
77
ContactMappingsDescription: `Map contact details with form fields`,
88
CustomFieldMappingsLabel: `Custom Fields Mappings`,
99
CustomFieldMappingsDescription: `Map contact custom fields with form fields`,
10+
11+
delete: "Delete"
1012
}
1113
} as UmbLocalizationDictionary;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export interface ContactMappingValue {
2+
contactField: string;
3+
formField: FormFieldValue | undefined;
4+
}
5+
6+
export interface FormFieldValue {
7+
id: string;
8+
value: string;
9+
}

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/Client/src/property-editor/account/account-property-editor.element.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ export class AccountPropertyUiElement extends UmbLitElement implements UmbProper
1616

1717
@state()
1818
private accounts: Array<AccountDto> | undefined = [];
19+
20+
1921

2022
constructor() {
2123
super();

0 commit comments

Comments
 (0)