Skip to content

Commit 34657b4

Browse files
committed
Remove Links from Faded Text
Automatically remove links from text, but allow them to be preserved if needed. Can be invoked on the FadeText component or on the yielded contextual component as needed. Mostly we're removing them, but I kept links in when in a read only display of the faded text.
1 parent 0972497 commit 34657b4

File tree

12 files changed

+165
-23
lines changed

12 files changed

+165
-23
lines changed

packages/frontend/app/components/program-year/objective-list-item.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ export default class ProgramYearObjectiveListItemComponent extends Component {
281281
</:postValue>
282282
</EditableField>
283283
{{else}}
284-
{{ft.text}}
284+
{{ft.text preserveLinks=true}}
285285
{{ft.controls}}
286286
{{/if}}
287287
</FadeText>

packages/ilios-common/addon-test-support/ilios-common/page-objects/components/fade-text.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const definition = {
44
scope: '[data-test-fade-text]',
55
enabled: isPresent('[data-test-fade-text-control]'),
66
displayText: {
7-
scope: '.display-text-wrapper',
7+
scope: '[data-test-display-text]',
88
isFaded: hasClass('faded'),
99
},
1010
control: {

packages/ilios-common/addon/components/course/objective-list-item-parents.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export default class CourseObjectiveListItemParentsComponent extends Component {
6363
</button>
6464
{{ft.controls}}
6565
{{else}}
66-
{{ft.text}}
66+
{{ft.text preserveLinks=true}}
6767
{{ft.controls}}
6868
{{/if}}
6969
</FadeText>

packages/ilios-common/addon/components/course/objective-list-item.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ export default class CourseObjectiveListItemComponent extends Component {
239239
</:postValue>
240240
</EditableField>
241241
{{else}}
242-
{{ft.text}}
242+
{{ft.text preserveLinks=true}}
243243
{{ft.controls}}
244244
{{/if}}
245245
</FadeText>

packages/ilios-common/addon/components/fade-text.gjs

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
import Component from '@glimmer/component';
2-
import { tracked } from '@glimmer/tracking';
2+
import { cached, tracked } from '@glimmer/tracking';
33
import { htmlSafe } from '@ember/template';
44
import onResize from 'ember-on-resize-modifier/modifiers/on-resize';
55
import t from 'ember-intl/helpers/t';
66
import { on } from '@ember/modifier';
77
import FaIcon from 'ilios-common/components/fa-icon';
88
import { hash } from '@ember/helper';
9+
import { TrackedAsyncData } from 'ember-async-data';
910

1011
export default class FadeTextComponent extends Component {
1112
@tracked textHeight;
1213
@tracked expanded;
1314

1415
MAX_HEIGHT = 200;
1516

16-
get displayText() {
17-
return new htmlSafe(this.args.text);
18-
}
19-
2017
get textHeightRounded() {
2118
return Math.floor(this.textHeight);
2219
}
@@ -68,15 +65,20 @@ export default class FadeTextComponent extends Component {
6865
collapse=this.collapse
6966
)
7067
text=(component
71-
FadedText faded=this.shouldFade resize=this.updateTextDims text=this.displayText
68+
FadedTextComponent
69+
faded=this.shouldFade
70+
resize=this.updateTextDims
71+
text=@text
72+
preserveLinks=@preserveLinks
7273
)
7374
)
7475
}}
7576
{{else}}
76-
<FadedText
77+
<FadedTextComponent
7778
@faded={{this.shouldFade}}
7879
@resize={{this.updateTextDims}}
79-
@text={{this.displayText}}
80+
@preserveLinks={{@preserveLinks}}
81+
@text={{@text}}
8082
/>
8183
<Controls
8284
@expandable={{this.shouldFade}}
@@ -117,10 +119,46 @@ const Controls = <template>
117119
{{/if}}
118120
</template>;
119121

120-
const FadedText = <template>
121-
<div class="display-text-wrapper{{if @faded ' faded'}}">
122-
<div class="display-text" {{onResize @resize}}>
123-
{{@text}}
122+
class FadedTextComponent extends Component {
123+
@cached
124+
get sanitizerData() {
125+
return new TrackedAsyncData(import('sanitize-html'));
126+
}
127+
128+
get cleanText() {
129+
if (this.args.preserveLinks) {
130+
return this.args.text;
131+
}
132+
133+
if (!this.sanitizerData.isResolved) {
134+
return this.args.text;
135+
}
136+
137+
const { default: sanitizeHtml } = this.sanitizerData.value;
138+
139+
return sanitizeHtml(this.args.text, {
140+
transformTags: {
141+
a: sanitizeHtml.simpleTransform('span', { class: 'link' }, false),
142+
},
143+
allowedAttributes: false, //disable attribute filtering
144+
allowedTags: false, //disable tag filtering
145+
allowVulnerableTags: true, //turn off warnings about script tags
146+
});
147+
}
148+
149+
get displayText() {
150+
return new htmlSafe(this.cleanText);
151+
}
152+
153+
<template>
154+
<div
155+
class="display-text-wrapper{{if @faded ' faded'}}"
156+
data-test-display-text
157+
data-test-done={{this.sanitierData.isResolved}}
158+
>
159+
<div class="display-text" {{onResize @resize}} data-test-text>
160+
{{this.displayText}}
161+
</div>
124162
</div>
125-
</div>
126-
</template>;
163+
</template>
164+
}

packages/ilios-common/addon/components/objective-sort-manager.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ export default class ObjectiveSortManagerComponent extends Component {
150150
<FaIcon @icon="up-down-left-right" />
151151
{{/unless}}
152152
<span class="draggable-object-content">
153-
<FadeText @text={{item.title}} />
153+
<FadeText @text={{item.title}} @preserveLinks={{true}} />
154154
</span>
155155
</li>
156156
{{/each}}

packages/ilios-common/addon/components/session/objective-list-item-parents.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export default class SessionObjectiveListItemParentsComponent extends Component
6767
</button>
6868
{{ft.controls}}
6969
{{else}}
70-
{{ft.text}}
70+
{{ft.text preserveLinks=true}}
7171
{{ft.controls}}
7272
{{/if}}
7373
</FadeText>

packages/ilios-common/addon/components/session/objective-list-item.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ export default class SessionObjectiveListItemComponent extends Component {
222222
</:postValue>
223223
</EditableField>
224224
{{else}}
225-
{{ft.text}}
225+
{{ft.text preserveLinks=true}}
226226
{{ft.controls}}
227227
{{/if}}
228228
</FadeText>

packages/ilios-common/addon/components/session/overview.gjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ export default class SessionOverview extends Component {
629629
</:postValue>
630630
</EditableField>
631631
{{else}}
632-
{{ft.text}}
632+
{{ft.text preserveLinks=true}}
633633
{{ft.controls}}
634634
{{/if}}
635635
</FadeText>
@@ -664,7 +664,7 @@ export default class SessionOverview extends Component {
664664
</:postValue>
665665
</EditableField>
666666
{{else}}
667-
{{ft.text}}
667+
{{ft.text preserveLinks=true}}
668668
{{ft.controls}}
669669
{{/if}}
670670
</FadeText>

packages/ilios-common/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"normalize.css": "^8.0.1",
6666
"query-string": ">= 9.1.0",
6767
"quill": "^2.0.3",
68+
"sanitize-html": "^2.17.0",
6869
"striptags": ">= 3.2.0",
6970
"typeface-nunito": ">= 1.1.13",
7071
"typeface-nunito-sans": ">= 1.1.13",

0 commit comments

Comments
 (0)