@reqquest/ui 1.0.1 → 1.1.1

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 +670 -129
  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 +619 -134
  24. package/dist/typed-client/schema.js +87 -23
  25. package/dist/typed-client/types.js +993 -482
  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."""
@@ -230,16 +278,6 @@ Represents a group of applications all being applied for at the same time. As pa
230
278
  type AppRequest {
231
279
  """Actions the user can take on this app request."""
232
280
  actions: AppRequestActions!
233
-
234
- """
235
- The activity log for this app request. This is a list of actions taken on the app request, such as submission, updating prompts, make an offer, add a note, etc. It will be sorted by the date of the activity in descending order.
236
- """
237
- activity(
238
- """
239
- Filters to apply to the activity log. This can be used to filter by action type, date range, etc.
240
- """
241
- filters: AppRequestActivityFilters
242
- ): [AppRequestActivity!]!
243
281
  applicant: AccessUser!
244
282
  applications: [Application!]!
245
283
 
@@ -247,6 +285,7 @@ type AppRequest {
247
285
  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
286
  """
249
287
  closedAt: DateTime
288
+ complete: Boolean!
250
289
  createdAt: DateTime!
251
290
 
252
291
  """
@@ -258,6 +297,11 @@ type AppRequest {
258
297
  """
259
298
  schemaVersion: String
260
299
  ): JsonData!
300
+
301
+ """
302
+ 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.
303
+ """
304
+ dataVersion: Int!
261
305
  id: ID!
262
306
 
263
307
  """
@@ -270,6 +314,16 @@ type AppRequest {
270
314
  for: AppRequestIndexDestination
271
315
  ): [AppRequestIndexCategory!]!
272
316
 
317
+ """
318
+ Notes attached to this app request. Notes are internal only and only visible to reviewers. They are not visible to applicants.
319
+ """
320
+ notes(filter: AppRequestNoteFilters): [Note!]!
321
+
322
+ """
323
+ Notes attached to other app requests from this same applicant. Useful for providing context information from previous applications.
324
+ """
325
+ otherNotes(filter: AppRequestNoteFilters): [Note!]!
326
+
273
327
  """The period this appRequest is associated with."""
274
328
  period: Period!
275
329
 
@@ -287,6 +341,11 @@ type AppRequest {
287
341
  }
288
342
 
289
343
  type AppRequestActions {
344
+ """
345
+ User may finalize the acceptance or denial of the offer. Sends the app request to non-blocking workflow (or completion).
346
+ """
347
+ acceptOffer: Boolean!
348
+
290
349
  """
291
350
  User may cancel this app request as the owner. Separate from closing as a reviewer/admin.
292
351
  """
@@ -297,8 +356,15 @@ type AppRequestActions {
297
356
  """
298
357
  close: Boolean!
299
358
 
300
- """User may make an offer on this app request."""
301
- offer: Boolean!
359
+ """
360
+ User may complete the app request. All non-blocking workflow must be complete.
361
+ """
362
+ completeRequest: Boolean!
363
+
364
+ """
365
+ 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.
366
+ """
367
+ completeReview: Boolean!
302
368
 
303
369
  """
304
370
  User may reopen this app request, whether as the owner or as a reviewer/admin.
@@ -306,13 +372,36 @@ type AppRequestActions {
306
372
  reopen: Boolean!
307
373
 
308
374
  """User may return this app request to the applicant phase."""
309
- return: Boolean!
375
+ returnToApplicant: Boolean!
376
+
377
+ """User may return to the non-blocking workflow phase from completion."""
378
+ returnToNonBlocking: Boolean!
379
+
380
+ """
381
+ User may return the app request to the acceptance phase from non-blocking workflow or completion.
382
+ """
383
+ returnToOffer: Boolean!
384
+
385
+ """
386
+ 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.
387
+ """
388
+ returnToReview: Boolean!
310
389
 
311
390
  """Whether the user can view this app request as a reviewer."""
312
391
  review: Boolean!
313
392
 
314
393
  """User may submit this app request either as or on behalf of the owner."""
315
394
  submit: Boolean!
395
+
396
+ """
397
+ User is able to see the acceptance UI. i.e. they are the applicant and the request is in the appropriate phase.
398
+ """
399
+ viewAcceptUI: Boolean!
400
+
401
+ """
402
+ User is able to see the applicant UI. i.e. they are the applicant and the request is in the appropriate phase.
403
+ """
404
+ viewApplyUI: Boolean!
316
405
  }
317
406
 
318
407
  type AppRequestActivity {
@@ -373,7 +462,9 @@ input AppRequestActivityFilters {
373
462
  """
