Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 24 additions & 4 deletions manage/app/gql/queries/campaign/email-links.graphql
Original file line number Diff line number Diff line change
@@ -1,7 +1,27 @@
#import 'leads-manage/gql/fragments/campaign/email-links'

query CampaignEditEmailLinks($input: ModelIdInput!) {
query CampaignEditEmailLinks($input: ModelIdInput!, $urlGroupsInput: EmailCampaignUrlGroupInput) {
emailCampaign(input: $input) {
...EmailCampaignLinksFragment
id
urlGroups(input: $urlGroupsInput) {
url {
id
title
values {
resolved
}
}
deploymentGroups {
active
deployment {
id
entity
name
typeDescription
sentDate
metrics {
sent
}
}
}
}
}
}
16 changes: 13 additions & 3 deletions manage/app/routes/campaign/edit/email/links.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,19 @@ import FormMixin from 'leads-manage/mixins/form-mixin';
import query from 'leads-manage/gql/queries/campaign/email-links';

export default Route.extend(FormMixin, RouteQueryManager, {
model() {
queryParams: {
'deployments-filter': '',
},

async model(params) {
const id = this.modelFor('campaign.edit.email').get('id');
const variables = { input: { id } };
return this.get('apollo').watchQuery({ query, variables, fetchPolicy: 'network-only' }, 'emailCampaign');
const deploymentsFilter = params['deployments-filter'];
const urlGroupsInput = deploymentsFilter ? { deploymentsFilter } : null;
const variables = {
input: { id },
...urlGroupsInput && { urlGroupsInput },
};
const result = await this.get('apollo').watchQuery({ query, variables, fetchPolicy: 'network-only' }, 'emailCampaign');
return {...result, deploymentsFilter };
},
});
14 changes: 14 additions & 0 deletions manage/app/templates/campaign/edit/email/links.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,20 @@
</button>
{{/modal.header}}
{{#modal.body}}
<div class="d-flex flex-row">
<form>
<label for="deployments-filter">Filter Deployments</label>
<input type="text" id="deployments-filter" name="deployments-filter" value={{ model.deploymentsFilter }}>
<button type="submit" class="btn btn-success ml-2">
Apply Filter
</button>
</form>
<form class="pl-2">
<button type="submit" class="btn btn-primary">
Clear Filter
</button>
</form>
</div>
{{email-campaign/url-groups
urlGroups=model.urlGroups
disabled=isActionRunning
Expand Down
6 changes: 5 additions & 1 deletion monorepo/services/server/src/graphql/definitions/campaign.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ type EmailCampaign {
displayDeliveredMetrics: Boolean
enforceMaxEmailDomains: Boolean
urlCount: Int!
urlGroups: [EmailCampaignUrlGroup!]!
urlGroups(input: EmailCampaignUrlGroupInput): [EmailCampaignUrlGroup!]!
"Whether this email campaign has any eligible deployment data."
hasDeployments: Boolean!
}
Expand Down Expand Up @@ -402,6 +402,10 @@ input CampaignStatusInput {
enabled: Boolean!
}

input EmailCampaignUrlGroupInput {
deploymentsFilter: String!
}

enum CampaignSortField {
fullName
createdAt
Expand Down
15 changes: 12 additions & 3 deletions monorepo/services/server/src/graphql/resolvers/campaign.js
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,9 @@ module.exports = {
/**
* @todo find a way to not re-query the campaign here.
*/
urlGroups: async (emailCampaign) => {
urlGroups: async (emailCampaign, { input }) => {
const deploymentsFilter = input ? input.deploymentsFilter : null;
const deploymentsFilterRegEx = deploymentsFilter ? new RegExp(deploymentsFilter, 'i') : null;
const { id } = emailCampaign;
const campaign = await Campaign.findOne({ 'email._id': id });
if (!campaign) return [];
Expand All @@ -310,13 +312,20 @@ module.exports = {
const { deployment } = deploymentUrl;
const { _id: urlId } = deploymentUrl.url;
if (!m.has(`${urlId}`)) m.set(`${urlId}`, new Map());
m.get(`${urlId}`).set(deployment.entity, deployment);
if (
(deploymentsFilterRegEx && deployment.name.match(deploymentsFilterRegEx))
|| !deploymentsFilterRegEx
) {
m.get(`${urlId}`).set(deployment.entity, deployment);
}
return m;
}, new Map());

const arr = [];
map.forEach((deployments, urlId) => {
arr.push({ urlId, deployments, excludeUrls });
if (deployments.size) {
arr.push({ urlId, deployments, excludeUrls });
}
});
return arr;
},
Expand Down
Loading