-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TNO-3033 changes in custom report template to add transcript tag and … #2305
Merged
Merged
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
373 changes: 373 additions & 0 deletions
373
libs/net/dal/Migrations/1.3.6/Up/PostUp/00-ReportTemplate.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,373 @@ | ||
DO $$ | ||
BEGIN | ||
|
||
-- Update custom report with latest template. | ||
UPDATE public."report_template" SET | ||
"body" = '@inherits RazorEngineCore.RazorEngineTemplateBase<TNO.TemplateEngine.Models.Reports.ReportEngineContentModel> | ||
@using System | ||
@using System.Linq | ||
@using TNO.Entities | ||
@using TNO.TemplateEngine | ||
@{ | ||
var pageBreak = Settings.Sections.UsePageBreaks ? "page-break-after: always;" : ""; | ||
var utcOffset = ReportExtensions.GetUtcOffset(System.DateTime.Now, "Pacific Standard Time"); | ||
} | ||
|
||
<style> | ||
a { text-decoration:none; } | ||
div, p { | ||
word-wrap: break-word; | ||
overflow-wrap: break-word; | ||
} | ||
|
||
</style> | ||
|
||
<center><div style="margin-bottom: 25px; color:#FFFFF6;"><img src="@($"{SubscriberAppUrl}assets/reports/MMI_logo_white.png")" width="600"></div></center> | ||
|
||
@* This is the Do Not Forward disclaimer *@ | ||
<div><p style="background-color: #FFF7E1; color: #876503; text-align: center; font-size: 1em; font-weight: 700; line-height: 1.1em; letter-spacing: 0.08px; padding: 10px 0px; margin: 6px 0px 20px 0px;">Please take two minutes to answer a few questions about how you use MMI. <a href="https://forms.office.com/Pages/ResponsePage.aspx?id=AFLbbw09ikqwNtNoXjWa3LO6CqyU1bRHn43hYw6kY1VUN05QREFTSFdIV1I5RE9ZQ1ZHMlEzUEhZNC4u">Click here to begin the survey.</a></p></div> | ||
|
||
<a id="top" name="top"> | ||
<h1 style="color: #971D29; font-size: 30px; line-height: 34px; margin: 0px; border-bottom: #971D29 1px solid;">@Settings.Subject.Text</h1> | ||
<div style="font-size:22px; font-weight:500;"><p>@(Settings.Subject.ShowTodaysDate ? $" {ReportExtensions.GetTodaysDate():dd-MMM-yyyy}" : "")</p></div> | ||
</a> | ||
|
||
@if (Content.Count() == 0 && !ViewOnWebOnly) | ||
{ | ||
<p>There is no content in this report.</p> | ||
} | ||
@if (!ViewOnWebOnly) | ||
{ | ||
var contentCount = 0; | ||
var allContent = Content.ToArray(); | ||
var startChartGroup = -1; | ||
var endChartGroup = false; | ||
for (var index = 0; index < Sections.Count(); index++) | ||
{ | ||
var section = Sections.ElementAt(index); | ||
KeyValuePair<string, TNO.TemplateEngine.Models.Reports.ReportSectionModel>? nextSection = index + 1 < Sections.Count() ? Sections.ElementAt(index+1) : null; | ||
var sectionContent = section.Value.Content.ToArray(); | ||
|
||
if (!section.Value.IsEnabled) continue; | ||
if (sectionContent.Length == 0 && section.Value.Settings.HideEmpty) continue; | ||
|
||
// Horizontal Chart is if this section and the next section is a Media Analytics chart. | ||
var horizontalCharts = section.Value.SectionType == ReportSectionType.MediaAnalytics && section.Value.Settings.Direction == "row" | ||
&& nextSection != null && nextSection?.Value.SectionType == ReportSectionType.MediaAnalytics; | ||
startChartGroup = (horizontalCharts && startChartGroup == -1) ? index : startChartGroup; | ||
endChartGroup = section.Value.SectionType == ReportSectionType.MediaAnalytics && | ||
(nextSection == null || nextSection?.Value.SectionType != ReportSectionType.MediaAnalytics); | ||
|
||
if (startChartGroup == index) | ||
{ | ||
@:<div style="@pageBreak"><table><tr> | ||
} | ||
|
||
if (!horizontalCharts && !endChartGroup) | ||
{ | ||
@:<div style="@pageBreak"> | ||
} | ||
else | ||
{ | ||
@:<td style="padding:1rem;"> | ||
} | ||
|
||
@if (!String.IsNullOrEmpty(section.Value.Settings.Label)) | ||
{ | ||
<div style="color:#41393B; width:100%; background-color:#F0EEEE; margin: 20px 0px 10px 0px; padding: 4px"> <h2 font-size="16px"><a id="[email protected]" name="[email protected]">@section.Value.Settings.Label</a></h2></div> | ||
} | ||
|
||
@if (!String.IsNullOrEmpty(section.Value.Description)) | ||
{ | ||
<div style="font-size: 16px; line-height: 110%; margin-bottom: 10px;">@section.Value.Description</div> | ||
} | ||
|
||
@if (section.Value.SectionType == ReportSectionType.TableOfContents) | ||
{ | ||
@* TABLE OF CONTENTS SECTION *@ | ||
var tocCount = 0; | ||
@foreach (var tableSection in Sections.Where(s => new [] {ReportSectionType.Content, ReportSectionType.Gallery}.Contains(s.Value.SectionType))) | ||
{ | ||
if ((!tableSection.Value.Settings.HideEmpty || tableSection.Value.Content.Any()) && tableSection.Value.IsEnabled) | ||
{ | ||
<div id="toc" name="toc"> | ||
<div style="border-bottom:1px solid #675f62; margin: 2px 0 4px 0;"> | ||
<a style="color:#41393B; text-decoration:none;" href="#[email protected]"><strong>@tableSection.Value.Settings.Label</strong></a> | ||
</div> | ||
|
||
@if (section.Value.Settings.ShowHeadlines && tableSection.Value.Content.Any() && tableSection.Value.SectionType != ReportSectionType.Gallery) | ||
{ | ||
<div style="margin: 10px 0 1em 24px; padding:0;"> | ||
@foreach (var content in tableSection.Value.Content) | ||
{ | ||
var summary = OwnerId.HasValue ? content.Versions.ContainsKey(OwnerId.Value) ? content.Versions[OwnerId.Value].Summary : "" : ""; | ||
<div style="vertical-align:center; margin-bottom:4px ;"> | ||
<a id="toc-item-@tocCount" name="toc-item-@tocCount"></a> | ||
@ReportExtensions.GetFullHeadline(content, Model, utcOffset, true, $"#item-{tocCount}", "", true) @summary | ||
</div> | ||
tocCount++; | ||
} | ||
</div> | ||
} | ||
</div> | ||
} | ||
} | ||
} | ||
else if (section.Value.SectionType == ReportSectionType.Text) | ||
{ | ||
@* TEXT SECTION *@ | ||
} | ||
else if (section.Value.SectionType == ReportSectionType.Content) | ||
{ | ||
@* STORY CONTENT SECTION *@ | ||
var positionInTOC = 0; | ||
if (section.Value.Settings.ShowHeadlines) | ||
{ | ||
if (section.Value.Settings.GroupBy != "") | ||
{ | ||
var contentGroupings = sectionContent.GetContentGroupings(section.Value.Settings.GroupBy); | ||
<ul style="margin:0; margin-left: 15px; padding:0;"> | ||
@foreach(KeyValuePair<string, List<long>> contentGroup in contentGroupings) | ||
{ | ||
<li>@section.Value.Settings.GroupBy = @contentGroup.Key</li> | ||
<ul style="margin:0; margin-left: 15px; padding:0;"> | ||
@foreach(long contentId in contentGroup.Value) | ||
{ | ||
var content = sectionContent.FirstOrDefault(c => c.Id == contentId); | ||
var headlineLink = contentCount + positionInTOC; | ||
positionInTOC++; | ||
if (section.Value.Settings.ShowFullStory) | ||
{ | ||
<li>@ReportExtensions.GetFullHeadline(content, Model, utcOffset, true, $"#item-{headlineLink}", "", true)</li> | ||
} | ||
else | ||
{ | ||
<li>@ReportExtensions.GetFullHeadline(content, Model, utcOffset, true, "", "_blank", true)</li> | ||
} | ||
} | ||
</ul> | ||
} | ||
</ul> | ||
} | ||
else | ||
{ | ||
<ul style="margin:0; margin-left: 15px; padding:0;"> | ||
@foreach (var content in sectionContent) | ||
{ | ||
var headlineLink= contentCount + positionInTOC; | ||
positionInTOC++; | ||
@if (section.Value.Settings.ShowFullStory) | ||
{ | ||
<li>@ReportExtensions.GetFullHeadline(content, Model, utcOffset, true, $"#item-{headlineLink}", "", true)</li> | ||
} | ||
else | ||
{ | ||
<li>@ReportExtensions.GetFullHeadline(content, Model, utcOffset, true, "", "_blank", true)</li> | ||
} | ||
} | ||
</ul> | ||
} | ||
} | ||
|
||
@* FULL STORIES *@ | ||
@if (section.Value.Settings.ShowFullStory || section.Value.Settings.ShowImage) | ||
{ | ||
for (var i = 0; i < sectionContent.Length; i++) | ||
{ | ||
var content = sectionContent[i]; | ||
if (Settings.Content.HighlightKeywords) ReportExtensions.MarkKeywords(section.Value, content); | ||
var isTranscript = ReportExtensions.IsTranscriptAvailable(content); | ||
var sentiment = ReportExtensions.GetSentiment(content, Model, true); | ||
var headline = ReportExtensions.GetHeadline(content, Model); | ||
var body = ReportExtensions.GetBody(content, Model); | ||
var byline= ReportExtensions.GetByline(content, Model); | ||
var hasPrev = contentCount > 0; | ||
var prev = hasPrev ? contentCount - 1 : 0; | ||
var hasNext = (contentCount + 1) < allContent.Length; | ||
var next = hasNext ? contentCount + 1 : 0; | ||
var itemPosition = contentCount; | ||
var sourceUrl = ReportExtensions.GetSourceUrl(content, Model); | ||
var isPrivate = ReportExtensions.IsPrivate(content, Model); | ||
if (!section.Value.Settings.ShowImage) { | ||
body = ReportExtensions.StripHtmlImages(body); | ||
} | ||
|
||
var containImage = body.Contains("<img"); | ||
var hasImageToDisplay = (!string.IsNullOrEmpty(content.ImageContent) && section.Value.Settings.ShowImage) || containImage; | ||
|
||
/** | ||
* Checks if there is no image to display and the section settings do not allow showing the full story. | ||
* If both conditions are true, the loop will continue to the next iteration. | ||
*/ | ||
|
||
if (!hasImageToDisplay && !section.Value.Settings.ShowFullStory) | ||
{ | ||
continue; | ||
} | ||
contentCount++; | ||
<div style="display: flex; align-items: center;"> | ||
<a id="item-@itemPosition" name="item-@itemPosition"></a> | ||
</div> | ||
<div class="story_separator" style="margin:20px 0 4px 0;" > | ||
<hr /> | ||
</div> | ||
|
||
@* SECTION & NAVIGATION LINKS *@ | ||
<table width="100%" margin-bottom="25px"> | ||
<tr style="font-size: 12px;"> | ||
<td align="left"> | ||
<span style="border: none; padding:4px 6px; background-color: #FEE2E5; text-transform: uppercase; font-size:.8rem;"><a id="[email protected]" name="[email protected]" style="text-decoration:none;">@section.Value.Settings.Label</a></span> | ||
</td> | ||
|
||
<td align="right"> | ||
<span style="border: 1px solid #ccc; padding:4px 6px; text-transform: uppercase;"> | ||
<span><a style="text-decoration:none; color: #6750a4; " href="#toc-item-@itemPosition">Back</a></span> | ||
<span> | <a style="text-decoration:none; color: #6750a4; " href="#top">top</a></span> | ||
@if (hasPrev ) | ||
{ | ||
<span> | <a style="text-decoration:none; color: #6750a4; " href="#item-@prev">previous</a></span> | ||
} | ||
@if (hasNext ) | ||
{ | ||
<span> | <a style="text-decoration:none; color: #6750a4; " href="#item-@next">next</a></span> | ||
} | ||
</span> | ||
</td> | ||
</tr> | ||
</table> | ||
|
||
<h3 style="margin:16px 0px 10px 0px;">@(String.IsNullOrEmpty(sentiment) ? "" : $"{sentiment} ")@headline</h3> | ||
<div style="padding: 2px 0px 8px 12px; width:100%; border-bottom:1px solid #E8E9F1; color:#584C50; font-size:.85rem; line-height:.9rem; text-transform:uppercase; margin-bottom:16px;"> | ||
<div style="display: block; font-size: 14px; line-height: 110%;"> | ||
<strong style="text-transform:none;">@content.Source?.Name</strong><br/> | ||
<strong>@content.PublishedOn?.AddHours(utcOffset).ToString("dddd, MMMM d yyyy")</strong><br/> | ||
@if (!string.IsNullOrWhiteSpace(content.Page)) | ||
{ | ||
<span>Page @content.Page</span><br/> | ||
} | ||
@if (!string.IsNullOrWhiteSpace(byline) && Settings.Headline.ShowByline) | ||
{ | ||
<span>By @byline</span><br/> | ||
} | ||
</div> | ||
</div> | ||
@if (isTranscript) | ||
{ | ||
<div style="display: inline-block; margin-top: 5px;"> | ||
<img src="@($"{SubscriberAppUrl}asset/reports/transcript_icon.png")"> | ||
<span style="font-size: 14px;">Transcript</span> | ||
</div> | ||
} | ||
@if (!String.IsNullOrEmpty(body)) | ||
{ | ||
<div style="font-size:1em; margin-bottom: 10px;text-align:left;">@body</div> | ||
} | ||
@if (hasImageToDisplay) | ||
{ | ||
var src = $"data:{content.ContentType};base64," + content.ImageContent; | ||
<div><img src="@src" alt="@content.FileReferences.FirstOrDefault()?.FileName" /></div> | ||
} | ||
@if (Settings.Content.ShowLinkToStory && !isPrivate) | ||
{ | ||
@* LINK TO STORY ON WEBSITE *@ | ||
<div> | ||
<span style="font-size: .85em; text-transform:uppercase; vertical-align: middle; background-color:#FFF; border:#ccc 1px solid; margin:20 auto; padding:6px 10px;"> | ||
<a href="@($"{ViewContentUrl}{content.Id}")" target="_blank" style="color: #6750a4; text-decoration: none;">View Article <img height="14" style="max-width: 14px; height: 14px;" valign="absmiddle" src="@($"{SubscriberAppUrl}assets/reports/follow_link.png")"></a> | ||
</span> | ||
</div> | ||
} | ||
else if (Settings.Content.ShowLinkToStory) | ||
{ | ||
<div> | ||
<span style="font-size: .85em; text-transform:uppercase; vertical-align: middle; background-color:#FFF; border:#ccc 1px solid; margin:20 auto; padding:6px 10px;"> | ||
<a rel="noreferrer" href="@($"{sourceUrl}")" target="_blank" style="color: #6750a4; text-decoration: none;">View Article (external site)<img height="14" style="max-width: 14px; height: 14px;" valign="absmiddle" src="@($"{SubscriberAppUrl}assets/reports/follow_link.png")"></a> | ||
</span> | ||
</div> | ||
} | ||
<div style="text-align: right; margin-top: 20px;"> | ||
<a href="#item-@itemPosition" style="background-color:#6750A4; color:#FFFFFF; padding:5px 10px; text-decoration:none; border-radius:5px;">To Article Top</a> | ||
</div> | ||
|
||
} | ||
} | ||
} | ||
else if (section.Value.SectionType == ReportSectionType.MediaAnalytics) | ||
{ | ||
@* Media Analytics Section *@ | ||
foreach (var chart in section.Value.ChartTemplates) | ||
{ | ||
<img alt="@chart.SectionSettings.AltText" src="@chart.Uid" /> | ||
} | ||
} | ||
else if (section.Value.SectionType == ReportSectionType.Gallery) | ||
{ | ||
@* Gallery Section *@ | ||
if (section.Value.Settings.Direction == "row" && section.Value.Settings.ShowImage) | ||
{ | ||
<div style="display:flex;flex-wrap:wrap;"> | ||
@for (var i = 0; i < sectionContent.Length; i++) | ||
{ | ||
var content = sectionContent[i]; | ||
var fileName = content.FileReferences.FirstOrDefault()?.FileName ?? content.Id.ToString(); | ||
var src = $"data:{content.ContentType};base64," + content.ImageContent; | ||
|
||
<img style="height:min-content" src="@src" alt="@fileName" /> | ||
} | ||
</div> | ||
} | ||
else if (section.Value.Settings.ShowImage) | ||
{ | ||
for (var i = 0; i < sectionContent.Length; i++) | ||
{ | ||
var content = sectionContent[i]; | ||
var fileName = content.FileReferences.FirstOrDefault()?.FileName ?? content.Id.ToString(); | ||
var src = $"data:{content.ContentType};base64," + content.ImageContent; | ||
if (!string.IsNullOrEmpty(content.ImageContent)) | ||
{ | ||
<div> | ||
<img style="height:min-content" src="@src" alt="@fileName" /> | ||
</div> | ||
} | ||
} | ||
} | ||
} | ||
|
||
|
||
@if (!horizontalCharts && !endChartGroup) | ||
{ | ||
@:</div> | ||
} | ||
else | ||
{ | ||
@:</td> | ||
} | ||
@if (endChartGroup) | ||
{ | ||
@:</tr></table></div> | ||
} | ||
} | ||
} | ||
|
||
@* FOOTER *@ | ||
<div style="width:100%"> | ||
<hr style="background-color:#646293; border-width:0;height:1px;line-height:0;width:100%; margin-top:20px; margin-bottom:10px;"/> | ||
<a style="text-transform:uppercase; color:#fff;" href="@($"{SubscriberAppUrl}{(ReportInstanceId.HasValue ? $"report/instances/{ReportInstanceId }" : $"reports/{ReportId}")}/view")" target="_blank"> | ||
<div style="vertical-align:middle; text-align: center; background-color:#6750A4; border:#ccc 1px solid; margin:20px 20px; padding:6px 10px;"> | ||
View this report as a web page | ||
</div> | ||
</a> | ||
|
||
<div style="margin-top:20px; background-color:#F5F6F9; color:#6C5D62; text-align: center; font-size: 11px; font-style: normal; font-weight: 500; line-height: 110%; letter-spacing: 0.08px; padding: 10px 0; width:100%;"> | ||
<p>Terms of Use</p> | ||
<p> | ||
This summary is a service provided by Government Communications and Public Engagement and is only intended for original addressee. All content is the copyrighted property of a third party creator of the material. | ||
</p> | ||
<p> | ||
<b>Copying, retransmitting, archiving, redistributing, selling, licensing, or emailing the material to any third party or any employee of the Province who is not authorized to access the material is prohibited.</b> | ||
</p> | ||
</div> | ||
</div> | ||
' | ||
WHERE "name" = 'Custom Report'; | ||
|
||
END $$; |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The transcript_icon.png was not uploaded.