374
463
  impersonatedUsers: [ID!]
375
464
 
376
- """Return activities that were performed by one of the given logins."""
465
+ """
466
+ 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.
467
+ """
377
468
  users: [ID!]
378
469
  }
379
470
 
@@ -382,15 +473,55 @@ input AppRequestFilter {
382
473
  true -> only return appRequests that are closed. false -> only return appRequests that are open. null -> return all appRequests.
383
474
  """
384
475
  closed: Boolean
476
+
477
+ """
478
+ Only return appRequests that were closed after this date. Open appRequests will be filtered out.
479
+ """
480
+ closedAfter: DateTime
481
+
482
+ """
483
+ Only return appRequests that were closed before this date. Open appRequests will be filtered out.
484
+ """
485
+ closedBefore: DateTime
486
+
487
+ """Only return appRequests that were created after this date."""
488
+ createdAfter: DateTime
489
+
490
+ """Only return appRequests that were created before this date."""
491
+ createdBefore: DateTime
385
492
  ids: [ID!]
386
493
 
494
+ """Only return appRequests that match one of the given indexes."""
495
+ indexes: [AppRequestIndexFilter!]
496
+
387
497
  """Only return appRequests that are owned by one the given logins."""
388
498
  logins: [ID!]
389
499
 
390
500
  """Only return appRequests that are owned by the current user."""
391
501
  own: Boolean
392
502
  periodIds: [ID!]
503
+
504
+ """
505
+ Search for appRequests that match this search term. This will do a prefix search across all fields that are indexed.
506
+ """
507
+ search: String
393
508
  status: [AppRequestStatus!]
509
+
510
+ """
511
+ Only return appRequests that were submitted after this date. App Requests that have not been submitted will be filtered out.
512
+ """
513
+ submittedAfter: DateTime
514
+
515
+ """
516
+ Only return appRequests that were submitted before this date. App Requests that have not been submitted will be filtered out.
517
+ """
518
+ submittedBefore: DateTime
519
+
520
+ """Only return appRequests that were updated after this date."""
521
+ updatedAfter: DateTime
522
+
523
+ """Only return appRequests that were updated before this date."""
524
+ updatedBefore: DateTime
394
525
  }
395
526
 
396
527
  """
@@ -406,13 +537,23 @@ type AppRequestIndexCategory {
406
537
  If this is > 0, the index values should be shown on the applicant dashboard, sorted by this priority in descending order.
407
538
  """
408
539
  applicantDashboardPriority: Float
540
+
541
+ """
542
+ The internal category name for this index. Use this with any GraphQL filters.
543
+ """
409
544
  category: String!
545
+
546
+ """A human-friendly label for this category that can be shown in the UI."""
410
547
  categoryLabel: String!
411
548
 
412
549
  """
413
550
  If this is > 0, the index values should be shown on the list filters, sorted by this priority in descending order.
414
551
  """
415
552
  listFiltersPriority: Float
553
+
554
+ """
555
+ If true, this category has few enough values that it is reasonable to list them all in a dropdown or similar UI control. If false, the list of values is likely to get very long and it would be better to use an autofill combobox or something.
556
+ """
416
557
  listable: Boolean!
417
558
 
418
559
  """
@@ -443,6 +584,24 @@ enum AppRequestIndexDestination {
443
584
  REVIEWER_DASHBOARD
444
585
  }
445
586
 
587
+ input AppRequestIndexFilter {
588
+ category: String!
589
+ tags: [String!]!
590
+ }
591
+
592
+ input AppRequestNoteFilters {
593
+ """Filter notes to those attached to the specified application requests."""
594
+ appRequestIds: [ID!]
595
+
596
+ """
597
+ Filter notes to those attached to application requests from the specified applicants (by login name).
598
+ """
599
+ applicants: [String!]
600
+
601
+ """Filter to the specified note IDs."""
602
+ ids: [ID!]
603
+ }
604
+
446
605
  "\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
606
  enum AppRequestStatus {
448
607
  """
@@ -461,7 +620,7 @@ enum AppRequestStatus {
461
620
  APPROVAL
462
621
 
463
622
  """
464
- Applicant has submitted, at least one application is in an approved state, and no applications are pending.
623
+ Results have been released to the applicant, there is no acceptance phase, and at least one application was found eligible.
465
624
  """
466
625
  APPROVED
467
626
 
@@ -474,10 +633,14 @@ enum AppRequestStatus {
474
633
  Applicant has not yet submitted but ALL applications have been disqualified. Applicant may continue editing prompts until the App Request is closed.
475
634
  """
476
635
  DISQUALIFIED
636
+
637
+ """
638
+ Applicant has responded to the offer, but did not accept an offer on any application.
639
+ """
477
640
  NOT_ACCEPTED
478
641
 
479
642
  """
480
- Applicant has submitted, and ALL applications have been disqualified, no applications are pending.
643
+ Results have been released to the applicant, there is no acceptance phase, and all applications were found ineligible.
481
644
  """
482
645
  NOT_APPROVED
483
646
 
@@ -486,11 +649,21 @@ enum AppRequestStatus {
486
649
  """
487
650
  PREAPPROVAL
488
651
 
652
+ """
653
+ Applicant has been offered, satisfied all acceptance requirements and is ready to accept. This status is unreachable if the period has no ACCEPTANCE requirements.
654
+ """
655
+ READY_TO_ACCEPT
656
+
489
657
  """
490
658
  Applicant has completed all prompts and is ready to submit. At least one application is eligible to proceed.
491
659
  """
492
660
  READY_TO_SUBMIT
493
661
 
662
+ """
663
+ 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.
664
+ """
665
+ REVIEW_COMPLETE
666
+
494
667
  """Applicant has begun the process and has not yet submitted."""
495
668
  STARTED
496
669
 
@@ -507,8 +680,31 @@ type Application {
507
680
  actions: ApplicationActions!
508
681
  id: ID!
509
682
 
683
+ """
684
+ The phase in which this application became ineligible for benefits. Useful for reporting / filtering. Null if the application is not (yet) ineligible.
685
+ """
686
+ ineligiblePhase: IneligiblePhases
687
+
510
688
  """The navigation title of the program this application is for."""
511
689
  navTitle: String!
690
+
691
+ """
692
+ 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.
693
+ """
694
+ nextWorkflowStage: PeriodWorkflowStage
695
+
696
+ """
697
+ The phase of the application. This is usually a computed field, not stored in the database.
698
+ """
699
+ phase: ApplicationPhase!
700
+
701
+ """
702
+ 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.
703
+ """
704
+ previousWorkflowStage: PeriodWorkflowStage
705
+
706
+ """The program key this application corresponds to."""
707
+ programKey: String!
512
708
  requirements: [ApplicationRequirement!]!
513
709
  status: ApplicationStatus!
514
710
 
@@ -519,12 +715,92 @@ type Application {
519
715
 
520
716
  """The title of the program this application is for."""
521
717
  title: String!
718
+
719
+ """
720
+ 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.
721
+ """
722
+ workflowStage: PeriodWorkflowStage
723
+
724
+ """
725
+ All workflow stages defined for the program/period of this application, in evaluation order.
726
+ """
727
+ workflowStages: [PeriodWorkflowStage!]!
522
728
  }
523
729
 
524
730
  type ApplicationActions {
731
+ advanceWorkflow: Boolean!
732
+ reverseWorkflow: Boolean!
525
733
  viewAsReviewer: Boolean!
526
734
  }
527
735
 
736
+ "\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 "
737
+ enum ApplicationPhase {
738
+ """
739
+ The application has been reviewed and an offer has been made to the applicant. The applicant must accept the offer.
740
+ """
741
+ ACCEPTANCE
742
+
743
+ """
744
+ The applicant has submitted the application and any PREAPPROVAL requirements are passing. The application is under review.
745
+ """
746
+ APPROVAL
747
+
748
+ """
749
+ 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.
750
+ """
751
+ COMPLETE
752
+
753
+ """
754
+ 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.
755
+ """
756
+ PREAPPROVAL
757
+
758
+ """
759
+ The appRequest has not finished pre-qual yet. The application doesn't properly exist yet.
760
+ """
761
+ PREQUAL
762
+
763
+ """
764
+ The applicant is filling out their portion of prompts and has not yet finished.
765
+ """
766
+ QUALIFICATION
767
+
768
+ """
769
+ 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.
770
+ """
771
+ READY_FOR_WORKFLOW
772
+
773
+ """
774
+ An offer has been made to the applicant. The acceptance requirements are no longer pending, the application is ready to be finalized.
775
+ """
776
+ READY_TO_ACCEPT
777
+
778
+ """
779
+ All non-blocking workflow stages are complete. The application is ready to be finalized.
780
+ """
781
+ READY_TO_COMPLETE
782
+
783
+ """
784
+ The applicant has filled out their portion of the prompts but has not yet submitted for review.
785
+ """
786
+ READY_TO_SUBMIT
787
+
788
+ """
789
+ 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.
790
+ """
791
+ REVIEW_COMPLETE
792
+
793
+ """
794
+ 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.
795
+ """
796
+ WORKFLOW_BLOCKING
797
+
798
+ """
799
+ 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.
800
+ """
801
+ WORKFLOW_NONBLOCKING
802
+ }
803
+
528
804
  """
529
805
  The specific instance of a requirement on a particular application. Stores the status of the requirement, e.g. being satisfied or not.
530
806
  """
@@ -553,11 +829,6 @@ type ApplicationRequirement {
553
829
  navTitle: String!
554
830
  prompts: [RequirementPrompt!]!
555
831
 
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
832
  """
562
833
  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
834
  """
@@ -580,76 +851,82 @@ type ApplicationRequirement {
580
851
  The type of requirement. This determines when the requirement is evaluated and who can see the requirement.
581
852
  """
582
853
  type: RequirementType!
583
- }
584
854
 
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
855
  """
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.
856
+ The stage of the workflow for this requirement. Null if not part of a workflow stage
589
857
  """
590
- ACCEPTANCE
858
+ workflowStage: PeriodWorkflowStage
859
+ }
591
860
 
861
+ "\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 "
862
+ enum ApplicationStatus {
592
863
  """
593
- The application's benefit has been accepted by the applicant. This status is only possible for programs with at least one ACCEPTANCE requirement.
864
+ An offer was made to the applicant and all ACCEPTANCE requirements are met (the applicant accepted the offer).
594
865
  """
595
866
  ACCEPTED
596
867
 
597
868
  """
598
- The application has been submitted, has passed preapproval, and is awaiting approval.
869
+ 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
870
  """
600
- APPROVAL
871
+ ELIGIBLE
601
872
 
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
873
+ """
874
+ 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.
875
+ """
876
+ INELIGIBLE
607
877
 
608
878
  """
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.
879
+ The application status has not yet been determined. Further prompts must be answered.
610
880
  """
611
- FAILED_PREQUAL
881
+ PENDING
612
882
 
613
883
  """
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.
884
+ An offer was made to the applicant and at least one ACCEPTANCE requirement is not met (the applicant rejected the offer).
615
885
  """
616
- FAILED_QUALIFICATION
886
+ REJECTED
887
+ }
617
888
 
889
+ type Category {
618
890
  """
619
- The application's benefit was rejected by the applicant. This status is only possible for programs with at least one ACCEPTANCE requirement.
891
+ This is indexed name of the category. Categories are indexed to allow for quick filtering of a list of items. e.g. institutionalRoles
620
892
  """
621
- NOT_ACCEPTED
893
+ category: String!
622
894
 
623
- """The application has not been approved."""
624
- NOT_APPROVED
895
+ """Displayed Label of the category. e.g. Institutional Roles"""
896
+ label: String
625
897
 
626
- """The application has been submitted and is awaiting preapproval."""
627
- PREAPPROVAL
898
+ """
899
+ 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"]
900
+ """
901
+ tags: [CategoryTag!]!
628
902
 
629
903
  """
630
- The appRequest has not finished pre-qualification yet. This application does not quite exist yet and probably should not appear in the UI.
904
+ Set this to true should be available as a filter in the User list view.
631
905
  """
632
- PREQUAL
906
+ useInFilters: Boolean
633
907
 
634
908
  """
635
- The application has been pre-qualified and is awaiting further input from the applicant.
909
+ Set this to true should be displayed as a column in the User list view.
636
910
  """
637
- QUALIFICATION
911
+ useInList: Boolean
912
+ }
638
913
 
914
+ type CategoryTag {
639
915
  """
640
- All requirements have been evaluated as MET or NOT_APPLICABLE. The application is ready to be submitted.
916
+ 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
917
  """
642
- READY_TO_SUBMIT
918
+ label: String
643
919
 
644
920
  """
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.
921
+ This is the indexed name of the tagged instance within a category type and is what is stored/searched for in the database.
646
922
  """
647
- WITHDRAWN
923
+ tag: String!
648
924
  }
649
925
 
650
926
  type Configuration {
651
927
  actions: ConfigurationAccess!
652
928
  data: JsonData!
929
+ fetchedData: JsonData
653
930
 
654
931
  """The key being configured. Could be a requirement or prompt key."""
655
932
  key: String!
@@ -692,13 +969,23 @@ type IndexCategory {
692
969
  If this is > 0, the index values should be shown on the applicant dashboard, sorted by this priority in descending order.
693
970
  """
694
971
  applicantDashboardPriority: Float
972
+
973
+ """
974
+ The internal category name for this index. Use this with any GraphQL filters.
975
+ """
695
976
  category: String!
977
+
978
+ """A human-friendly label for this category that can be shown in the UI."""
696
979
  categoryLabel: String!
697
980
 
698
981
  """
699
982
  If this is > 0, the index values should be shown on the list filters, sorted by this priority in descending order.
700
983
  """
701
984
  listFiltersPriority: Float
985
+
986
+ """
987
+ If true, this category has few enough values that it is reasonable to list them all in a dropdown or similar UI control. If false, the list of values is likely to get very long and it would be better to use an autofill combobox or something.
988
+ """
702
989
  listable: Boolean!
703
990
 
704
991
  """
@@ -719,24 +1006,111 @@ type IndexValue {
719
1006
  value: String!
720
1007
  }
721
1008
 
1009
+ enum IneligiblePhases {
1010
+ """The application became ineligible in the acceptance phase."""
1011
+ ACCEPTANCE
1012
+
1013
+ """The application became ineligible in the approval phase."""
1014
+ APPROVAL
1015
+
1016
+ """The application became ineligible in the pre-approval phase."""
1017
+ PREAPPROVAL
1018
+
1019
+ """The application became ineligible in the pre-qualification phase."""
1020
+ PREQUAL
1021
+
1022
+ """The application became ineligible in the qualification phase."""
1023
+ QUALIFICATION
1024
+
1025
+ """The application became ineligible during blocking workflow."""
1026
+ WORKFLOW
1027
+ }
1028
+
722
1029
  """Unstructured JSON data."""
723
1030
  scalar JsonData
724
1031
 
725
1032
  type Mutation {
1033
+ """
1034
+ 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.
1035
+ """
1036
+ acceptOffer(appRequestId: ID!): ValidatedAppRequestResponse!
1037
+
726
1038
  """Add a note to the app request."""
727
1039
  addNote(
1040
+ """The content of the note. HTML is expected."""
728
1041
  content: String!
1042
+ ): ValidatedAppRequestResponse!
1043
+
1044
+ """
1045
+ 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.
1046
+ """
1047
+ advanceWorkflow(applicationId: ID!): ValidatedAppRequestResponse!
1048
+
1049
+ """
1050
+ Cancel or withdraw the app request, depending on its current phase. This is only available if the app request is in a cancellable state.
1051
+ """
1052
+ cancelAppRequest(
1053
+ appRequestId: ID!
729
1054
 
730
1055
  """
731
- If true, the note will be marked as internal and only visible to reviewers.
1056
+ 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
1057
  """
733
- internal: Boolean!
1058
+ dataVersion: Int
734
1059
  ): ValidatedAppRequestResponse!
735
1060
 
736
- """Make an offer on the app request."""
737
- offerAppRequest(appRequestId: ID!): ValidatedAppRequestResponse!
1061
+ """
1062
+ Close the app request. Generally this is always available and will freeze the request/applications in their current phase/status.
1063
+ """
1064
+ closeAppRequest(appRequestId: ID!): ValidatedAppRequestResponse!
1065
+
1066
+ """
1067
+ Complete the app request. This is generally only available if request is in non-blocking workflow and all applications are complete.
1068
+ """
1069
+ completeRequest(appRequestId: ID!): ValidatedAppRequestResponse!
1070
+
1071
+ """
1072
+ 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.
1073
+ """
1074
+ completeReview(appRequestId: ID!): ValidatedAppRequestResponse!
1075
+
1076
+ """Create a new app request."""
1077
+ createAppRequest(login: String!, periodId: ID!, validateOnly: Boolean): ValidatedAppRequestResponse!
1078
+ createPeriod(copyPeriodId: String, period: PeriodUpdate!, validateOnly: Boolean): ValidatedPeriodResponse!
1079
+
1080
+ """Delete an existing note."""
1081
+ deleteNote(noteId: String!): Boolean!
1082
+ deletePeriod(periodId: ID!): ValidatedResponse!
1083
+ markPeriodReviewed(periodId: ID!, validateOnly: Boolean): ValidatedPeriodResponse!
1084
+
1085
+ """
1086
+ Reopen the app request. This is only available if the app request is in a state that allows reopening.
1087
+ """
1088
+ reopenAppRequest(appRequestId: ID!): ValidatedAppRequestResponse!
1089
+
1090
+ """
1091
+ Return the app request to the applicant phase. This is only available if the app request is in a state that allows returning.
1092
+ """
1093
+ returnToApplicant(appRequestId: ID!): ValidatedAppRequestResponse!
1094
+
1095
+ """If request is complete, undo and return to non-blocking workflow."""
1096
+ returnToNonBlocking(appRequestId: ID!): ValidatedAppRequestResponse!
1097
+
1098
+ """
1099
+ Return the app request to the acceptance phase from non-blocking workflow or completion.
1100
+ """
1101
+ returnToOffer(appRequestId: ID!): ValidatedAppRequestResponse!
1102
+
1103
+ """
1104
+ Return the app request to the review phase from acceptance, non-blocking workflow, or completion.
1105
+ """
1106
+ returnToReview(appRequestId: ID!): ValidatedAppRequestResponse!
1107
+
1108
+ """
1109
+ 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.
1110
+ """
1111
+ reverseWorkflow(applicationId: ID!): ValidatedAppRequestResponse!
738
1112
  roleAddGrant(grant: AccessRoleGrantCreate!, roleId: ID!, validateOnly: Boolean): AccessRoleValidatedResponse!
739
- roleCreate(role: AccessRoleInput!, validateOnly: Boolean): AccessRoleValidatedResponse!
1113
+ roleCreate(copyRoleId: ID, role: AccessRoleInput!, validateOnly: Boolean): AccessRoleValidatedResponse!
740
1114
  roleDelete(roleId: ID!): ValidatedResponse!
741
1115
  roleDeleteGrant(grantId: ID!): AccessRoleValidatedResponse!
742
1116
  roleUpdate(role: AccessRoleInput!, roleId: ID!, validateOnly: Boolean): AccessRoleValidatedResponse!
@@ -744,11 +1118,24 @@ type Mutation {
744
1118
 
745
1119
  """Submit the app request."""
746
1120
  submitAppRequest(appRequestId: ID!): ValidatedAppRequestResponse!
747
- updateConfiguration(data: JsonData!, key: String!, periodId: String!, validateOnly: Boolean): ValidatedConfigurationResponse!
748
- updatePeriod(id: String!, update: PeriodUpdate!, validateOnly: Boolean): ValidatedPeriodResponse!
1121
+ updateConfiguration(data: JsonData!, key: String!, periodId: ID!, validateOnly: Boolean): ValidatedConfigurationResponse!
1122
+
1123
+ """Update the content of an existing note."""
1124
+ updateNote(content: String!, noteId: String!): Note!
1125
+ updatePeriod(periodId: ID!, update: PeriodUpdate!, validateOnly: Boolean): ValidatedPeriodResponse!
1126
+ updatePeriodRequirement(disabled: Boolean!, periodId: String!, requirementKey: String!): ValidatedResponse!
749
1127
 
750
1128
  """Update the data for a prompt in this app request."""
751
- updatePrompt(data: JsonData!, promptId: ID!, validateOnly: Boolean): ValidatedAppRequestResponse!
1129
+ updatePrompt(
1130
+ data: JsonData!
1131
+
1132
+ """
1133
+ 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.
1134
+ """
1135
+ dataVersion: Int
1136
+ promptId: ID!
1137
+ validateOnly: Boolean
1138
+ ): ValidatedAppRequestResponse!
752
1139
  }
753
1140
 
754
1141
  type MutationMessage {
@@ -781,6 +1168,70 @@ enum MutationMessageType {
781
1168
  warning
782
1169
  }
783
1170
 
1171
+ """
1172
+ 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.
1173
+ """
1174
+ type Note {
1175
+ actions: NoteActions!
1176
+
1177
+ """The app request this note is attached to."""
1178
+ appRequest: AppRequest!
1179
+
1180
+ """The author of the note."""
1181
+ author: AccessUser!
1182
+
1183
+ """The content of the note in HTML."""
1184
+ content: String!
1185
+ createdAt: DateTime!
1186
+ id: ID!
1187
+ updatedAt: DateTime!
1188
+ }
1189
+
1190
+ """Actions that can be performed on a note."""
1191
+ type NoteActions {
1192
+ delete: Boolean!
1193
+ update: Boolean!
1194
+ }
1195
+
1196
+ input Pagination {
1197
+ """The page number to retrieve. If not provided, will default to 1."""
1198
+ page: Int
1199
+ perPage: Int
1200
+ }
1201
+
1202
+ type PaginationInfoWithTotalItems {
1203
+ """
1204
+ List of indexed category data related to items within a page. Often used for filtering items.
1205
+ """
1206
+ categories: [Category!]
1207
+
1208
+ """
1209
+ The current page number, starting at 1. This is always provided - if pagination was not requested, will return 1.
1210
+ """
1211
+ currentPage: Float!
1212
+
1213
+ """
1214
+ 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.
1215
+ """
1216
+ hasNextPage: Boolean!
1217
+
1218
+ """
1219
+ The number of items per page. Null if pagination was not requested/forced because results per page is unlimited.
1220
+ """
1221
+ perPage: Float
1222
+
1223
+ """
1224
+ 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.
1225
+ """
1226
+ totalItems: Float
1227
+ }
1228
+
1229
+ type PaginationResponse {
1230
+ accessUsers: PaginationInfoWithTotalItems
1231
+ appRequests: PaginationInfoWithTotalItems
1232
+ appRequestsActivity: PaginationInfoWithTotalItems
1233
+ }
1234
+
784
1235
  type Period {
785
1236
  actions: PeriodActions!
786
1237
 
@@ -811,11 +1262,17 @@ type Period {
811
1262
  programs: [PeriodProgram!]!
812
1263
  prompts: [PeriodPrompt!]!
813
1264
  requirements: [PeriodProgramRequirement!]!
1265
+
1266
+ """
1267
+ 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.
1268
+ """
1269
+ reviewed: Boolean!
814
1270
  }
815
1271
 
816
1272
  type PeriodActions {
1273
+ createAppRequest: Boolean!
1274
+ delete: Boolean!
817
1275
  update: Boolean!
818
- view: Boolean!
819
1276
  }
820
1277
 
821
1278
  input PeriodFilters {
@@ -839,6 +1296,9 @@ input PeriodFilters {
839
1296
  """Return periods that have any of these IDs."""
840
1297
  ids: [ID!]
841
1298
 
1299
+ """Return periods that have any of these names."""
1300
+ names: [String!]
1301
+
842
1302
  """true -> open periods. false -> closed periods. null -> all periods."""
843
1303
  openNow: Boolean
844
1304
 
@@ -858,7 +1318,6 @@ type PeriodProgram {
858
1318
  Whether the program is enabled in this period. This is set by the system administrator.
859
1319
  """
860
1320
  enabled: Boolean!
861
- group: PeriodProgramActions!
862
1321
  key: ID!
863
1322
  navTitle: String!
864
1323
  period: Period!
@@ -940,33 +1399,29 @@ input PeriodUpdate {
940
1399
  openDate: DateTime!
941
1400
  }
942
1401
 
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
-
1402
+ type PeriodWorkflowStage {
956
1403
  """
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.
1404
+ 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
1405
  """
959
- navTitle: String!
960
- programs(filter: ProgramFilters): [Program!]!
1406
+ blocking: Boolean!
961
1407
 
962
1408
  """
963
- A human readable title for the program group. This will be shown to users.
1409
+ Globally unique key for this workflow stage. Use lowercase snake_case, alphanumeric and underscore only.
964
1410
  """
1411
+ key: String!
1412
+
1413
+ """A human readable title for the workflow stage."""
965
1414
  title: String!
966
1415
  }
967
1416
 
968
- input ProgramGroupFilter {
969
- keys: [ID!]
1417
+ type Program {
1418
+ key: ID!
1419
+ navTitle: String!
1420
+ title: String!
1421
+ }
1422
+
1423
+ input ProgramFilters {
1424
+ keys: [String!]
970
1425
  }
971
1426
 
972
1427
  """
@@ -978,11 +1433,6 @@ enum PromptVisibility {
978
1433
  """
979
1434
  APPLICATION_DUPE
980
1435
 
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
1436
  """
987
1437
  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
1438
  """
@@ -1002,7 +1452,19 @@ enum PromptVisibility {
1002
1452
  type Query {
1003
1453
  "\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
1454
  access: Access!
1005
- accessUsers(filter: AccessUserFilter): [AccessUser!]!
1455
+ accessUsers(filter: AccessUserFilter, paged: Pagination): [AccessUser!]!
1456
+
1457
+ """
1458
+ The activity log for this app request. This is a list of actions taken on the app request, such as submission, updating prompts, make an offer, add a note, etc. It will be sorted by the date of the activity in descending order.
1459
+ """
1460
+ appRequestActivity(
1461
+ """
1462
+ Filters to apply to the activity log. This can be used to filter by action type, date range, etc.
1463
+ """
1464
+ filters: AppRequestActivityFilters
1465
+ id: String!
1466
+ paged: Pagination
1467
+ ): [AppRequestActivity!]!
1006
1468
  appRequestIndexes(
1007
1469
  categories: [String!]
1008
1470
 
@@ -1011,9 +1473,14 @@ type Query {
1011
1473
  """
1012
1474
  for: AppRequestIndexDestination
1013
1475
  ): [IndexCategory!]!
1014
- appRequests(filter: AppRequestFilter): [AppRequest!]!
1476
+ appRequests(filter: AppRequestFilter, paged: Pagination): [AppRequest!]!
1477
+
1478
+ """
1479
+ 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.
1480
+ """
1481
+ controlGroups: [AccessControlGroup!]!
1482
+ pageInfo: PaginationResponse!
1015
1483
  periods(filter: PeriodFilters): [Period!]!
1016
- programGroups(filter: ProgramGroupFilter): [ProgramGroup!]!
1017
1484
  programs(filter: ProgramFilters): [Program!]!
1018
1485
  roles(filter: AccessRoleFilter): [AccessRole!]!
1019
1486
 
@@ -1021,11 +1488,12 @@ type Query {
1021
1488
  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
1489
  """
1023
1490
  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!]!
1491
+ userIndexes(
1492
+ """
1493
+ Returns indexes that are flagged to appear in this destination. Also sorts for this destination.
1494
+ """
1495
+ for: AppRequestIndexDestination
1496
+ ): [IndexCategory!]!
1029
1497
  }
1030
1498
 
1031
1499
  """
@@ -1035,17 +1503,14 @@ type RequirementPrompt {
1035
1503
  """Actions that the user can take on this prompt."""
1036
1504
  actions: RequirementPromptActions!
1037
1505
 
1038
- """Whether the prompt has been answered on this request."""
1506
+ """
1507
+ 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.
1508
+ """
1039
1509
  answered: Boolean!
1040
1510
 
1041
1511
  """The configuration data for this prompt in the app request's period."""
1042
1512
  configurationData: JsonData!
1043
1513
 
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
1514
  """
1050
1515
  The data that has been gathered from the user in response to this prompt. The schema is controlled by the question's implementation.
1051
1516
  """
@@ -1062,7 +1527,7 @@ type RequirementPrompt {
1062
1527
  description: String
1063
1528
 
1064
1529
  """
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.
1530
+ 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
1531
  """
1067
1532
  fetchedData(
1068
1533
  """
@@ -1070,18 +1535,33 @@ type RequirementPrompt {
1070
1535
  """
1071
1536
  schemaVersion: String
1072
1537
  ): JsonData
1538
+
1539
+ """
1540
+ 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.
1541
+ """
1542
+ gatheredConfigData: JsonData!
1073
1543
  id: ID!
1074
1544
 
1075
1545
  """
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.
1546
+ 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
1547
  """
1078
1548
  invalidated: Boolean!
1079
1549
 
1550
+ """
1551
+ If the prompt has been invalidated, this may contain a reason why. It should be displayed to the user.
1552
+ """
1553
+ invalidatedReason: String
1554
+
1080
1555
  """
1081
1556
  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
1557
  """
1083
1558
  key: String!
1084
1559
 
1560
+ """
1561
+ 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.
1562
+ """
1563
+ moot: Boolean!
1564
+
1085
1565
  """
1086
1566
  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
1567
  """
@@ -1170,6 +1650,11 @@ enum RequirementType {
1170
1650
  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
1651
  """
1172
1652
  QUALIFICATION
1653
+
1654
+ """
1655
+ 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.
1656
+ """
1657
+ WORKFLOW
1173
1658
  }
1174
1659
 
1175
1660
  type RoleActions {
@@ -1178,7 +1663,7 @@ type RoleActions {
1178
1663
  }
1179
1664
 
1180
1665
  type ValidatedAppRequestResponse {
1181
- appRequest: AppRequest!
1666
+ appRequest: AppRequest
1182
1667
  messages: [MutationMessage!]!
1183
1668
 
1184
1669
  """