diff --git a/blocks/gmo-campaign-details/gmo-campaign-details.css b/blocks/gmo-campaign-details/gmo-campaign-details.css
index 2b5f2a06..1005d4a1 100644
--- a/blocks/gmo-campaign-details/gmo-campaign-details.css
+++ b/blocks/gmo-campaign-details/gmo-campaign-details.css
@@ -33,6 +33,9 @@ body {
& .h3 {
font: normal normal bold 14px/21px Adobe Clean;
}
+ & .subtitle {
+ font: normal normal normal 14px/21px Adobe Clean;
+ }
& > .main-body-wrapper {
display: flex;
flex-direction: column;
@@ -51,6 +54,7 @@ body {
margin-left: 20px;
display: flex;
flex-direction: column;
+ justify-content: space-evenly;
& .icon-calendar {
width: 17px;
}
@@ -68,12 +72,15 @@ body {
& .header-row2 {
display: flex;
align-items: center;
- margin-top: 20px;
+ }
+ & .header-row3 {
+ display: flex;
+ align-items: center;
}
& .campaign-status {
- background-color: #EEF8F5;
border-radius: 4px;
- color: #33AB84;
+ color: black;
+ filter: saturate(0.5);
font: normal normal normal 12px/15px Adobe Clean;
height: 24px;
line-height: 24px;
@@ -265,21 +272,25 @@ body {
}
}
}
-}
-.artifacts-wrapper {
- display: flex;
- flex-direction: column;
- width: 400px;
- margin-right: 100px;
- & .links {
+ .links-wrapper {
display: flex;
- justify-content: space-between;
- margin-top: 10px;
- }
- & .campaign-link {
- font: normal normal normal 14px/21px Adobe Clean;
- letter-spacing: 0px;
- color: #0D66D0;
+ flex-direction: column;
+ max-width: 90%;
+ margin-right: 100px;
+ margin-top: unset;
+ & .links {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 10px;
+ }
+ & .campaign-link {
+ font: normal normal normal 14px/21px Adobe Clean;
+ letter-spacing: 0px;
+ color: #0D66D0;
+ &:not(:last-child) {
+ margin-right: 30px;
+ }
+ }
}
}
.table-wrapper {
@@ -321,6 +332,18 @@ body {
text-overflow: ellipsis;
line-height: 16px;
}
+ & .date-wrapper {
+ display: flex;
+ flex-direction: column;
+ justify-content:center;
+ & > .completion-date, .revised-date {
+ line-height: 21px;
+ }
+ & > .revised-date {
+ color: #959595;
+ font: italic normal normal 11px/21px Adobe Clean;
+ }
+ }
}
&.collapsible.header {
height: unset;
@@ -360,6 +383,7 @@ body {
border-top: 2px solid #F4F4F4;
}
}
+
.status-wrapper {
height: 56px;
display: flex;
@@ -397,6 +421,22 @@ body {
}
}
+.header-row3:hover .date-tooltip {
+ visibility: visible;
+ opacity: 1;
+}
+.date-tooltip {
+ background-color: #D3D3D3;
+ border-radius: 2px;
+ visibility: hidden;
+ z-index: 1;
+ position: absolute;
+ text-align: center;
+ width: 100px;
+ padding: 2px 0;
+ font: normal normal normal 12px/17px Adobe Clean;
+ margin-left: 100px;
+}
.column1 {
margin-left: 45px;
}
@@ -416,7 +456,7 @@ body {
width: 170px;
}
.column8 {
- width: 100px;
+ width: 120px;
}
.column9 {
width: 150px;
diff --git a/blocks/gmo-campaign-details/gmo-campaign-details.js b/blocks/gmo-campaign-details/gmo-campaign-details.js
index ef22138e..7fc5a2f7 100644
--- a/blocks/gmo-campaign-details/gmo-campaign-details.js
+++ b/blocks/gmo-campaign-details/gmo-campaign-details.js
@@ -2,22 +2,22 @@ import { decorateIcons, readBlockConfig } from '../../scripts/lib-franklin.js';
import { getQueryVariable } from '../../scripts/shared.js';
import { getProgramInfo } from '../../scripts/graphql.js';
import { checkBlankString } from '../gmo-campaign-list/gmo-campaign-list.js'
-import { statusMappings, productMappings } from '../../scripts/shared-campaigns.js';
+import { statusMappings, productMappings, typeMappings } from '../../scripts/shared-campaigns.js';
import { getBaseConfigPath } from '../../scripts/site-config.js';
import { searchAsset } from '../../scripts/assets.js';
let blockConfig;
+const programName = getQueryVariable('programName');
export default async function decorate(block) {
- const programName = getQueryVariable('programName');
- const programData = await getProgramInfo(programName, "program");
- const deliverables = getProgramInfo(programName, "deliverables");
+ const programData = await getProgramInfo(programName, "getProgramDetails");
+ const deliverables = getProgramInfo(programName, "getProgramDeliverables");
const program = programData.data.programList.items[0];
const kpis = buildKPIList(program).outerHTML;
const products = buildProductList(program).outerHTML;
const audiences = buildAudienceList(program).outerHTML;
const date = formatDate(program.launchDate);
- const status = buildStatus(program.status).outerHTML;
+ const artifactLinks = buildArtifactLinks(program).outerHTML;
blockConfig = readBlockConfig(block);
block.innerHTML = `
@@ -33,8 +33,10 @@ export default async function decorate(block) {
${program.programName}
${status}
-
@@ -79,6 +81,7 @@ export default async function decorate(block) {
+ ${artifactLinks}
Links to Important Artifacts
@@ -127,6 +130,7 @@ export default async function decorate(block) {
+ ${artifactLinks}
Links to Important Artifacts
@@ -135,9 +139,9 @@ export default async function decorate(block) {
Marketing Brief
-
@@ -164,6 +168,7 @@ export default async function decorate(block) {
try {
const imageObject = await searchAsset(program.programName, program.campaignName);
insertImageIntoCampaignImg(block,imageObject);
+ document.getElementById('totalassets').textContent = imageObject.assetCount;
} catch (error) {
console.error("Failed to load campaign image:", error);
}
@@ -186,6 +191,7 @@ export default async function decorate(block) {
decorateIcons(block);
buildChannelScope(await deliverables, block);
buildDeliverablesTable(await deliverables, block);
+ buildStatus(program.status);
}
function insertImageIntoCampaignImg(block,imageObject) {
@@ -196,8 +202,10 @@ function insertImageIntoCampaignImg(block,imageObject) {
campaignImgDiv.appendChild(imgElement);
}
async function buildDeliverablesTable(deliverables, block) {
- const rows = buildTableNoGroups(deliverables);
+ //const rows = buildTableNoGroups(deliverables);
+ const rows = buildTable(deliverables)
const tableRoot = block.querySelector('.table-content');
+ decorateIcons(rows);
tableRoot.appendChild(rows);
}
@@ -288,14 +296,40 @@ function buildAudienceList(program) {
return audienceList;
}
-function buildStatus(status) {
+function buildArtifactLinks(program) {
+ const artifactLinks = document.createElement('div');
+ artifactLinks.classList.add('links-wrapper');
+ artifactLinks.innerHTML = `
+
Links to Important Artifacts
+
+ `;
+ // see how many 'links' were made. if none, hide the section
+ const numLinks = artifactLinks.querySelectorAll('.campaign-link')?.length;
+ if (numLinks == 0) artifactLinks.classList.add('inactive');
+ return artifactLinks;
+}
+
+async function buildStatus(status) {
const statusDiv = document.createElement('div');
statusDiv.classList.add('campaign-status');
- const statusLabel = statusMappings[status].label;
- const statusColor = statusMappings[status].color;
- statusDiv.textContent = statusLabel;
- statusDiv.classList.add(statusColor);
- return statusDiv;
+ const statusJson = await getProgramInfo(programName, "getStatusList")
+ // use new function that doesn't require programname
+ const statusArray = statusJson.data.jsonByPath.item.json.options;
+ const statusMatch = statusArray.filter(item => item.value === status);
+ const statusText = statusMatch.length > 0 ? statusMatch[0].text : status;
+ const statusHex = statusMatch[0]["color-code"];
+ statusDiv.textContent = statusText;
+ statusDiv.style.backgroundColor = "#" + statusHex;
+ document.querySelector('.header-row1').appendChild(statusDiv);
}
function createAudience(audience) {
@@ -328,51 +362,58 @@ function formatDate(dateString) {
return formattedDate;
}
-function buildTable(data) {
+function buildTable(jsonResponse) {
+ const deliverableList = jsonResponse.data.deliverableList.items;
+ const programKpi = jsonResponse.data.programList.items.primaryKpi;
const rows = document.createElement('div');
- const uniqueCategories = getUniqueValues(data, 'category');
- let isRowHidden = true;
+ const uniqueCategories = getUniqueValues(deliverableList, 'deliverableType');
let emptyCategory = false;
uniqueCategories.forEach((category) => {
// build header row
let headerRow;
- if (!((category == undefined) || (category === ''))) {
- headerRow = buildHeaderRow(category, 'header', false);
- attachListener(headerRow);
- rows.appendChild(headerRow);
- } else {
+ const matchingCampaigns = deliverableList.filter(deliverable => deliverable.deliverableType === category);
+ const matchCount = matchingCampaigns.length;
+ if (category == null || category == undefined || category === '') {
emptyCategory = true;
headerRow = rows;
+ } else {
+ headerRow = buildHeaderRow(category, 'header', false, matchCount);
+ attachListener(headerRow);
+ rows.appendChild(headerRow);
}
- const matchingCampaigns = data.filter(campaign => campaign.category === category);
- // create subcategory headings
- const subCats = getUniqueValues(matchingCampaigns, 'subcategory');
- subCats.forEach((subCat) => {
- let subCatHeader;
- if (!((subCat == undefined) || (subCat === ''))) {
- if(emptyCategory) {
- subCatHeader = buildHeaderRow(subCat, 'category', false);
- } else {
- subCatHeader = buildHeaderRow(subCat, 'subcategory', true);
- }
- attachListener(subCatHeader);
- headerRow.appendChild(subCatHeader);
- } else {
- subCatHeader = rows;
- isRowHidden = false;
- }
-
- const matchingSubs = data.filter(campaign => campaign.subcategory === subCat);
- matchingSubs.forEach((campaign) => {
- const tableRow = buildTableRow(campaign, isRowHidden);
- subCatHeader.appendChild(tableRow);
- isRowHidden = true;
- });
- });
+ matchingCampaigns.forEach((campaign) => {
+ const tableRow = buildTableRow(campaign, programKpi, !emptyCategory);
+ headerRow.appendChild(tableRow);
+ })
+ // sort grouped rows by date
+ if (!emptyCategory) {
+ dateSort(headerRow);
+ }
+ emptyCategory = false;
})
+ //sort the rows
+ sortRows(rows);
return rows;
}
+function dateSort(parent) {
+ const childNodes = Array.from(parent.getElementsByClassName('datarow'));
+ childNodes.sort((a, b) => {
+ const dateA = new Date(a.querySelector('.completion-date').innerHTML);
+ const dateB = new Date(b.querySelector('.completion-date').innerHTML);
+ // Check if dates are valid
+ if (isNaN(dateA.getTime()) || isNaN(dateB.getTime())) {
+ return 0; // Move on if date is invalid
+ }
+
+ return dateA - dateB;
+ })
+
+ childNodes.forEach((node) => {
+ parent.appendChild(node);
+ })
+}
+
function buildTableNoGroups(response) {
const deliverableList = response.data.deliverableList.items;
const programKpi = response.data.programList.items.primaryKpi;
@@ -392,12 +433,20 @@ function getUniqueValues(array, filterValue) {
return Array.from(uniqueValues);
}
+function lookupType(rawType) {
+ const typeLookup = typeMappings[rawType]?.name;
+ const deliverableTypeLabel = (typeLookup != undefined) ? typeLookup : deliverableJson.deliverableType;
+ return deliverableTypeLabel;
+}
+
/**
* @param {string} category - String value of the category property
* @param {string} headerType - Type of header. Either 'category' or 'subcategory'
* @param {boolean} isInactive - Determines whether or not the header will be hidden initially
*/
-function buildHeaderRow(category, headerType, isInactive) {
+function buildHeaderRow(category, headerType, isInactive, matchCount) {
+ //look up friendly name for deliverable type
+ const typeLabel = lookupType(category);
const headerRow = document.createElement('div');
headerRow.classList.add('row', 'collapsible', 'header');
let divopen;
@@ -412,12 +461,14 @@ function buildHeaderRow(category, headerType, isInactive) {
${divopen}
-
+
`;
return headerRow;
}
function buildTableRow(deliverableJson, kpi, createHidden) {
+ //look up friendly name for deliverable type
+ const typeLabel = lookupType(deliverableJson.deliverableType);
const dataRow = document.createElement('div');
dataRow.classList.add('row', 'datarow');
if (createHidden) dataRow.classList.add('inactive');
@@ -430,7 +481,7 @@ function buildTableRow(deliverableJson, kpi, createHidden) {
platformString = platformString.slice(0, -2);
dataRow.innerHTML = `
${deliverableJson.deliverableName}
-
${deliverableJson.deliverableType}
+
${typeLabel}
${platformString}
Review Link
@@ -450,9 +501,12 @@ function buildTableRow(deliverableJson, kpi, createHidden) {
-
${checkBlankString(deliverableJson.taskCompletionDate)}
+
+
${checkBlankString(deliverableJson.taskCompletionDate)}
+ ${deliverableJson.previousTaskCompletionDate ? '
Revised from ' + deliverableJson.previousTaskCompletionDate + '
': ""}
+
${checkBlankString(deliverableJson.driver)}
- `
+ `;
if (!(deliverableJson.linkedFolderLink == null)) {
const finalAssetLink = document.createElement('a');
finalAssetLink.href = deliverableJson.linkedFolderLink;
@@ -464,6 +518,30 @@ function buildTableRow(deliverableJson, kpi, createHidden) {
return dataRow;
}
+function sortRows(rows) {
+ const rowParent = rows;
+ const nodes = Array.from(rowParent.childNodes);
+ // Sort child nodes by class name
+ nodes.sort((a, b) => {
+ var classA = a.classList ? a.classList.contains('datarow') : false;
+ var classB = b.classList ? b.classList.contains('datarow') : false;
+
+ if (classA && !classB) {
+ return 1;
+ } else if (!classA && classB) {
+ return -1;
+ } else {
+ return 0;
+ }
+ });
+
+ // Rearrange child nodes
+ nodes.forEach((node) => {
+ rowParent.appendChild(node);
+ });
+ return rowParent;
+}
+
function attachListener(htmlElement) {
htmlElement.querySelector('.heading-wrapper').addEventListener('click', (event) => {
const arrow = event.target;
diff --git a/blocks/gmo-campaign-header/gmo-campaign-header.css b/blocks/gmo-campaign-header/gmo-campaign-header.css
index ac30d581..e2aa9bdd 100644
--- a/blocks/gmo-campaign-header/gmo-campaign-header.css
+++ b/blocks/gmo-campaign-header/gmo-campaign-header.css
@@ -6,6 +6,7 @@
.inputs-wrapper {
display: flex;
height: 50px;
+ padding-left: 10px;
}
.search-wrapper {
background-color: #FFF;
diff --git a/blocks/gmo-campaign-list/gmo-campaign-list.css b/blocks/gmo-campaign-list/gmo-campaign-list.css
index bbac4c8a..2153a884 100644
--- a/blocks/gmo-campaign-list/gmo-campaign-list.css
+++ b/blocks/gmo-campaign-list/gmo-campaign-list.css
@@ -231,6 +231,8 @@ select {
border-radius: 3px;
height: 24px;
line-height: 24px;
+ filter: saturate(0.5);
+ color: black;
}
.status.green {
background-color: #E8FFF8;
diff --git a/blocks/gmo-campaign-list/gmo-campaign-list.js b/blocks/gmo-campaign-list/gmo-campaign-list.js
index cd3d1842..080ed634 100644
--- a/blocks/gmo-campaign-list/gmo-campaign-list.js
+++ b/blocks/gmo-campaign-list/gmo-campaign-list.js
@@ -1,6 +1,6 @@
import { readBlockConfig } from '../../scripts/lib-franklin.js';
import { decorateIcons } from '../../scripts/lib-franklin.js';
-import { graphqlAllCampaignsFilter, graphqlCampaignCount, generateFilterJSON } from '../../scripts/graphql.js';
+import { graphqlAllCampaignsFilter, graphqlCampaignCount, generateFilterJSON, getMappingInfo } from '../../scripts/graphql.js';
import { productMappings, statusMappings } from '../../scripts/shared-campaigns.js'
import { getBaseConfigPath } from '../../scripts/site-config.js';
import { searchAsset } from '../../scripts/assets.js';
@@ -9,17 +9,17 @@ const headerConfig = [
{
'name': 'Marketing Moments',
'attribute': 'campaign',
- 'sortable': 'true'
+ 'sortable': true
},
{
'name': 'Overview',
'attribute': 'description',
- 'sortable': 'false'
+ 'sortable': false
},
{
'name': 'Launch Date',
'attribute': 'launch',
- 'sortable': 'true',
+ 'sortable': true,
'type': 'date'
},
{
@@ -29,7 +29,7 @@ const headerConfig = [
{
'name': 'Status',
'attribute': 'status',
- 'sortable': 'true'
+ 'sortable': false
}
]
@@ -41,7 +41,7 @@ let currentNumberPerPage = 4;
//Get Campaign Count for pagination
let campaignCount = await graphqlCampaignCount();
let blockConfig;
-let initialBlockCall = true;
+let statusMapping = await getMappingInfo("getStatusList");
//Custom event gmoCampaignListBlock to allow the gmo-campaign-header to trigger the gmo-campaign-list to update
document.addEventListener('gmoCampaignListBlock', async function() {
@@ -67,11 +67,7 @@ document.addEventListener('gmoCampaignListBlock', async function() {
export default async function decorate(block, numPerPage = currentNumberPerPage, cursor = '', previousPage = false, nextPage = false, graphQLFilter = {}) {
- //Only populate blockConfig on the first call the decorate function
- if (initialBlockCall) {
- blockConfig = readBlockConfig(block);
- initialBlockCall = false;
- }
+ if (blockConfig == undefined) blockConfig = readBlockConfig(block);
const campaignPaginatedResponse = await graphqlAllCampaignsFilter(numPerPage, cursor,graphQLFilter);
const campaigns = campaignPaginatedResponse.data.programPaginated.edges;
currentPageInfo = campaignPaginatedResponse.data.programPaginated.pageInfo;
@@ -101,7 +97,7 @@ export default async function decorate(block, numPerPage = currentNumberPerPage,
block.innerHTML = `
Last refreshed date: TBD
-
`
+
`;
const listContainer = block.querySelector('.list-container');
listContainer.appendChild(listHeaders);
listContainer.appendChild(listItems);
@@ -187,10 +183,9 @@ async function buildCampaignList(campaigns, numPerPage) {
const campaignName = document.createElement('div');
campaignName.classList.add('campaign-name-wrapper', 'vertical-center');
campaignName.innerHTML = `
- ${checkBlankString(campaign.node.campaignName)}
- ${checkBlankString(campaign.node.programName)}
- `;
-
+ ${checkBlankString(campaign.node.programName)}
+ ${checkBlankString(campaign.node.campaignName)}
+ `
campaignInfoWrapper.appendChild(campaignIconLink);
campaignInfoWrapper.appendChild(campaignName);
@@ -211,18 +206,9 @@ async function buildCampaignList(campaigns, numPerPage) {
const campaignProducts = buildProductsList(checkBlankString(campaign.node.productOffering));
campaignProducts.classList.add('column-4', 'vertical-center');
- const campaignStatusWrapper = document.createElement('div');
+ var campaignStatusWrapper = document.createElement('div');
campaignStatusWrapper.classList.add('status-wrapper', 'column-6', 'vertical-center');
-
- const campaignStatus = document.createElement('div');
- const statusStr = checkBlankString(campaign.node.status);
- const statusString = statusMappings[statusStr].label;
- campaignStatus.textContent = statusString;
- campaignStatus.classList.add(statusMappings[statusStr].color);
- campaignStatus.classList.add('status');
- campaignStatus.dataset.property = 'status';
- campaignStatusWrapper.appendChild(campaignStatus);
-
+ campaignStatusWrapper = buildStatus(campaignStatusWrapper, campaign);
campaignRow.appendChild(campaignInfoWrapper);
campaignRow.appendChild(campaignOverviewWrapper);
campaignRow.appendChild(campaignLaunch);
@@ -234,6 +220,20 @@ async function buildCampaignList(campaigns, numPerPage) {
return listWrapper;
}
+function buildStatus(statusWrapper, campaign) {
+ const campaignStatus = document.createElement('div');
+ const statusStr = checkBlankString(campaign.node.status);
+ const statusArray = statusMapping.data.jsonByPath.item.json.options;
+ const statusMatch = statusArray.filter(item => item.value === statusStr);
+ const statusText = statusMatch.length > 0 ? statusMatch[0].text : statusStr;
+ campaignStatus.textContent = statusText;
+ campaignStatus.style.backgroundColor = "#" + statusMatch[0]["color-code"];
+ campaignStatus.classList.add('status');
+ campaignStatus.dataset.property = 'status';
+ statusWrapper.appendChild(campaignStatus);
+ return statusWrapper;
+}
+
function buildProductsList(productList) {
const campaignProducts = document.createElement('div');
const productEl = buildProduct(productList);
diff --git a/scripts/assets.js b/scripts/assets.js
index a1f140c0..9eb62894 100644
--- a/scripts/assets.js
+++ b/scripts/assets.js
@@ -88,8 +88,9 @@ export async function searchAsset(programName, campaignName, imageWidth = 80) {
// Asset retrieved successfully
const responseBody = await response.json();
const assetData = responseBody.results[0].hits[0];
+ const totalAssets = responseBody.results[0].nbHits;
const thumbnailURL = await getOptimizedDeliveryUrl(assetData.assetId, assetData['repo-name'], imageWidth);
- return {imageUrl : thumbnailURL, imageAltText: assetData['repo-name']};
+ return {imageUrl : thumbnailURL, imageAltText: assetData['repo-name'], assetCount: totalAssets};
}
// Handle other response codes
throw new Error(`Failed to search asset: ${response.status} ${response.statusText}`);
diff --git a/scripts/graphql.js b/scripts/graphql.js
index a35a4cc3..8db1d8b4 100644
--- a/scripts/graphql.js
+++ b/scripts/graphql.js
@@ -226,11 +226,11 @@ export function generateFilterJSON(filterParams) {
export async function getProgramInfo(programName, queryType) {
const baseApiUrl = `${await getGraphqlEndpoint()}/graphql/execute.json`;
const projectId = 'gmo';
- const queryName = (queryType == "deliverables") ? "getProgramDeliverables" : "getProgramDetails";
+ //const queryName = (queryType == "deliverables") ? "getProgramDeliverables" : "getProgramDetails";
const encodedProgramName = encodeURIComponent(programName);
const encodedSemiColon = encodeURIComponent(';');
//persisted query URLs have to be encoded together with the first semicolon
- const graphqlEndpoint = `${baseApiUrl}/${projectId}/${queryName}${encodedSemiColon}programName=${encodedProgramName}`;
+ const graphqlEndpoint = `${baseApiUrl}/${projectId}/${queryType}${encodedSemiColon}programName=${encodedProgramName}`;
const jwtToken = await getBearerToken();
// Return the fetch promise chain so that it can be awaited outside
@@ -251,3 +251,29 @@ export async function getProgramInfo(programName, queryType) {
throw error; // Rethrow or handle error as appropriate
});
}
+
+export async function getMappingInfo(queryType) {
+ const baseApiUrl = `${await getGraphqlEndpoint()}/graphql/execute.json`;
+ const projectId = 'gmo';
+ //persisted query URLs have to be encoded together with the first semicolon
+ const graphqlEndpoint = `${baseApiUrl}/${projectId}/${queryType}`;
+ const jwtToken = await getBearerToken();
+
+ // Return the fetch promise chain so that it can be awaited outside
+ return fetch(graphqlEndpoint, {
+ method: 'GET',
+ headers: {
+ Authorization: jwtToken,
+ },
+ }).then(response => {
+ if (!response.ok) {
+ throw new Error(`HTTP error! Status: ${response.status}`);
+ }
+ return response.json();
+ }).then(data => {
+ return data; // Make sure to return the data so that the promise resolves with it
+ }).catch(error => {
+ console.error('Error fetching data: ', error);
+ throw error; // Rethrow or handle error as appropriate
+ });
+}
\ No newline at end of file
diff --git a/scripts/shared-campaigns.js b/scripts/shared-campaigns.js
index 51993236..a20f0215 100644
--- a/scripts/shared-campaigns.js
+++ b/scripts/shared-campaigns.js
@@ -18,6 +18,10 @@ export const productMappings = {
"name": "Acrobat Pro",
"icon": "acro-icon"
},
+ "acrobat-export-pdf": {
+ "name": "Acrobat Export PDF",
+ "icon": "acro-icon"
+ },
"lightroom": {
"name": "Lightroom",
"icon": "lr-icon",
@@ -34,4 +38,34 @@ export const productMappings = {
"name": "Not Available",
"icon": "gear"
}
+}
+
+export const typeMappings = {
+ "email": {
+ "name": "E-Mail"
+ },
+ "adobe-com": {
+ "name": "Adobe.com"
+ },
+ "other": {
+ "name": "Other"
+ },
+ "in-app": {
+ "name": "In-App"
+ },
+ "paid-media-static": {
+ "name": "Paid Media: Static"
+ },
+ "paid-media-video": {
+ "name": "Paid Media: Video"
+ },
+ "owned-social": {
+ "name": "Owned Social"
+ },
+ "discover": {
+ "name": "Discover"
+ },
+ null: {
+ "name": "Not Available"
+ }
}
\ No newline at end of file