@reqquest/ui 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +8 -0
  2. package/dist/api.js +656 -111
  3. package/dist/components/AppRequestCard.svelte +172 -0
  4. package/dist/components/ApplicantProgramList.svelte +184 -0
  5. package/dist/components/ApplicantProgramListTooltip.svelte +22 -0
  6. package/dist/components/ApplicantPromptPage.svelte +88 -0
  7. package/dist/components/ApplicationDetailsView.svelte +307 -0
  8. package/dist/components/ButtonLoadingIcon.svelte +2 -1
  9. package/dist/components/FieldCardCheckbox.svelte +328 -0
  10. package/dist/components/FieldCardRadio.svelte +320 -0
  11. package/dist/components/IntroPanel.svelte +41 -0
  12. package/dist/components/PeriodPanel.svelte +100 -0
  13. package/dist/components/QuestionnairePrompt.svelte +36 -0
  14. package/dist/components/RenderDisplayComponent.svelte +38 -0
  15. package/dist/components/ReviewerList.svelte +93 -0
  16. package/dist/components/StatusMessageList.svelte +35 -0
  17. package/dist/components/WarningIconYellow.svelte +20 -0
  18. package/dist/components/index.js +11 -0
  19. package/dist/components/types.js +1 -0
  20. package/dist/csv.js +21 -0
  21. package/dist/index.js +2 -1
  22. package/dist/status-utils.js +343 -0
  23. package/dist/typed-client/schema.graphql +564 -124
  24. package/dist/typed-client/schema.js +87 -23
  25. package/dist/typed-client/types.js +919 -454
  26. package/dist/util.js +12 -1
  27. package/package.json +39 -40
  28. package/dist/api.d.ts +0 -595
  29. package/dist/components/ButtonLoadingIcon.svelte.d.ts +0 -18
  30. package/dist/components/index.d.ts +0 -1
  31. package/dist/index.d.ts +0 -5
  32. package/dist/registry.d.ts +0 -138
  33. package/dist/stores/IStateStore.d.ts +0 -5
  34. package/dist/typed-client/index.d.ts +0 -25
  35. package/dist/typed-client/runtime/batcher.d.ts +0 -105
  36. package/dist/typed-client/runtime/createClient.d.ts +0 -17
  37. package/dist/typed-client/runtime/error.d.ts +0 -18
  38. package/dist/typed-client/runtime/fetcher.d.ts +0 -10
  39. package/dist/typed-client/runtime/generateGraphqlOperation.d.ts +0 -30
  40. package/dist/typed-client/runtime/index.d.ts +0 -11
  41. package/dist/typed-client/runtime/linkTypeMap.d.ts +0 -9
  42. package/dist/typed-client/runtime/typeSelection.d.ts +0 -28
  43. package/dist/typed-client/runtime/types.d.ts +0 -55
  44. package/dist/typed-client/schema.d.ts +0 -1483
  45. package/dist/typed-client/types.d.ts +0 -540
  46. package/dist/util.d.ts +0 -2
