diff --git a/manage/app/gql/queries/campaign/email-links.graphql b/manage/app/gql/queries/campaign/email-links.graphql index 3c7624cb..0df38a6c 100644 --- a/manage/app/gql/queries/campaign/email-links.graphql +++ b/manage/app/gql/queries/campaign/email-links.graphql @@ -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 + } + } + } + } } } diff --git a/manage/app/routes/campaign/edit/email/links.js b/manage/app/routes/campaign/edit/email/links.js index ac9c8e7c..c48ba67f 100644 --- a/manage/app/routes/campaign/edit/email/links.js +++ b/manage/app/routes/campaign/edit/email/links.js @@ -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 }; }, }); diff --git a/manage/app/templates/campaign/edit/email/links.hbs b/manage/app/templates/campaign/edit/email/links.hbs index f7ddcfd3..20d8cd8c 100644 --- a/manage/app/templates/campaign/edit/email/links.hbs +++ b/manage/app/templates/campaign/edit/email/links.hbs @@ -6,6 +6,20 @@ {{/modal.header}} {{#modal.body}} +
+
+ + + +
+
+ +
+
{{email-campaign/url-groups urlGroups=model.urlGroups disabled=isActionRunning diff --git a/monorepo/services/server/src/graphql/definitions/campaign.js b/monorepo/services/server/src/graphql/definitions/campaign.js index 04f446a9..bc3f163b 100644 --- a/monorepo/services/server/src/graphql/definitions/campaign.js +++ b/monorepo/services/server/src/graphql/definitions/campaign.js @@ -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! } @@ -402,6 +402,10 @@ input CampaignStatusInput { enabled: Boolean! } +input EmailCampaignUrlGroupInput { + deploymentsFilter: String! +} + enum CampaignSortField { fullName createdAt diff --git a/monorepo/services/server/src/graphql/resolvers/campaign.js b/monorepo/services/server/src/graphql/resolvers/campaign.js index d505d083..de3f386b 100644 --- a/monorepo/services/server/src/graphql/resolvers/campaign.js +++ b/monorepo/services/server/src/graphql/resolvers/campaign.js @@ -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 []; @@ -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; },