@burdenoff/microfe-crewfoundry 2026.626.1 → 2026.703.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.
- package/dist/crewfoundry/components/forms/ConfirmDialog.js +43 -0
- package/dist/crewfoundry/components/forms/ConfirmDialog.js.map +1 -0
- package/dist/crewfoundry/components/forms/FormModal.js +220 -0
- package/dist/crewfoundry/components/forms/FormModal.js.map +1 -0
- package/dist/crewfoundry/components/forms/formValues.js +20 -0
- package/dist/crewfoundry/components/forms/formValues.js.map +1 -0
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +255 -65
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +28 -17
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +57 -53
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +32 -23
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +44 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +183 -57
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +214 -92
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +165 -131
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +163 -133
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +269 -54
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +225 -78
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +213 -59
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +287 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +49 -47
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +166 -59
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +274 -83
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +198 -88
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +216 -88
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +216 -66
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +6 -7
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +83 -68
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +167 -46
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +75 -55
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +152 -79
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -63
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +3 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +235 -87
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +199 -86
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +21 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +117 -45
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +249 -90
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +47 -45
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +262 -133
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +144 -77
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +306 -51
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,105 +1,177 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
+
import { useState as t } from "react";
|
|
3
|
+
import { FolderKanban as n, Save as r } from "lucide-react";
|
|
4
|
+
import { useNavigate as i } from "react-router-dom";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import { Button as s, EmphasisPanel as c, GradientText as l, Input as u, PagePurpose as d, Textarea as f } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { useGlobalUi as p } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
5
8
|
//#region src/crewfoundry/pages/ProjectsCreateProjectPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let [
|
|
8
|
-
|
|
9
|
+
function m() {
|
|
10
|
+
let m = i(), { showToast: h } = p(), g = e((e) => e.addProject), _ = e((e) => e.teams), [v, y] = t(""), [b, x] = t(""), [S, C] = t(""), [w, T] = t(""), [E, D] = t(""), [O, k] = t(""), [A, j] = t(!1), M = async (e) => {
|
|
11
|
+
if (A) return;
|
|
12
|
+
if (v.trim() === "") {
|
|
13
|
+
h("Project Name is required", "warning");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
let t = _.find((e) => e.id === O), n = E.trim() === "" ? void 0 : Number(E), r = {
|
|
17
|
+
name: v.trim(),
|
|
18
|
+
description: b.trim(),
|
|
19
|
+
status: e,
|
|
20
|
+
priority: "medium",
|
|
21
|
+
...S ? { startDate: S } : {},
|
|
22
|
+
...w ? { endDate: w } : {},
|
|
23
|
+
...n !== void 0 && !Number.isNaN(n) ? { budget: n } : {},
|
|
24
|
+
...t ? {
|
|
25
|
+
teamId: t.id,
|
|
26
|
+
teamName: t.name
|
|
27
|
+
} : {}
|
|
28
|
+
};
|
|
29
|
+
j(!0);
|
|
30
|
+
try {
|
|
31
|
+
await g(r), h(e === "planning" ? "Draft project saved" : "Project created", "success"), m("../../projects/projects-page");
|
|
32
|
+
} catch (e) {
|
|
33
|
+
h(e instanceof Error ? e.message : "Unable to create project", "error");
|
|
34
|
+
} finally {
|
|
35
|
+
j(!1);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
return /* @__PURE__ */ o("div", {
|
|
9
39
|
className: "space-y-6 p-6 max-w-3xl",
|
|
10
40
|
children: [
|
|
11
|
-
/* @__PURE__ */
|
|
12
|
-
/* @__PURE__ */
|
|
41
|
+
/* @__PURE__ */ o("div", { children: [
|
|
42
|
+
/* @__PURE__ */ a("h1", {
|
|
13
43
|
className: "text-2xl font-semibold",
|
|
14
|
-
children: /* @__PURE__ */
|
|
44
|
+
children: /* @__PURE__ */ a(l, { children: "Create Project" })
|
|
15
45
|
}),
|
|
16
|
-
/* @__PURE__ */
|
|
46
|
+
/* @__PURE__ */ a("p", {
|
|
17
47
|
className: "text-sm text-text-secondary",
|
|
18
48
|
children: "Set up a new project for your team"
|
|
19
49
|
}),
|
|
20
|
-
/* @__PURE__ */
|
|
50
|
+
/* @__PURE__ */ a(d, {
|
|
21
51
|
className: "mt-1",
|
|
22
52
|
children: "Start a new project — define its scope, budget, and team here so you can begin tracking work toward a clear goal."
|
|
23
53
|
})
|
|
24
54
|
] }),
|
|
25
|
-
/* @__PURE__ */
|
|
55
|
+
/* @__PURE__ */ o(c, { children: [/* @__PURE__ */ o("div", {
|
|
26
56
|
className: "mb-4 flex items-center gap-2 text-lg font-semibold",
|
|
27
|
-
children: [/* @__PURE__ */
|
|
28
|
-
}), /* @__PURE__ */
|
|
57
|
+
children: [/* @__PURE__ */ a(n, { className: "h-5 w-5" }), "Project Details"]
|
|
58
|
+
}), /* @__PURE__ */ o("div", {
|
|
29
59
|
className: "space-y-4",
|
|
30
60
|
children: [
|
|
31
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ o("div", {
|
|
32
62
|
className: "space-y-2",
|
|
33
|
-
children: [/* @__PURE__ */
|
|
63
|
+
children: [/* @__PURE__ */ a("label", {
|
|
64
|
+
htmlFor: "cpName",
|
|
34
65
|
className: "text-sm font-medium",
|
|
35
66
|
children: "Project Name"
|
|
36
|
-
}), /* @__PURE__ */
|
|
67
|
+
}), /* @__PURE__ */ a(u, {
|
|
68
|
+
id: "cpName",
|
|
37
69
|
placeholder: "e.g. HR Analytics Dashboard v3",
|
|
38
|
-
value:
|
|
39
|
-
|
|
70
|
+
value: v,
|
|
71
|
+
disabled: A,
|
|
72
|
+
onChange: (e) => y(e.target.value)
|
|
40
73
|
})]
|
|
41
74
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ o("div", {
|
|
43
76
|
className: "space-y-2",
|
|
44
|
-
children: [/* @__PURE__ */
|
|
77
|
+
children: [/* @__PURE__ */ a("label", {
|
|
78
|
+
htmlFor: "cpDesc",
|
|
45
79
|
className: "text-sm font-medium",
|
|
46
80
|
children: "Description"
|
|
47
|
-
}), /* @__PURE__ */
|
|
81
|
+
}), /* @__PURE__ */ a(f, {
|
|
82
|
+
id: "cpDesc",
|
|
48
83
|
placeholder: "Describe the project objectives and scope...",
|
|
49
84
|
rows: 3,
|
|
50
|
-
value:
|
|
51
|
-
|
|
85
|
+
value: b,
|
|
86
|
+
disabled: A,
|
|
87
|
+
onChange: (e) => x(e.target.value)
|
|
52
88
|
})]
|
|
53
89
|
}),
|
|
54
|
-
/* @__PURE__ */
|
|
90
|
+
_.length > 0 ? /* @__PURE__ */ o("div", {
|
|
91
|
+
className: "space-y-2",
|
|
92
|
+
children: [/* @__PURE__ */ a("label", {
|
|
93
|
+
htmlFor: "cpTeam",
|
|
94
|
+
className: "text-sm font-medium",
|
|
95
|
+
children: "Team"
|
|
96
|
+
}), /* @__PURE__ */ o("select", {
|
|
97
|
+
id: "cpTeam",
|
|
98
|
+
className: "flex h-10 w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors duration-200 focus-visible:border-border-focus focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
99
|
+
value: O,
|
|
100
|
+
disabled: A,
|
|
101
|
+
onChange: (e) => k(e.target.value),
|
|
102
|
+
children: [/* @__PURE__ */ a("option", {
|
|
103
|
+
value: "",
|
|
104
|
+
children: "Unassigned"
|
|
105
|
+
}), _.map((e) => /* @__PURE__ */ a("option", {
|
|
106
|
+
value: e.id,
|
|
107
|
+
children: e.name
|
|
108
|
+
}, e.id))]
|
|
109
|
+
})]
|
|
110
|
+
}) : null,
|
|
111
|
+
/* @__PURE__ */ o("div", {
|
|
55
112
|
className: "grid grid-cols-2 gap-4",
|
|
56
|
-
children: [/* @__PURE__ */
|
|
113
|
+
children: [/* @__PURE__ */ o("div", {
|
|
57
114
|
className: "space-y-2",
|
|
58
|
-
children: [/* @__PURE__ */
|
|
115
|
+
children: [/* @__PURE__ */ a("label", {
|
|
116
|
+
htmlFor: "cpStart",
|
|
59
117
|
className: "text-sm font-medium",
|
|
60
118
|
children: "Start Date"
|
|
61
|
-
}), /* @__PURE__ */
|
|
119
|
+
}), /* @__PURE__ */ a(u, {
|
|
120
|
+
id: "cpStart",
|
|
62
121
|
type: "date",
|
|
63
|
-
value:
|
|
64
|
-
|
|
122
|
+
value: S,
|
|
123
|
+
disabled: A,
|
|
124
|
+
onChange: (e) => C(e.target.value)
|
|
65
125
|
})]
|
|
66
|
-
}), /* @__PURE__ */
|
|
126
|
+
}), /* @__PURE__ */ o("div", {
|
|
67
127
|
className: "space-y-2",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ a("label", {
|
|
129
|
+
htmlFor: "cpEnd",
|
|
69
130
|
className: "text-sm font-medium",
|
|
70
131
|
children: "End Date"
|
|
71
|
-
}), /* @__PURE__ */
|
|
132
|
+
}), /* @__PURE__ */ a(u, {
|
|
133
|
+
id: "cpEnd",
|
|
72
134
|
type: "date",
|
|
73
|
-
value:
|
|
74
|
-
|
|
135
|
+
value: w,
|
|
136
|
+
disabled: A,
|
|
137
|
+
onChange: (e) => T(e.target.value)
|
|
75
138
|
})]
|
|
76
139
|
})]
|
|
77
140
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
141
|
+
/* @__PURE__ */ o("div", {
|
|
79
142
|
className: "space-y-2",
|
|
80
|
-
children: [/* @__PURE__ */
|
|
143
|
+
children: [/* @__PURE__ */ a("label", {
|
|
144
|
+
htmlFor: "cpBudget",
|
|
81
145
|
className: "text-sm font-medium",
|
|
82
146
|
children: "Budget ($)"
|
|
83
|
-
}), /* @__PURE__ */
|
|
147
|
+
}), /* @__PURE__ */ a(u, {
|
|
148
|
+
id: "cpBudget",
|
|
84
149
|
type: "number",
|
|
85
150
|
placeholder: "e.g. 250000",
|
|
86
|
-
value:
|
|
87
|
-
|
|
151
|
+
value: E,
|
|
152
|
+
disabled: A,
|
|
153
|
+
onChange: (e) => D(e.target.value)
|
|
88
154
|
})]
|
|
89
155
|
})
|
|
90
156
|
]
|
|
91
157
|
})] }),
|
|
92
|
-
/* @__PURE__ */
|
|
158
|
+
/* @__PURE__ */ o("div", {
|
|
93
159
|
className: "flex justify-end gap-2",
|
|
94
|
-
children: [/* @__PURE__ */
|
|
160
|
+
children: [/* @__PURE__ */ a(s, {
|
|
95
161
|
variant: "outline",
|
|
162
|
+
disabled: A,
|
|
163
|
+
onClick: () => M("planning"),
|
|
96
164
|
children: "Save as Draft"
|
|
97
|
-
}), /* @__PURE__ */
|
|
165
|
+
}), /* @__PURE__ */ o(s, {
|
|
166
|
+
disabled: A,
|
|
167
|
+
onClick: () => M("active"),
|
|
168
|
+
children: [/* @__PURE__ */ a(r, { className: "h-4 w-4 mr-1" }), A ? "Saving…" : "Create Project"]
|
|
169
|
+
})]
|
|
98
170
|
})
|
|
99
171
|
]
|
|
100
172
|
});
|
|
101
173
|
}
|
|
102
174
|
//#endregion
|
|
103
|
-
export {
|
|
175
|
+
export { m as ProjectsCreateProjectPagePage };
|
|
104
176
|
|
|
105
177
|
//# sourceMappingURL=ProjectsCreateProjectPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsCreateProjectPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsCreateProjectPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Button,\n EmphasisPanel,\n GradientText,\n Input,\n PagePurpose,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { FolderKanban, Save } from 'lucide-react';\n\nexport function ProjectsCreateProjectPagePage() {\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n const [budget, setBudget] = useState('');\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Create Project</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Set up a new project for your team</p>\n <PagePurpose className=\"mt-1\">Start a new project — define its scope, budget, and team here so you can begin tracking work toward a clear goal.</PagePurpose>\n </div>\n <EmphasisPanel>\n <div className=\"mb-4 flex items-center gap-2 text-lg font-semibold\">\n <FolderKanban className=\"h-5 w-5\" />\n Project Details\n </div>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Project Name</label>\n <Input\n placeholder=\"e.g. HR Analytics Dashboard v3\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Description</label>\n <Textarea\n placeholder=\"Describe the project objectives and scope...\"\n rows={3}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Start Date</label>\n <Input type=\"date\" value={startDate} onChange={(e) => setStartDate(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">End Date</label>\n <Input type=\"date\" value={endDate} onChange={(e) => setEndDate(e.target.value)} />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Budget ($)</label>\n <Input\n type=\"number\"\n placeholder=\"e.g. 250000\"\n value={budget}\n onChange={(e) => setBudget(e.target.value)}\n />\n </div>\n </div>\n </EmphasisPanel>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\">Save as Draft</Button>\n <Button>\n <Save className=\"h-4 w-4 mr-1\" />\n Create Project\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAWA,SAAgB,IAAgC;CAC9C,IAAM,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAS,KAAc,EAAS,GAAG,EACpC,CAAC,GAAQ,KAAa,EAAS,GAAG;AAExC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,kBAA6B,CAAA;KACxC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAsC,CAAA;IACjF,kBAAC,GAAD;KAAa,WAAU;eAAO;KAA+H,CAAA;IACzJ,EAAA,CAAA;GACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EAAA,kBAEhC;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAsB;OAAoB,CAAA,EAC3D,kBAAC,GAAD;OACE,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,CAAA,CACE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAsB;OAAmB,CAAA,EAC1D,kBAAC,GAAD;OACE,aAAY;OACZ,MAAM;OACN,OAAO;OACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;OAC/C,CAAA,CACE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAsB;QAAkB,CAAA,EACzD,kBAAC,GAAD;QAAO,MAAK;QAAO,OAAO;QAAW,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;QAAI,CAAA,CAClF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAsB;QAAgB,CAAA,EACvD,kBAAC,GAAD;QAAO,MAAK;QAAO,OAAO;QAAS,WAAW,MAAM,EAAW,EAAE,OAAO,MAAM;QAAI,CAAA,CAC9E;SACF;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAsB;OAAkB,CAAA,EACzD,kBAAC,GAAD;OACE,MAAK;OACL,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;OAC1C,CAAA,CACE;;KACF;MACQ,EAAA,CAAA;GAChB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,SAAQ;eAAU;KAAsB,CAAA,EAChD,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,iBAE1B,EAAA,CAAA,CACL;;GACF"}
|
|
1
|
+
{"version":3,"file":"ProjectsCreateProjectPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsCreateProjectPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Button,\n EmphasisPanel,\n GradientText,\n Input,\n PagePurpose,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { FolderKanban, Save } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore, type Project } from '../store/crewfoundryStore';\n\nexport function ProjectsCreateProjectPagePage() {\n const navigate = useNavigate();\n const { showToast } = useGlobalUi();\n const addProject = useCrewFoundryStore((state) => state.addProject);\n const teams = useCrewFoundryStore((state) => state.teams);\n\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n const [budget, setBudget] = useState('');\n const [teamId, setTeamId] = useState('');\n const [submitting, setSubmitting] = useState(false);\n\n const handleCreate = async (status: Project['status']) => {\n if (submitting) return;\n if (name.trim() === '') {\n showToast('Project Name is required', 'warning');\n return;\n }\n const selectedTeam = teams.find((team) => team.id === teamId);\n const budgetValue = budget.trim() === '' ? undefined : Number(budget);\n // CreateCrewProjectInput only accepts a known field subset; build exactly\n // that shape. The store replaces this optimistic row with the server's\n // complete Project, so display-only fields need not be provided here.\n const payload: Partial<Project> = {\n name: name.trim(),\n description: description.trim(),\n status,\n priority: 'medium',\n ...(startDate ? { startDate } : {}),\n ...(endDate ? { endDate } : {}),\n ...(budgetValue !== undefined && !Number.isNaN(budgetValue) ? { budget: budgetValue } : {}),\n ...(selectedTeam ? { teamId: selectedTeam.id, teamName: selectedTeam.name } : {}),\n };\n setSubmitting(true);\n try {\n await addProject(payload as Project);\n showToast(\n status === 'planning' ? 'Draft project saved' : 'Project created',\n 'success'\n );\n navigate('../../projects/projects-page');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to create project', 'error');\n } finally {\n setSubmitting(false);\n }\n };\n\n const selectClass =\n 'flex h-10 w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors duration-200 focus-visible:border-border-focus focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50';\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Create Project</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Set up a new project for your team</p>\n <PagePurpose className=\"mt-1\">Start a new project — define its scope, budget, and team here so you can begin tracking work toward a clear goal.</PagePurpose>\n </div>\n <EmphasisPanel>\n <div className=\"mb-4 flex items-center gap-2 text-lg font-semibold\">\n <FolderKanban className=\"h-5 w-5\" />\n Project Details\n </div>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor=\"cpName\" className=\"text-sm font-medium\">\n Project Name\n </label>\n <Input\n id=\"cpName\"\n placeholder=\"e.g. HR Analytics Dashboard v3\"\n value={name}\n disabled={submitting}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <label htmlFor=\"cpDesc\" className=\"text-sm font-medium\">\n Description\n </label>\n <Textarea\n id=\"cpDesc\"\n placeholder=\"Describe the project objectives and scope...\"\n rows={3}\n value={description}\n disabled={submitting}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n {teams.length > 0 ? (\n <div className=\"space-y-2\">\n <label htmlFor=\"cpTeam\" className=\"text-sm font-medium\">\n Team\n </label>\n <select\n id=\"cpTeam\"\n className={selectClass}\n value={teamId}\n disabled={submitting}\n onChange={(e) => setTeamId(e.target.value)}\n >\n <option value=\"\">Unassigned</option>\n {teams.map((team) => (\n <option key={team.id} value={team.id}>\n {team.name}\n </option>\n ))}\n </select>\n </div>\n ) : null}\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label htmlFor=\"cpStart\" className=\"text-sm font-medium\">\n Start Date\n </label>\n <Input\n id=\"cpStart\"\n type=\"date\"\n value={startDate}\n disabled={submitting}\n onChange={(e) => setStartDate(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <label htmlFor=\"cpEnd\" className=\"text-sm font-medium\">\n End Date\n </label>\n <Input\n id=\"cpEnd\"\n type=\"date\"\n value={endDate}\n disabled={submitting}\n onChange={(e) => setEndDate(e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label htmlFor=\"cpBudget\" className=\"text-sm font-medium\">\n Budget ($)\n </label>\n <Input\n id=\"cpBudget\"\n type=\"number\"\n placeholder=\"e.g. 250000\"\n value={budget}\n disabled={submitting}\n onChange={(e) => setBudget(e.target.value)}\n />\n </div>\n </div>\n </EmphasisPanel>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" disabled={submitting} onClick={() => handleCreate('planning')}>\n Save as Draft\n </Button>\n <Button disabled={submitting} onClick={() => handleCreate('active')}>\n <Save className=\"h-4 w-4 mr-1\" />\n {submitting ? 'Saving…' : 'Create Project'}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|