@@ -1,8 +1,13 @@
1
1
  type Access {
2
2
  """
3
- Current user may create a new app request, either for themselves or on behalf of another user.
3
+ Current user may create a new app request on behalf of another user and should be shown the Create App Request button on the reviewer dashboard or main app request list.
4
4
  """
5
- createAppRequest: Boolean!
5
+ createAppRequestOther: Boolean!
6
+
7
+ """
8
+ Current user may create a new app request for themselves and should be shown the Create App Request button.
9
+ """
10
+ createAppRequestSelf: Boolean!
6
11
 
7
12
  """
8
13
  Current user is permitted to create new periods in the period management UI.
@@ -14,6 +19,9 @@ type Access {
14
19
  """
15
20
  createRole: Boolean!
16
21
 
22
+ """The current user, if any."""
23
+ user: AccessUser
24
+
17
25
  """Current user is permitted to view the app request list."""
18
26
  viewAppRequestList: Boolean!
19
27
 
@@ -35,6 +43,25 @@ type AccessControl {
35
43
  name: String!
36
44
  }
37
45
 
46
+ type AccessControlGroup {
47
+ """
48
+ A list of all possible controls for this controlGroup. Use this to populate the control dropdown when creating a grant.
49
+ """
50
+ controls: [AccessControl!]!
51
+
52
+ """
53
+ A longer explanation of the control group for display in the role management interface.
54
+ """
55
+ description: String
56
+ name: String!
57
+ tags: [AccessTagCategory!]!
58
+
59
+ """
60
+ A slightly longer version of the control group's name, for display in the role management interface.
61
+ """
62
+ title: String!
63
+ }
64
+
38
65
  type AccessGrantTag {
39
66
  category: String!
40
67
  categoryLabel: String!
@@ -50,7 +77,7 @@ type AccessRole {
50
77
  """
51
78
  description: String
52
79
  grants: [AccessRoleGrant!]!
53
- groups: [String!]!
80
+ groups: [AccessRoleGroup!]!
54
81
  id: ID!
55
82
  name: String!
56
83
  scope: String
@@ -66,13 +93,13 @@ input AccessRoleFilter {
66
93
  type AccessRoleGrant {
67
94
  actions: AccessRoleGrantActions!
68
95
 
69
- "\n If true, this grant allows the action specified by the selected controls. If false, it removes\n the controls.\n\n Removing a control only happens within the context of a single role. If another role grants the\n same control, the action is allowed. This is more of an exception system than a denial\n system. So you can do something like add the \"view\" control to the \"movie\" subject type in one\n grant, and then in a second grant in the same role, remove it from \"The Princess Bride\". Now you\n have a role that grants \"view\" on all movies _except_ The Princess Bride. If the user has another role\n that grants \"view\" on The Princess Bride (or on all movies), they can view it based on that other role.\n "
96
+ "\n If true, this grant allows the action specified by the selected controls. If false, it removes\n the controls.\n\n Removing a control only happens within the context of a single role. If another role grants the\n same control, the action is allowed. This is more of an exception system than a denial\n system. So you can do something like add the \"view\" control to the \"movie\" control group in one\n grant, and then in a second grant in the same role, remove it from \"The Princess Bride\". Now you\n have a role that grants \"view\" on all movies _except_ The Princess Bride. If the user has another role\n that grants \"view\" on The Princess Bride (or on all movies), they can view it based on that other role.\n "
70
97
  allow: Boolean!
98
+
99
+ """The group this control belongs to. e.g. Reviewer - Review Phase"""
100
+ controlGroup: AccessControlGroup!
71
101
  controls: [String!]!
72
102
  id: ID!
73
-
74
- """The type of subject this grant applies to, e.g. "movie"."""
75
- subjectType: AccessSubjectType!
76
103
  tags: [AccessGrantTag!]!
77
104
  }
78
105
 
@@ -83,12 +110,12 @@ type AccessRoleGrantActions {
83
110
 
84
111
  input AccessRoleGrantCreate {
85
112
  allow: Boolean!
113
+ controlGroup: String
86
114
 
87
115
  """
88
- A list of controls that are allowed or denied by this grant. Each subjectType has a list of available controls, available under Query.subjectTypes.
116
+ A list of controls that are allowed or denied by this grant. Each controlGroup has a list of available controls, available under Query.controlGroups.
89
117
  """
90
118
  controls: [String!]
91
- subjectType: String
92
119
 
93
120
  """
94
121
  A list of tags to restrict a grant. For instance, if this is added to a grant on PromptAnswer-update, each tag refers to a subset of App Requests.
@@ -98,12 +125,12 @@ input AccessRoleGrantCreate {
98
125
 
99
126
  input AccessRoleGrantUpdate {
100
127
  allow: Boolean!
128
+ controlGroup: String
101
129
 
102
130
  """
103
- A list of controls that are allowed or denied by this grant. Each subjectType has a list of available controls, available under Query.subjectTypes.
131
+ A list of controls that are allowed or denied by this grant. Each controlGroup has a list of available controls, available under Query.controlGroups.
104
132
  """
105
133
  controls: [String!]
106
- subjectType: String
107
134
 
108
135
  """
109
136
  A list of tags to restrict a grant. For instance, if this is added to a grant on PromptAnswer-update, each tag refers to a subset of App Requests.
@@ -111,6 +138,25 @@ input AccessRoleGrantUpdate {
111
138
  tags: [AccessTagInput!]
112
139
  }
113
140
 
141
+ type AccessRoleGroup {
142
+ """The date the group was added to a role."""
143
+ dateAdded: DateTime!
144
+ dateCreated: DateTime!
145
+
146
+ """The name of the group. This should be unique even among all roleIds."""
147
+ groupName: String!
148
+ managers: [AccessRoleGroupManager!]!
149
+ roleId: ID!
150
+ }
151
+
152
+ type AccessRoleGroupManager {
153
+ """The date the group was added to a role."""
154
+ email: String
155
+
156
+ """The date the group was added to a role."""
157
+ fullname: String!
158
+ }
159
+
114
160
  input AccessRoleInput {
115
161
  """
116
162
  A description of the role. This is not used for anything, but can be useful for admins to understand what the role is trying to do.
@@ -135,25 +181,6 @@ type AccessRoleValidatedResponse {
135
181
  success: Boolean!
136
182
  }
137
183
 
138
- type AccessSubjectType {
139
- """
140
- A list of all possible controls for this subjectType. Use this to populate the control dropdown when creating a grant.
141
- """
142
- controls: [AccessControl!]!
143
-
144
- """
145
- A longer explanation of the subject type for display in the role management interface.
146
- """
147
- description: String
148
- name: String!
149
- tags: [AccessTagCategory!]!
150
-
151
- """
152
- A slightly longer version of the subject type's name, for display in the role management interface.
153
- """
154
- title: String!
155
- }
156
-
157
184
  type AccessTag {
158
185
  label: String!
159
186
  value: String!
@@ -190,15 +217,36 @@ type AccessUser {
190
217
  A JSON object containing any information about the user that the implementing application wants to store. Could be useful for constructing personalized UI.
191
218
  """
192
219
  otherInfo: JsonData
193
- roles: AccessRole!
220
+ roles: [AccessRole!]!
221
+
222
+ """
223
+ True as long as the lookupUser.byLogins function still returns this user. False otherwise. Likely this user has been deactivated.
224
+ """
225
+ stillValid: Boolean!
226
+ }
227
+
228
+ """
229
+ A category and tag pair for an internal and external user related attributes. For example, [{ category: "institutionalRole", tags: ["STAFF", "STUDENT"] }, { category: "lastLogin", tags: ["2025-09-01T10:20:04"] }]
230
+ """
231
+ input AccessUserCategoryInput {
232
+ category: ID!
233
+ tags: [ID!]!
194
234
  }
195
235
 
196
236
  input AccessUserFilter {
197
237
  logins: [ID!]
198
238
 
239
+ """
240
+ One to Many categories Filter, like a institutional role people may belong to.
241
+ """
242
+ otherCategoriesByLabel: [AccessUserCategoryInput!]
243
+
199
244
  """Filter by identifiers aside from username, like an Employee ID."""
200
245
  otherIdentifiers: [String!]
201
246
  otherIdentifiersByLabel: [AccessUserIdentifierInput!]
247
+
248
+ """Filter users by associated Application Roles"""
249
+ roles: [String!]
202
250
  search: String
203
251
 
204
252
  """If true, only return the user that is currently logged in."""
@@ -239,6 +287,7 @@ type AppRequest {
239
287
  Filters to apply to the activity log. This can be used to filter by action type, date range, etc.
240
288
  """
241
289
  filters: AppRequestActivityFilters
290
+ paged: Pagination
242
291
  ): [AppRequestActivity!]!
243
292
  applicant: AccessUser!
244
293
  applications: [Application!]!
@@ -247,6 +296,7 @@ type AppRequest {
247
296
  Date that this request was considered closed and no longer editable. If active or re-opened, will be null. If closed again, will be the second closure date.
248
297
  """
249
298
  closedAt: DateTime
299
+ complete: Boolean!
250
300
  createdAt: DateTime!
251
301
 
252
302
  """
@@ -258,6 +308,11 @@ type AppRequest {
258
308
  """
259
309
  schemaVersion: String
260
310
  ): JsonData!
311
+
312
+ """
313
+ The version of the data for this app request. This is incremented every time the data is updated. If you provide it with your update requests, the API will perform an optimistic concurrency check and fail the update if someone else has updated the data in the meantime.
314
+ """
315
+ dataVersion: Int!
261
316
  id: ID!
262
317
 
263
318
  """
@@ -270,6 +325,16 @@ type AppRequest {
270
325
  for: AppRequestIndexDestination
271
326
  ): [AppRequestIndexCategory!]!
272
327
 
328
+ """
329
+ Notes attached to this app request. Notes are internal only and only visible to reviewers. They are not visible to applicants.
330
+ """
331
+ notes(filter: AppRequestNoteFilters): [Note!]!
332
+
333
+ """
334
+ Notes attached to other app requests from this same applicant. Useful for providing context information from previous applications.
335
+ """
336
+ otherNotes(filter: AppRequestNoteFilters): [Note!]!
337
+
273
338
  """The period this appRequest is associated with."""
274
339
  period: Period!
275
340
 
@@ -287,6 +352,11 @@ type AppRequest {
287
352
  }
288
353
 
289
354
  type AppRequestActions {
355
+ """
356
+ User may finalize the acceptance or denial of the offer. Sends the app request to non-blocking workflow (or completion).
357
+ """
358
+ acceptOffer: Boolean!
359
+
290
360
  """
291
361
  User may cancel this app request as the owner. Separate from closing as a reviewer/admin.
292
362
  """
@@ -297,8 +367,15 @@ type AppRequestActions {
297
367
  """
298
368
  close: Boolean!
299
369
 
300
- """User may make an offer on this app request."""
301
- offer: Boolean!
370
+ """
371
+ User may complete the app request. All non-blocking workflow must be complete.
372
+ """
373
+ completeRequest: Boolean!
374
+
375
+ """
376
+ User may complete the review app request. Sends the app request to the acceptance phase, or if there is no acceptance phase, to the non-blocking workflow or completion.
377
+ """
378
+ completeReview: Boolean!
302
379
 
303
380
  """
304
381
  User may reopen this app request, whether as the owner or as a reviewer/admin.
@@ -306,7 +383,20 @@ type AppRequestActions {
306
383
  reopen: Boolean!
307
384
 
308
385
  """User may return this app request to the applicant phase."""
309
- return: Boolean!
386
+ returnToApplicant: Boolean!
387
+
388
+ """User may return to the non-blocking workflow phase from completion."""
389
+ returnToNonBlocking: Boolean!
390
+
391
+ """
392
+ User may return the app request to the acceptance phase from non-blocking workflow or completion.
393
+ """
394
+ returnToOffer: Boolean!
395
+
396
+ """
397
+ User may return the app request to the review phase from non-blocking workflow or completion. This does not cover reclaiming an offer - see reverseOffer for that. It also does not cover returning from completion to acceptance - see returnToOffer for that.
398
+ """
399
+ returnToReview: Boolean!
310
400
 
311
401
  """Whether the user can view this app request as a reviewer."""
312
402
  review: Boolean!
@@ -373,7 +463,9 @@ input AppRequestActivityFilters {
373
463
  """
374
464
  impersonatedUsers: [ID!]
375
465
 
376
- """Return activities that were performed by one of the given logins."""
466
+ """
467
+ Return activities that were performed by one of the given logins. Also returns activities that were performed while one of the given logins was impersonating someone else.
468
+ """
377
469
  users: [ID!]
378
470
  }
379
471
 
@@ -382,15 +474,55 @@ input AppRequestFilter {
382
474
  true -> only return appRequests that are closed. false -> only return appRequests that are open. null -> return all appRequests.
383
475
  """
384
476
  closed: Boolean
477
+
478
+ """
479
+ Only return appRequests that were closed after this date. Open appRequests will be filtered out.
480
+ """
481
+ closedAfter: DateTime
482
+
483
+ """
484
+ Only return appRequests that were closed before this date. Open appRequests will be filtered out.
485
+ """
486
+ closedBefore: DateTime
487
+
488
+ """Only return appRequests that were created after this date."""
489
+ createdAfter: DateTime
490
+
491
+ """Only return appRequests that were created before this date."""
492
+ createdBefore: DateTime
385
493
  ids: [ID!]
386
494
 
495
+ """Only return appRequests that match one of the given indexes."""
496
+ indexes: [AppRequestIndexFilter!]
497
+
387
498
  """Only return appRequests that are owned by one the given logins."""
388
499
  logins: [ID!]
389
500
 
390
501
  """Only return appRequests that are owned by the current user."""
391
502
  own: Boolean
392
503
  periodIds: [ID!]
504
+
505
+ """
506
+ Search for appRequests that match this search term. This will do a prefix search across all fields that are indexed.
507
+ """
508
+ search: String
393
509
  status: [AppRequestStatus!]
510
+
511
+ """
512
+ Only return appRequests that were submitted after this date. App Requests that have not been submitted will be filtered out.
513
+ """
514
+ submittedAfter: DateTime
515
+
516
+ """
517
+ Only return appRequests that were submitted before this date. App Requests that have not been submitted will be filtered out.
518
+ """
519
+ submittedBefore: DateTime
520
+
521
+ """Only return appRequests that were updated after this date."""
522
+ updatedAfter: DateTime
523
+
524
+ """Only return appRequests that were updated before this date."""
525
+ updatedBefore: DateTime
394
526
  }
395
527
 
396
528
  """
@@ -443,6 +575,24 @@ enum AppRequestIndexDestination {
443
575
  REVIEWER_DASHBOARD
444
576
  }
445
577
 
578
+ input AppRequestIndexFilter {
579
+ category: String!
580
+ tags: [String!]!
581
+ }
582
+
583
+ input AppRequestNoteFilters {
584
+ """Filter notes to those attached to the specified application requests."""
585
+ appRequestIds: [ID!]
586
+
587
+ """
588
+ Filter notes to those attached to application requests from the specified applicants (by login name).
589
+ """
590
+ applicants: [String!]
591
+
592
+ """Filter to the specified note IDs."""
593
+ ids: [ID!]
594
+ }
595
+
446
596
  "\n The status of an appRequest. This status is computed based on the \"dbStatus\" recorded in\n the database and the status of each application.\n "
447
597
  enum AppRequestStatus {
448
598
  """
@@ -461,7 +611,7 @@ enum AppRequestStatus {
461
611
  APPROVAL
462
612
 
463
613
  """
464
- Applicant has submitted, at least one application is in an approved state, and no applications are pending.
614
+ Results have been released to the applicant, there is no acceptance phase, and at least one application was found eligible.
465
615
  """
466
616
  APPROVED
467
617
 
@@ -474,10 +624,14 @@ enum AppRequestStatus {
474
624
  Applicant has not yet submitted but ALL applications have been disqualified. Applicant may continue editing prompts until the App Request is closed.
475
625
  """
476
626
  DISQUALIFIED
627
+
628
+ """
629
+ Applicant has responded to the offer, but did not accept an offer on any application.
630
+ """
477
631
  NOT_ACCEPTED
478
632
 
479
633
  """
480
- Applicant has submitted, and ALL applications have been disqualified, no applications are pending.
634
+ Results have been released to the applicant, there is no acceptance phase, and all applications were found ineligible.
481
635
  """
482
636
  NOT_APPROVED
483
637
 
@@ -486,11 +640,21 @@ enum AppRequestStatus {
486
640
  """
487
641
  PREAPPROVAL
488
642
 
643
+ """
644
+ Applicant has been offered, satisfied all acceptance requirements and is ready to accept. This status is unreachable if the period has no ACCEPTANCE requirements.
645
+ """
646
+ READY_TO_ACCEPT
647
+
489
648
  """
490
649
  Applicant has completed all prompts and is ready to submit. At least one application is eligible to proceed.
491
650
  """
492
651
  READY_TO_SUBMIT
493
652
 
653
+ """
654
+ All applications have been reviewed and any blocking workflow stages have been completed. The application is ready for results to be released to the applicant.
655
+ """
656
+ REVIEW_COMPLETE
657
+
494
658
  """Applicant has begun the process and has not yet submitted."""
495
659
  STARTED
496
660
 
@@ -507,8 +671,31 @@ type Application {
507
671
  actions: ApplicationActions!
508
672
  id: ID!
509
673
 
674
+ """
675
+ The phase in which this application became ineligible for benefits. Useful for reporting / filtering. Null if the application is not (yet) ineligible.
676
+ """
677
+ ineligiblePhase: IneligiblePhases
678
+
510
679
  """The navigation title of the program this application is for."""
511
680
  navTitle: String!
681
+
682
+ """
683
+ The next workflow stage for this application that would be active after activating the advanceWorkflow mutation. Null if the application or current user is not allowed to advance.
684
+ """
685
+ nextWorkflowStage: PeriodWorkflowStage
686
+
687
+ """
688
+ The phase of the application. This is usually a computed field, not stored in the database.
689
+ """
690
+ phase: ApplicationPhase!
691
+
692
+ """
693
+ The previous workflow stage for this application that would be active after activating the reverseWorkflow mutation. Null if the application or current user is not allowed to reverse.
694
+ """
695
+ previousWorkflowStage: PeriodWorkflowStage
696
+
697
+ """The program key this application corresponds to."""
698
+ programKey: String!
512
699
  requirements: [ApplicationRequirement!]!
513
700
  status: ApplicationStatus!
514
701
 
@@ -519,12 +706,92 @@ type Application {
519
706
 
520
707
  """The title of the program this application is for."""
521
708
  title: String!
709
+
710
+ """
711
+ If the program has workflow, it may be divided into multiple stages of audit, each with their own requirements/prompts. This indicates which stage we are currently evaluating, or null if we are not in the workflow phase. An application with no workflow defined will never be in the workflow phase. Starts at 1.
712
+ """
713
+ workflowStage: PeriodWorkflowStage
714
+
715
+ """
716
+ All workflow stages defined for the program/period of this application, in evaluation order.
717
+ """
718
+ workflowStages: [PeriodWorkflowStage!]!
522
719
  }
523
720
 
524
721
  type ApplicationActions {
722
+ advanceWorkflow: Boolean!
723
+ reverseWorkflow: Boolean!
525
724
  viewAsReviewer: Boolean!
526
725
  }
527
726
 
727
+ "\n The phase of the application. This is usually a computed field, not stored in the database. The phase\n is computed based on the status of the appRequest and of the requirements for the program.\n "
728
+ enum ApplicationPhase {
729
+ """
730
+ The application has been reviewed and an offer has been made to the applicant. The applicant must accept the offer.
731
+ """
732
+ ACCEPTANCE
733
+
734
+ """
735
+ The applicant has submitted the application and any PREAPPROVAL requirements are passing. The application is under review.
736
+ """
737
+ APPROVAL
738
+
739
+ """
740
+ The application has been reviewed. If there was a workflow, it is complete. If there was an acceptance phase, the offer was accepted or rejected.
741
+ """
742
+ COMPLETE
743
+
744
+ """
745
+ The applicant has submitted the application, but there are automated prompts that need to be filled in before the application will appear on a reviewer's dashboard.
746
+ """
747
+ PREAPPROVAL
748
+
749
+ """
750
+ The appRequest has not finished pre-qual yet. The application doesn't properly exist yet.
751
+ """
752
+ PREQUAL
753
+
754
+ """
755
+ The applicant is filling out their portion of prompts and has not yet finished.
756
+ """
757
+ QUALIFICATION
758
+
759
+ """
760
+ No application requirements are PENDING. The application is ready for the first workflow stage, but a reviewer must manually advance the phase. This phase will be automatically skipped if there are no workflow stages configured/enabled.
761
+ """
762
+ READY_FOR_WORKFLOW
763
+
764
+ """
765
+ An offer has been made to the applicant. The acceptance requirements are no longer pending, the application is ready to be finalized.
766
+ """
767
+ READY_TO_ACCEPT
768
+
769
+ """
770
+ All non-blocking workflow stages are complete. The application is ready to be finalized.
771
+ """
772
+ READY_TO_COMPLETE
773
+
774
+ """
775
+ The applicant has filled out their portion of the prompts but has not yet submitted for review.
776
+ """
777
+ READY_TO_SUBMIT
778
+
779
+ """
780
+ The application has been reviewed and any blocking workflow stages have been completed. The application is ready for results (whether eligible or not) to be released to the applicant. A reviewer must manually advanced the phase, and will do so for the whole appRequest, not one application at a time. So the application will sit in this state until all applications are REVIEW_COMPLETE. If there is no acceptance phase (because there are no acceptance requirements), or if the application is not eligible, the makeOffer prompt will move the phase to WORKFLOW_NONBLOCKING or COMPLETE.
781
+ """
782
+ REVIEW_COMPLETE
783
+
784
+ """
785
+ The application review has been completed and now there is a workflow process to audit the review BEFORE marking the application status as eligible or ineligible. It should remain pending until the blocking workflow stages have been completed. Workflow stages that evaluate to INELIGIBLE will also make the application status INELIGIBLE. Prompts from the applicant and review phases are locked.
786
+ """
787
+ WORKFLOW_BLOCKING
788
+
789
+ """
790
+ The application has been offered and accepted and now there is a workflow process to audit the review AFTER marking the application status as eligible or ineligible. Requirements from non-blocking workflow states cannot affect the application status, but the application will not proceed to the complete phase until all workflow stages are non-PENDING.
791
+ """
792
+ WORKFLOW_NONBLOCKING
793
+ }
794
+
528
795
  """
529
796
  The specific instance of a requirement on a particular application. Stores the status of the requirement, e.g. being satisfied or not.
530
797
  """
@@ -553,11 +820,6 @@ type ApplicationRequirement {
553
820
  navTitle: String!
554
821
  prompts: [RequirementPrompt!]!
555
822
 
556
- """
557
- When true, means that the requirement has not been made moot by an earlier requirement failing. It may still need to be hidden from navigation based on evaluatedInEarlierApplication.
558
- """
559
- reachable: Boolean!
560
-
561
823
  """
562
824
  The smart title for this requirement in the app request's period. For instance, might be "Applicant must have GPA over 3.4" instead of the regular title "Applicant must meet GPA requirement". Will fall back to the regular title for any requirement that does not provide a smart title.
563
825
  """
@@ -580,76 +842,82 @@ type ApplicationRequirement {
580
842
  The type of requirement. This determines when the requirement is evaluated and who can see the requirement.
581
843
  """
582
844
  type: RequirementType!
583
- }
584
845
 
585
- "\n The status of an application. This is usually a computed field, not stored in the database. The status\n is computed based on the status of the appRequest and of the requirements for the program. If\n the appRequest is CLOSED, the status should permanently match the ApplicationStatusDB instead of being\n computed. If the appRequest is CANCELLED, all applications should be CANCELLED as well.\n "
586
- enum ApplicationStatus {
587
846
  """
588
- The application has been approved and an offer has been submitted for applicant acceptance. This status is only possible for programs with at least one ACCEPTANCE requirement.
847
+ The stage of the workflow for this requirement. Null if not part of a workflow stage
589
848
  """
590
- ACCEPTANCE
849
+ workflowStage: PeriodWorkflowStage
850
+ }
591
851
 
852
+ "\n The status of an application. This is usually a computed field, not stored in the database. The status\n is computed based on the status of the appRequest and of the requirements for the program. If\n the appRequest is CLOSED or CANCELLED, this status will remain frozen wherever it was before the\n closure / cancellation.\n "
853
+ enum ApplicationStatus {
592
854
  """
593
- The application's benefit has been accepted by the applicant. This status is only possible for programs with at least one ACCEPTANCE requirement.
855
+ An offer was made to the applicant and all ACCEPTANCE requirements are met (the applicant accepted the offer).
594
856
  """
595
857
  ACCEPTED
596
858
 
597
859
  """
598
- The application has been submitted, has passed preapproval, and is awaiting approval.
860
+ All application requirements up to and including WORKFLOW_BLOCKING requirements are resolving as MET (or NOT_APPLICABLE or WARNING). If there is an acceptance phase, the acceptance is still pending.
599
861
  """
600
- APPROVAL
862
+ ELIGIBLE
601
863
 
602
- """The application has been approved."""
603
- APPROVED
604
-
605
- "\n The appRequest (and thus the application inside it) has been cancelled by the applicant. In\n some cases, individual programs may have a requirement that the applicant agrees that they\n desire to apply. In that case the appRequest status is not CANCELLED, and neither is the application\n status. It will actually be FAILED_PREQUAL or FAILED_QUALIFICATION, and the statusReason of the\n requirement will explain that the applicant did not wish to pursue the application.\n "
606
- CANCELLED
864
+ """
865
+ At least one application requirement up to and including WORKFLOW_BLOCKING requirements is not met. The review cannot proceed, but the first or current stage of the workflow should still continue.
866
+ """
867
+ INELIGIBLE
607
868
 
608
869
  """
609
- The applicant is ineligible for the program according to the pre-qual requirements. The application/program should no longer be visible in the UI for this appRequest.
870
+ The application status has not yet been determined. Further prompts must be answered.
610
871
  """
611
- FAILED_PREQUAL
872
+ PENDING
612
873
 
613
874
  """
614
- The applicant is ineligible for the program according to the qualification requirements. The application/program should remain visible in the UI and any applicable statusReason from the associated requirements should be displayed.
875
+ An offer was made to the applicant and at least one ACCEPTANCE requirement is not met (the applicant rejected the offer).
615
876
  """
616
- FAILED_QUALIFICATION
877
+ REJECTED
878
+ }
617
879
 
880
+ type Category {
618
881
  """
619
- The application's benefit was rejected by the applicant. This status is only possible for programs with at least one ACCEPTANCE requirement.
882
+ This is indexed name of the category. Categories are indexed to allow for quick filtering of a list of items. e.g. institutionalRoles
620
883
  """
621
- NOT_ACCEPTED
884
+ category: String!
622
885
 
623
- """The application has not been approved."""
624
- NOT_APPROVED
886
+ """Displayed Label of the category. e.g. Institutional Roles"""
887
+ label: String
625
888
 
626
- """The application has been submitted and is awaiting preapproval."""
627
- PREAPPROVAL
889
+ """
890
+ IDs are the unique values that may be used to group an items. Multiple IDs may be assigned to an item. i.e. ["Staff", "Faculty", "Student"]
891
+ """
892
+ tags: [CategoryTag!]!
628
893
 
629
894
  """
630
- The appRequest has not finished pre-qualification yet. This application does not quite exist yet and probably should not appear in the UI.
895
+ Set this to true should be available as a filter in the User list view.
631
896
  """
632
- PREQUAL
897
+ useInFilters: Boolean
633
898
 
634
899
  """
635
- The application has been pre-qualified and is awaiting further input from the applicant.
900
+ Set this to true should be displayed as a column in the User list view.
636
901
  """
637
- QUALIFICATION
902
+ useInList: Boolean
903
+ }
638
904
 
905
+ type CategoryTag {
639
906
  """
640
- All requirements have been evaluated as MET or NOT_APPLICABLE. The application is ready to be submitted.
907
+ Displayed Label of the tag in the UI Filter. This value should be unique enough to be distinguishable between other tags within a category type.
641
908
  """
642
- READY_TO_SUBMIT
909
+ label: String
643
910
 
644
911
  """
645
- The appRequest (and thus the application inside it) was withdrawn after being submitted. If it is re-opened, it will re-open in submitted state.
912
+ This is the indexed name of the tagged instance within a category type and is what is stored/searched for in the database.
646
913
  """
647
- WITHDRAWN
914
+ tag: String!
648
915
  }
649
916
 
650
917
  type Configuration {
651
918
  actions: ConfigurationAccess!
652
919
  data: JsonData!
920
+ fetchedData: JsonData
653
921
 
654
922
  """The key being configured. Could be a requirement or prompt key."""
655
923
  key: String!
@@ -719,24 +987,108 @@ type IndexValue {
719
987
  value: String!
720
988
  }
721
989
 
990
+ enum IneligiblePhases {
991
+ """The application became ineligible in the acceptance phase."""
992
+ ACCEPTANCE
993
+
994
+ """The application became ineligible in the approval phase."""
995
+ APPROVAL
996
+
997
+ """The application became ineligible in the pre-approval phase."""
998
+ PREAPPROVAL
999
+
1000
+ """The application became ineligible in the pre-qualification phase."""
1001
+ PREQUAL
1002
+
1003
+ """The application became ineligible in the qualification phase."""
1004
+ QUALIFICATION
1005
+
1006
+ """The application became ineligible during blocking workflow."""
1007
+ WORKFLOW
1008
+ }
1009
+
722
1010
  """Unstructured JSON data."""
723
1011
  scalar JsonData
724
1012
 
725
1013
  type Mutation {
1014
+ """
1015
+ This is for the applicant to accept or reject the offer that was made based on their app request. The difference between accept and reject is determined by the status of the acceptance requirements. They will still "accept offer" after they answer that they do not want the offer. If there is non-blocking workflow on any applications, the first one in each will begin. Applications without non-blocking workflow will be advanced to the COMPLETE phase. If all applications are complete, the app request will be closed.
1016
+ """
1017
+ acceptOffer(appRequestId: ID!): ValidatedAppRequestResponse!
1018
+
726
1019
  """Add a note to the app request."""
727
1020
  addNote(
1021
+ """The content of the note. HTML is expected."""
728
1022
  content: String!
1023
+ ): ValidatedAppRequestResponse!
1024
+
1025
+ """
1026
+ Moves the application to the next workflow stage. If phase is READY_FOR_WORKFLOW, moves to the first or next blocking workflow stage. If on the last blocking workflow, moves to REVIEW_COMPLETE. If on the last non-blocking workflow, moves the application to COMPLETE. If all applications are COMPLETE, automatically triggers the app request close mutation.
1027
+ """
1028
+ advanceWorkflow(applicationId: ID!): ValidatedAppRequestResponse!
1029
+
1030
+ """
1031
+ Cancel or withdraw the app request, depending on its current phase. This is only available if the app request is in a cancellable state.
1032
+ """
1033
+ cancelAppRequest(
1034
+ appRequestId: ID!
729
1035
 
730
1036
  """
731
- If true, the note will be marked as internal and only visible to reviewers.
1037
+ If the user is currently viewing some of the app request details, include the dataVersion here to make the cancellation fail when the app request has been updated by another user.
732
1038
  """
733
- internal: Boolean!
1039
+ dataVersion: Int
734
1040
  ): ValidatedAppRequestResponse!
735
1041
 
736
- """Make an offer on the app request."""
737
- offerAppRequest(appRequestId: ID!): ValidatedAppRequestResponse!
1042
+ """
1043
+ Close the app request. Generally this is always available and will freeze the request/applications in their current phase/status.
1044
+ """
1045
+ closeAppRequest(appRequestId: ID!): ValidatedAppRequestResponse!
1046
+
1047
+ """
1048
+ Complete the app request. This is generally only available if request is in non-blocking workflow and all applications are complete.
1049
+ """
1050
+ completeRequest(appRequestId: ID!): ValidatedAppRequestResponse!
1051
+
1052
+ """
1053
+ Make an offer on the app request. If all applications are ineligible, or if there are no acceptance requirements, the applications will advance to the non-blocking workflow, or absent that, be marked complete.
1054
+ """
1055
+ completeReview(appRequestId: ID!): ValidatedAppRequestResponse!
1056
+
1057
+ """Create a new app request."""
1058
+ createAppRequest(login: String!, periodId: ID!, validateOnly: Boolean): ValidatedAppRequestResponse!
1059
+ createPeriod(copyPeriodId: String, period: PeriodUpdate!, validateOnly: Boolean): ValidatedPeriodResponse!
1060
+ deletePeriod(periodId: ID!): ValidatedResponse!
1061
+ markPeriodReviewed(periodId: ID!, validateOnly: Boolean): ValidatedPeriodResponse!
1062
+
1063
+ """
1064
+ Reopen the app request. This is only available if the app request is in a state that allows reopening.
1065
+ """
1066
+ reopenAppRequest(appRequestId: ID!): ValidatedAppRequestResponse!
1067
+
1068
+ """
1069
+ Return the app request to the applicant phase. This is only available if the app request is in a state that allows returning.
1070
+ """
1071
+ returnToApplicant(appRequestId: ID!): ValidatedAppRequestResponse!
1072
+
1073
+ """If request is complete, undo and return to non-blocking workflow."""
1074
+ returnToNonBlocking(appRequestId: ID!): ValidatedAppRequestResponse!
1075
+
1076
+ """
1077
+ Return the app request to the acceptance phase from non-blocking workflow or completion.
1078
+ """
1079
+ returnToOffer(appRequestId: ID!): ValidatedAppRequestResponse!
1080
+
1081
+ """
1082
+ Return the app request to the review phase from acceptance, non-blocking workflow, or completion.
1083
+ """
1084
+ returnToReview(appRequestId: ID!): ValidatedAppRequestResponse!
1085
+
1086
+ """
1087
+ Moves the application back to the previous workflow stage. If on the first blocking workflow stage, moves back to APPROVAL. If on the first non-blocking workflow, throws an error.
1088
+ """
1089
+ reverseWorkflow(applicationId: ID!): ValidatedAppRequestResponse!
738
1090
  roleAddGrant(grant: AccessRoleGrantCreate!, roleId: ID!, validateOnly: Boolean): AccessRoleValidatedResponse!
739
- roleCreate(role: AccessRoleInput!, validateOnly: Boolean): AccessRoleValidatedResponse!
1091
+ roleCreate(copyRoleId: ID, role: AccessRoleInput!, validateOnly: Boolean): AccessRoleValidatedResponse!
740
1092
  roleDelete(roleId: ID!): ValidatedResponse!
741
1093
  roleDeleteGrant(grantId: ID!): AccessRoleValidatedResponse!
742
1094
  roleUpdate(role: AccessRoleInput!, roleId: ID!, validateOnly: Boolean): AccessRoleValidatedResponse!
@@ -744,11 +1096,21 @@ type Mutation {
744
1096
 
745
1097
  """Submit the app request."""
746
1098
  submitAppRequest(appRequestId: ID!): ValidatedAppRequestResponse!
747
- updateConfiguration(data: JsonData!, key: String!, periodId: String!, validateOnly: Boolean): ValidatedConfigurationResponse!
748
- updatePeriod(id: String!, update: PeriodUpdate!, validateOnly: Boolean): ValidatedPeriodResponse!
1099
+ updateConfiguration(data: JsonData!, key: String!, periodId: ID!, validateOnly: Boolean): ValidatedConfigurationResponse!
1100
+ updatePeriod(periodId: ID!, update: PeriodUpdate!, validateOnly: Boolean): ValidatedPeriodResponse!
1101
+ updatePeriodRequirement(disabled: Boolean!, periodId: String!, requirementKey: String!): ValidatedResponse!
749
1102
 
750
1103
  """Update the data for a prompt in this app request."""
751
- updatePrompt(data: JsonData!, promptId: ID!, validateOnly: Boolean): ValidatedAppRequestResponse!
1104
+ updatePrompt(
1105
+ data: JsonData!
1106
+
1107
+ """
1108
+ The data version of the app request at the time this prompt was loaded. If provided, the API will perform an optimistic concurrency check and fail the update if someone else has updated the data in the meantime.
1109
+ """
1110
+ dataVersion: Int
1111
+ promptId: ID!
1112
+ validateOnly: Boolean
1113
+ ): ValidatedAppRequestResponse!
752
1114
  }
753
1115
 
754
1116
  type MutationMessage {
@@ -781,6 +1143,68 @@ enum MutationMessageType {
781
1143
  warning
782
1144
  }
783
1145
 
1146
+ """
1147
+ An internal note attached to an application request. Notes are always written by reviewers and never visible to applicants. "Messages" are for reviewers and applicants communicating with one another.
1148
+ """
1149
+ type Note {
1150
+ actions: NoteActions!
1151
+
1152
+ """The app request this note is attached to."""
1153
+ appRequest: AppRequest!
1154
+
1155
+ """The author of the note."""
1156
+ author: AccessUser!
1157
+
1158
+ """The content of the note in HTML."""
1159
+ content: String!
1160
+ createdAt: DateTime!
1161
+ id: ID!
1162
+ }
1163
+
1164
+ """Actions that can be performed on a note."""
1165
+ type NoteActions {
1166
+ update: Boolean!
1167
+ }
1168
+
1169
+ input Pagination {
1170
+ """The page number to retrieve. If not provided, will default to 1."""
1171
+ page: Int
1172
+ perPage: Int
1173
+ }
1174
+
1175
+ type PaginationInfoWithTotalItems {
1176
+ """
1177
+ List of indexed category data related to items within a page. Often used for filtering items.
1178
+ """
1179
+ categories: [Category!]
1180
+
1181
+ """
1182
+ The current page number, starting at 1. This is always provided - if pagination was not requested, will return 1.
1183
+ """
1184
+ currentPage: Float!
1185
+
1186
+ """
1187
+ Indicates whether requesting the next page would provide more results. Especially useful for models that cannot provide total item count for practical reasons. Note that over time, more results can appear and make this answer wrong, so in some circumstances it makes sense to request another page anyway.
1188
+ """
1189
+ hasNextPage: Boolean!
1190
+
1191
+ """
1192
+ The number of items per page. Null if pagination was not requested/forced because results per page is unlimited.
1193
+ """
1194
+ perPage: Float
1195
+
1196
+ """
1197
+ If possible, the total number of results will be provided. The API may return null if calculating the total is impractical. If pagination was not requested/forced, will equal the result count.
1198
+ """
1199
+ totalItems: Float
1200
+ }
1201
+
1202
+ type PaginationResponse {
1203
+ accessUsers: PaginationInfoWithTotalItems
1204
+ appRequests: PaginationInfoWithTotalItems
1205
+ appRequestsActivity: PaginationInfoWithTotalItems
1206
+ }
1207
+
784
1208
  type Period {
785
1209
  actions: PeriodActions!
786
1210
 
@@ -811,11 +1235,17 @@ type Period {
811
1235
  programs: [PeriodProgram!]!
812
1236
  prompts: [PeriodPrompt!]!
813
1237
  requirements: [PeriodProgramRequirement!]!
1238
+
1239
+ """
1240
+ Whether this period's configurations have been reviewed by an administrator. Newly created periods must be reviewed before they will accept new app requests, even if the open date has passed.
1241
+ """
1242
+ reviewed: Boolean!
814
1243
  }
815
1244
 
816
1245
  type PeriodActions {
1246
+ createAppRequest: Boolean!
1247
+ delete: Boolean!
817
1248
  update: Boolean!
818
- view: Boolean!
819
1249
  }
820
1250
 
821
1251
  input PeriodFilters {
@@ -839,6 +1269,9 @@ input PeriodFilters {
839
1269
  """Return periods that have any of these IDs."""
840
1270
  ids: [ID!]
841
1271
 
1272
+ """Return periods that have any of these names."""
1273
+ names: [String!]
1274
+
842
1275
  """true -> open periods. false -> closed periods. null -> all periods."""
843
1276
  openNow: Boolean
844
1277
 
@@ -858,7 +1291,6 @@ type PeriodProgram {
858
1291
  Whether the program is enabled in this period. This is set by the system administrator.
859
1292
  """
860
1293
  enabled: Boolean!
861
- group: PeriodProgramActions!
862
1294
  key: ID!
863
1295
  navTitle: String!
864
1296
  period: Period!
@@ -940,33 +1372,29 @@ input PeriodUpdate {
940
1372
  openDate: DateTime!
941
1373
  }
942
1374
 
943
- type Program {
944
- key: ID!
945
- navTitle: String!
946
- title: String!
947
- }
948
-
949
- input ProgramFilters {
950
- keys: [String!]
951
- }
952
-
953
- type ProgramGroup {
954
- key: ID!
955
-
1375
+ type PeriodWorkflowStage {
956
1376
  """
957
- A human readable title for the program group in the navigation. You may want it to be shorter than the full title. If not provided, the title will be used.
1377
+ Whether this stage is blocking. If true, the application cannot be completed and shown to the applicant until all requirements in this stage are satisfied.
958
1378
  """
959
- navTitle: String!
960
- programs(filter: ProgramFilters): [Program!]!
1379
+ blocking: Boolean!
961
1380
 
962
1381
  """
963
- A human readable title for the program group. This will be shown to users.
1382
+ Globally unique key for this workflow stage. Use lowercase snake_case, alphanumeric and underscore only.
964
1383
  """
1384
+ key: String!
1385
+
1386
+ """A human readable title for the workflow stage."""
1387
+ title: String!
1388
+ }
1389
+
1390
+ type Program {
1391
+ key: ID!
1392
+ navTitle: String!
965
1393
  title: String!
966
1394
  }
967
1395
 
968
- input ProgramGroupFilter {
969
- keys: [ID!]
1396
+ input ProgramFilters {
1397
+ keys: [String!]
970
1398
  }
971
1399
 
972
1400
  """
@@ -978,11 +1406,6 @@ enum PromptVisibility {
978
1406
  """
979
1407
  APPLICATION_DUPE
980
1408
 
981
- """
982
- The prompt is intended to be filled in by an automation, but is otherwise available to be answered. It may or may not be visible in various UIs but it is not editable in any of them.
983
- """
984
- AUTOMATION
985
-
986
1409
  """
987
1410
  This RequirementPrompt is available to be answered. It is the first appearance of this prompt in the App Request. It should be visible in both the applicant and reviewer UI.
988
1411
  """
@@ -1002,7 +1425,7 @@ enum PromptVisibility {
1002
1425
  type Query {
1003
1426
  "\n This is the global access object. Each field represents a global permission\n like the ability to view the role management interface.\n "
1004
1427
  access: Access!
1005
- accessUsers(filter: AccessUserFilter): [AccessUser!]!
1428
+ accessUsers(filter: AccessUserFilter, paged: Pagination): [AccessUser!]!
1006
1429
  appRequestIndexes(
1007
1430
  categories: [String!]
1008
1431
 
@@ -1011,9 +1434,14 @@ type Query {
1011
1434
  """
1012
1435
  for: AppRequestIndexDestination
1013
1436
  ): [IndexCategory!]!
1014
- appRequests(filter: AppRequestFilter): [AppRequest!]!
1437
+ appRequests(filter: AppRequestFilter, paged: Pagination): [AppRequest!]!
1438
+
1439
+ """
1440
+ This is where you get information about the authorization system. Each grant will be associated with one of these controlGroups, one or more controls in the group, and an optional set of tags. The tags are used to limit the scope of the grant.
1441
+ """
1442
+ controlGroups: [AccessControlGroup!]!
1443
+ pageInfo: PaginationResponse!
1015
1444
  periods(filter: PeriodFilters): [Period!]!
1016
- programGroups(filter: ProgramGroupFilter): [ProgramGroup!]!
1017
1445
  programs(filter: ProgramFilters): [Program!]!
1018
1446
  roles(filter: AccessRoleFilter): [AccessRole!]!
1019
1447
 
@@ -1021,11 +1449,6 @@ type Query {
1021
1449
  A list of all possible scopes. Scopes are used to limit users when they are accessing the system through an alternate UI or login method. For instance, if you generate an authentication token to give to a third party, it may have a scope identifying that third party and limiting their access even though they are acting as you. Roles must match the token scope in order to apply permissions.
1022
1450
  """
1023
1451
  scopes: [String!]!
1024
-
1025
- """
1026
- This is where you get information about the authorization system. Each grant will be associated with one of these subjectTypes and optionally a list of subject instances. The grant will also have a set of controls, and each control will have an optional set of tags. The tags are used to limit the scope of the grant.
1027
- """
1028
- subjectTypes: [AccessSubjectType!]!
1029
1452
  }
1030
1453
 
1031
1454
  """
@@ -1035,17 +1458,14 @@ type RequirementPrompt {
1035
1458
  """Actions that the user can take on this prompt."""
1036
1459
  actions: RequirementPromptActions!
1037
1460
 
1038
- """Whether the prompt has been answered on this request."""
1461
+ """
1462
+ Whether the prompt has been answered on this request. Note that the answer may be marked invalidated, which means that even though it has been answered, the current answer can't be used and the user needs to answer it again.
1463
+ """
1039
1464
  answered: Boolean!
1040
1465
 
1041
1466
  """The configuration data for this prompt in the app request's period."""
1042
1467
  configurationData: JsonData!
1043
1468
 
1044
- """
1045
- All the configuration data that could be relevant for this prompt. This includes its own config, and also the config data for any requirements and programs that are related to it.
1046
- """
1047
- configurationRelatedData: JsonData!
1048
-
1049
1469
  """
1050
1470
  The data that has been gathered from the user in response to this prompt. The schema is controlled by the question's implementation.
1051
1471
  """
@@ -1062,7 +1482,7 @@ type RequirementPrompt {
1062
1482
  description: String
1063
1483
 
1064
1484
  """
1065
- Any data that the API needs to provide to the UI to display the prompt properly. For instance, if the prompt text is in the database and able to be modified by admins, the UI can't hardcode the prompt text and needs it from the API. Could also be used to pull reference information from an external system, e.g. a student's course schedule, for display in the prompt dialog.
1485
+ Any data that the API needs to provide to the UI to build the prompt form properly. For instance, it could pull reference information from an external system, e.g. a student's course schedule, for display in the prompt dialog. Null if the user is not currently allowed to update the prompt.
1066
1486
  """
1067
1487
  fetchedData(
1068
1488
  """
@@ -1070,18 +1490,33 @@ type RequirementPrompt {
1070
1490
  """
1071
1491
  schemaVersion: String
1072
1492
  ): JsonData
1493
+
1494
+ """
1495
+ Extra configuration data that is relevant for this prompt. This configuration is explicitly gathered from related requirements and prompts by the gatherConfig function in the prompt definition.
1496
+ """
1497
+ gatheredConfigData: JsonData!
1073
1498
  id: ID!
1074
1499
 
1075
1500
  """
1076
- When true, this prompt has been invalidated by the answer to another prompt. The `answered` field should remain false until the user specifically answers this prompt again, regardless of the output of the definition's `complete` method.
1501
+ When true, this prompt has been invalidated by the answer to another prompt. The `answered` field will remain true so be sure to check this field as well when determining whether the prompt is complete.
1077
1502
  """
1078
1503
  invalidated: Boolean!
1079
1504
 
1505
+ """
1506
+ If the prompt has been invalidated, this may contain a reason why. It should be displayed to the user.
1507
+ """
1508
+ invalidatedReason: String
1509
+
1080
1510
  """
1081
1511
  A human and machine readable identifier for the prompt. Will be used to match prompt data with UI and API code that handles it.
1082
1512
  """
1083
1513
  key: String!
1084
1514
 
1515
+ """
1516
+ This prompt's requirement follows a requirement that has already marked the application as ineligible. The prompt still has visibility of AVAILABLE OR REQUEST_DUPE OR APPLICATION_DUPE as normal, but should probably be shown to the user as disabled or not shown at all.
1517
+ """
1518
+ moot: Boolean!
1519
+
1085
1520
  """
1086
1521
  A human readable title for the prompt in the navigation. You probably want it to be shorter than the full title. If not provided, the title will be used.
1087
1522
  """
@@ -1170,6 +1605,11 @@ enum RequirementType {
1170
1605
  A requirement that should have a non-pending status before an application may be submitted for review. Programs with a DISQUALIFYING requirement of type APPLICATION should be visible to the submitter but visually distinct as disabled/ineligible.
1171
1606
  """
1172
1607
  QUALIFICATION
1608
+
1609
+ """
1610
+ This requirement belongs to a workflow stage. It should only be included in a workflow stage and should not appear in the standard requirementKeys array of a program.
1611
+ """
1612
+ WORKFLOW
1173
1613
  }
1174
1614
 
1175
1615
  type RoleActions {
@@ -1178,7 +1618,7 @@ type RoleActions {
1178
1618
  }
1179
1619
 
1180
1620
  type ValidatedAppRequestResponse {
1181
- appRequest: AppRequest!
1621
+ appRequest: AppRequest
1182
1622
  messages: [MutationMessage!]!
1183
1623
 
1184
1624
  """