Skip to content

Commit 2c5bf00

Browse files
adliusbrianjgeigerfuta-ikedaaaxelbchth0n1x
authored
Merge feature/output-reporting into develop (#1638)
* [ENG-3910] Add models and mirage (#1575) - Ticket: [ENG-3910] - Feature flag: n/a ## Purpose Add models and set up mirage for output reporting. ## Summary of Changes 1. Add model for Output 2. Modify model for Registration 3. Fix up all the mirage stuff 4. Add placeholder icons for badges * [ENG-3914] Add route and nav (#1582) - Ticket: [ENG-3914] - Feature flag: n/a ## Purpose Add the route and sidenav for output reporting. Replaces #1573 ## Summary of Changes 1. Add `[guid-registration]/resources` route 2. Add leftnav to take advantage of that route 3. Get rid of old waffled-off route for files 4. Fix and update tests * Move icons out of the registrations engine (#1584) ## Purpose Badge icons need to be used outside of the registries engine (inside the project's registrations page specifically), so this moves them to global space. ## Summary of Changes 1. Move the icons * [ENG-3911] New feature popover (#1571) * new feature popover * CR follow up. Add invocation * add tests * change popover body language * [ENG-3912] Add new resource-list component (#1583) * Add new resource-list component * Add expandable preveiw component * Add tests for resource cards * Simplify some logic * Change how icons are displayed * Add section for adding new resources * Update translation file * Add analytic code resource type (#1585) ## Purpose Add the resource type, mirage, and icons for the Analytic Code resource type ## Summary of Changes 1. Add AnalyticCode to resource types enum 2. Add hasAnalyticCode boolean to registration model 3. Fix mirage for SHARE and Registrations 3. Add placeholder icon 4. Add translation string for Resource List * [ENG-3916] Node and search cards (#1587) ## Purpose Add the display of the "Open practice resources" badges to the node card and to the registries search result cards. You probably want to hide whitespace-only changes for this to make it a bit easier to review. ## Summary of Changes 1. Add OpenBadgesList component with OpenBadgeCard subcomponent 2. Fix SHARE results mirage 3. Get rid of unnecessary icons 4. Refactor open badge icon mapping from Futa's PR 5. Add OpenBadgesList to node-card 6. Add OpenBadgesList to registries search result card 7. Translation strings 8. Test * Merge develop 2 - alternate approach (#1591) * [ENG-3886] Hide node-files page links based on permission (#1572) - Ticket: [ENG-3886] - Feature flag: n/a ## Purpose - Hide `Contributors` and `Settings` link for non-contributors ## Summary of Changes - Add condition to show/hide Contributors and Settings links - Remove logic around Analytics link (doesn't match legacy page) * [ENG-3879] Show dataverse specific info (#1570) * Show dataverse specific info * Streamline displayname logic * Add dataverse-file unit test Co-authored-by: Brian J. Geiger <bgeiger@cos.io> * Revert "Remove opacity filter from branded providers (#1568)" (#1577) This reverts commit a9f2dab. * [ENG-3917] Create folder/rename file bugs (#1578) - Ticket: [ENG-3917] - Feature flag: n/a ## Purpose - Fix bugs with rename file and create folder modals when users hit "Enter" key to submit - Add missing translation key ## Summary of Changes - Only submit name change/new folder when users hit "Enter" for these modals - Add missing translation key * [ENG-3921] Registries landing page (#1579) - Ticket: [ENG-3921] - Feature flag: n/a ## Purpose - Update registration providers shown on registries landing page ## Summary of Changes - Add new provider assets for ASIST, Character Lab, egap, Metascience, RWE, YOUth registries' logo - Add links - Remove some extra language used in the registration provider list * Remove registry advisory group section (#1581) * Add single-quote to forbidden file name chars (#1580) Co-authored-by: Yuhuai Liu <yuhuai@cos.io> * bump version no. Add CHANGELOG Co-authored-by: futa-ikeda <51409893+futa-ikeda@users.noreply.github.com> Co-authored-by: Yuhuai Liu <yuhuai@cos.io> * [ENG-3913] Add new resource (#1586) * prelim * moar * patch finalize * add edit button to resource-cards * mock failure PATCH * CR followup * CR follow-up again * [ENG-3885] Update badge alt text (#1589) ## Purpose - Fix a11y issue for badge's alt text: "Alternative text of images should not be repeated as text" ## Summary of Changes - Update resource card badge image's alt text * Update icons (#1593) ## Purpose Update the icons. The color ones should be final, but the gray ones are still intermediate is my understanding. ## Summary of Changes 1. Swap out icons * Reword/Restyle no resource (#1592) ## Purpose - Update wording for when registration has no resources ## Summary of Changes - Change wording - Add better styling * New disabled icons (#1595) ## Purpose Replace out the disabled icons with their proper versions ## Summary of Changes 1. Replace the icons * Add translation string for case of undefined resource type (#1596) ## Purpose When first creating a Resource, the back end send us a resource with a type of Undefined. The user has to choose a non-undefined type. There was no translation string for this case, so this PR adds that translation string. ## Summary of Changes 1. Add translation string * Add aria-label for add/edit resource button (#1597) * Add width to edit dialog (#1599) ## Purpose Added a width to the edit dialog box ## Summary of Changes 1. Add local class 2. Add width to style of local-class 3. Add mobile checking and styling * Add tests for edit-resource (#1594) * Add extra validation for resource type * add tests * remove comments * CR follow up * use normalizedRequestAttrs * CR follow up * CR followup Co-authored-by: Futa Ikeda <futa.ikeda@gmail.com> * [ENG-3943] Revert dialog z-index and change file-action behavior (#1600) - Ticket: [ENG-3943] - Feature flag: n/a ## Purpose - Revert z-index of dialog backgrounds to prevent bad behaviors associated with dropdowns in modal windows - We bumped the z-index up due to some issues with mobile view for Files Page Phase II in this PR here: #1529 to address the problem found here: https://www.notion.so/cos/Files-Page-Phase-II-Bugs-Found-2daf0384e75f43c18bef48c60e4b58be#02af2801c0f243b99b4c8be9ab0aef28 - Prevent issue where opening the "Resource Type" dropdown using the 🔽 down caret would immediately close the dropdown options ## Summary of Changes - Revert z-index for dialog background to 900 - Close dropdown when selecting a file/folder action to prevent them from showing up simultaneously and obscuring each other * Show API error on finalize (#1606) ## Purpose When the API returns an error from finalizing the resource, we should show that error, so people know what went wrong. ## Summary of Changes 1. Show error message on finalize * Handle DOI as non-URI (#1604) * add prefix mode to validated-input text * fix mirage view and prepend prefix to url * fix tests * fix tests * fix tests * [ENG-3949] Delete resource (#1598) * prelim * delete resource * add tests * CR followup * CR followup * Fix broken deletebutton test (#1607) ## Purpose I think the DeleteButton PR was not up to date with feature/output-reporting before merge, which caused one of the tests to break. Jenkins caught it. This fixes the test. ## Summary of Changes 1. Fix broken test * Fix infinite scroller (#1608) ## Purpose Make the infinite scroller work ## Summary of Changes 1. Create an action for loading pages 2. Pass the action to the component rather than the task * Add resource bugfixes (#1609) ## Purpose - Address issues found with Add/Edit Resource modal - unfinalized resources weren't being deleted properly - User changes were persisting in an unintuitive way when editing an existing resource ## Summary of Changes - Remove "Preview" functionality when editing existing resource - Delete unfinalized resource when adding a new resource - Change modal header if adding or editing resource - Update tests * rename open_badges to related_resource_types (#1603) rename `open_badges` to `related_resource_types`, aligning with: CenterForOpenScience/SHARE#793 CenterForOpenScience/osf.io#10004 * Fix SHARE search results in mirage view (#1611) ## Purpose When #1603 was merged, it didn't quite have everything it needed, and while things work great on staging, they didn't work in mirage. This corrects that. ## Summary of Changes 1. Update mirage view for SHARE search results * Remove overzealous aria-label (#1610) * Hide resource badges for certain registration states (#1614) - Ticket: [[Notion card]](https://www.notion.so/cos/Remove-Front-end-option-to-add-Resource-for-certain-registration-states-9780597577c7436e91b83b345aff6841) - Feature flag: n/a ## Purpose - Prevent users from adding resources when not appropriate - Prevent showing resource badges if users cannot add resources ## Summary of Changes - Update Overview leftnav to hide resources if the registration is not accepted by admins or moderators - Update node-card to hide resource badges if registration is not accepted by admins or moderators - Update tests * make the dropdown list consistent (#1616) * Add margin-bottom to resource heading (#1615) * Allow search results from OSF to use routed links (#1612) ## Purpose Links to the resource page were broken because the ID I was using from SHARE to point to a guid-based route was not a GUID. This takes advantage of a new field returned from SHARE that gives us the guid, in the case of OSF-based results. ## Summary of Changes 1. Add new property to SHARE results 2. Have main link to registration overview page in SHARE results link using the new property in case of OSF-based registrations 3. Have resource links use the new property instead of a SHARE-internal ID that I was using 4. Update mirage for SHARE 5. Test SHARE mirage for new property * Remove badges list padding for mobile view (#1621) * Resource error handling (#1622) - Ticket: [notion ticket](https://www.notion.so/cos/Misleading-error-message-when-updating-a-resource-e01b8a4f655e40c796116fb2587e614f) - Feature flag: n/a ## Purpose - Give better error messaging for DOIs conflicts ## Summary of Changes - Check error source on error and change error message accordingly * Remove metadata panel on registries components page (#1620) ## Purpose Make the node cards on the components tab of the registries overview look better by removing the right panel and giving the cards more room to breathe. ## Summary of Changes 1. Remove metadata panel on registries components page. * Add link to help docs (#1618) ## Purpose - Add link to help guides for resources ## Summary of Changes - Add new link in the top of resources page - Add new translation - TODO: add this link to the leftnav when it is ready * Disable buttons while tasks are running (#1617) ## Purpose - Disable Preview and Save buttons while those tasks are running - Show loading indicator while those tasks are running ## Summary of Changes - Basically exactly what was mentioned above * Use more direct check for missing pid (#1623) ## Purpose For some reason, the anonymized view link wasn't causing us to hide the PID link (I suspect because the meta tag is part of the list and not the individual items of the list, but I didn't look that closely into it). This changes the test to something more direct, so that if the pid value is missing, it won't try to render the link. ## Summary of Changes 1. Use pid value for checking whether to render PID link 2. Update test * Fix tab order. Fix ul and li relationships (#1619) ## Purpose - Fix tab order in editable resource card - Remove `<li>` from ResourceCard component, so we don't have a `<li>` that's not wrapped in a `<ul>` ## Summary of Changes - Wrap edit and delete button in a div, change their order - Move `<li>` wrapper from ResourceCard component to ResourcesList * [ENG-3915] Modify overview leftnav to show badges (#1602) ## Purpose The purpose of these changes were to update the left hand navigation with properly rendered resource badge icons on the registries overview page. ## Summary of Changes Changes include the creation of a resource component invoked on the overview page with parameters of the current registration's resources. These include active and inactive versions of the badges whose display is determined by the resource's `finalized` property. Because badges displayed here are read-only, permissions based logic has not been added. * Fix duplicate resource links; hide badges when !resourcesVisible (#1624) * remove duplicate resources tab * hide badges on overview page when resourcesVisible===false * Move edit/delete buttons in resource card (#1625) ## Purpose - Prevent unexpected whitespace of resource cards in mobile view ## Summary of Changes - Move edit/delete buttons in resource card to same line as resource type * Match font weight on resource icons (#1626) ## Purpose Make the font weight of the leftnav resource icons match the font weight of the other resource icons. ## Summary of Changes 1. Remove font-weight line from css * Open resource help link in new tab (#1627) * Open resource help link in new tab * Use rel=noopener * Click outside feature popover closes the popover (#1628) * click outside feature popover closes the popover * remove unnecessary unique id * user modifier * reload registration (#1632) * Add whitespace above description (#1629) * Open links in a new tab (#1633) ## Purpose Open some links in a new tab. *Note*: Links to help docs are still temporary and need replacing before deploying. ## Summary of Changes 1. Add link to help docs to the leftnav question mark icon 2. Make link to DOI in the add modal's preview open the doi in a new tab * Prevent doi prefix text-wrap. Change prefix background color (#1630) ## Purpose - Prevent text-wrap of "doi.org" prefix - Change styling of uneditable prefix to make it more clear that it is not an editable part of the text-input ## Summary of Changes - CSS changes * Don't show popover when not showing leftnav (#1634) ## Purpose Hide the New Feature Popover when in tablet or mobile view, since that's when the leftnav will be potentially hidden, so the popover would otherwise point at nothing. I tried to do this using the popover's `shouldShow` getter, but it resulted in erratic behavior. Basically, it would work if you started in mobile view, but if you went from desktop to mobile view, it would still show the popover. Also, I didn't want to put the logic on the popover itself since, in this particular instance, we're hiding it for both tablet and mobile view, not just mobile view, and that won't always necessarily be true for the popover. One oddity with this implementation is that if you close the popover without clicking "never show again", then go to mobile, then go to desktop, the popover will come back. ## Summary of Changes 1. Make a check for isDesktop 2. Only show popover if on desktop * Use correct link for leftnav help (#1635) ## Purpose We just got the link for the leftnav help, so this replaces the old, placeholder link with the new one. Note: the link will not be live yet, it's in preview-only for now. ## Summary of Changes 1. Use new link * Hide add-resource button if resources are not visible (#1636) * Add error toast if DOI validation fails (#1637) Co-authored-by: Brian J. Geiger <bgeiger@cos.io> Co-authored-by: futa-ikeda <51409893+futa-ikeda@users.noreply.github.com> Co-authored-by: Futa Ikeda <futa.ikeda@gmail.com> Co-authored-by: Abram Booth <aaxelb@users.noreply.github.com> Co-authored-by: chth0n1x <82047646+chth0n1x@users.noreply.github.com>
1 parent 079faac commit 2c5bf00

File tree

103 files changed

+2897
-270
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

103 files changed

+2897
-270
lines changed

app/adapters/resource.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import OsfAdapter from './osf-adapter';
2+
3+
export default class ResourceAdapter extends OsfAdapter {
4+
5+
}
6+
7+
declare module 'ember-data/types/registries/adapter' {
8+
export default interface AdapterRegistry {
9+
resource: ResourceAdapter;
10+
} // eslint-disable-line semi
11+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { ResourceTypes } from 'ember-osf-web/models/resource';
2+
3+
export function getBadgeIcon(resourceType: ResourceTypes) {
4+
switch (resourceType) {
5+
case ResourceTypes.Data:
6+
return '/assets/images/badges/data_small_color.png';
7+
case ResourceTypes.Materials:
8+
return '/assets/images/badges/materials_small_color.png';
9+
case ResourceTypes.AnalyticCode:
10+
return '/assets/images/badges/analytic_code_small_color.png';
11+
case ResourceTypes.Papers:
12+
return '/assets/images/badges/papers_small_color.png';
13+
case ResourceTypes.Supplements:
14+
return '/assets/images/badges/supplements_small_color.png';
15+
default:
16+
return '/assets/images/badges/data_small_color.png';
17+
}
18+
}
19+
20+
export function getBadgeIconDisabled(resourceType: ResourceTypes) {
21+
switch (resourceType) {
22+
case ResourceTypes.Data:
23+
return '/assets/images/badges/data_small_gray.png';
24+
case ResourceTypes.Materials:
25+
return '/assets/images/badges/materials_small_gray.png';
26+
case ResourceTypes.AnalyticCode:
27+
return '/assets/images/badges/analytic_code_small_gray.png';
28+
case ResourceTypes.Papers:
29+
return '/assets/images/badges/papers_small_gray.png';
30+
case ResourceTypes.Supplements:
31+
return '/assets/images/badges/supplements_small_gray.png';
32+
default:
33+
return '/assets/images/badges/data_small_gray.png';
34+
}
35+
}

app/models/registration.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { attr, belongsTo, hasMany, AsyncBelongsTo, AsyncHasMany } from '@ember-d
22
import { buildValidations, validator } from 'ember-cp-validations';
33

44
import DraftRegistrationModel from 'ember-osf-web/models/draft-registration';
5+
import ResourceModel from 'ember-osf-web/models/resource';
56
import ReviewActionModel, { ReviewActionTrigger } from 'ember-osf-web/models/review-action';
67
import SchemaResponseModel, { RevisionReviewStates } from 'ember-osf-web/models/schema-response';
78
import { RegistrationResponse } from 'ember-osf-web/packages/registration-schema';
@@ -106,6 +107,11 @@ export default class RegistrationModel extends NodeModel.extend(Validations) {
106107
@attr('array') providerSpecificMetadata!: ProviderMetadata[];
107108
@attr('fixstring') revisionState!: RevisionReviewStates;
108109
@attr('boolean') wikiEnabled!: boolean;
110+
@attr('boolean') hasData!: boolean;
111+
@attr('boolean') hasMaterials!: boolean;
112+
@attr('boolean') hasAnalyticCode!: boolean;
113+
@attr('boolean') hasPapers!: boolean;
114+
@attr('boolean') hasSupplements!: boolean;
109115

110116
// Write-only attributes
111117
@attr('array') includedNodeIds?: string[];
@@ -153,9 +159,19 @@ export default class RegistrationModel extends NodeModel.extend(Validations) {
153159
@belongsTo('schema-response', { inverse: null })
154160
latestResponse!: AsyncBelongsTo<SchemaResponseModel> & SchemaResponseModel; // Latest accepted response
155161

162+
@hasMany('resource', { inverse: 'registration' })
163+
resources!: AsyncHasMany<ResourceModel> | ResourceModel[];
164+
156165
// Write-only relationships
157166
@belongsTo('draft-registration', { inverse: null })
158167
draftRegistration!: DraftRegistrationModel;
168+
169+
get resourcesVisible(): boolean {
170+
return ![
171+
RegistrationReviewStates.Initial,
172+
RegistrationReviewStates.Pending,
173+
].includes(this.reviewsState) && !this.withdrawn && !this.archiving;
174+
}
159175
}
160176

161177
declare module 'ember-data/types/registries/model' {

app/models/resource.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { AsyncBelongsTo, attr, belongsTo } from '@ember-data/model';
2+
import RegistrationModel from 'ember-osf-web/models/registration';
3+
4+
import OsfModel from './osf-model';
5+
6+
export enum ResourceTypes {
7+
Data = 'data',
8+
AnalyticCode = 'analytic_code',
9+
Materials = 'materials',
10+
Papers = 'papers',
11+
Supplements = 'supplements',
12+
}
13+
14+
export default class ResourceModel extends OsfModel {
15+
@attr('fixstring') pid!: string;
16+
@attr('fixstring') name!: string;
17+
@attr('fixstring') resourceType!: ResourceTypes | 'undefined';
18+
@attr('fixstring') description!: string;
19+
@attr('date') dateCreated!: Date;
20+
@attr('date') dateModified!: Date;
21+
@attr('boolean') finalized!: boolean;
22+
23+
@belongsTo('registration', { inverse: 'resources' })
24+
registration!: AsyncBelongsTo<RegistrationModel> & RegistrationModel;
25+
}
26+
27+
declare module 'ember-data/types/registries/model' {
28+
export default interface ModelRegistry {
29+
resource: ResourceModel;
30+
} // eslint-disable-line semi
31+
}

app/serializers/resource.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import OsfSerializer from './osf-serializer';
2+
3+
export default class ResourceSerializer extends OsfSerializer {
4+
5+
}
6+
7+
declare module 'ember-data/types/registries/serializer' {
8+
export default interface SerializerRegistry {
9+
'resource': ResourceSerializer;
10+
} // eslint-disable-line semi
11+
}

config/environment.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ declare const config: {
8282
keenSessionId: string;
8383
analyticsDismissAdblock: string;
8484
cookieConsent: string;
85+
outputFeaturePopover: string;
8586
maintenance: string;
8687
csrf: string;
8788
authSession: string;

config/environment.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ module.exports = function(environment) {
154154
keenSessionId: 'keenSessionId',
155155
analyticsDismissAdblock: 'adBlockDismiss',
156156
cookieConsent: 'osf_cookieconsent',
157+
outputFeaturePopover: 'outputFeaturePopover',
157158
maintenance: 'maintenance',
158159
csrf: 'api-csrf',
159160
authSession: 'embosf-auth-session',
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import Component from '@glimmer/component';
2+
import { tracked } from '@glimmer/tracking';
3+
import { action } from '@ember/object';
4+
5+
interface Args {
6+
height?: number;
7+
open?: boolean;
8+
}
9+
10+
export default class ExpandablePreview extends Component<Args> {
11+
@tracked thresholdHeight: number;
12+
@tracked collapsed: boolean;
13+
@tracked collapsible = false;
14+
@tracked wrapperElement?: HTMLElement;
15+
16+
@action
17+
didInsert(element: HTMLElement) {
18+
this.wrapperElement = element;
19+
this.checkThreshold(element);
20+
}
21+
22+
@action
23+
checkThreshold(element: HTMLElement) {
24+
if (!this.wrapperElement) {
25+
this.wrapperElement = element;
26+
}
27+
if (this.thresholdHeight < element.clientHeight) {
28+
this.collapsible = true;
29+
if (this.collapsed) {
30+
this.collapseWrapper();
31+
}
32+
}
33+
}
34+
35+
@action
36+
toggleCollapse() {
37+
this.collapsed = !this.collapsed;
38+
if (this.collapsed) {
39+
this.collapseWrapper();
40+
} else {
41+
this.expandWrapper();
42+
}
43+
}
44+
45+
@action
46+
collapseWrapper() {
47+
if (this.wrapperElement) {
48+
this.wrapperElement.style.maxHeight = this.thresholdHeight + 'px';
49+
}
50+
}
51+
52+
@action
53+
expandWrapper() {
54+
if (this.wrapperElement) {
55+
this.wrapperElement.style.maxHeight = '';
56+
}
57+
}
58+
59+
constructor(owner: unknown, args: Args) {
60+
super(owner, args);
61+
this.thresholdHeight = this.args.height || 200;
62+
this.collapsed = !this.args.open;
63+
}
64+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
.Wrapper {
2+
position: relative;
3+
overflow: hidden;
4+
}
5+
6+
.Wrapper__Overlay {
7+
position: absolute;
8+
bottom: 0;
9+
right: 0;
10+
width: 100%;
11+
height: 100%;
12+
13+
&.Wrapper__Collapsed {
14+
background-image: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
15+
}
16+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<div
2+
data-test-preview-wrapper
3+
local-class='Wrapper {{if this.collapsed 'Wrapper__Collapsed'}}'
4+
{{did-insert this.didInsert}}
5+
{{did-update this.checkThreshold}}
6+
...attributes
7+
>
8+
{{#if this.collapsible}}
9+
<div
10+
data-test-collapse-overlay
11+
local-class='Wrapper__Overlay {{if this.collapsed 'Wrapper__Collapsed'}}'
12+
>
13+
</div>
14+
{{/if}}
15+
{{yield}}
16+
</div>
17+
18+
{{#if this.collapsible}}
19+
<Button
20+
data-test-collapse-button
21+
local-class='ToggleButton'
22+
@layout='fake-link'
23+
{{on 'click' this.toggleCollapse}}
24+
>
25+
{{if this.collapsed (t 'osf-components.expandable-preview.show_more') (t 'osf-components.expandable-preview.show_less')}}
26+
<FaIcon @icon='{{if this.collapsed 'caret-down' 'caret-up'}}'/>
27+
</Button>
28+
{{/if}}
29+

0 commit comments

Comments
 (0)