Skip to content

Commit 42f13d5

Browse files
committed
Merge branch 'release/25.13.0'
2 parents c87a90c + faa4e8b commit 42f13d5

40 files changed

+803
-121
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

7+
## [25.13.0] - 2025-07-08
8+
### Added
9+
- Verified Resource Linking project release - FE
10+
711
## [25.12.0] - 2025-06-13
812
### Added
913
- Google File Picker workflow
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import AddonServiceAdapter from './addon-service';
2+
3+
export default class AuthorizedLinkAccountAdapter extends AddonServiceAdapter {
4+
}
5+
6+
declare module 'ember-data/types/registries/adapter' {
7+
export default interface AdapterRegistry {
8+
'authorized-link-account': AuthorizedLinkAccountAdapter;
9+
} // eslint-disable-line semi
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import AddonServiceAdapter from './addon-service';
2+
3+
export default class ConfiguredLinkAddonAdapter extends AddonServiceAdapter {
4+
}
5+
6+
declare module 'ember-data/types/registries/adapter' {
7+
export default interface AdapterRegistry {
8+
'configured-link-addon': ConfiguredLinkAddonAdapter;
9+
} // eslint-disable-line semi
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import AddonServiceAdapter from './addon-service';
2+
3+
export default class ExternalLinkServiceAdapter extends AddonServiceAdapter {
4+
}
5+
6+
declare module 'ember-data/types/registries/adapter' {
7+
export default interface AdapterRegistry {
8+
'external-link-service': ExternalLinkServiceAdapter;
9+
} // eslint-disable-line semi
10+
}

app/guid-node/addons/index/controller.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
import Controller from '@ember/controller';
22
import { inject as service } from '@ember/service';
33
import Media from 'ember-responsive';
4+
import { tracked } from 'tracked-built-ins';
45

6+
enum FilterTypes {
7+
STORAGE = 'additional-storage',
8+
CITATION_MANAGER = 'citation-manager',
9+
VERIFIED_LINK = 'verified-link',
10+
// CLOUD_COMPUTING = 'cloud-computing', // disabled because BOA is down
11+
}
512
export default class GuidNodeAddonsController extends Controller {
613
@service media!: Media;
14+
@tracked tabIndex = 0;
15+
@tracked activeFilterType = FilterTypes.STORAGE;
16+
17+
queryParams = ['tabIndex', 'activeFilterType'];
718

819
get isMobile() {
920
return this.media.isMobile;

app/guid-node/addons/index/template.hbs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
<div local-class='addon-page-wrapper'>
44
<AddonsService::Manager
55
@node={{this.model}}
6+
@activeFilterType={{this.activeFilterType}}
7+
@updateActiveFilterType={{fn (mut this.activeFilterType)}}
8+
@updateTabIndex={{fn (mut this.tabIndex)}}
69
as |manager|
710
>
811
{{#if manager.selectedProvider}}
@@ -166,7 +169,7 @@
166169
<div
167170
data-test-configured-addon-name
168171
local-class='configured-addon-display-name'
169-
{{did-insert (perform configuredAddon.getRootFolderName)}}
172+
{{did-insert (perform configuredAddon.getSelectedItemName)}}
170173
>
171174
<span>{{configuredAddon.displayName}}</span>
172175
<span local-class='float-right'>
@@ -240,10 +243,18 @@
240243
{{manager.selectedConfiguration.displayName}}
241244
</div>
242245
<div>
243-
{{#if manager.selectedConfiguration.rootFolder}}
244-
{{manager.selectedConfiguration.rootFolderName}}
246+
{{#if (instance-of manager.selectedConfiguration 'ConfiguredLinkAddon')}}
247+
{{#if manager.selectedConfiguration.targetUrl}}
248+
{{manager.selectedConfiguration.targetItemName}}
249+
{{else}}
250+
{{t 'addons.list.target-not-set'}}
251+
{{/if}}
245252
{{else}}
246-
{{t 'addons.list.root-folder-not-set'}}
253+
{{#if manager.selectedConfiguration.rootFolder}}
254+
{{manager.selectedConfiguration.rootFolderName}}
255+
{{else}}
256+
{{t 'addons.list.root-folder-not-set'}}
257+
{{/if}}
247258
{{/if}}
248259
</div>
249260
<div>
@@ -274,6 +285,7 @@
274285
<AddonsService::ConfiguredAddonEdit
275286
@configuredAddon={{manager.selectedConfiguration}}
276287
@authorizedAccount={{manager.selectedAccount}}
288+
@supportedResourceTypes={{manager.selectedProvider.provider.supportedResourceTypes}}
277289
@onSave={{perform manager.saveOrCreateConfiguration}}
278290
@onCancel={{manager.cancelSetup}}
279291
/>
@@ -282,7 +294,8 @@
282294
{{/let}}
283295
{{else}}
284296
<AriaTabs
285-
@defaultIndex={{0}}
297+
@selectedIndex={{this.tabIndex}}
298+
@onSelect={{action (mut this.tabIndex)}}
286299
local-class='tabs'
287300
as |tab|
288301
>
@@ -324,7 +337,7 @@
324337
<Button
325338
data-test-addon-list-filter={{type}}
326339
data-analytics-name={{t (concat 'addons.list.filter.' type)}}
327-
local-class='filter-button {{if (eq manager.activeFilterType type) 'active'}}'
340+
local-class='filter-button {{if (eq this.activeFilterType type) 'active'}}'
328341
@layout='fake-link'
329342
{{on 'click' (fn manager.filterByAddonType type)}}
330343
>
@@ -364,7 +377,7 @@
364377
<Button
365378
data-test-addon-list-filter={{type}}
366379
data-analytics-name={{t (concat 'addons.list.filter.' type)}}
367-
local-class='filter-button {{if (eq manager.activeFilterType type) 'active'}}'
380+
local-class='filter-button {{if (eq this.activeFilterType type) 'active'}}'
368381
@layout='fake-link'
369382
{{on 'click' (fn manager.filterByAddonType type)}}
370383
>

app/guid-node/links/controller.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Controller from '@ember/controller';
2+
import { Permission } from 'ember-osf-web/models/osf-model';
3+
4+
export default class GuidNodeLinksController extends Controller {
5+
get currentUserCanEdit() {
6+
return this.model.node.currentUserPermissions.includes(Permission.Write);
7+
}
8+
}

app/guid-node/links/route.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Route from '@ember/routing/route';
2+
import Store from '@ember-data/store';
3+
import { inject as service } from '@ember/service';
4+
5+
export default class GuidNodeLinks extends Route {
6+
@service store!: Store;
7+
8+
async model() {
9+
const node = await this.modelFor('guid-node').taskInstance;
10+
const resourceReferences = await this.store.query('resource-reference', {
11+
filter: {resource_uri: node.links.iri?.toString()},
12+
});
13+
const resourceReference = resourceReferences?.firstObject;
14+
const configuredLinkAddons = await resourceReference?.configuredLinkAddons;
15+
return await {node, configuredLinkAddons};
16+
}
17+
}

app/guid-node/links/styles.scss

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
.table {
2+
width: 100%;
3+
text-align: left;
4+
border-collapse: collapse;
5+
}
6+
7+
.table-header {
8+
padding-bottom: 10px;
9+
padding-top: 10px;
10+
}
11+
12+
.edit-header {
13+
min-width: 30px;
14+
}
15+
16+
.table-row {
17+
border-bottom: 1px solid $color-border-gray;
18+
}
19+
20+
.table-cell {
21+
padding-bottom: 10px;
22+
padding-top: 10px;
23+
}
24+
25+
.logo {
26+
max-width: 50px;
27+
max-height: 50px;
28+
}
29+
30+
.links-page-wrapper {
31+
margin: 20px;
32+
}
33+

app/guid-node/links/template.hbs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<div local-class='links-page-wrapper'>
2+
<h2>{{t 'links.linked-services'}}</h2>
3+
{{#if this.model.configuredLinkAddons}}
4+
<table local-class='table'>
5+
<thead>
6+
<tr local-class='table-row'>
7+
<th local-class='table-header'>{{t 'links.linked-service'}}</th>
8+
<th local-class='table-header'>{{t 'links.display-name'}}</th>
9+
<th local-class='table-header'>{{t 'links.resource-type'}}</th>
10+
<th local-class='table-header edit-header'>
11+
{{#if this.currentUserCanEdit}}
12+
<OsfLink
13+
@route='guid-node.addons'
14+
@queryParams={{hash
15+
activeFilterType='verified-link'
16+
tabIndex='1'
17+
}}
18+
@models={{array this.model.node.id}}
19+
>
20+
{{t 'links.edit'}}
21+
</OsfLink>
22+
{{/if}}
23+
</th>
24+
</tr>
25+
</thead>
26+
<tbody>
27+
{{#each this.model.configuredLinkAddons as |configuredLinkAddon|}}
28+
<tr local-class='table-row'>
29+
<td local-class='table-cell'>
30+
<img alt={{t 'links.logo'}} local-class='logo'
31+
src={{configuredLinkAddon.externalLinkService.iconUrl}}>
32+
<span>{{configuredLinkAddon.externalLinkService.displayName}}</span>
33+
</td>
34+
<td local-class='table-cell'>{{configuredLinkAddon.displayName}}</td>
35+
<td local-class='table-cell'>{{configuredLinkAddon.resourceType}}</td>
36+
<td local-class='table-cell'><a target='_blank' rel='noopener noreferrer' href={{configuredLinkAddon.targetUrl}}>{{t 'links.link'}}</a></td>
37+
</tr>
38+
{{/each}}
39+
</tbody>
40+
</table>
41+
{{else}}
42+
<p>{{t 'links.empty-screen-message'}}</p>
43+
{{#if this.currentUserCanEdit}}
44+
<p> {{t 'links.point-to-addons-message'}} <a href='/{{this.model.node.id}}/addons?activeFilterType=verified-link'>{{t 'addons.heading'}}</a></p>
45+
{{/if}}
46+
{{/if}}
47+
</div>

0 commit comments

Comments
 (0)