@powerhousedao/network-admin 0.0.28 → 0.0.30

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 (74) hide show
  1. package/dist/document-models/index.d.ts.map +1 -1
  2. package/dist/document-models/request-for-proposals/gen/document-model.js +36 -36
  3. package/dist/document-models/request-for-proposals/gen/object.d.ts.map +1 -1
  4. package/dist/document-models/request-for-proposals/gen/object.js +1 -1
  5. package/dist/document-models/request-for-proposals/gen/ph-factories.js +1 -1
  6. package/dist/document-models/request-for-proposals/gen/utils.js +3 -3
  7. package/dist/document-models/request-for-proposals/src/reducers/rfp-state.d.ts.map +1 -1
  8. package/dist/document-models/request-for-proposals/src/reducers/rfp-state.js +7 -5
  9. package/dist/document-models/workstream/gen/document-model.d.ts.map +1 -1
  10. package/dist/document-models/workstream/gen/document-model.js +52 -52
  11. package/dist/document-models/workstream/gen/object.d.ts.map +1 -1
  12. package/dist/document-models/workstream/gen/object.js +1 -1
  13. package/dist/document-models/workstream/gen/schema/types.d.ts +1 -1
  14. package/dist/document-models/workstream/gen/schema/types.d.ts.map +1 -1
  15. package/dist/document-models/workstream/gen/utils.js +2 -2
  16. package/dist/editors/index.d.ts.map +1 -1
  17. package/dist/editors/network-admin/components/DriveExplorer.d.ts.map +1 -1
  18. package/dist/editors/network-admin/components/DriveExplorer.js +23 -5
  19. package/dist/editors/network-profile/editor.js +1 -1
  20. package/dist/editors/request-for-proposals/editor.d.ts.map +1 -1
  21. package/dist/editors/request-for-proposals/editor.js +61 -13
  22. package/dist/editors/workstream/editor.d.ts.map +1 -1
  23. package/dist/editors/workstream/editor.js +167 -13
  24. package/dist/powerhouse.manifest.json +8 -1
  25. package/dist/processors/factory.d.ts +8 -0
  26. package/dist/processors/factory.d.ts.map +1 -0
  27. package/dist/processors/factory.js +22 -0
  28. package/dist/processors/index.d.ts +3 -0
  29. package/dist/processors/index.d.ts.map +1 -1
  30. package/dist/processors/index.js +3 -1
  31. package/dist/processors/workstreams/factory.d.ts +4 -0
  32. package/dist/processors/workstreams/factory.d.ts.map +1 -0
  33. package/dist/processors/workstreams/factory.js +22 -0
  34. package/dist/processors/workstreams/index.d.ts +14 -0
  35. package/dist/processors/workstreams/index.d.ts.map +1 -0
  36. package/dist/processors/workstreams/index.js +196 -0
  37. package/dist/processors/workstreams/migrations.d.ts +4 -0
  38. package/dist/processors/workstreams/migrations.d.ts.map +1 -0
  39. package/dist/processors/workstreams/migrations.js +40 -0
  40. package/dist/processors/workstreams/schema.d.ts +19 -0
  41. package/dist/processors/workstreams/schema.d.ts.map +1 -0
  42. package/dist/processors/workstreams/schema.js +1 -0
  43. package/dist/scripts/sow-mirror/mirror_sow_state.d.ts +3 -0
  44. package/dist/scripts/sow-mirror/mirror_sow_state.d.ts.map +1 -0
  45. package/dist/scripts/sow-mirror/mirror_sow_state.js +441 -0
  46. package/dist/style.css +134 -1
  47. package/dist/subgraphs/index.d.ts +2 -0
  48. package/dist/subgraphs/index.d.ts.map +1 -1
  49. package/dist/subgraphs/index.js +2 -0
  50. package/dist/subgraphs/networks/index.d.ts +11 -0
  51. package/dist/subgraphs/networks/index.d.ts.map +1 -0
  52. package/dist/subgraphs/networks/index.js +11 -0
  53. package/dist/subgraphs/networks/resolvers.d.ts +3 -0
  54. package/dist/subgraphs/networks/resolvers.d.ts.map +1 -0
  55. package/dist/subgraphs/networks/resolvers.js +41 -0
  56. package/dist/subgraphs/networks/schema.d.ts +3 -0
  57. package/dist/subgraphs/networks/schema.d.ts.map +1 -0
  58. package/dist/subgraphs/networks/schema.js +39 -0
  59. package/dist/subgraphs/request-for-proposals/index.d.ts.map +1 -1
  60. package/dist/subgraphs/workstream/index.d.ts.map +1 -1
  61. package/dist/subgraphs/workstream/schema.js +1 -1
  62. package/dist/subgraphs/workstreams/index.d.ts +11 -0
  63. package/dist/subgraphs/workstreams/index.d.ts.map +1 -0
  64. package/dist/subgraphs/workstreams/index.js +11 -0
  65. package/dist/subgraphs/workstreams/resolvers.d.ts +3 -0
  66. package/dist/subgraphs/workstreams/resolvers.d.ts.map +1 -0
  67. package/dist/subgraphs/workstreams/resolvers.js +377 -0
  68. package/dist/subgraphs/workstreams/schema.d.ts +3 -0
  69. package/dist/subgraphs/workstreams/schema.d.ts.map +1 -0
  70. package/dist/subgraphs/workstreams/schema.js +326 -0
  71. package/package.json +3 -2
  72. package/dist/editors/hooks/useBuilderProfileDocument.d.ts +0 -3
  73. package/dist/editors/hooks/useBuilderProfileDocument.d.ts.map +0 -1
  74. package/dist/editors/hooks/useBuilderProfileDocument.js +0 -8
