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

CenterForOpenScience / ember-osf-web / 12832262567

17 Jan 2025 03:43PM UTC coverage: 68.238% (+3.3%) from 64.94%
12832262567

Pull #2447

github

web-flow
Merge 08b0aa590 into 8621f29d7
Pull Request #2447: [ENG-6813] FE Reference PR for Preprints DOI Versioning

2960 of 4717 branches covered (62.75%)

Branch coverage included in aggregate %.

202 of 268 new or added lines in 13 files covered. (75.37%)

94 existing lines in 2 files now uncovered.

7417 of 10490 relevant lines covered (70.71%)

203.5 hits per line

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

79.56
/app/preprints/-components/preprint-status-banner/component.ts
1
import Component from '@glimmer/component';
2
import { inject as service } from '@ember/service';
3
import Theme from 'ember-osf-web/services/theme';
4
import Intl from 'ember-intl/services/intl';
5
import PreprintModel from 'ember-osf-web/models/preprint';
6
import PreprintRequestActionModel from 'ember-osf-web/models/preprint-request-action';
7
import PreprintProviderModel from 'ember-osf-web/models/preprint-provider';
8
import { tracked } from '@glimmer/tracking';
9
import { ReviewsState } from 'ember-osf-web/models/provider';
10
import ReviewActionModel from 'ember-osf-web/models/review-action';
11
import Media from 'ember-responsive';
12
import PreprintRequestModel from 'ember-osf-web/models/preprint-request';
13

14
const UNKNOWN = 'unknown';
1✔
15
const PENDING = 'pending';
1✔
16
const ACCEPTED = 'accepted';
1✔
17
const REJECTED = 'rejected';
1✔
18
const PENDING_WITHDRAWAL = 'pendingWithdrawal';
1✔
19
const WITHDRAWAL_REJECTED = 'withdrawalRejected';
1✔
20
const WITHDRAWN = 'withdrawn';
1✔
21

22
const PRE_MODERATION = 'pre-moderation';
1✔
23
const POST_MODERATION = 'post-moderation';
1✔
24

25
const STATUS = Object({});
1✔
26
STATUS[PENDING]= 'preprints.detail.status_banner.pending';
1✔
27
STATUS[ACCEPTED]= 'preprints.detail.status_banner.accepted';
1✔
28
STATUS[REJECTED]= 'preprints.detail.status_banner.rejected';
1✔
29
STATUS[PENDING_WITHDRAWAL]= 'preprints.detail.status_banner.pending_withdrawal';
1✔
30
STATUS[WITHDRAWAL_REJECTED]= 'preprints.detail.status_banner.withdrawal_rejected';
1✔
31

32
const MESSAGE = Object({});
1✔
33
MESSAGE[PRE_MODERATION] =  'preprints.detail.status_banner.message.pending_pre';
1✔
34
MESSAGE[POST_MODERATION] =  'preprints.detail.status_banner.message.pending_post';
1✔
35
MESSAGE[ACCEPTED] =  'preprints.detail.status_banner.message.accepted';
1✔
36
MESSAGE[REJECTED] =  'preprints.detail.status_banner.message.rejected';
1✔
37
MESSAGE[PENDING_WITHDRAWAL] =  'preprints.detail.status_banner.message.pending_withdrawal';
1✔
38
MESSAGE[WITHDRAWAL_REJECTED] =  'preprints.detail.status_banner.message.withdrawal_rejected';
1✔
39
MESSAGE[WITHDRAWN] =  'preprints.detail.status_banner.message.withdrawn';
1✔
40
MESSAGE[UNKNOWN] =  'preprints.detail.status_banner.message.withdrawn';
1✔
41

42
const WORKFLOW = Object({});
1✔
43
WORKFLOW[PRE_MODERATION] = 'preprints.detail.status_banner.pre_moderation';
1✔
44
WORKFLOW[POST_MODERATION] = 'preprints.detail.status_banner.post_moderation';
1✔
45
WORKFLOW[UNKNOWN] = 'preprints.detail.status_banner.post_moderation';
1✔
46

47
const CLASS_NAMES = Object({});
1✔
48
CLASS_NAMES[PRE_MODERATION] = 'preprint-status-pending-pre';
1✔
49
CLASS_NAMES[POST_MODERATION] =  'preprint-status-pending-post';
1✔
50
CLASS_NAMES[ACCEPTED] =  'preprint-status-accepted';
1✔
51
CLASS_NAMES[REJECTED] =  'preprint-status-rejected';
1✔
52
CLASS_NAMES[PENDING_WITHDRAWAL] =  'preprint-status-rejected';
1✔
53
CLASS_NAMES[WITHDRAWAL_REJECTED] =  'preprint-status-rejected';
1✔
54
CLASS_NAMES[WITHDRAWN] =  'preprint-status-withdrawn';
1✔
55
CLASS_NAMES[UNKNOWN] =  'preprint-status-withdrawn';
1✔
56

57
const ICONS = Object({});
1✔
58
ICONS[PENDING] = 'hourglass';
1✔
59
ICONS[ACCEPTED] = 'check-circle';
1✔
60
ICONS[REJECTED] = 'times-circle';
1✔
61
ICONS[PENDING_WITHDRAWAL] = 'hourglass';
1✔
62
ICONS[WITHDRAWAL_REJECTED] = 'times-circle';
1✔
63
ICONS[WITHDRAWN] = 'exclamation-triangle';
1✔
64
ICONS[UNKNOWN] = 'exclamation-triangle';
1✔
65

