Skip to content

Commit c72deb1

Browse files
authored
Merge pull request #284 from umbraco/bugfix/v16/activecampaign/pagination-filtering
Bugfix/v16/activecampaign/pagination filtering
2 parents 1d5dfc2 + 710ea33 commit c72deb1

File tree

8 files changed

+52
-23
lines changed

8 files changed

+52
-23
lines changed

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Api/Management/Controllers/GetFormsPagedController.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Asp.Versioning;
22
using Microsoft.AspNetCore.Http;
33
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.AspNetCore.WebUtilities;
45
using Microsoft.Extensions.Options;
56
using Umbraco.Cms.Api.Common.Builders;
67
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
@@ -21,15 +22,13 @@ public GetFormsByPageController(IOptions<ActiveCampaignSettings> options, IHttpC
2122
[ProducesResponseType(StatusCodes.Status404NotFound)]
2223
[ProducesResponseType(StatusCodes.Status403Forbidden)]
2324
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
24-
public async Task<IActionResult> GetForms([FromQuery] int? page = 1)
25+
public async Task<IActionResult> GetForms([FromQuery] int? page = 1, [FromQuery] string? searchQuery = "")
2526
{
2627
try
2728
{
2829
var client = HttpClientFactory.CreateClient(Constants.FormsHttpClient);
2930

30-
var requestUriString = page == 1
31-
? $"{client.BaseAddress}{ApiPath}&limit={Constants.DefaultPageSize}"
32-
: $"{client.BaseAddress}{ApiPath}&limit={Constants.DefaultPageSize}&offset={(page - 1) * Constants.DefaultPageSize}";
31+
var requestUriString = BuildRequestUri(client.BaseAddress.ToString(), page ?? 1, searchQuery);
3332

3433
var requestMessage = new HttpRequestMessage
3534
{
@@ -48,5 +47,22 @@ public async Task<IActionResult> GetForms([FromQuery] int? page = 1)
4847
.Build());
4948
}
5049
}
50+
51+
private string BuildRequestUri(string baseAddress, int page, string searchQuery)
52+
{
53+
var uri = $"{baseAddress}{ApiPath}?limit={Constants.DefaultPageSize}";
54+
55+
if (page > 1)
56+
{
57+
uri = QueryHelpers.AddQueryString(uri, "offset", ((page - 1) * Constants.DefaultPageSize).ToString());
58+
}
59+
60+
if (!string.IsNullOrWhiteSpace(searchQuery))
61+
{
62+
uri = QueryHelpers.AddQueryString(uri, "search", searchQuery);
63+
}
64+
65+
return uri;
66+
}
5167
}
5268
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export type GetFormsData = {
6464
path?: never;
6565
query?: {
6666
page?: number;
67+
searchQuery?: string;
6768
};
6869
url: '/umbraco/activecampaign-forms/management/api/v1/forms';
6970
};
@@ -73,10 +74,6 @@ export type GetFormsErrors = {
7374
* The resource is protected and requires an authentication token
7475
*/
7576
401: unknown;
76-
/**
77-
* Payment Required
78-
*/
79-
402: unknown;
8077
/**
8178
* Forbidden
8279
*/

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Client/public/umbraco-package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"id": "Umbraco.Cms.Integrations.Crm.ActiveCampaign",
33
"name": "Umbraco CMS Integrations: CRM - ActiveCampaign",
4-
"version": "5.0.0",
4+
"version": "5.1.0",
55
"extensions": [
66
{
77
"name": "Umbraco EntryPoint",

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Client/src/context/activecampaign-forms.context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ export class ActiveCampaignFormsContext extends UmbControllerBase {
2828
this.#configurationModel.setValue(data);
2929
}
3030

31-
async getForms(page?: number) {
32-
return await this.#repository.getForms(page);
31+
async getForms(page?: number, searchQuery?: string) {
32+
return await this.#repository.getForms(page, searchQuery);
3333
}
3434

3535
async getForm(id: string) {

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Client/src/modal/activecampaign-forms-modal.element.ts

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ export default class ActiveCampaignFormsModalElement
2929
@state()
3030
_totalPages = 1;
3131

32+
@state()
33+
_searchQuery = "";
34+
35+
#filterTimeout?: NodeJS.Timeout;
36+
3237
constructor() {
3338
super();
3439

@@ -47,6 +52,13 @@ export default class ActiveCampaignFormsModalElement
4752
this.#checkApiAccess();
4853
}
4954

55+
disconnectedCallback() {
56+
super.disconnectedCallback();
57+
if (this.#filterTimeout) {
58+
clearTimeout(this.#filterTimeout);
59+
}
60+
}
61+
5062
async #checkApiAccess() {
5163
if (!this.#activecampaignFormsContext || !this.#configurationModel) return;
5264

@@ -58,10 +70,10 @@ export default class ActiveCampaignFormsModalElement
5870
await this.#loadForms();
5971
}
6072

61-
async #loadForms(page?: number) {
73+
async #loadForms(page?: number, searchQuery?: string) {
6274
this._loading = true;
6375

64-
const { data } = await this.#activecampaignFormsContext.getForms(page);
76+
const { data } = await this.#activecampaignFormsContext.getForms(page, searchQuery);
6577
if (!data) {
6678
this._loading = false;
6779
return;
@@ -75,21 +87,26 @@ export default class ActiveCampaignFormsModalElement
7587
this._loading = false;
7688
}
7789

78-
#handleFilterInput(event: UUIInputEvent) {
90+
async #handleFilterInput(event: UUIInputEvent) {
7991
let query = (event.target.value as string) || '';
8092
query = query.toLowerCase();
93+
this._searchQuery = query;
8194

82-
const result = !query
83-
? this._forms
84-
: this._forms.filter((form) => form.name.toLowerCase().includes(query));
95+
// Clear existing timeout
96+
if (this.#filterTimeout) {
97+
clearTimeout(this.#filterTimeout);
98+
}
8599

86-
this._filteredForms = result;
100+
this.#filterTimeout = setTimeout(async () => {
101+
this._currentPageNumber = 1;
102+
await this.#loadForms(this._currentPageNumber, this._searchQuery);
103+
}, 500);
87104
}
88105

89106
async #onPageChange(event: UUIPaginationEvent) {
90107
this._currentPageNumber = event.target?.current;
91108

92-
await this.#loadForms(this._currentPageNumber);
109+
await this.#loadForms(this._currentPageNumber, this._searchQuery);
93110
}
94111

95112
#renderPagination() {

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Client/src/property-editor/form-picker-property-editor.element.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ export default class ActiveCampaignFormPickerElement extends UmbElementMixin(Lit
1515

1616
@property({ type: String })
1717
public value = "";
18-
1918

2019
@state()
2120
private _form: FormDtoModel = {

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Client/src/repository/activecampaign-forms.repository.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ export class ActiveCampaignFormsRepository extends UmbControllerBase {
2828
return { data };
2929
}
3030

31-
async getForms(page?: number) {
32-
const { data, error } = await tryExecute(this, ActiveCampaignFormsService.getForms({ query: { page } }));
31+
async getForms(page?: number, searchQuery?: string) {
32+
const { data, error } = await tryExecute(this, ActiveCampaignFormsService.getForms({ query: { page, searchQuery } }));
3333

3434
if (error || !data) {
3535
return { error };

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Umbraco.Cms.Integrations.Crm.ActiveCampaign.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<PackageIconUrl></PackageIconUrl>
1717
<PackageProjectUrl>https://github.com/umbraco/Umbraco.Cms.Integrations/tree/main-v16/src/Umbraco.Cms.Integrations.Crm.ActiveCampaign</PackageProjectUrl>
1818
<RepositoryUrl>https://github.com/umbraco/Umbraco.Cms.Integrations</RepositoryUrl>
19-
<Version>5.0.0</Version>
19+
<Version>5.1.0</Version>
2020
<Authors>Umbraco HQ</Authors>
2121
<Company>Umbraco</Company>
2222
<PackageTags>Umbraco;Umbraco-Marketplace</PackageTags>

0 commit comments

Comments
 (0)