placementt-core 1.400.1006 → 1.400.1008
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.
- package/lib/exportTransformers.js +5 -1
- package/lib/exportTransformers.js.map +1 -1
- package/lib/features/search/globalSearch.d.ts +16 -0
- package/lib/features/search/globalSearch.js +37 -5
- package/lib/features/search/globalSearch.js.map +1 -1
- package/lib/hooks.d.ts +10 -3
- package/lib/hooks.js +22 -10
- package/lib/hooks.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/tasksAndTips.js +3 -2
- package/lib/tasksAndTips.js.map +1 -1
- package/lib/typeDefinitions.d.ts +44 -4
- package/lib/util.js +1 -1
- package/lib/util.js.map +1 -1
- package/lib/workflows.d.ts +54 -0
- package/lib/workflows.js +124 -0
- package/lib/workflows.js.map +1 -0
- package/package.json +1 -1
- package/src/exportTransformers.ts +5 -2
- package/src/features/search/globalSearch.ts +41 -4
- package/src/hooks.tsx +23 -12
- package/src/index.ts +1 -0
- package/src/tasksAndTips.ts +3 -2
- package/src/typeDefinitions.ts +50 -4
- package/src/util.ts +1 -1
- package/src/workflows.ts +125 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.exportTransformers = void 0;
|
|
4
|
+
const workflows_1 = require("./workflows");
|
|
4
5
|
exports.exportTransformers = {
|
|
5
6
|
resolveCohortName: async (fetcher, value) => {
|
|
6
7
|
if (!value)
|
|
@@ -13,7 +14,10 @@ exports.exportTransformers = {
|
|
|
13
14
|
if (!cohortId)
|
|
14
15
|
return value;
|
|
15
16
|
const cohort = await fetcher.getDocData(["cohorts", cohortId]).catch(() => null);
|
|
16
|
-
|
|
17
|
+
if (!cohort?.workflowId)
|
|
18
|
+
return value;
|
|
19
|
+
const workflowConfig = await fetcher.getDocData(["workflows", cohort.workflowId]).catch(() => null);
|
|
20
|
+
return (0, workflows_1.applyWorkflowOverrides)(workflowConfig?.workflow || [], cohort.workflowOverrides).find(s => s.id === value)?.name ?? value;
|
|
17
21
|
},
|
|
18
22
|
resolveActivityTitles: async (fetcher, value) => {
|
|
19
23
|
const activityIds = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportTransformers.js","sourceRoot":"","sources":["../src/exportTransformers.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"exportTransformers.js","sourceRoot":"","sources":["../src/exportTransformers.ts"],"names":[],"mappings":";;;AACA,2CAAmD;AAStC,QAAA,kBAAkB,GAAwC;IACnE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACxC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAa,CAAC,SAAS,EAAE,KAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpG,OAAO,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC;IACjC,CAAC;IAED,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAgB,CAAC;QACvC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7F,IAAI,CAAC,MAAM,EAAE,UAAU;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,UAAU,CAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpH,OAAO,IAAA,kCAAsB,EAAC,cAAc,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC;IACrI,CAAC;IAED,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC5C,MAAM,WAAW,GAAG,KAAoC,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,MAAM;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAmB,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAC5G,CAAC;QACF,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;CACJ,CAAC"}
|
|
@@ -63,6 +63,22 @@ export type GlobalSearchIndexDefinition = {
|
|
|
63
63
|
/** Turns one raw hit into a row. */
|
|
64
64
|
toHit: (hit: any) => GlobalSearchHit;
|
|
65
65
|
};
|
|
66
|
+
/**
|
|
67
|
+
* The oIds whose employer databases this institute may read.
|
|
68
|
+
*
|
|
69
|
+
* Its own, plus every trust and every careers hub it has an approved link with —
|
|
70
|
+
* for a trust, `trustLinks` holds its member schools, so the same walk covers
|
|
71
|
+
* both directions of the relationship. Mirrors the `sources` handling in
|
|
72
|
+
* useProviderContactPaginator, which is what the Employers list itself queries.
|
|
73
|
+
*
|
|
74
|
+
* @param {UserData} user the signed-in user.
|
|
75
|
+
* @param {InstituteData} [institute] the signed-in institute.
|
|
76
|
+
* @return {{oId: string, linked: boolean}[]} scopes to search, own database first.
|
|
77
|
+
*/
|
|
78
|
+
export declare const employerSearchScopes: (user: UserData, institute?: InstituteData) => {
|
|
79
|
+
oId: string;
|
|
80
|
+
linked: boolean;
|
|
81
|
+
}[];
|
|
66
82
|
/**
|
|
67
83
|
* The indexes the navbar search covers.
|
|
68
84
|
*
|
|
@@ -14,7 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.nonEmptyGlobalSearchSections = exports.totalGlobalSearchHits = exports.globalSearch = exports.availableGlobalSearchIndexes = exports.GLOBAL_SEARCH_INDEXES = exports.GLOBAL_SEARCH_INDEX_HITS = exports.GLOBAL_SEARCH_OVERVIEW_HITS = void 0;
|
|
17
|
+
exports.nonEmptyGlobalSearchSections = exports.totalGlobalSearchHits = exports.globalSearch = exports.availableGlobalSearchIndexes = exports.GLOBAL_SEARCH_INDEXES = exports.employerSearchScopes = exports.GLOBAL_SEARCH_INDEX_HITS = exports.GLOBAL_SEARCH_OVERVIEW_HITS = void 0;
|
|
18
18
|
const algoliasearch_1 = __importDefault(require("algoliasearch"));
|
|
19
19
|
const util_1 = require("../../firebase/util");
|
|
20
20
|
const algoliaConfig_1 = require("../../algoliaConfig");
|
|
@@ -26,6 +26,33 @@ const fullName = (forename, surname) => [forename, surname].filter(Boolean).join
|
|
|
26
26
|
const joinParts = (...parts) => parts.filter(Boolean).join(" · ") || undefined;
|
|
27
27
|
/** Packages that run their own students, placements and cohorts. */
|
|
28
28
|
const isSchoolPackage = (institute) => institute?.package === "institutes-one" || institute?.package === "institutes-two";
|
|
29
|
+
/** Packages that keep an employer database of their own. */
|
|
30
|
+
const hasEmployerDatabase = (institute) => isSchoolPackage(institute) || institute?.package === "careersHub";
|
|
31
|
+
/**
|
|
32
|
+
* The oIds whose employer databases this institute may read.
|
|
33
|
+
*
|
|
34
|
+
* Its own, plus every trust and every careers hub it has an approved link with —
|
|
35
|
+
* for a trust, `trustLinks` holds its member schools, so the same walk covers
|
|
36
|
+
* both directions of the relationship. Mirrors the `sources` handling in
|
|
37
|
+
* useProviderContactPaginator, which is what the Employers list itself queries.
|
|
38
|
+
*
|
|
39
|
+
* @param {UserData} user the signed-in user.
|
|
40
|
+
* @param {InstituteData} [institute] the signed-in institute.
|
|
41
|
+
* @return {{oId: string, linked: boolean}[]} scopes to search, own database first.
|
|
42
|
+
*/
|
|
43
|
+
const employerSearchScopes = (user, institute) => {
|
|
44
|
+
const approved = (links) => Object.entries(links || {})
|
|
45
|
+
.filter(([, link]) => link?.status === "approved")
|
|
46
|
+
.map(([oId]) => oId);
|
|
47
|
+
const linked = [...approved(institute?.trustLinks), ...approved(institute?.careersHubLinks)]
|
|
48
|
+
.filter((oId) => oId !== user.oId);
|
|
49
|
+
return [
|
|
50
|
+
{ oId: user.oId, linked: false },
|
|
51
|
+
// Deduped: a school can be linked to a trust and a hub that share an oId.
|
|
52
|
+
...Array.from(new Set(linked)).map((oId) => ({ oId, linked: true })),
|
|
53
|
+
];
|
|
54
|
+
};
|
|
55
|
+
exports.employerSearchScopes = employerSearchScopes;
|
|
29
56
|
/**
|
|
30
57
|
* The indexes the navbar search covers.
|
|
31
58
|
*
|
|
@@ -54,10 +81,15 @@ exports.GLOBAL_SEARCH_INDEXES = [
|
|
|
54
81
|
label: "Employers",
|
|
55
82
|
labelSingular: "employer",
|
|
56
83
|
indexName: "providerContacts",
|
|
57
|
-
available: (institute) => Boolean(institute && institute
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
|
|
84
|
+
available: (institute) => Boolean(hasEmployerDatabase(institute) && institute?.network !== false),
|
|
85
|
+
// oIds are Firestore ids, so they go into the attribute path unquoted — the
|
|
86
|
+
// same shape algoliaProviderContactSearch already uses. Own records come
|
|
87
|
+
// through at any status; a linked trust's or hub's only once approved.
|
|
88
|
+
filters: (user, institute) => `(${(0, exports.employerSearchScopes)(user, institute)
|
|
89
|
+
.map(({ oId, linked }) => (linked ?
|
|
90
|
+
`(savedBy.${oId}.exists:true AND savedBy.${oId}.status:approved)` :
|
|
91
|
+
`savedBy.${oId}.exists:true`))
|
|
92
|
+
.join(" OR ")})`,
|
|
61
93
|
toHit: (hit) => ({
|
|
62
94
|
id: hit.objectID,
|
|
63
95
|
title: hit.name || fullName(hit.contactForename, hit.contactSurname) || "Unnamed employer",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalSearch.js","sourceRoot":"","sources":["../../../src/features/search/globalSearch.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;AAEH,kEAA0C;AAE1C,8CAA+D;AAC/D,uDAAmD;AAEnD,8EAA8E;AACjE,QAAA,2BAA2B,GAAG,CAAC,CAAC;AAE7C,8EAA8E;AACjE,QAAA,wBAAwB,GAAG,EAAE,CAAC;AAoD3C,MAAM,QAAQ,GAAG,CAAC,QAAiB,EAAE,OAAgB,EAAE,EAAE,CACrD,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAEzD,MAAM,SAAS,GAAG,CAAC,GAAG,KAAiC,EAAE,EAAE,CACvD,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;AAEnD,oEAAoE;AACpE,MAAM,eAAe,GAAG,CAAC,SAAyB,EAAE,EAAE,CAClD,SAAS,EAAE,OAAO,KAAK,gBAAgB,IAAI,SAAS,EAAE,OAAO,KAAK,gBAAgB,CAAC;AAEvF;;;;;GAKG;AACU,QAAA,qBAAqB,GAAkC;IAChE;QACI,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,aAAa,EAAE,WAAW;QAC1B,SAAS,EAAE,YAAY;QACvB,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,cAAc,CAAC;QAC1F,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAA,iCAA0B,EAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB;QAChF,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,EAAE,EAAE,GAAG,CAAC,QAAQ;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,oBAAoB;YACpD,QAAQ,EAAE,SAAS,CACf,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,EACrB,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS,EAC9D,GAAG,CAAC,QAAQ,CACf;YACD,IAAI,EAAE,GAAG,CAAC,UAAU;YACpB,IAAI,EAAE,kCAAkC,GAAG,CAAC,QAAQ,EAAE;YACtD,GAAG,EAAE,GAAG;SACX,CAAC;KACL;IACD;QACI,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,aAAa,EAAE,UAAU;QACzB,SAAS,EAAE,kBAAkB;QAC7B,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"globalSearch.js","sourceRoot":"","sources":["../../../src/features/search/globalSearch.ts"],"names":[],"mappings":"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"}
|
package/lib/hooks.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DocumentData, QueryConstraint, QueryDocumentSnapshot } from "firebase/firestore";
|
|
2
|
-
import { AlumniConvoUser, ApplicantStage, Application, ArrowObject, CohortData, CSVExportResponse, CustomFormSchema, ExternalEvent, FileItem, FilterObject, FlagCodes, InstituteData, OnboardingDocs, PlacementListing, Products, ProviderData, QueryObject, QueryObjectConstraint, Sorts, StudentPlacementData, UserData, UserGroupData, WorkflowStage } from "./typeDefinitions";
|
|
2
|
+
import { AlumniConvoUser, ApplicantStage, Application, ArrowObject, CohortData, CSVExportResponse, CustomFormSchema, ExternalEvent, FileItem, FilterObject, FlagCodes, InstituteData, OnboardingDocs, PlacementListing, Products, ProviderData, QueryObject, QueryObjectConstraint, Sorts, StudentPlacementData, UserData, UserGroupData, WorkflowConfig, WorkflowStage } from "./typeDefinitions";
|
|
3
3
|
type StudentPlacementListParams = {
|
|
4
4
|
user: UserData;
|
|
5
5
|
student?: UserData;
|
|
@@ -413,7 +413,9 @@ export declare function useUserUploadHandler({ product, oId, event, eventId, use
|
|
|
413
413
|
parentEmail?: string;
|
|
414
414
|
year: number;
|
|
415
415
|
[key: string]: unknown;
|
|
416
|
-
}[]
|
|
416
|
+
}[], options?: {
|
|
417
|
+
activateImmediately?: boolean;
|
|
418
|
+
}) => Promise<void>;
|
|
417
419
|
alert: {
|
|
418
420
|
severity: "warning" | "error" | "success" | "info";
|
|
419
421
|
msg: string;
|
|
@@ -542,12 +544,14 @@ export type InstituteProviderContactUpload = {
|
|
|
542
544
|
};
|
|
543
545
|
};
|
|
544
546
|
export declare function useInstituteProviderContactsHandler({ user, addToEvent }: InstituteProviderContactUploadParams): {
|
|
545
|
-
uploadProviderContacts: ({ providers, schoolId, template, skipInvites }: {
|
|
547
|
+
uploadProviderContacts: ({ providers, schoolId, template, skipInvites, validated }: {
|
|
546
548
|
providers: InstituteProviderContactUpload[];
|
|
547
549
|
schoolId?: string;
|
|
548
550
|
template?: string;
|
|
549
551
|
skipInvites?: boolean;
|
|
552
|
+
validated?: boolean;
|
|
550
553
|
}) => Promise<boolean | string[]>;
|
|
554
|
+
checkData: (providerContacts: InstituteProviderContactUpload[]) => false | InstituteProviderContactUpload[];
|
|
551
555
|
alert: {
|
|
552
556
|
severity: "warning" | "error" | "success" | "info";
|
|
553
557
|
msg: string;
|
|
@@ -570,6 +574,9 @@ export declare function useGetIndividualPlacementForPlacementPage({ user, placem
|
|
|
570
574
|
cohorts: {
|
|
571
575
|
[key: string]: CohortData;
|
|
572
576
|
};
|
|
577
|
+
workflows?: {
|
|
578
|
+
[key: string]: WorkflowConfig;
|
|
579
|
+
};
|
|
573
580
|
};
|
|
574
581
|
}): {
|
|
575
582
|
placement: StudentPlacementData | undefined;
|
package/lib/hooks.js
CHANGED
|
@@ -42,6 +42,7 @@ const writeDatabase_1 = require("./firebase/writeDatabase");
|
|
|
42
42
|
const algoliasearch_1 = __importDefault(require("algoliasearch"));
|
|
43
43
|
const storage_1 = require("firebase/storage");
|
|
44
44
|
const util_2 = require("./util");
|
|
45
|
+
const workflows_1 = require("./workflows");
|
|
45
46
|
const algoliaConfig_1 = require("./algoliaConfig");
|
|
46
47
|
const DEFAULTQUERYLIMIT = 5;
|
|
47
48
|
function useStudentPlacementList({ user, student, queryConstraint, ql = DEFAULTQUERYLIMIT }) {
|
|
@@ -2172,7 +2173,6 @@ const defaultCohortData = {
|
|
|
2172
2173
|
startPlacements: "",
|
|
2173
2174
|
endPlacements: "",
|
|
2174
2175
|
placementType: "defined",
|
|
2175
|
-
workflow: [],
|
|
2176
2176
|
oId: "",
|
|
2177
2177
|
product: "providers",
|
|
2178
2178
|
feedback: {
|
|
@@ -2301,7 +2301,9 @@ function useUserUploadHandler({ product, oId, event, eventId, userType, user, on
|
|
|
2301
2301
|
}
|
|
2302
2302
|
return true;
|
|
2303
2303
|
};
|
|
2304
|
-
|
|
2304
|
+
// activateImmediately can be set per submission (e.g. the "Add and activate"
|
|
2305
|
+
// button on staff uploads) as well as for the whole hook.
|
|
2306
|
+
const uploadUsers = async (users, options) => {
|
|
2305
2307
|
let fUsers = [];
|
|
2306
2308
|
const cleanUpload = checkData(users);
|
|
2307
2309
|
if (!cleanUpload) {
|
|
@@ -2311,7 +2313,7 @@ function useUserUploadHandler({ product, oId, event, eventId, userType, user, on
|
|
|
2311
2313
|
setAlert(undefined);
|
|
2312
2314
|
if (fUsers.length) {
|
|
2313
2315
|
console.log("fUsers", fUsers);
|
|
2314
|
-
const jobId = await execute(userType === "eventStudents" ? "events-addStudents" : "userManagement-addUsers", { product: product, oId: oId, event: event, eventId: eventId, users: fUsers, userType: userType, userGroupId: userGroupId, cohortId: cohortId, activateImmediately, parentEmailTemplate });
|
|
2316
|
+
const jobId = await execute(userType === "eventStudents" ? "events-addStudents" : "userManagement-addUsers", { product: product, oId: oId, event: event, eventId: eventId, users: fUsers, userType: userType, userGroupId: userGroupId, cohortId: cohortId, activateImmediately: options?.activateImmediately ?? activateImmediately, parentEmailTemplate });
|
|
2315
2317
|
onComplete && onComplete(jobId.jobId);
|
|
2316
2318
|
}
|
|
2317
2319
|
console.log("Complete", onComplete);
|
|
@@ -2917,10 +2919,13 @@ function useInstituteProviderContactsHandler({ user, addToEvent }) {
|
|
|
2917
2919
|
}
|
|
2918
2920
|
return true;
|
|
2919
2921
|
};
|
|
2920
|
-
|
|
2922
|
+
// `validated` is for multi-step flows that ran checkData when the user left
|
|
2923
|
+
// the spreadsheet step. Re-checking here would surface the empty-cell
|
|
2924
|
+
// warning a second time, on a step where the data isn't editable.
|
|
2925
|
+
const uploadProviderContacts = async ({ providers, schoolId, template, skipInvites = false, validated = false }) => {
|
|
2921
2926
|
let fProviders = [];
|
|
2922
2927
|
console.log("PP", providers);
|
|
2923
|
-
const cleanUpload = checkData(providers);
|
|
2928
|
+
const cleanUpload = validated ? providers : checkData(providers);
|
|
2924
2929
|
if (!cleanUpload) {
|
|
2925
2930
|
return false;
|
|
2926
2931
|
}
|
|
@@ -2939,7 +2944,7 @@ function useInstituteProviderContactsHandler({ user, addToEvent }) {
|
|
|
2939
2944
|
setAlert(undefined);
|
|
2940
2945
|
setEmptyCellsWarning(false);
|
|
2941
2946
|
};
|
|
2942
|
-
return ({ ...{ uploadProviderContacts, alert, onChange } });
|
|
2947
|
+
return ({ ...{ uploadProviderContacts, checkData, alert, onChange } });
|
|
2943
2948
|
}
|
|
2944
2949
|
async function getIndividualPlacementForTaskList({ type, placement }) {
|
|
2945
2950
|
const newPlacementData = { ...placement };
|
|
@@ -3014,12 +3019,19 @@ function useGetIndividualPlacementForPlacementPage({ user, placementId, organisa
|
|
|
3014
3019
|
}
|
|
3015
3020
|
if (placement.cohort) {
|
|
3016
3021
|
if (user.product === "institutes" && user.oId === placement.oId) {
|
|
3017
|
-
|
|
3018
|
-
|
|
3022
|
+
const cohortData = organisation?.cohorts[placement.cohort];
|
|
3023
|
+
setCohort(cohortData);
|
|
3024
|
+
// Workflows live in their own collection - resolve from context when loaded, else fetch.
|
|
3025
|
+
if (organisation?.workflows) {
|
|
3026
|
+
setWorkflow((0, workflows_1.resolveCohortWorkflow)(cohortData, organisation.workflows));
|
|
3027
|
+
}
|
|
3028
|
+
else {
|
|
3029
|
+
(0, workflows_1.fetchCohortWorkflow)(cohortData, firebaseQuery).then(setWorkflow);
|
|
3030
|
+
}
|
|
3019
3031
|
}
|
|
3020
3032
|
else {
|
|
3021
|
-
firebaseQuery.getDocData(["cohorts", placement.cohort]).then((w) => {
|
|
3022
|
-
setWorkflow(
|
|
3033
|
+
firebaseQuery.getDocData(["cohorts", placement.cohort]).then(async (w) => {
|
|
3034
|
+
setWorkflow(await (0, workflows_1.fetchCohortWorkflow)(w, firebaseQuery));
|
|
3023
3035
|
setCohort(w);
|
|
3024
3036
|
});
|
|
3025
3037
|
}
|