• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CenterForOpenScience / ember-osf-web / 12694429563

09 Jan 2025 04:39PM UTC coverage: 64.499%. First build
12694429563

Pull #2433

github

web-flow
Merge 715bee8a8 into 5bbb5a3c5
Pull Request #2433: [ENG-6669] Institutional Access project Request Modal

2738 of 4664 branches covered (58.7%)

Branch coverage included in aggregate %.

3 of 55 new or added lines in 5 files covered. (5.45%)

6973 of 10392 relevant lines covered (67.1%)

199.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

62.86
/app/institutions/dashboard/-components/object-list/contributors-field/component.ts
1
import Component from '@glimmer/component';
2
import { inject as service } from '@ember/service';
3
import Intl from 'ember-intl/services/intl';
4
import { action } from '@ember/object';
5

6
import InstitutionModel from 'ember-osf-web/models/institution';
7
import SearchResultModel from 'ember-osf-web/models/search-result';
8
import { AttributionRoleIris } from 'ember-osf-web/models/index-card';
9
import { getOsfmapObjects, getSingleOsfmapValue, hasOsfmapValue } from 'ember-osf-web/packages/osfmap/jsonld';
10

11
interface ContributorsFieldArgs {
12
    searchResult: SearchResultModel;
13
    institution: InstitutionModel;
14
    projectRequestModal: (contributor: any) => void;
15
}
16

17
const roleIriToTranslationKey: Record<AttributionRoleIris, string> = {
1✔
18
    [AttributionRoleIris.Admin]: 'general.permissions.admin',
19
    [AttributionRoleIris.Write]: 'general.permissions.write',
20
    [AttributionRoleIris.Read]: 'general.permissions.read',
21
};
22

23

24
export default class InstitutionalObjectListContributorsField extends Component<ContributorsFieldArgs> {
25
    @service intl!: Intl;
26

27
    // Return two contributors affiliated with the institution given with highest permission levels
28
    get topInstitutionAffiliatedContributors() {
29
        const { searchResult, institution } = this.args;
110✔
30
        const {resourceMetadata} = searchResult;
110✔
31
        const attributions: any[] = getOsfmapObjects(resourceMetadata, ['qualifiedAttribution']);
110✔
32
        const contributors = getOsfmapObjects(resourceMetadata, ['creator']);
110✔
33
        const institutionIris = institution.iris;
110✔
34

35
        const affiliatedAttributions = attributions
110✔
36
            .filter((attribution: any) => hasInstitutionAffiliation(contributors, attribution, institutionIris));
110✔
37
        const adminAttributions = affiliatedAttributions.filter(
110✔
38
            attribution => hasOsfmapValue(attribution, ['hadRole'], AttributionRoleIris.Admin),
×
39
        );
40
        const writeAttributions = affiliatedAttributions.filter(
110✔
41
            attribution => hasOsfmapValue(attribution, ['hadRole'], AttributionRoleIris.Write),
×
42
        );
43
        const readAttributions = affiliatedAttributions.filter(
110✔
44
            attribution => hasOsfmapValue(attribution, ['hadRole'], AttributionRoleIris.Read),
×
45
        );
46

47
        const prioritizedAttributions = adminAttributions.concat(writeAttributions, readAttributions);
110✔
48

49
        return prioritizedAttributions.slice(0, 2).map(attribution => {
110✔
50
            const contributor = getContributorById(contributors, getSingleOsfmapValue(attribution, ['agent']));
×
51
            const roleIri: AttributionRoleIris = getSingleOsfmapValue(attribution, ['hadRole']);
×
52
            return {
×
53
                name: getSingleOsfmapValue(contributor, ['name']) || 'Unknown Contributor',
×
54
                userId: contributor['@id'],
55
                nodeId: searchResult.indexCard.get('osfGuid'),
56
                url: getSingleOsfmapValue(contributor, ['identifier']),
57
                permissionLevel: this.intl.t(roleIriToTranslationKey[roleIri]),
58
            };
59
        });
60
    }
61

62
    @action
63
    handleOpenModal(contributor: any) {
NEW
64
        this.args.projectRequestModal(contributor);
×
65
    }
66
}
67

68
function hasInstitutionAffiliation(contributors: any[], attribution: any, institutionIris: string[]) {
69
    const attributedContributor = getContributorById(contributors, getSingleOsfmapValue(attribution, ['agent']));
110✔
70

71
    if (!attributedContributor.affiliation) {
110!
72
        return false;
×
73
    }
74

75
    return attributedContributor.affiliation.some(
110✔
76
        (affiliation: any) => {
77
            if (affiliation.identifier) {
110!
78
                return affiliation.identifier.some(
110✔
79
                    (affiliationIdentifier: any) => institutionIris.includes(affiliationIdentifier['@value']),
110✔
80
                );
81
            }
82
            return institutionIris.includes(affiliation['@id']);
×
83
        },
84
    );
85
}
86

87
function getContributorById(contributors: any[], contributorId: string) {
88
    return contributors.find(contributor => contributor['@id'] === contributorId);
110✔
89
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc