diff --git a/app/assets/javascripts/classes/reports/EditReportViewModel.ts b/app/assets/javascripts/classes/reports/EditReportViewModel.ts index 9c1bfd129..ab609a829 100644 --- a/app/assets/javascripts/classes/reports/EditReportViewModel.ts +++ b/app/assets/javascripts/classes/reports/EditReportViewModel.ts @@ -22,6 +22,7 @@ import moment = require('moment-timezone/moment-timezone'); import csrf from '../Csrf'; import { + availableReportFormatTypes, availableSourceTypes, BaseRecipientViewModel, BaseScheduleViewModel, @@ -189,10 +190,16 @@ class EditRecipientViewModel extends BaseRecipientViewModel { } } - readonly availableFormats = [ - {value: ReportFormat.PDF, text: "PDF"}, - {value: ReportFormat.HTML, text: "HTML"}, - ]; + private static readonly formatDisplayNames = { + [ReportFormat.PDF]: "PDF", + [ReportFormat.HTML]: "HTML", + }; + readonly availableFormats: {value: ReportFormat, text: string}[] = availableReportFormatTypes.map( + reportFormatType => ({ + value: reportFormatType, + text: EditRecipientViewModel.formatDisplayNames[reportFormatType], + }) + ); readonly helpMessages = { format: "The format that will be delivered to this recipient. For example, a PDF attached to an email or " + diff --git a/app/assets/javascripts/classes/reports/Models.ts b/app/assets/javascripts/classes/reports/Models.ts index c54b67d81..b755ba315 100644 --- a/app/assets/javascripts/classes/reports/Models.ts +++ b/app/assets/javascripts/classes/reports/Models.ts @@ -26,7 +26,18 @@ export enum ScheduleRepetition { MONTHLY, } +function mimeTypeToReportFormat(mimeType: string): ReportFormat | undefined { + if (/^application\/pdf\b/.test(mimeType)) { + return ReportFormat.HTML; + } else if (/^text\/html\b/.test(mimeType)) { + return ReportFormat.HTML; + } + return undefined; +} export const availableSourceTypes: SourceType[] = features.sourceTypes.map((s: keyof typeof SourceType) => SourceType[s]); +export const availableReportFormatTypes: ReportFormat[] = features.reportFormatTypes + .map((s: string) => mimeTypeToReportFormat(s)) + .filter(fmt => (fmt !== undefined)); export class ZoneInfo { value: string; diff --git a/app/models/internal/Features.java b/app/models/internal/Features.java index 2a7674c81..2abdbb42c 100644 --- a/app/models/internal/Features.java +++ b/app/models/internal/Features.java @@ -17,6 +17,8 @@ import com.arpnetworking.metrics.portal.reports.SourceType; import com.google.common.collect.ImmutableList; +import com.google.common.net.MediaType; +import models.internal.reports.ReportFormat; /** * Internal model interface for metrics portal feature state. @@ -87,4 +89,11 @@ public interface Features { * @return list of names of {@link SourceType} enum values. */ ImmutableList getSourceTypes(); + + /** + * {@link MediaType}s of {@link ReportFormat}s to display in the UI. + * + * @return list of names of {@link MediaType}s. + */ + ImmutableList getReportFormatTypes(); } diff --git a/app/models/internal/impl/DefaultFeatures.java b/app/models/internal/impl/DefaultFeatures.java index f797cc8a9..84512981c 100644 --- a/app/models/internal/impl/DefaultFeatures.java +++ b/app/models/internal/impl/DefaultFeatures.java @@ -18,6 +18,7 @@ import com.arpnetworking.logback.annotations.Loggable; import com.arpnetworking.metrics.portal.reports.SourceType; import com.google.common.collect.ImmutableList; +import com.google.common.net.MediaType; import com.typesafe.config.Config; import models.internal.Features; @@ -73,6 +74,11 @@ public ImmutableList getSourceTypes() { return _sourceTypes.stream().map(SourceType::name).collect(ImmutableList.toImmutableList()); } + @Override + public ImmutableList getReportFormatTypes() { + return _reportFormatTypes.stream().map(MediaType::toString).collect(ImmutableList.toImmutableList()); + } + @Override public String toString() { return new StringBuilder() @@ -84,6 +90,8 @@ public String toString() { .append(", rollupsEnabled=").append(_rollupsEnabled) .append(", reportsEnabled=").append(_reportsEnabled) .append(", metricsAggregatorDaemonPorts=").append(_metricsAggregatorDaemonPorts) + .append(", sourceTypes=").append(_sourceTypes) + .append(", reportFormatTypes=").append(_reportFormatTypes) .append("}") .toString(); } @@ -107,6 +115,10 @@ public DefaultFeatures(final Config configuration) { .stream() .map(SourceType::valueOf) .collect(ImmutableList.toImmutableList()); + _reportFormatTypes = configuration.getStringList("portal.features.reports.formatTypes") + .stream() + .map(MediaType::parse) + .collect(ImmutableList.toImmutableList()); } private final boolean _telemetryEnabled; @@ -118,4 +130,5 @@ public DefaultFeatures(final Config configuration) { private final boolean _reportsEnabled; private final ImmutableList _metricsAggregatorDaemonPorts; private final ImmutableList _sourceTypes; + private final ImmutableList _reportFormatTypes; } diff --git a/conf/portal.application.conf b/conf/portal.application.conf index 33a7a3f11..a78c3b1b3 100644 --- a/conf/portal.application.conf +++ b/conf/portal.application.conf @@ -78,6 +78,10 @@ portal.features { # Reports reports.enabled = false reports.sourceTypes = [WEB_PAGE, GRAFANA] + reports.formatTypes = [ + "text/html; charset=utf-8", + "application/pdf", + ] # Metrics aggregator ports metricsAggregatorDaemonPorts = [7090]