DEV: enforces ember-template-lint: no-triple-curlies (#9150)

This pr replaces `{{{ }}}` usage by a {{html-safe}} helper. While it doesn't solve the underlying issue, it gives us a path forward without risking breaking too much existing behavior.

Also introduces an htmlSafe computed macro:

```
import { htmlSafe } from "discourse/lib/computed";

htmlDescription: htmlSafe("description")
```

Overtime {{html-safe}} usage should be removed and moved to components properties or specialized components/helpers.
This commit is contained in:
Joffrey JAFFEUX
2020-03-10 16:46:57 +01:00
committed by GitHub
parent aec26ad2f0
commit d436b600fb
152 changed files with 345 additions and 284 deletions

View File

@@ -9,11 +9,11 @@
{{icon-or-image model}}
<span class="badge-display-name">{{model.name}}</span>
{{else}}
<span class='badge-placeholder'>{{I18n 'admin.badges.mass_award.no_badge_selected'}}</span>
<span class='badge-placeholder'>{{i18n 'admin.badges.mass_award.no_badge_selected'}}</span>
{{/if}}
</div>
<div>
<h4>{{I18n 'admin.badges.mass_award.upload_csv'}}</h4>
<h4>{{i18n 'admin.badges.mass_award.upload_csv'}}</h4>
<input type='file' id='massAwardCSVUpload' accept='.csv'>
</div>
<div>
@@ -34,6 +34,6 @@
{{/link-to}}
</form>
{{else}}
<span class='badge-required'>{{I18n 'admin.badges.mass_award.no_badge_selected'}}</span>
<span class='badge-required'>{{i18n 'admin.badges.mass_award.no_badge_selected'}}</span>
{{/if}}
{{/d-section}}

View File

@@ -7,7 +7,7 @@
{{#each badgeIntroLinks as |link|}}
<a href={{link.href}} class="external-link" target="_blank" rel="noopener">
{{d-icon link.icon}}
<span>{{I18n link.text}}</span>
<span>{{i18n link.text}}</span>
</a>
{{/each}}
</div>

View File

@@ -15,7 +15,7 @@
{{#if backupStats.last_backup_taken_at}}
<br>
{{{i18n "admin.dashboard.lastest_backup" date=(format-date backupStats.last_backup_taken_at leaveAgo="true")}}}
{{i18n "admin.dashboard.lastest_backup" date=(format-date backupStats.last_backup_taken_at leaveAgo="true")}}
{{/if}}
</p>
</div>

View File

@@ -1 +1 @@
{{{formatedValue}}}
{{html-safe formatedValue}}

View File

@@ -199,6 +199,6 @@
{{/conditional-loading-section}}
{{else}}
<div class="alert alert-info">
{{{disabledLabel}}}
{{html-safe disabledLabel}}
</div>
{{/if}}

View File

@@ -46,7 +46,7 @@
<div class="form-display">
<strong>{{userField.name}}</strong>
<br>
{{{userField.description}}}
{{html-safe userField.description}}
</div>
<div class="form-display">{{fieldName}}</div>
<div class="form-element controls">

View File

@@ -1,7 +1,7 @@
<div class='penalty-post-controls'>
<label>
<div class='penalty-post-label'>
{{{i18n 'admin.user.penalty_post_actions'}}}
{{i18n 'admin.user.penalty_post_actions'}}
</div>
</label>
{{combo-box

View File

@@ -1,7 +1,7 @@
<div class='reason-controls'>
<label>
<div class='silence-reason-label'>
{{{i18n 'admin.user.silence_reason_label'}}}
{{i18n 'admin.user.silence_reason_label'}}
</div>
</label>
{{text-field

View File

@@ -1,5 +1,5 @@
<label>
{{input type="checkbox" checked=enabled}}
<span>{{{setting.description}}}</span>
<span>{{html-safe setting.description}}</span>
{{setting-validation-message message=validationMessage}}
</label>

View File

@@ -3,5 +3,5 @@
onChange=(action "onChangeSelectedCategories")
}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>
{{setting-validation-message message=validationMessage}}

View File

@@ -4,4 +4,4 @@
onChange=(action (mut value))
}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -6,4 +6,4 @@
onChangeColor=(action "onChangeColor")
}}
{{setting-validation-message message=validationMessage}}
<div class="desc">{{{setting.description}}}</div>
<div class="desc">{{html-safe setting.description}}</div>

View File

@@ -8,4 +8,4 @@
}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -15,5 +15,5 @@
{{setting-validation-message message=validationMessage}}
<div class='desc'>
{{{setting.description}}}
{{html-safe setting.description}}
</div>

View File

@@ -7,4 +7,4 @@
onChange=(action "onChangeGroupListSetting")
}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -1,3 +1,3 @@
{{value-list values=value addKey="admin.site_settings.add_host"}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -1,3 +1,3 @@
{{value-list values=value inputDelimiter="|" choices=setting.choices}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -1,3 +1,3 @@
{{secret-value-list setting=setting values=value isSecret=isSecret}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -7,4 +7,4 @@
{{/if}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -1,3 +1,3 @@
{{tag-chooser tags=selectedTags}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>
{{setting-validation-message message=validationMessage}}

View File

@@ -1,2 +1,2 @@
{{site-settings-image-uploader imageUrl=value placeholderUrl=setting.placeholder type="site_setting"}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -1,2 +1,2 @@
{{d-button label="admin.site_settings.uploaded_image_list.label" action=(action "showUploadModal") actionParam=(hash value=value setting=setting)}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -1,3 +1,3 @@
{{value-list values=value addKey="admin.site_settings.add_url"}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -1,3 +1,3 @@
{{value-list values=value}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{setting.description}}}</div>
<div class='desc'>{{html-safe setting.description}}</div>

View File

@@ -2,9 +2,9 @@
<label>
<div class='suspend-reason-label'>
{{#if siteSettings.hide_suspension_reasons}}
{{{i18n 'admin.user.suspend_reason_hidden_label'}}}
{{i18n 'admin.user.suspend_reason_hidden_label'}}
{{else}}
{{{i18n 'admin.user.suspend_reason_label'}}}
{{i18n 'admin.user.suspend_reason_label'}}
{{/if}}
</div>
</label>

View File

@@ -28,14 +28,14 @@
{{#if displayComponents}}
<div class="components-list">
<span class="components">{{{childrenString}}}</span>
<span class="components">{{html-safe childrenString}}</span>
{{#if displayHasMore}}
<a href {{action "toggleChildrenExpanded"}} class="others-count">
{{#if childrenExpanded}}
{{I18n "admin.customize.theme.collapse"}}
{{i18n "admin.customize.theme.collapse"}}
{{else}}
{{I18n "admin.customize.theme.and_x_more" count=moreCount}}
{{i18n "admin.customize.theme.and_x_more" count=moreCount}}
{{/if}}
</a>
{{/if}}

View File

@@ -25,9 +25,9 @@
<div class="themes-list-item inactive-indicator">
<span class="empty">
{{#if themesTabActive}}
{{I18n "admin.customize.theme.inactive_themes"}}
{{i18n "admin.customize.theme.inactive_themes"}}
{{else}}
{{I18n "admin.customize.theme.inactive_components"}}
{{i18n "admin.customize.theme.inactive_components"}}
{{/if}}
</span>
</div>
@@ -41,7 +41,7 @@
{{/if}}
{{else}}
<div class="themes-list-item">
<span class="empty">{{I18n "admin.customize.theme.empty"}}</span>
<span class="empty">{{i18n "admin.customize.theme.empty"}}</span>
</div>
{{/if}}

View File

@@ -1,7 +1,7 @@
<div class="themes-intro admin-intro">
<img src={{womanArtistEmojiURL}}>
<div class="content-wrapper">
<h1>{{I18n "admin.customize.theme.themes_intro"}}</h1>
<h1>{{i18n "admin.customize.theme.themes_intro"}}</h1>
<div class="create-actions">
{{d-button action=(route-action "installModal") icon="upload" label="admin.customize.install" class="btn-primary"}}
</div>
@@ -9,7 +9,7 @@
{{#each externalResources as |resource|}}
<a href={{resource.link}} class="external-link" rel="noopener" target="_blank">
{{d-icon resource.icon}}
{{I18n resource.key}}
{{i18n resource.key}}
</a>
{{/each}}
</div>

View File

@@ -89,7 +89,7 @@
{{#if showRemoteError}}
<div class="error-message">
{{d-icon "exclamation-triangle"}} {{I18n "admin.customize.theme.repo_unreachable"}}
{{d-icon "exclamation-triangle"}} {{i18n "admin.customize.theme.repo_unreachable"}}
</div>
<div class="raw-error">
<code>{{model.remoteError}}</code>

View File

@@ -12,7 +12,7 @@
<div class="problem-messages">
<ul>
{{#each problems as |problem|}}
<li>{{{problem}}}</li>
<li>{{html-safe problem}}</li>
{{/each}}
</ul>
</div>

View File

@@ -142,7 +142,7 @@
filters=trendingSearchFilters
isEnabled=logSearchQueriesEnabled
disabledLabel=trendingSearchDisabledLabel}}
{{{i18n "admin.dashboard.reports.trending_search.more" basePath=basePath}}}
{{i18n "admin.dashboard.reports.trending_search.more" basePath=basePath}}
</div>
</div>

View File

@@ -14,13 +14,13 @@
<hr>
<div class="text">
<h3>{{i18n 'admin.email.advanced_test.text'}}</h3>
<pre class="full-reason">{{{text}}}</pre>
<pre class="full-reason">{{html-safe text}}</pre>
</div>
<hr>
<div class="elided">
<h3>{{i18n 'admin.email.advanced_test.elided'}}</h3>
<pre class="full-reason">{{{elided}}}</pre>
<pre class="full-reason">{{html-safe elided}}</pre>
</div>
{{/if}}

View File

@@ -53,7 +53,7 @@
<iframe srcdoc={{model.html_content}} />
{{/if}}
{{else}}
<pre>{{{model.text_content}}}</pre>
<pre>{{html-safe model.text_content}}</pre>
{{/if}}
</div>
</div>

View File

@@ -23,7 +23,7 @@
{{#if showSecondary}}
<div class='embedding-secondary'>
<p>{{{i18n "admin.embedding.sample"}}}</p>
<p>{{i18n "admin.embedding.sample"}}</p>
{{highlighted-code code=embeddingCode lang="html"}}
</div>

View File

@@ -88,7 +88,7 @@
<td class="col value created-at">{{age-with-tooltip item.created_at}}</td>
<td class="col value details">
<div>
{{{item.formattedDetails}}}
{{html-safe item.formattedDetails}}
{{#if item.useCustomModalForDetails}}
<a href {{action "showCustomDetailsModal" item}}>{{d-icon "info-circle"}} {{i18n 'admin.logs.staff_actions.show'}}</a>
{{/if}}

View File

@@ -17,9 +17,9 @@
{{else}}
<p class="grant-count">
{{#if count}}
{{{i18n "admin.badges.preview.grant_count" count=count}}}
{{i18n "admin.badges.preview.grant_count" count=count}}
{{else}}
{{{i18n "admin.badges.preview.no_grant_count"}}}
{{i18n "admin.badges.preview.no_grant_count"}}
{{/if}}
</p>
@@ -41,14 +41,14 @@
</p>
<ul>
{{#each processedSample as |html|}}
<li>{{{html}}}</li>
<li>{{html-safe html}}</li>
{{/each}}
</ul>
{{/if}}
{{#if hasQueryPlan}}
<div class="badge-query-plan">
{{{queryPlanHtml}}}
{{html-safe queryPlanHtml}}
</div>
{{/if}}
{{/if}}

View File

@@ -24,7 +24,7 @@
<div class="popular-theme-buttons">
{{#if theme.installed}}
<span>{{I18n "admin.customize.theme.installed"}}</span>
<span>{{i18n "admin.customize.theme.installed"}}</span>
{{else}}
{{d-button class='btn-small'
label="admin.customize.theme.install"
@@ -33,7 +33,7 @@
action=(action "installThemeFromList" theme.value)}}
{{#if theme.preview}}
<a href={{theme.preview}} rel="noopener" target="_blank">{{d-icon "desktop"}} {{I18n "admin.customize.theme.preview"}}</a>
<a href={{theme.preview}} rel="noopener" target="_blank">{{d-icon "desktop"}} {{i18n "admin.customize.theme.preview"}}</a>
{{/if}}
{{/if}}
</div>
@@ -85,10 +85,10 @@
{{#if create}}
<div class="inputs">
<div class="label">{{I18n "admin.customize.theme.create_name"}}</div>
<div class="label">{{i18n "admin.customize.theme.create_name"}}</div>
{{input value=name placeholder=placeholder}}
<div class="label">{{I18n "admin.customize.theme.create_type"}}</div>
<div class="label">{{i18n "admin.customize.theme.create_type"}}</div>
{{combo-box
valueProperty="value"
content=createTypes

View File

@@ -1,6 +1,6 @@
<div>
{{#d-modal-body title="admin.logs.staff_actions.modal_title"}}
{{{diff}}}
{{html-safe diff}}
{{/d-modal-body}}
<div class="modal-footer">
{{d-button

View File

@@ -7,7 +7,7 @@
</div>
<div class="popular-theme-buttons">
{{#if theme.installed}}
<span>{{I18n "admin.customize.theme.installed"}}</span>
<span>{{i18n "admin.customize.theme.installed"}}</span>
{{else}}
{{d-button class='btn-small'
label="admin.customize.theme.install"

View File

@@ -31,7 +31,7 @@
<div class='fps-topic'>
<div class='topic'>
<a class='search-link' href={{result.url}}>
{{topic-status topic=result.topic disableActions=true}}<span class='topic-title'>{{#highlight-text highlight=term}}{{{result.topic.fancyTitle}}}{{/highlight-text}}</span>
{{topic-status topic=result.topic disableActions=true}}<span class='topic-title'>{{#highlight-text highlight=term}}{{html-safe result.topic.fancyTitle}}{{/highlight-text}}</span>
</a>
<div class='search-category'>
@@ -55,7 +55,7 @@
{{#if result.blurb}}
{{#highlight-text highlight=term}}
{{{result.blurb}}}
{{html-safe result.blurb}}
{{/highlight-text}}
{{/if}}
</div>

View File

@@ -132,7 +132,7 @@
<div class="field">{{i18n "user.avatar.title"}}</div>
<div class="value">{{avatar model imageSize="large"}}</div>
<div class="controls">
{{{i18n "admin.user.visit_profile" url=preferencesPath}}}
{{i18n "admin.user.visit_profile" url=preferencesPath}}
</div>
</div>
@@ -509,7 +509,7 @@
<h1>{{i18n "admin.groups.title"}}</h1>
<div class="display-row">
<div class="field">{{i18n "admin.groups.automatic"}}</div>
<div class="value">{{{automaticGroups}}}</div>
<div class="value">{{html-safe automaticGroups}}</div>
</div>
<div class="display-row">
<div class="field">{{i18n "admin.groups.custom"}}</div>
@@ -616,11 +616,11 @@
</div>
<div class="display-row">
<div class="field">{{i18n "admin.user.time_read"}}</div>
<div class="value">{{{format-duration model.time_read}}}</div>
<div class="value">{{format-duration model.time_read}}</div>
</div>
<div class="display-row">
<div class="field">{{i18n "user.invited.days_visited"}}</div>
<div class="value">{{{model.days_visited}}}</div>
<div class="value">{{html-safe model.days_visited}}</div>
</div>
</section>

View File

@@ -53,11 +53,11 @@
</td>
<td class="last-emailed">
<div class="label">{{i18n 'admin.users.last_emailed'}}</div>
<div>{{{format-duration user.last_emailed_age}}}</div>
<div>{{format-duration user.last_emailed_age}}</div>
</td>
<td class="last-seen">
<div class="label">{{i18n 'last_seen'}}</div>
<div>{{{format-duration user.last_seen_age}}}</div>
<div>{{format-duration user.last_seen_age}}</div>
</td>
<td class="topics-entered">
<div class="label">{{i18n 'admin.user.topics_entered'}}</div>
@@ -69,12 +69,12 @@
</td>
<td class="time-read">
<div class="label">{{i18n 'admin.user.time_read'}}</div>
<div>{{{format-duration user.time_read}}}</div>
<div>{{format-duration user.time_read}}</div>
</td>
<td class="created">
<div class="label">{{i18n 'created'}}</div>
<div>{{{format-duration user.created_at_age}}}</div>
<div>{{format-duration user.created_at_age}}</div>
</td>
{{#if siteSettings.must_approve_users}}