66
interface InputArgs {
67
    submission: PreprintModel;
68
    provider: PreprintProviderModel;
69
    latestWithdrawalRequest: PreprintRequestModel | null;
70
    latestAction: PreprintRequestActionModel | ReviewActionModel | null;
71
}
72

73
export default class PreprintStatusBanner extends Component<InputArgs>{
74
    @service intl!: Intl;
75
    @service theme!: Theme;
76
    @service media!: Media;
77

78
    @tracked displayComment = false;
×
79

80
    // translations
81
    labelModeratorFeedback = 'preprints.detail.status_banner.feedback.moderator_feedback';
6✔
82
    moderator = 'preprints.detail.status_banner.feedback.moderator';
6✔
83
    baseMessage = 'preprints.detail.status_banner.message.base';
6✔
84

85
    get isPendingWithdrawal(): boolean {
86
        return Boolean(this.args.latestWithdrawalRequest) && !this.isWithdrawalRejected;
43!
87
    }
88

89
    get isWithdrawalRejected(): boolean {
90
        const isPreprintRequestActionModel = this.args.latestAction instanceof PreprintRequestActionModel;
37✔
91
        return isPreprintRequestActionModel && this.args.latestAction?.actionTrigger === 'reject';
37!
92
    }
93

94
    get reviewerComment(): string | undefined {
95
        return this.args.latestAction?.comment;
4✔
96
    }
97

98
    get reviewerName(): string | undefined {
NEW
99
        return this.args.latestAction?.creator.fullName;
×
100
    }
101

102
    get isWithdrawn() {
103
        return this.args.submission.isWithdrawn;
38✔
104
    }
105

106
    public get getClassName(): string {
107
        if (this.isPendingWithdrawal) {
10!
108
            return CLASS_NAMES[PENDING_WITHDRAWAL];
×
109
        } else if (this.isWithdrawn) {
10✔
110
            return CLASS_NAMES[WITHDRAWN];
3✔
111
        } else if (this.isWithdrawalRejected) {
7!
112
            return CLASS_NAMES[WITHDRAWAL_REJECTED];
×
113
        } else {
114
            return this.args.submission.reviewsState === PENDING ?
7✔
115
                CLASS_NAMES[this.args.provider.reviewsWorkflow || UNKNOWN] :
2!
116
                CLASS_NAMES[this.args.submission.reviewsState];
117
        }
118
    }
119

120
    public get bannerContent(): string {
121
        const { provider } = this.args;
10✔
122
        if (this.isPendingWithdrawal) {
10!
NEW
123
            return this.intl.t(this.statusExplanation, { documentType: provider.documentType.singular });
×
124
        } else if (this.isWithdrawn) {
10✔
125
            return this.intl.t(MESSAGE[WITHDRAWN], { documentType: provider.documentType.singular });
3✔
126
        } else if (this.isWithdrawalRejected) {
7!
NEW
127
            return this.intl.t(MESSAGE[WITHDRAWAL_REJECTED], { documentType: provider.documentType.singular });
×
128
        } else {
129
            const tName = this.theme.isProvider ?
7!
130
                this.theme.provider?.name :
131
                this.intl.t('preprints.detail.status_banner.brand_name');
132
            const tWorkflow = this.intl.t(this.workflow);
7✔
133
            const tStatusExplanation = this.intl.t(this.statusExplanation);
7✔
134
            const base = (this.intl.t(this.baseMessage, {
7✔
135
                name: tName,
136
                reviewsWorkflow:
137
                tWorkflow,
138
                documentType: this.args.provider.documentType.singular,
139
            }));
140
            return `${base} ${tStatusExplanation}`;
7✔
141
        }
142
    }
143

144
    private get statusExplanation(): string {
145
        if (this.isPendingWithdrawal) {
7!
146
            return MESSAGE[PENDING_WITHDRAWAL];
×
147
        } else if (this.isWithdrawalRejected) {
7!
148
            return MESSAGE[WITHDRAWAL_REJECTED];
×
149
        } else {
150
            return this.args.submission.reviewsState === PENDING ?
7✔
151
                MESSAGE[this.args.provider.reviewsWorkflow || UNKNOWN ] :
2!
152
                MESSAGE[this.args.submission.reviewsState];
153
        }
154
    }
155

156
    public get status(): string {
157
        let currentState = this.args.submission.reviewsState;
6✔
158
        if (this.isPendingWithdrawal) {
6!
159
            currentState = ReviewsState.PENDING_WITHDRAWAL;
×
160
        } else if (this.isWithdrawalRejected) {
6!
161
            currentState = ReviewsState.WITHDRAWAL_REJECTED;
×
162
        }
163
        return STATUS[currentState];
6✔
164
    }
165

166
    public get icon(): string {
167
        let currentState = this.args.submission.reviewsState;
10✔
168
        if (this.isPendingWithdrawal) {
10!
169
            currentState = ReviewsState.PENDING_WITHDRAWAL;
×
170
        } else if (this.isWithdrawalRejected) {
10!
171
            currentState = ReviewsState.WITHDRAWAL_REJECTED;
×
172
        } else if (this.isWithdrawn) {
10✔
173
            currentState = ReviewsState.WITHDRAWN;
3✔
174
        }
175
        return ICONS[currentState];
10✔
176
    }
177

178
    private get workflow(): string {
179
        return WORKFLOW[this.args.provider.reviewsWorkflow || UNKNOWN];
7!
180
    }
181

182
    get isMobile() {
183
        return this.media.isMobile;
6✔
184
    }
185
}
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