@powerhousedao/network-admin 0.0.53 → 0.0.54
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/dist/style.css +47 -0
- package/dist/subgraphs/builders-addon/index.d.ts +11 -0
- package/dist/subgraphs/builders-addon/index.d.ts.map +1 -0
- package/dist/subgraphs/builders-addon/index.js +11 -0
- package/dist/subgraphs/builders-addon/resolvers.d.ts +3 -0
- package/dist/subgraphs/builders-addon/resolvers.d.ts.map +1 -0
- package/dist/subgraphs/builders-addon/resolvers.js +280 -0
- package/dist/subgraphs/builders-addon/schema.d.ts +3 -0
- package/dist/subgraphs/builders-addon/schema.d.ts.map +1 -0
- package/dist/subgraphs/builders-addon/schema.js +209 -0
- package/dist/subgraphs/index.d.ts +1 -0
- package/dist/subgraphs/index.d.ts.map +1 -1
- package/dist/subgraphs/index.js +1 -0
- package/package.json +2 -2
package/dist/style.css
CHANGED
|
@@ -2296,6 +2296,7 @@
|
|
|
2296
2296
|
"Courier New", monospace;
|
|
2297
2297
|
--color-red-50: oklch(97.1% 0.013 17.38);
|
|
2298
2298
|
--color-red-100: hsl(3 82% 96%);
|
|
2299
|
+
--color-red-300: hsl(6 82% 87%);
|
|
2299
2300
|
--color-red-500: hsl(5 80% 78%);
|
|
2300
2301
|
--color-red-600: hsl(4 81% 74%);
|
|
2301
2302
|
--color-orange-500: hsl(33 99% 70%);
|
|
@@ -2371,6 +2372,7 @@
|
|
|
2371
2372
|
--tracking-wider: 0.05em;
|
|
2372
2373
|
--leading-relaxed: 1.625;
|
|
2373
2374
|
--radius-sm: 0.25rem;
|
|
2375
|
+
--radius-md: 0.375rem;
|
|
2374
2376
|
--radius-lg: 0.5rem;
|
|
2375
2377
|
--radius-xl: 0.75rem;
|
|
2376
2378
|
--radius-2xl: 1rem;
|
|
@@ -2584,6 +2586,9 @@
|
|
|
2584
2586
|
.mt-1 {
|
|
2585
2587
|
margin-top: calc(var(--spacing) * 1);
|
|
2586
2588
|
}
|
|
2589
|
+
.mt-2 {
|
|
2590
|
+
margin-top: calc(var(--spacing) * 2);
|
|
2591
|
+
}
|
|
2587
2592
|
.mt-3 {
|
|
2588
2593
|
margin-top: calc(var(--spacing) * 3);
|
|
2589
2594
|
}
|
|
@@ -2620,6 +2625,9 @@
|
|
|
2620
2625
|
.inline-flex {
|
|
2621
2626
|
display: inline-flex;
|
|
2622
2627
|
}
|
|
2628
|
+
.table {
|
|
2629
|
+
display: table;
|
|
2630
|
+
}
|
|
2623
2631
|
.h-2 {
|
|
2624
2632
|
height: calc(var(--spacing) * 2);
|
|
2625
2633
|
}
|
|
@@ -2689,6 +2697,9 @@
|
|
|
2689
2697
|
.flex-shrink-0 {
|
|
2690
2698
|
flex-shrink: 0;
|
|
2691
2699
|
}
|
|
2700
|
+
.border-collapse {
|
|
2701
|
+
border-collapse: collapse;
|
|
2702
|
+
}
|
|
2692
2703
|
.-translate-y-1\/2 {
|
|
2693
2704
|
--tw-translate-y: calc(calc(1/2 * 100%) * -1);
|
|
2694
2705
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
@@ -2705,6 +2716,9 @@
|
|
|
2705
2716
|
.grid-cols-1 {
|
|
2706
2717
|
grid-template-columns: repeat(1, minmax(0, 1fr));
|
|
2707
2718
|
}
|
|
2719
|
+
.flex-col {
|
|
2720
|
+
flex-direction: column;
|
|
2721
|
+
}
|
|
2708
2722
|
.flex-wrap {
|
|
2709
2723
|
flex-wrap: wrap;
|
|
2710
2724
|
}
|
|
@@ -2783,6 +2797,9 @@
|
|
|
2783
2797
|
.rounded-lg {
|
|
2784
2798
|
border-radius: var(--radius-lg);
|
|
2785
2799
|
}
|
|
2800
|
+
.rounded-md {
|
|
2801
|
+
border-radius: var(--radius-md);
|
|
2802
|
+
}
|
|
2786
2803
|
.rounded-sm {
|
|
2787
2804
|
border-radius: var(--radius-sm);
|
|
2788
2805
|
}
|
|
@@ -2824,6 +2841,9 @@
|
|
|
2824
2841
|
.border-indigo-100 {
|
|
2825
2842
|
border-color: var(--color-indigo-100);
|
|
2826
2843
|
}
|
|
2844
|
+
.border-red-300 {
|
|
2845
|
+
border-color: var(--color-red-300);
|
|
2846
|
+
}
|
|
2827
2847
|
.border-slate-100 {
|
|
2828
2848
|
border-color: var(--color-slate-100);
|
|
2829
2849
|
}
|
|
@@ -2899,6 +2919,9 @@
|
|
|
2899
2919
|
.bg-purple-500 {
|
|
2900
2920
|
background-color: var(--color-purple-500);
|
|
2901
2921
|
}
|
|
2922
|
+
.bg-red-50 {
|
|
2923
|
+
background-color: var(--color-red-50);
|
|
2924
|
+
}
|
|
2902
2925
|
.bg-red-500 {
|
|
2903
2926
|
background-color: var(--color-red-500);
|
|
2904
2927
|
}
|
|
@@ -3090,6 +3113,10 @@
|
|
|
3090
3113
|
font-size: var(--text-xs);
|
|
3091
3114
|
line-height: var(--tw-leading, var(--text-xs--line-height));
|
|
3092
3115
|
}
|
|
3116
|
+
.leading-4 {
|
|
3117
|
+
--tw-leading: calc(var(--spacing) * 4);
|
|
3118
|
+
line-height: calc(var(--spacing) * 4);
|
|
3119
|
+
}
|
|
3093
3120
|
.leading-relaxed {
|
|
3094
3121
|
--tw-leading: var(--leading-relaxed);
|
|
3095
3122
|
line-height: var(--leading-relaxed);
|
|
@@ -3157,6 +3184,9 @@
|
|
|
3157
3184
|
.text-red-500 {
|
|
3158
3185
|
color: var(--color-red-500);
|
|
3159
3186
|
}
|
|
3187
|
+
.text-red-600 {
|
|
3188
|
+
color: var(--color-red-600);
|
|
3189
|
+
}
|
|
3160
3190
|
.text-sky-700 {
|
|
3161
3191
|
color: var(--color-sky-700);
|
|
3162
3192
|
}
|
|
@@ -3217,6 +3247,10 @@
|
|
|
3217
3247
|
--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
3218
3248
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
3219
3249
|
}
|
|
3250
|
+
.blur {
|
|
3251
|
+
--tw-blur: blur(8px);
|
|
3252
|
+
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
3253
|
+
}
|
|
3220
3254
|
.backdrop-blur-sm {
|
|
3221
3255
|
--tw-backdrop-blur: blur(var(--blur-sm));
|
|
3222
3256
|
-webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
|
|
@@ -3469,6 +3503,19 @@
|
|
|
3469
3503
|
--tw-ring-offset-width: 0px;
|
|
3470
3504
|
--tw-ring-offset-color: #fff;
|
|
3471
3505
|
--tw-ring-offset-shadow: 0 0 #0000;
|
|
3506
|
+
--tw-blur: initial;
|
|
3507
|
+
--tw-brightness: initial;
|
|
3508
|
+
--tw-contrast: initial;
|
|
3509
|
+
--tw-grayscale: initial;
|
|
3510
|
+
--tw-hue-rotate: initial;
|
|
3511
|
+
--tw-invert: initial;
|
|
3512
|
+
--tw-opacity: initial;
|
|
3513
|
+
--tw-saturate: initial;
|
|
3514
|
+
--tw-sepia: initial;
|
|
3515
|
+
--tw-drop-shadow: initial;
|
|
3516
|
+
--tw-drop-shadow-color: initial;
|
|
3517
|
+
--tw-drop-shadow-alpha: 100%;
|
|
3518
|
+
--tw-drop-shadow-size: initial;
|
|
3472
3519
|
--tw-backdrop-blur: initial;
|
|
3473
3520
|
--tw-backdrop-brightness: initial;
|
|
3474
3521
|
--tw-backdrop-contrast: initial;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseSubgraph } from "@powerhousedao/reactor-api";
|
|
2
|
+
import type { DocumentNode } from "graphql";
|
|
3
|
+
export declare class BuildersAddonSubgraph extends BaseSubgraph {
|
|
4
|
+
name: string;
|
|
5
|
+
typeDefs: DocumentNode;
|
|
6
|
+
resolvers: Record<string, unknown>;
|
|
7
|
+
additionalContextFields: {};
|
|
8
|
+
onSetup(): Promise<void>;
|
|
9
|
+
onDisconnect(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../subgraphs/builders-addon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,IAAI,SAAoB;IACxB,QAAQ,EAAE,YAAY,CAAU;IAChC,SAAS,0BAAsB;IAC/B,uBAAuB,KAAM;IACvB,OAAO;IACP,YAAY;CACnB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseSubgraph } from "@powerhousedao/reactor-api";
|
|
2
|
+
import { schema } from "./schema.js";
|
|
3
|
+
import { getResolvers } from "./resolvers.js";
|
|
4
|
+
export class BuildersAddonSubgraph extends BaseSubgraph {
|
|
5
|
+
name = "builders-addon";
|
|
6
|
+
typeDefs = schema;
|
|
7
|
+
resolvers = getResolvers(this);
|
|
8
|
+
additionalContextFields = {};
|
|
9
|
+
async onSetup() { }
|
|
10
|
+
async onDisconnect() { }
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.d.ts","sourceRoot":"","sources":["../../../subgraphs/builders-addon/resolvers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAc5D,eAAO,MAAM,YAAY,GAAI,UAAU,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CA4UxE,CAAC"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import {} from "@powerhousedao/reactor-api";
|
|
2
|
+
export const getResolvers = (subgraph) => {
|
|
3
|
+
const reactor = subgraph.reactor;
|
|
4
|
+
const extractPhid = (value) => {
|
|
5
|
+
if (typeof value === "string") {
|
|
6
|
+
return value.trim() || null;
|
|
7
|
+
}
|
|
8
|
+
if (value &&
|
|
9
|
+
typeof value === "object" &&
|
|
10
|
+
"id" in value &&
|
|
11
|
+
typeof value.id === "string") {
|
|
12
|
+
const id = value.id;
|
|
13
|
+
return id.trim() || null;
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
};
|
|
17
|
+
const getCandidateDrives = async () => {
|
|
18
|
+
try {
|
|
19
|
+
const drives = await reactor.getDrives?.();
|
|
20
|
+
if (Array.isArray(drives) && drives.length > 0)
|
|
21
|
+
return drives;
|
|
22
|
+
}
|
|
23
|
+
catch { }
|
|
24
|
+
return [];
|
|
25
|
+
};
|
|
26
|
+
const applyFilters = (builder, filter) => {
|
|
27
|
+
if (!filter)
|
|
28
|
+
return true;
|
|
29
|
+
if (filter.id && builder.id !== filter.id)
|
|
30
|
+
return false;
|
|
31
|
+
if (filter.code &&
|
|
32
|
+
String(builder.code || "").toLowerCase() !==
|
|
33
|
+
String(filter.code || "").toLowerCase())
|
|
34
|
+
return false;
|
|
35
|
+
if (filter.name &&
|
|
36
|
+
String(builder.name || "").toLowerCase() !==
|
|
37
|
+
String(filter.name || "").toLowerCase())
|
|
38
|
+
return false;
|
|
39
|
+
if (filter.slug &&
|
|
40
|
+
String(builder.slug || "").toLowerCase() !==
|
|
41
|
+
String(filter.slug || "").toLowerCase())
|
|
42
|
+
return false;
|
|
43
|
+
if (filter.type &&
|
|
44
|
+
String(builder.type || "").toLowerCase() !==
|
|
45
|
+
String(filter.type || "").toLowerCase())
|
|
46
|
+
return false;
|
|
47
|
+
if (filter.status &&
|
|
48
|
+
String(builder.status || "").toLowerCase() !==
|
|
49
|
+
String(filter.status || "").toLowerCase())
|
|
50
|
+
return false;
|
|
51
|
+
if (filter.skills && filter.skills.length > 0) {
|
|
52
|
+
const builderSkills = (builder.skils || []).map((s) => String(s).toLowerCase());
|
|
53
|
+
const hasAllSkills = filter.skills.every((skill) => builderSkills.includes(String(skill).toLowerCase()));
|
|
54
|
+
if (!hasAllSkills)
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (filter.scopes && filter.scopes.length > 0) {
|
|
58
|
+
const builderScopes = (builder.scopes || []).map((s) => String(s).toLowerCase());
|
|
59
|
+
const hasAllScopes = filter.scopes.every((scope) => builderScopes.includes(String(scope).toLowerCase()));
|
|
60
|
+
if (!hasAllScopes)
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
Query: {
|
|
67
|
+
builders: async (parent, args) => {
|
|
68
|
+
const filter = args.filter;
|
|
69
|
+
const drives = await getCandidateDrives();
|
|
70
|
+
// Step 1: Collect all builder profile documents
|
|
71
|
+
const builderDocs = [];
|
|
72
|
+
const sowDocs = [];
|
|
73
|
+
for (const driveId of drives) {
|
|
74
|
+
try {
|
|
75
|
+
const docIds = await reactor.getDocuments(driveId);
|
|
76
|
+
const docs = await Promise.all(docIds.map(async (docId) => {
|
|
77
|
+
try {
|
|
78
|
+
return await reactor.getDocument(docId);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}));
|
|
84
|
+
for (const doc of docs) {
|
|
85
|
+
if (!doc)
|
|
86
|
+
continue;
|
|
87
|
+
if (doc.header.documentType === "powerhouse/builder-profile") {
|
|
88
|
+
builderDocs.push(doc);
|
|
89
|
+
}
|
|
90
|
+
else if (doc.header.documentType === "powerhouse/scopeofwork") {
|
|
91
|
+
sowDocs.push(doc);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.warn(`Failed to process drive ${driveId}:`, error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Step 2: Build a map of deliverable OID -> deliverable object for each SOW
|
|
100
|
+
const sowDeliverablesMap = new Map();
|
|
101
|
+
for (const sowDoc of sowDocs) {
|
|
102
|
+
const sowState = sowDoc.state.global;
|
|
103
|
+
if (!sowState || typeof sowState !== "object")
|
|
104
|
+
continue;
|
|
105
|
+
const deliverablesMap = new Map();
|
|
106
|
+
const deliverables = Array.isArray(sowState.deliverables)
|
|
107
|
+
? sowState.deliverables
|
|
108
|
+
: [];
|
|
109
|
+
for (const deliverable of deliverables) {
|
|
110
|
+
if (!deliverable || typeof deliverable !== "object")
|
|
111
|
+
continue;
|
|
112
|
+
const deliverableId = deliverable.id;
|
|
113
|
+
if (deliverableId && typeof deliverableId === "string") {
|
|
114
|
+
deliverablesMap.set(deliverableId, deliverable);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
sowDeliverablesMap.set(sowDoc.header.id, deliverablesMap);
|
|
118
|
+
}
|
|
119
|
+
// Step 3: Extract projects from SOW documents and group by projectOwner
|
|
120
|
+
const projectsByOwner = new Map();
|
|
121
|
+
for (const sowDoc of sowDocs) {
|
|
122
|
+
const sowState = sowDoc.state.global;
|
|
123
|
+
if (!sowState || typeof sowState !== "object")
|
|
124
|
+
continue;
|
|
125
|
+
if (!Array.isArray(sowState.projects))
|
|
126
|
+
continue;
|
|
127
|
+
const deliverablesMap = sowDeliverablesMap.get(sowDoc.header.id) || new Map();
|
|
128
|
+
for (const project of sowState.projects) {
|
|
129
|
+
if (!project || typeof project !== "object")
|
|
130
|
+
continue;
|
|
131
|
+
const ownerPhid = extractPhid(project.projectOwner);
|
|
132
|
+
if (!ownerPhid)
|
|
133
|
+
continue;
|
|
134
|
+
// Resolve scope deliverables from OIDs to actual deliverable objects
|
|
135
|
+
let resolvedScope = null;
|
|
136
|
+
if (project.scope && typeof project.scope === "object") {
|
|
137
|
+
try {
|
|
138
|
+
const scopeDeliverableOids = Array.isArray(project.scope.deliverables)
|
|
139
|
+
? project.scope.deliverables
|
|
140
|
+
: [];
|
|
141
|
+
const resolvedDeliverables = scopeDeliverableOids
|
|
142
|
+
.map((oid) => {
|
|
143
|
+
if (!oid || typeof oid !== "string")
|
|
144
|
+
return null;
|
|
145
|
+
const deliverable = deliverablesMap.get(oid);
|
|
146
|
+
if (!deliverable || typeof deliverable !== "object")
|
|
147
|
+
return null;
|
|
148
|
+
// Transform to SOW_Deliverable format with error handling
|
|
149
|
+
try {
|
|
150
|
+
return {
|
|
151
|
+
id: deliverable.id || "",
|
|
152
|
+
icon: deliverable.icon ?? null,
|
|
153
|
+
title: String(deliverable.title || ""),
|
|
154
|
+
code: String(deliverable.code || ""),
|
|
155
|
+
description: String(deliverable.description || ""),
|
|
156
|
+
status: deliverable.status || "DRAFT",
|
|
157
|
+
workProgress: deliverable.workProgress ?? null,
|
|
158
|
+
keyResults: Array.isArray(deliverable.keyResults)
|
|
159
|
+
? deliverable.keyResults.map((kr) => ({
|
|
160
|
+
id: kr?.id || "",
|
|
161
|
+
title: String(kr?.title || ""),
|
|
162
|
+
link: String(kr?.link || ""),
|
|
163
|
+
}))
|
|
164
|
+
: [],
|
|
165
|
+
budgetAnchor: deliverable.budgetAnchor ?? null,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.warn(`Failed to transform deliverable ${oid}:`, error);
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
})
|
|
173
|
+
.filter((d) => d !== null);
|
|
174
|
+
// Build resolved scope with error handling
|
|
175
|
+
resolvedScope = {
|
|
176
|
+
deliverables: resolvedDeliverables,
|
|
177
|
+
status: project.scope.status ||
|
|
178
|
+
project.scope.deliverableSetStatus ||
|
|
179
|
+
"DRAFT",
|
|
180
|
+
progress: project.scope.progress ?? null,
|
|
181
|
+
deliverablesCompleted: project.scope.deliverablesCompleted ?? {
|
|
182
|
+
total: 0,
|
|
183
|
+
completed: 0,
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.warn(`Failed to resolve scope for project ${project.id}:`, error);
|
|
189
|
+
// Fallback to empty scope
|
|
190
|
+
resolvedScope = {
|
|
191
|
+
deliverables: [],
|
|
192
|
+
status: "DRAFT",
|
|
193
|
+
progress: null,
|
|
194
|
+
deliverablesCompleted: { total: 0, completed: 0 },
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Transform project to BuilderProject format with error handling
|
|
199
|
+
try {
|
|
200
|
+
const builderProject = {
|
|
201
|
+
id: project.id || "",
|
|
202
|
+
code: String(project.code || ""),
|
|
203
|
+
title: String(project.title || ""),
|
|
204
|
+
slug: String(project.slug || ""),
|
|
205
|
+
abstract: project.abstract ?? null,
|
|
206
|
+
imageUrl: project.imageUrl ?? null,
|
|
207
|
+
scope: resolvedScope,
|
|
208
|
+
budgetType: project.budgetType ?? null,
|
|
209
|
+
currency: project.currency ?? null,
|
|
210
|
+
budget: project.budget ?? null,
|
|
211
|
+
expenditure: project.expenditure ?? null,
|
|
212
|
+
};
|
|
213
|
+
if (!projectsByOwner.has(ownerPhid)) {
|
|
214
|
+
projectsByOwner.set(ownerPhid, []);
|
|
215
|
+
}
|
|
216
|
+
projectsByOwner.get(ownerPhid).push(builderProject);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.warn(`Failed to transform project ${project.id}:`, error);
|
|
220
|
+
// Skip this project if transformation fails
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Step 4: Transform builder documents to BuilderProfileState format
|
|
226
|
+
const builders = builderDocs
|
|
227
|
+
.map((doc) => {
|
|
228
|
+
const state = doc.state.global;
|
|
229
|
+
// Ensure all non-nullable fields are properly handled
|
|
230
|
+
const name = String(state?.name ?? doc.header?.name ?? "");
|
|
231
|
+
const icon = String(state?.icon ?? "");
|
|
232
|
+
const description = String(state?.description ?? state?.slug ?? "");
|
|
233
|
+
const type = state?.type ?? "INDIVIDUAL";
|
|
234
|
+
const skils = Array.isArray(state?.skils) ? state.skils : [];
|
|
235
|
+
const scopes = Array.isArray(state?.scopes) ? state.scopes : [];
|
|
236
|
+
const links = Array.isArray(state?.links) ? state.links : [];
|
|
237
|
+
const contributors = Array.isArray(state?.contributors)
|
|
238
|
+
? state.contributors
|
|
239
|
+
: [];
|
|
240
|
+
const builder = {
|
|
241
|
+
id: doc.header.id,
|
|
242
|
+
code: state?.code ?? null,
|
|
243
|
+
slug: state?.slug ?? null,
|
|
244
|
+
name,
|
|
245
|
+
icon,
|
|
246
|
+
description,
|
|
247
|
+
lastModified: state?.lastModified ?? null,
|
|
248
|
+
type,
|
|
249
|
+
contributors,
|
|
250
|
+
status: state?.status ?? null,
|
|
251
|
+
skils,
|
|
252
|
+
scopes,
|
|
253
|
+
links,
|
|
254
|
+
projects: projectsByOwner.get(doc.header.id) || [],
|
|
255
|
+
};
|
|
256
|
+
return builder;
|
|
257
|
+
})
|
|
258
|
+
.filter((builder) => applyFilters(builder, filter));
|
|
259
|
+
return builders;
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
SOW_Progress: {
|
|
263
|
+
__resolveType(obj) {
|
|
264
|
+
if (obj && typeof obj === "object") {
|
|
265
|
+
if (Object.prototype.hasOwnProperty.call(obj, "total") &&
|
|
266
|
+
Object.prototype.hasOwnProperty.call(obj, "completed")) {
|
|
267
|
+
return "SOW_StoryPoint";
|
|
268
|
+
}
|
|
269
|
+
if (Object.prototype.hasOwnProperty.call(obj, "value")) {
|
|
270
|
+
return "SOW_Percentage";
|
|
271
|
+
}
|
|
272
|
+
if (Object.prototype.hasOwnProperty.call(obj, "done")) {
|
|
273
|
+
return "SOW_Binary";
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/builders-addon/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YA+MpB,CAAC"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { gql } from "graphql-tag";
|
|
2
|
+
export const schema = gql `
|
|
3
|
+
"""
|
|
4
|
+
Subgraph definition
|
|
5
|
+
"""
|
|
6
|
+
type Query {
|
|
7
|
+
builders(filter: buildersFilter): [BuilderProfileState!]!
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
## Filters
|
|
11
|
+
|
|
12
|
+
input buildersFilter {
|
|
13
|
+
id: PHID
|
|
14
|
+
code: String
|
|
15
|
+
name: String
|
|
16
|
+
slug: String
|
|
17
|
+
type: teamType
|
|
18
|
+
status: BuilderStatus
|
|
19
|
+
skills: [BuilderSkill!]
|
|
20
|
+
scopes: [BuilderScope!]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## Builder Profile Schema
|
|
27
|
+
type BuilderProfileState {
|
|
28
|
+
id: PHID
|
|
29
|
+
code: String
|
|
30
|
+
slug: String
|
|
31
|
+
name: String
|
|
32
|
+
icon: URL
|
|
33
|
+
description: String
|
|
34
|
+
lastModified: DateTime
|
|
35
|
+
type: teamType!
|
|
36
|
+
contributors: [PHID!]!
|
|
37
|
+
status: BuilderStatus
|
|
38
|
+
skils: [BuilderSkill!]!
|
|
39
|
+
scopes: [BuilderScope!]!
|
|
40
|
+
links: [BuilderLink!]!
|
|
41
|
+
projects: [BuilderProject!]!
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
enum teamType {
|
|
45
|
+
INDIVIDUAL
|
|
46
|
+
TEAM
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
enum BuilderStatus {
|
|
50
|
+
ACTIVE
|
|
51
|
+
INACTIVE
|
|
52
|
+
ON_HOLD
|
|
53
|
+
COMPLETED
|
|
54
|
+
ARCHIVED
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
enum BuilderSkill {
|
|
58
|
+
FRONTEND_DEVELOPMENT
|
|
59
|
+
BACKEND_DEVELOPMENT
|
|
60
|
+
FULL_STACK_DEVELOPMENT
|
|
61
|
+
DEVOPS_ENGINEERING
|
|
62
|
+
SMART_CONTRACT_DEVELOPMENT
|
|
63
|
+
UI_UX_DESIGN
|
|
64
|
+
TECHNICAL_WRITING
|
|
65
|
+
QA_TESTING
|
|
66
|
+
DATA_ENGINEERING
|
|
67
|
+
SECURITY_ENGINEERING
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
enum BuilderScope {
|
|
71
|
+
ACC
|
|
72
|
+
STA
|
|
73
|
+
SUP
|
|
74
|
+
STABILITY_SCOPE
|
|
75
|
+
SUPPORT_SCOPE
|
|
76
|
+
PROTOCOL_SCOPE
|
|
77
|
+
GOVERNANCE_SCOPE
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
type BuilderLink {
|
|
81
|
+
id: OID!
|
|
82
|
+
url: URL!
|
|
83
|
+
label: String
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
type Builder {
|
|
87
|
+
id: PHID
|
|
88
|
+
code: String
|
|
89
|
+
slug: String
|
|
90
|
+
name: String!
|
|
91
|
+
icon: String!
|
|
92
|
+
description: String!
|
|
93
|
+
lastModified: DateTime
|
|
94
|
+
type: teamType!
|
|
95
|
+
contributors: [Builder!]!
|
|
96
|
+
status: BuilderStatus
|
|
97
|
+
skils: [BuilderSkill!]!
|
|
98
|
+
scopes: [BuilderScope!]!
|
|
99
|
+
links: [BuilderLink!]!
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
type BuilderProject {
|
|
103
|
+
id: OID!
|
|
104
|
+
code: String!
|
|
105
|
+
title: String!
|
|
106
|
+
slug: String!
|
|
107
|
+
abstract: String
|
|
108
|
+
imageUrl: URL
|
|
109
|
+
scope: Builder_SOW_DeliverablesSet
|
|
110
|
+
budgetType: SOW_BudgetType
|
|
111
|
+
currency: SOW_PMCurrency
|
|
112
|
+
budget: Float
|
|
113
|
+
expenditure: SOW_BudgetExpenditure
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
type Builder_SOW_DeliverablesSet {
|
|
117
|
+
deliverables: [BuilderSOW_Deliverable!]!
|
|
118
|
+
status: SOW_DeliverableSetStatus!
|
|
119
|
+
progress: SOW_Progress!
|
|
120
|
+
deliverablesCompleted: SOW_DeliverablesCompleted!
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
type BuilderSOW_Deliverable {
|
|
124
|
+
id: OID!
|
|
125
|
+
icon: String
|
|
126
|
+
title: String!
|
|
127
|
+
code: String!
|
|
128
|
+
description: String!
|
|
129
|
+
status: SOW_DeliverableStatus!
|
|
130
|
+
workProgress: SOW_Progress
|
|
131
|
+
keyResults: [SOW_KeyResult!]!
|
|
132
|
+
budgetAnchor: SOW_BudgetAnchorProject
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
enum SOW_DeliverableStatus {
|
|
136
|
+
WONT_DO
|
|
137
|
+
DRAFT
|
|
138
|
+
TODO
|
|
139
|
+
BLOCKED
|
|
140
|
+
IN_PROGRESS
|
|
141
|
+
DELIVERED
|
|
142
|
+
CANCELED
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
type SOW_KeyResult {
|
|
146
|
+
id: OID!
|
|
147
|
+
title: String!
|
|
148
|
+
link: String!
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
type SOW_BudgetAnchorProject {
|
|
152
|
+
project: OID
|
|
153
|
+
unit: SOW_Unit
|
|
154
|
+
unitCost: Float!
|
|
155
|
+
quantity: Float!
|
|
156
|
+
margin: Float!
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
enum SOW_Unit {
|
|
160
|
+
StoryPoints
|
|
161
|
+
Hours
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
enum SOW_BudgetType {
|
|
165
|
+
CONTINGENCY
|
|
166
|
+
OPEX
|
|
167
|
+
CAPEX
|
|
168
|
+
OVERHEAD
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
enum SOW_PMCurrency {
|
|
172
|
+
DAI
|
|
173
|
+
USDS
|
|
174
|
+
EUR
|
|
175
|
+
USD
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
enum SOW_DeliverableSetStatus {
|
|
179
|
+
DRAFT
|
|
180
|
+
TODO
|
|
181
|
+
IN_PROGRESS
|
|
182
|
+
FINISHED
|
|
183
|
+
CANCELED
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
type SOW_DeliverablesCompleted {
|
|
187
|
+
total: Int!
|
|
188
|
+
completed: Int!
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
type SOW_BudgetExpenditure {
|
|
192
|
+
percentage: Float!
|
|
193
|
+
actuals: Float!
|
|
194
|
+
cap: Float!
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
union SOW_Progress = SOW_StoryPoint | SOW_Percentage | SOW_Binary
|
|
198
|
+
|
|
199
|
+
type SOW_Percentage {
|
|
200
|
+
value: Float!
|
|
201
|
+
}
|
|
202
|
+
type SOW_Binary {
|
|
203
|
+
done: Boolean
|
|
204
|
+
}
|
|
205
|
+
type SOW_StoryPoint {
|
|
206
|
+
total: Int!
|
|
207
|
+
completed: Int!
|
|
208
|
+
}
|
|
209
|
+
`;
|
|
@@ -5,4 +5,5 @@ export * as WorkstreamSubgraph from "./workstream/index.js";
|
|
|
5
5
|
export * as WorkstreamsSubgraph from "./workstreams/index.js";
|
|
6
6
|
export * as NetworksSubgraph from "./networks/index.js";
|
|
7
7
|
export * as BuildersSubgraph from "./builders/index.js";
|
|
8
|
+
export * as BuildersAddonSubgraph from "./builders-addon/index.js";
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../subgraphs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,sBAAsB,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,oBAAoB,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,2BAA2B,MAAM,kCAAkC,CAAC;AAChF,OAAO,KAAK,kBAAkB,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,mBAAmB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../subgraphs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,sBAAsB,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,oBAAoB,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,2BAA2B,MAAM,kCAAkC,CAAC;AAChF,OAAO,KAAK,kBAAkB,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,mBAAmB,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,qBAAqB,MAAM,2BAA2B,CAAC"}
|
package/dist/subgraphs/index.js
CHANGED
|
@@ -5,3 +5,4 @@ export * as WorkstreamSubgraph from "./workstream/index.js";
|
|
|
5
5
|
export * as WorkstreamsSubgraph from "./workstreams/index.js";
|
|
6
6
|
export * as NetworksSubgraph from "./networks/index.js";
|
|
7
7
|
export * as BuildersSubgraph from "./builders/index.js";
|
|
8
|
+
export * as BuildersAddonSubgraph from "./builders-addon/index.js";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/network-admin",
|
|
3
3
|
"description": "Network Admin package for Powerhouse",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.54",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"files": [
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"service-unstartup": "bash ./node_modules/@powerhousedao/ph-cli/dist/scripts/service-unstartup.sh"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@powerhousedao/builder-profile": "0.0.
|
|
65
|
+
"@powerhousedao/builder-profile": "0.0.6",
|
|
66
66
|
"@powerhousedao/builder-tools": "^5.0.12",
|
|
67
67
|
"@powerhousedao/common": "^5.0.12",
|
|
68
68
|
"@powerhousedao/design-system": "^5.0.12",
|