@powerhousedao/network-admin 0.0.52 → 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 +74 -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/dist/subgraphs/workstreams/resolvers.d.ts.map +1 -1
- package/dist/subgraphs/workstreams/resolvers.js +21 -5
- package/dist/subgraphs/workstreams/schema.d.ts.map +1 -1
- package/dist/subgraphs/workstreams/schema.js +1 -0
- package/package.json +3 -3
- package/dist/editors/payment-terms/basic-terms-tab.d.ts +0 -10
- package/dist/editors/payment-terms/basic-terms-tab.d.ts.map +0 -1
- package/dist/editors/payment-terms/basic-terms-tab.js +0 -89
- package/dist/editors/payment-terms/clauses-tab.d.ts +0 -12
- package/dist/editors/payment-terms/clauses-tab.d.ts.map +0 -1
- package/dist/editors/payment-terms/clauses-tab.js +0 -214
- package/dist/editors/payment-terms/components/EditName.d.ts +0 -3
- package/dist/editors/payment-terms/components/EditName.d.ts.map +0 -1
- package/dist/editors/payment-terms/components/EditName.js +0 -31
- package/dist/editors/payment-terms/components/styles.d.ts +0 -2
- package/dist/editors/payment-terms/components/styles.d.ts.map +0 -1
- package/dist/editors/payment-terms/components/styles.js +0 -741
- package/dist/editors/payment-terms/cost-materials-tab.d.ts +0 -10
- package/dist/editors/payment-terms/cost-materials-tab.d.ts.map +0 -1
- package/dist/editors/payment-terms/cost-materials-tab.js +0 -63
- package/dist/editors/payment-terms/escrow-tab.d.ts +0 -10
- package/dist/editors/payment-terms/escrow-tab.d.ts.map +0 -1
- package/dist/editors/payment-terms/escrow-tab.js +0 -57
- package/dist/editors/payment-terms/evaluation-tab.d.ts +0 -10
- package/dist/editors/payment-terms/evaluation-tab.d.ts.map +0 -1
- package/dist/editors/payment-terms/evaluation-tab.js +0 -72
- package/dist/editors/payment-terms/milestones-tab.d.ts +0 -10
- package/dist/editors/payment-terms/milestones-tab.d.ts.map +0 -1
- package/dist/editors/payment-terms/milestones-tab.js +0 -214
- package/dist/editors/payment-terms/retainer-tab.d.ts +0 -10
- package/dist/editors/payment-terms/retainer-tab.d.ts.map +0 -1
- package/dist/editors/payment-terms/retainer-tab.js +0 -69
package/dist/style.css
CHANGED
|
@@ -1792,9 +1792,15 @@
|
|
|
1792
1792
|
.h-10 {
|
|
1793
1793
|
height: calc(var(--spacing) * 10);
|
|
1794
1794
|
}
|
|
1795
|
+
.h-\[60px\] {
|
|
1796
|
+
height: 60px;
|
|
1797
|
+
}
|
|
1795
1798
|
.h-\[100px\] {
|
|
1796
1799
|
height: 100px;
|
|
1797
1800
|
}
|
|
1801
|
+
.h-full {
|
|
1802
|
+
height: 100%;
|
|
1803
|
+
}
|
|
1798
1804
|
.w-0 {
|
|
1799
1805
|
width: calc(var(--spacing) * 0);
|
|
1800
1806
|
}
|
|
@@ -1816,6 +1822,9 @@
|
|
|
1816
1822
|
.w-80 {
|
|
1817
1823
|
width: calc(var(--spacing) * 80);
|
|
1818
1824
|
}
|
|
1825
|
+
.w-\[60px\] {
|
|
1826
|
+
width: 60px;
|
|
1827
|
+
}
|
|
1819
1828
|
.w-\[100px\] {
|
|
1820
1829
|
width: 100px;
|
|
1821
1830
|
}
|
|
@@ -1828,18 +1837,30 @@
|
|
|
1828
1837
|
.w-\[300px\] {
|
|
1829
1838
|
width: 300px;
|
|
1830
1839
|
}
|
|
1840
|
+
.w-\[400px\] {
|
|
1841
|
+
width: 400px;
|
|
1842
|
+
}
|
|
1831
1843
|
.w-full {
|
|
1832
1844
|
width: 100%;
|
|
1833
1845
|
}
|
|
1834
1846
|
.max-w-\[200px\] {
|
|
1835
1847
|
max-width: 200px;
|
|
1836
1848
|
}
|
|
1849
|
+
.max-w-\[350px\] {
|
|
1850
|
+
max-width: 350px;
|
|
1851
|
+
}
|
|
1852
|
+
.min-w-0 {
|
|
1853
|
+
min-width: calc(var(--spacing) * 0);
|
|
1854
|
+
}
|
|
1837
1855
|
.min-w-\[100px\] {
|
|
1838
1856
|
min-width: 100px;
|
|
1839
1857
|
}
|
|
1840
1858
|
.flex-1 {
|
|
1841
1859
|
flex: 1;
|
|
1842
1860
|
}
|
|
1861
|
+
.flex-shrink-0 {
|
|
1862
|
+
flex-shrink: 0;
|
|
1863
|
+
}
|
|
1843
1864
|
.-translate-x-1\/2 {
|
|
1844
1865
|
--tw-translate-x: calc(calc(1/2 * 100%) * -1);
|
|
1845
1866
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
@@ -1895,6 +1916,9 @@
|
|
|
1895
1916
|
.gap-2 {
|
|
1896
1917
|
gap: calc(var(--spacing) * 2);
|
|
1897
1918
|
}
|
|
1919
|
+
.gap-3 {
|
|
1920
|
+
gap: calc(var(--spacing) * 3);
|
|
1921
|
+
}
|
|
1898
1922
|
.gap-4 {
|
|
1899
1923
|
gap: calc(var(--spacing) * 4);
|
|
1900
1924
|
}
|
|
@@ -1917,6 +1941,9 @@
|
|
|
1917
1941
|
text-overflow: ellipsis;
|
|
1918
1942
|
white-space: nowrap;
|
|
1919
1943
|
}
|
|
1944
|
+
.overflow-hidden {
|
|
1945
|
+
overflow: hidden;
|
|
1946
|
+
}
|
|
1920
1947
|
.overflow-y-auto {
|
|
1921
1948
|
overflow-y: auto;
|
|
1922
1949
|
}
|
|
@@ -2269,6 +2296,7 @@
|
|
|
2269
2296
|
"Courier New", monospace;
|
|
2270
2297
|
--color-red-50: oklch(97.1% 0.013 17.38);
|
|
2271
2298
|
--color-red-100: hsl(3 82% 96%);
|
|
2299
|
+
--color-red-300: hsl(6 82% 87%);
|
|
2272
2300
|
--color-red-500: hsl(5 80% 78%);
|
|
2273
2301
|
--color-red-600: hsl(4 81% 74%);
|
|
2274
2302
|
--color-orange-500: hsl(33 99% 70%);
|
|
@@ -2344,6 +2372,7 @@
|
|
|
2344
2372
|
--tracking-wider: 0.05em;
|
|
2345
2373
|
--leading-relaxed: 1.625;
|
|
2346
2374
|
--radius-sm: 0.25rem;
|
|
2375
|
+
--radius-md: 0.375rem;
|
|
2347
2376
|
--radius-lg: 0.5rem;
|
|
2348
2377
|
--radius-xl: 0.75rem;
|
|
2349
2378
|
--radius-2xl: 1rem;
|
|
@@ -2557,6 +2586,9 @@
|
|
|
2557
2586
|
.mt-1 {
|
|
2558
2587
|
margin-top: calc(var(--spacing) * 1);
|
|
2559
2588
|
}
|
|
2589
|
+
.mt-2 {
|
|
2590
|
+
margin-top: calc(var(--spacing) * 2);
|
|
2591
|
+
}
|
|
2560
2592
|
.mt-3 {
|
|
2561
2593
|
margin-top: calc(var(--spacing) * 3);
|
|
2562
2594
|
}
|
|
@@ -2593,6 +2625,9 @@
|
|
|
2593
2625
|
.inline-flex {
|
|
2594
2626
|
display: inline-flex;
|
|
2595
2627
|
}
|
|
2628
|
+
.table {
|
|
2629
|
+
display: table;
|
|
2630
|
+
}
|
|
2596
2631
|
.h-2 {
|
|
2597
2632
|
height: calc(var(--spacing) * 2);
|
|
2598
2633
|
}
|
|
@@ -2662,6 +2697,9 @@
|
|
|
2662
2697
|
.flex-shrink-0 {
|
|
2663
2698
|
flex-shrink: 0;
|
|
2664
2699
|
}
|
|
2700
|
+
.border-collapse {
|
|
2701
|
+
border-collapse: collapse;
|
|
2702
|
+
}
|
|
2665
2703
|
.-translate-y-1\/2 {
|
|
2666
2704
|
--tw-translate-y: calc(calc(1/2 * 100%) * -1);
|
|
2667
2705
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
@@ -2678,6 +2716,9 @@
|
|
|
2678
2716
|
.grid-cols-1 {
|
|
2679
2717
|
grid-template-columns: repeat(1, minmax(0, 1fr));
|
|
2680
2718
|
}
|
|
2719
|
+
.flex-col {
|
|
2720
|
+
flex-direction: column;
|
|
2721
|
+
}
|
|
2681
2722
|
.flex-wrap {
|
|
2682
2723
|
flex-wrap: wrap;
|
|
2683
2724
|
}
|
|
@@ -2756,6 +2797,9 @@
|
|
|
2756
2797
|
.rounded-lg {
|
|
2757
2798
|
border-radius: var(--radius-lg);
|
|
2758
2799
|
}
|
|
2800
|
+
.rounded-md {
|
|
2801
|
+
border-radius: var(--radius-md);
|
|
2802
|
+
}
|
|
2759
2803
|
.rounded-sm {
|
|
2760
2804
|
border-radius: var(--radius-sm);
|
|
2761
2805
|
}
|
|
@@ -2797,6 +2841,9 @@
|
|
|
2797
2841
|
.border-indigo-100 {
|
|
2798
2842
|
border-color: var(--color-indigo-100);
|
|
2799
2843
|
}
|
|
2844
|
+
.border-red-300 {
|
|
2845
|
+
border-color: var(--color-red-300);
|
|
2846
|
+
}
|
|
2800
2847
|
.border-slate-100 {
|
|
2801
2848
|
border-color: var(--color-slate-100);
|
|
2802
2849
|
}
|
|
@@ -2872,6 +2919,9 @@
|
|
|
2872
2919
|
.bg-purple-500 {
|
|
2873
2920
|
background-color: var(--color-purple-500);
|
|
2874
2921
|
}
|
|
2922
|
+
.bg-red-50 {
|
|
2923
|
+
background-color: var(--color-red-50);
|
|
2924
|
+
}
|
|
2875
2925
|
.bg-red-500 {
|
|
2876
2926
|
background-color: var(--color-red-500);
|
|
2877
2927
|
}
|
|
@@ -3063,6 +3113,10 @@
|
|
|
3063
3113
|
font-size: var(--text-xs);
|
|
3064
3114
|
line-height: var(--tw-leading, var(--text-xs--line-height));
|
|
3065
3115
|
}
|
|
3116
|
+
.leading-4 {
|
|
3117
|
+
--tw-leading: calc(var(--spacing) * 4);
|
|
3118
|
+
line-height: calc(var(--spacing) * 4);
|
|
3119
|
+
}
|
|
3066
3120
|
.leading-relaxed {
|
|
3067
3121
|
--tw-leading: var(--leading-relaxed);
|
|
3068
3122
|
line-height: var(--leading-relaxed);
|
|
@@ -3130,6 +3184,9 @@
|
|
|
3130
3184
|
.text-red-500 {
|
|
3131
3185
|
color: var(--color-red-500);
|
|
3132
3186
|
}
|
|
3187
|
+
.text-red-600 {
|
|
3188
|
+
color: var(--color-red-600);
|
|
3189
|
+
}
|
|
3133
3190
|
.text-sky-700 {
|
|
3134
3191
|
color: var(--color-sky-700);
|
|
3135
3192
|
}
|
|
@@ -3190,6 +3247,10 @@
|
|
|
3190
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));
|
|
3191
3248
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
3192
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
|
+
}
|
|
3193
3254
|
.backdrop-blur-sm {
|
|
3194
3255
|
--tw-backdrop-blur: blur(var(--blur-sm));
|
|
3195
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,);
|
|
@@ -3442,6 +3503,19 @@
|
|
|
3442
3503
|
--tw-ring-offset-width: 0px;
|
|
3443
3504
|
--tw-ring-offset-color: #fff;
|
|
3444
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;
|
|
3445
3519
|
--tw-backdrop-blur: initial;
|
|
3446
3520
|
--tw-backdrop-brightness: initial;
|
|
3447
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"}
|