@@ -0,0 +1,377 @@
1
+ import { WorkstreamsProcessor } from "../../processors/workstreams/index.js";
2
+ export const getResolvers = (subgraph) => {
3
+ const reactor = subgraph.reactor;
4
+ const db = subgraph.relationalDb;
5
+ const deriveSlug = (name) => name.toLowerCase().trim().split(/\s+/).join("-");
6
+ const getCandidateDrives = async () => {
7
+ try {
8
+ const drives = await reactor.getDrives?.();
9
+ if (Array.isArray(drives) && drives.length > 0)
10
+ return drives;
11
+ }
12
+ catch { }
13
+ return [];
14
+ };
15
+ const loadLinkedDocument = async (id) => {
16
+ if (!id)
17
+ return null;
18
+ try {
19
+ const linked = await reactor.getDocument(id);
20
+ return { id, stateJSON: linked.state.global };
21
+ }
22
+ catch {
23
+ return { id, stateJSON: null };
24
+ }
25
+ };
26
+ const loadRfpDetails = async (rfpRef) => {
27
+ if (!rfpRef?.id) {
28
+ return null;
29
+ }
30
+ try {
31
+ const rfpDoc = await reactor.getDocument(rfpRef.id);
32
+ const rfpState = rfpDoc.state.global;
33
+ return {
34
+ id: rfpRef.id,
35
+ code: rfpState?.code ?? null,
36
+ title: rfpRef.title ?? rfpState?.title ?? null,
37
+ status: rfpState?.status ?? null,
38
+ summary: rfpState?.summary ?? null,
39
+ submissionDeadline: rfpState?.deadline ?? null,
40
+ budgetMin: rfpState?.budgetRange?.min ?? null,
41
+ budgetMax: rfpState?.budgetRange?.max ?? null,
42
+ budgetCurrency: rfpState?.budgetRange?.currency ?? null,
43
+ eligibilityCriteria: rfpState?.eligibilityCriteria ?? null,
44
+ evaluationCriteria: rfpState?.evaluationCriteria ?? null,
45
+ briefing: rfpState?.briefing ?? null,
46
+ };
47
+ }
48
+ catch {
49
+ return {
50
+ id: rfpRef.id,
51
+ code: null,
52
+ title: rfpRef.title ?? null,
53
+ status: null,
54
+ summary: null,
55
+ submissionDeadline: null,
56
+ budgetMin: null,
57
+ budgetMax: null,
58
+ budgetCurrency: null,
59
+ eligibilityCriteria: null,
60
+ evaluationCriteria: null,
61
+ briefing: null,
62
+ };
63
+ }
64
+ };
65
+ const hydrateWorkstreamRow = async (row) => {
66
+ try {
67
+ const doc = await reactor.getDocument(row.workstream_phid);
68
+ const state = doc.state.global;
69
+ const initialProposalBase = state.initialProposal
70
+ ? {
71
+ id: state.initialProposal.id,
72
+ status: state.initialProposal.status,
73
+ author: state.initialProposal.author,
74
+ }
75
+ : null;
76
+ const alternativeProposalsBase = (state.alternativeProposals || []).map((p) => ({
77
+ id: p.id,
78
+ status: p.status,
79
+ author: p.author,
80
+ }));
81
+ const [topSowDoc, topPaymentTermsDoc, initialSowDoc, initialPaymentTermsDoc, altSowDocs, altPaymentDocs, rfpDetails,] = await Promise.all([
82
+ loadLinkedDocument(state.sow || row.sow_phid || null),
83
+ loadLinkedDocument(state.paymentTerms || null),
84
+ loadLinkedDocument(state.initialProposal?.sow || row.sow_phid || null),
85
+ loadLinkedDocument(state.initialProposal?.paymentTerms || null),
86
+ Promise.all((state.alternativeProposals || []).map((p) => loadLinkedDocument(p.sow || null))),
87
+ Promise.all((state.alternativeProposals || []).map((p) => loadLinkedDocument(p.paymentTerms || null))),
88
+ loadRfpDetails(state.rfp || null),
89
+ ]);
90
+ const client = state.client ??
91
+ (row.network_phid
92
+ ? { id: row.network_phid, name: row.network_slug, icon: null }
93
+ : null);
94
+ return {
95
+ code: state.code || null,
96
+ title: state.title || row.workstream_title || null,
97
+ status: state.status || row.workstream_status || null,
98
+ client,
99
+ rfp: rfpDetails,
100
+ initialProposal: initialProposalBase
101
+ ? {
102
+ ...initialProposalBase,
103
+ sow: initialSowDoc?.stateJSON || null,
104
+ paymentTerms: initialPaymentTermsDoc?.stateJSON || null,
105
+ }
106
+ : null,
107
+ alternativeProposals: alternativeProposalsBase.map((proposal, index) => ({
108
+ ...proposal,
109
+ sow: altSowDocs[index]?.stateJSON || null,
110
+ paymentTerms: altPaymentDocs[index]?.stateJSON || null,
111
+ })),
112
+ sow: topSowDoc?.stateJSON || null,
113
+ paymentTerms: topPaymentTermsDoc?.stateJSON || null,
114
+ paymentRequests: state.paymentRequests || [],
115
+ };
116
+ }
117
+ catch {
118
+ return {
119
+ code: row.workstream_title || null,
120
+ title: row.workstream_title || null,
121
+ status: row.workstream_status || null,
122
+ client: row.network_phid
123
+ ? { id: row.network_phid, name: row.network_slug, icon: null }
124
+ : null,
125
+ rfp: null,
126
+ initialProposal: null,
127
+ alternativeProposals: [],
128
+ sow: null,
129
+ paymentTerms: null,
130
+ paymentRequests: [],
131
+ };
132
+ }
133
+ };
134
+ const applyWorkstreamFilters = (qb, filters, wantedSlug) => {
135
+ if (filters.workstreamId) {
136
+ qb = qb.where("workstream_phid", "=", filters.workstreamId);
137
+ }
138
+ else if (filters.workstreamSlug) {
139
+ qb = qb.where("workstream_slug", "=", filters.workstreamSlug);
140
+ }
141
+ if (filters.networkId) {
142
+ qb = qb.where("network_phid", "=", filters.networkId);
143
+ }
144
+ else if (filters.networkSlug) {
145
+ qb = qb.where("network_slug", "=", filters.networkSlug);
146
+ }
147
+ else if (filters.networkName && wantedSlug) {
148
+ qb = qb.where("network_slug", "=", wantedSlug);
149
+ }
150
+ const statuses = (filters.workstreamStatuses || []).filter((status) => Boolean(status));
151
+ if (statuses.length > 0) {
152
+ qb = qb.where("workstream_status", "in", statuses);
153
+ }
154
+ else if (filters.workstreamStatus) {
155
+ qb = qb.where("workstream_status", "=", filters.workstreamStatus);
156
+ }
157
+ return qb;
158
+ };
159
+ const applyScopeOfWorkFilters = (qb, filters, wantedSlug) => {
160
+ if (filters.workstreamId) {
161
+ qb = qb.where("workstream_phid", "=", filters.workstreamId);
162
+ }
163
+ else if (filters.workstreamSlug) {
164
+ qb = qb.where("workstream_slug", "=", filters.workstreamSlug);
165
+ }
166
+ if (filters.networkId) {
167
+ qb = qb.where("network_phid", "=", filters.networkId);
168
+ }
169
+ else if (filters.networkSlug) {
170
+ qb = qb.where("network_slug", "=", filters.networkSlug);
171
+ }
172
+ else if (filters.networkName && wantedSlug) {
173
+ qb = qb.where("network_slug", "=", wantedSlug);
174
+ }
175
+ if (filters.workstreamStatus) {
176
+ qb = qb.where("workstream_status", "=", filters.workstreamStatus);
177
+ }
178
+ return qb;
179
+ };
180
+ return {
181
+ Query: {
182
+ processorWorkstreams: async (parent, args) => {
183
+ const drives = await getCandidateDrives();
184
+ const allProcessorWorkstreams = await Promise.all(drives.map(async (driveId) => {
185
+ return WorkstreamsProcessor.query(driveId, db)
186
+ .selectFrom("workstreams")
187
+ .selectAll()
188
+ .execute();
189
+ }));
190
+ // Flatten the array of arrays into a single array
191
+ const flattenedWorkstreams = allProcessorWorkstreams.flat();
192
+ return flattenedWorkstreams.map((workstream) => ({
193
+ network_phid: workstream.network_phid,
194
+ network_slug: workstream.network_slug,
195
+ workstream_phid: workstream.workstream_phid,
196
+ workstream_slug: workstream.workstream_slug,
197
+ workstream_title: workstream.workstream_title,
198
+ workstream_status: workstream.workstream_status,
199
+ sow_phid: workstream.sow_phid,
200
+ roadmap_oid: workstream.roadmap_oid,
201
+ final_milestone_target: workstream.final_milestone_target,
202
+ initial_proposal_status: workstream.initial_proposal_status,
203
+ initial_proposal_author: workstream.initial_proposal_author,
204
+ }));
205
+ },
206
+ workstream: async (parent, args) => {
207
+ const filters = args.filter || {};
208
+ const candidateDrives = await getCandidateDrives();
209
+ const wantedSlug = filters.networkSlug ||
210
+ (filters.networkName ? deriveSlug(filters.networkName) : undefined);
211
+ let resolved = null;
212
+ for (const driveId of candidateDrives) {
213
+ let qb = WorkstreamsProcessor.query(driveId, db)
214
+ .selectFrom("workstreams")
215
+ .selectAll();
216
+ qb = applyWorkstreamFilters(qb, filters, wantedSlug);
217
+ const row = await qb.executeTakeFirst();
218
+ if (!row)
219
+ continue;
220
+ resolved = await hydrateWorkstreamRow(row);
221
+ break;
222
+ }
223
+ return resolved;
224
+ },
225
+ workstreams: async (parent, args) => {
226
+ const filters = args.filter || {};
227
+ const candidateDrives = await getCandidateDrives();
228
+ // Check if any filters are provided
229
+ const hasFilters = filters.networkId ||
230
+ filters.networkSlug ||
231
+ filters.networkName ||
232
+ filters.workstreamStatus ||
233
+ (filters.workstreamStatuses &&
234
+ filters.workstreamStatuses.length > 0);
235
+ const wantedSlug = filters.networkSlug ||
236
+ (filters.networkName ? deriveSlug(filters.networkName) : undefined);
237
+ const results = [];
238
+ for (const driveId of candidateDrives) {
239
+ let qb = WorkstreamsProcessor.query(driveId, db)
240
+ .selectFrom("workstreams")
241
+ .selectAll();
242
+ // Only apply filters if any are provided
243
+ if (hasFilters) {
244
+ const filterArgs = {
245
+ networkId: filters.networkId,
246
+ networkSlug: filters.networkSlug,
247
+ networkName: filters.networkName,
248
+ workstreamStatus: filters.workstreamStatus,
249
+ workstreamStatuses: filters.workstreamStatuses,
250
+ };
251
+ qb = applyWorkstreamFilters(qb, filterArgs, wantedSlug);
252
+ }
253
+ const rows = await qb.execute();
254
+ if (rows.length === 0) {
255
+ continue;
256
+ }
257
+ for (const row of rows) {
258
+ const hydrated = await hydrateWorkstreamRow(row);
259
+ results.push(hydrated);
260
+ }
261
+ }
262
+ return results;
263
+ },
264
+ rfpByWorkstream: async (parent, args) => {
265
+ const filters = args.filter || {};
266
+ const candidateDrives = await getCandidateDrives();
267
+ const wantedSlug = filters.networkSlug ||
268
+ (filters.networkName ? deriveSlug(filters.networkName) : undefined);
269
+ const results = [];
270
+ for (const driveId of candidateDrives) {
271
+ let qb = WorkstreamsProcessor.query(driveId, db)
272
+ .selectFrom("workstreams")
273
+ .selectAll();
274
+ qb = applyWorkstreamFilters(qb, filters, wantedSlug);
275
+ const rows = await qb.execute();
276
+ if (rows.length === 0) {
277
+ continue;
278
+ }
279
+ for (const row of rows) {
280
+ const hydrated = await hydrateWorkstreamRow(row);
281
+ results.push({
282
+ code: hydrated.code,
283
+ title: hydrated.title,
284
+ status: hydrated.status,
285
+ rfp: hydrated.rfp,
286
+ });
287
+ }
288
+ if (filters.workstreamId || filters.workstreamSlug) {
289
+ break;
290
+ }
291
+ }
292
+ return results;
293
+ },
294
+ scopeOfWorkByNetworkOrStatus: async (parent, args) => {
295
+ const filters = args.filter || {};
296
+ const candidateDrives = await getCandidateDrives();
297
+ const wantedSlug = filters.networkSlug ||
298
+ (filters.networkName ? deriveSlug(filters.networkName) : undefined);
299
+ const results = [];
300
+ for (const driveId of candidateDrives) {
301
+ let qb = WorkstreamsProcessor.query(driveId, db)
302
+ .selectFrom("workstreams")
303
+ .selectAll();
304
+ qb = applyScopeOfWorkFilters(qb, filters, wantedSlug);
305
+ const rows = await qb.execute();
306
+ if (rows.length === 0) {
307
+ continue;
308
+ }
309
+ for (const row of rows) {
310
+ const hydrated = await hydrateWorkstreamRow(row);
311
+ // Collect SOWs based on proposalRole filter
312
+ const sowDocs = [];
313
+ if (!filters.proposalRole) {
314
+ // If no proposalRole specified, include all SOWs
315
+ if (hydrated.sow) {
316
+ sowDocs.push(hydrated.sow);
317
+ }
318
+ if (hydrated.initialProposal?.sow) {
319
+ sowDocs.push(hydrated.initialProposal.sow);
320
+ }
321
+ for (const altProposal of hydrated.alternativeProposals || []) {
322
+ if (altProposal.sow) {
323
+ sowDocs.push(altProposal.sow);
324
+ }
325
+ }
326
+ }
327
+ else if (filters.proposalRole === "INITIAL") {
328
+ if (hydrated.initialProposal?.sow) {
329
+ sowDocs.push(hydrated.initialProposal.sow);
330
+ }
331
+ }
332
+ else if (filters.proposalRole === "ALTERNATIVE") {
333
+ for (const altProposal of hydrated.alternativeProposals || []) {
334
+ if (altProposal.sow) {
335
+ sowDocs.push(altProposal.sow);
336
+ }
337
+ }
338
+ }
339
+ else if (filters.proposalRole === "AWARDED") {
340
+ // For AWARDED, we check if the workstream status is AWARDED
341
+ // and return the initial proposal's SOW (as it's typically the awarded one)
342
+ if (hydrated.status === "AWARDED" && hydrated.initialProposal?.sow) {
343
+ sowDocs.push(hydrated.initialProposal.sow);
344
+ }
345
+ }
346
+ // Filter out null/undefined SOWs and add to results
347
+ for (const sow of sowDocs) {
348
+ if (sow) {
349
+ results.push(sow);
350
+ }
351
+ }
352
+ }
353
+ if (filters.workstreamId || filters.workstreamSlug) {
354
+ break;
355
+ }
356
+ }
357
+ return results;
358
+ },
359
+ },
360
+ SOW_Progress: {
361
+ __resolveType(obj) {
362
+ if (obj && typeof obj === "object") {
363
+ if (Object.prototype.hasOwnProperty.call(obj, "total") && Object.prototype.hasOwnProperty.call(obj, "completed")) {
364
+ return "SOW_StoryPoint";
365
+ }
366
+ if (Object.prototype.hasOwnProperty.call(obj, "value")) {
367
+ return "SOW_Percentage";
368
+ }
369
+ if (Object.prototype.hasOwnProperty.call(obj, "done")) {
370
+ return "SOW_Binary";
371
+ }
372
+ }
373
+ return null;
374
+ }
375
+ }
376
+ };
377
+ };
@@ -0,0 +1,3 @@
1
+ import type { DocumentNode } from "graphql";
2
+ export declare const schema: DocumentNode;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/workstreams/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YAoUpB,CAAC"}