Skip to content
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

[ENG-5012][ENG-5014] Updates to see the file version for the latest preprint deploy #2075

9 changes: 9 additions & 0 deletions app/models/file-version.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
import { attr } from '@ember-data/model';
import { Link } from 'jsonapi-typescript';
import { NormalLinks } from 'osf-api';

import OsfModel from './osf-model';

export interface FileVersionLinks extends NormalLinks {
download?: Link;
render?: Link;
}

export default class FileVersionModel extends OsfModel {
@attr('number') size!: number;
@attr('date') dateCreated!: Date;
@attr('fixstring') contentType!: string;
@attr('fixstring') name!: string;
@attr() links!: FileVersionLinks;
futa-ikeda marked this conversation as resolved.
Show resolved Hide resolved
}

declare module 'ember-data/types/registries/model' {
Expand Down
83 changes: 83 additions & 0 deletions app/preprints/-components/preprint-file-render/component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
import FileModel from 'ember-osf-web/models/file';
import PreprintProviderModel from 'ember-osf-web/models/preprint-provider';
import PreprintModel from 'ember-osf-web/models/preprint';
import Theme from 'ember-osf-web/services/theme';
import { tracked } from '@glimmer/tracking';
import { task } from 'ember-concurrency';
import { waitFor } from '@ember/test-waiters';
import { taskFor } from 'ember-concurrency-ts';
import FileVersionModel from 'ember-osf-web/models/file-version';
import Media from 'ember-responsive';


interface InputArgs {
preprint: PreprintModel;
provider: PreprintProviderModel;
primaryFile: FileModel;
}

export interface VersionModel extends FileVersionModel {
downloadUrl?: string;
}

export default class PreprintFileRender extends Component<InputArgs> {
@service theme!: Theme;
@service media!: Media;

@tracked allowCommenting = false;
@tracked primaryFileHasVersions = false;
@tracked fileVersions: VersionModel[] = [];

primaryFile = this.args.primaryFile;
provider = this.args.provider;
preprint = this.args.preprint;

constructor(owner: unknown, args: InputArgs) {
super(owner, args);

taskFor(this.loadPrimaryFileVersions).perform();

this.allowCommenting = this.provider.allowCommenting && this.preprint.isPublished && this.preprint.public;
}

@task
@waitFor
private async loadPrimaryFileVersions() {
const primaryFileVersions = (await this.primaryFile.queryHasMany('versions', {
sort: '-id', 'page[size]': 50,
})).toArray();
this.serializeVersions(primaryFileVersions);
this.primaryFileHasVersions = primaryFileVersions.length > 0;
}

private serializeVersions(versions: FileVersionModel[]) {
const downloadUrl = this.primaryFile.links.download as string || '';
const primaryFileGuid = this.primaryFile.guid;

const directDownloadUrl = downloadUrl.replace(
`download/${primaryFileGuid}`,
`${primaryFileGuid}/download`,
);

versions.map((version: VersionModel) => {
const dateFormatted = encodeURIComponent(version.dateCreated.toISOString());
const displayName = version.name.replace(/(\.\w+)?$/, ext => `-${dateFormatted}${ext}`);

this.fileVersions.push(
{
name: version.name,
id: version.id,
dateCreated: version.dateCreated,
downloadUrl: `${directDownloadUrl}?version=${version.id}&displayName=${displayName}`,
futa-ikeda marked this conversation as resolved.
Show resolved Hide resolved
} as VersionModel,
);
return version;
});
}

get isMobile() {
return this.media.isMobile;
}
}
122 changes: 122 additions & 0 deletions app/preprints/-components/preprint-file-render/styles.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
// stylelint-disable max-nesting-depth, selector-max-compound-selectors

.file-renderer-container {
width: 100%;
height: 1150px;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;

.file-container {
width: 100%;
height: 1100px;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
}

.details-container {
width: 100%;
height: 50px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;

.name-container {
width: 60%;
height: 50px;
overflow: hidden;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;

.name,
.version {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
height: 25px;
}
}

.version-container {
width: 40%;
height: 50px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-end;

.version-menu {
background-color: $color-bg-white;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 4px;
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
padding: 5px;
margin: 2px 0 0;

ul {
list-style: none;
padding-inline-start: 0;
}

.li-container {
margin-top: 10px;
margin-bottom: 10px;

.btn {
display: inline-block;
margin-bottom: 0;
font-weight: 400;
text-align: center;
white-space: nowrap;
touch-action: manipulation;
cursor: pointer;
background-image: none;
border: 1px solid transparent;
border-radius: 2px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857;
user-select: none;
vertical-align: middle;
color: $color-text-white;
}

.btn-primary {
color: $color-text-white;
background-color: $color-bg-blue-dark;
border-color: #2e6da4;
}
}
}
}
}

&.mobile {
height: 500px;

.file-container {
height: 400px;
}

.details-container {
height: 100px;
flex-direction: column;

.version-container,
.name-container {
height: 50px;
width: 100%;
justify-content: center;
align-items: flex-start;
flex-direction: column;
}
}
}
}
49 changes: 49 additions & 0 deletions app/preprints/-components/preprint-file-render/template.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<div local-class='file-renderer-container {{if this.isMobile 'mobile'}}'>
<div local-class='file-container'>
<FileRenderer
@allowCommenting={{this.allowCommenting}}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like FileRenderer isn't doing anything with this new parameter here. It looks like it was used to determine if we needed to do a postMessage?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was planning on tackling this after the hot fix since it's not part of the issue right now. I can fix it now.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can address it in a separate JIRA ticket/PR if it doesn't seem easy to implement. I'll leave that call up to you

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed it in this PR.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think the allowCommenting parameter is being used to enable Hypothesis though. I'm not the most familiar with how Hypothesis works, but in ember-osf, there is some window.postMessage being done based on allowCommenting. I'll reach out to others who may be more familiar with how this works to see what needs to be done

@download={{this.primaryFile.links.download}}
/>
</div>

<div local-class='details-container'>
<div local-class='name-container'>
<div data-test-selected-file-name local-class='name'>
{{this.primaryFile.name}}
</div>
<div data-test-file-version local-class='version'>
{{t 'preprints.detail.file_renderer.version'}}: {{this.primaryFile.currentVersion}}
</div>
</div>
<div local-class='version-container'>
{{#if this.primaryFileHasVersions}}
<ResponsiveDropdown
@renderInPlace={{true}}
@buttonStyling={{true}}
as |dd|
>
<dd.trigger>
{{t 'preprints.detail.file_renderer.download_previous_versions'}}
<span class='fa fa-caret-down'></span>
</dd.trigger>
<dd.content local-class='version-menu'>
<ul role='menu' tabindex='-1'>
{{#each this.fileVersions as |version|}}
<li role='menuitem' local-class='li-container'>
<OsfLink
data-test-get-started-button
data-analytics-name='Content - Download Previous Version'
local-class='btn btn-primary'
@href={{version.downloadUrl}}
>
{{t 'preprints.detail.file_renderer.version'}} {{version.id}}, {{moment-format version.dateCreated 'MM/DD/YYYY HH:mm:SS'}}
</OsfLink>
</li>
{{/each}}
</ul>
</dd.content>
</ResponsiveDropdown>
{{/if}}
</div>
</div>
</div>
2 changes: 2 additions & 0 deletions app/preprints/detail/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ export default class PreprintsDetail extends Route {

const primaryFile = await preprint?.get('primaryFile');

primaryFile.versions = await primaryFile?.versions;

this.theme.set('providerType', 'preprint');
this.theme.set('id', provider.id);

Expand Down
2 changes: 1 addition & 1 deletion app/preprints/detail/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@
}

.data-container-left {
height: 481px;
height: 500px;

.file-description-container {
flex-direction: column;
Expand Down
11 changes: 6 additions & 5 deletions app/preprints/detail/template.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,14 @@
</Alert>
{{else}}
{{#if this.model.preprint.public}}
<FileRenderer
@download={{this.model.primaryFile.links.download}}
@version={{this.viewedVersion}}
/>
<Preprints::-Components::PreprintFileRender
@provider={{this.model.provider}}
@preprint={{this.model.preprint}}
@primaryFile={{this.model.primaryFile}}
></Preprints::-Components::PreprintFileRender>
<div local-class='file-description-container'>
<div local-class='file-description'>
<div>{{t this.dateLabel}}: {{moment-format this.model.dateCreated 'MMMM DD, YYYY'}}</div>
<div>{{t this.dateLabel}}: {{moment-format this.model.preprint.dateCreated 'MMMM DD, YYYY'}}</div>
{{#unless this.isMobile}}
<div> | </div>
{{/unless}}
Expand Down
1 change: 1 addition & 0 deletions lib/analytics-page/addon/application/template.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@
{{t (get this.timespanIntlKeys this.timespan)}}
<FaIcon @icon='caret-down' />
</dd.trigger>

<dd.content
local-class='date-range-menu'
@align='right'
Expand Down
4 changes: 4 additions & 0 deletions mirage/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ export default function(this: Server) {
this.patch('/applications/:id', updateDeveloperApp);

osfResource(this, 'file', { only: ['show', 'update'] });
osfNestedResource(this, 'file', 'versions', {
only: ['index'],
path: '/files/:parentID/versions',
});

this.get('/guids/:id', guidDetail);

Expand Down
32 changes: 32 additions & 0 deletions mirage/factories/file-version.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { Factory } from 'ember-cli-mirage';
import faker from 'faker';

import FileVersionModel from 'ember-osf-web/models/file-version';

export default Factory.extend<FileVersionModel>({
id() {
return faker.random.number(1000);
},
size() {
return faker.random.number(1000);
},
contentType: 'application/octet-stream',
dateCreated() {
return faker.date.past(2, new Date(2018, 0, 0));
},
name() {
return faker.system.commonFileName(faker.system.commonFileExt());
},
});

declare module 'ember-cli-mirage/types/registries/model' {
export default interface MirageModelRegistry {
'file-version': FileVersionModel;
} // eslint-disable-line semi
}

declare module 'ember-cli-mirage/types/registries/schema' {
export default interface MirageSchemaRegistry {
'file-version': FileVersionModel;
} // eslint-disable-line semi
}
4 changes: 4 additions & 0 deletions mirage/factories/file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@ export default Factory.extend<MirageFile & FileTraits>({
id: newObj.id,
referentType: newObj.modelName,
});

const versions = server.createList('file-version', 3);

newObj.update({
guid: newObj.id,
versions,
});
},

Expand Down
1 change: 0 additions & 1 deletion mirage/factories/preprint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,6 @@ export default Factory.extend<PreprintMirageModel & PreprintTraits>({
preprint.update({ reviewActions: [preprintReviewAction]});
},
}),

});

declare module 'ember-cli-mirage/types/registries/model' {
Expand Down
Loading
Loading