Twilio bash config added. Milestone Panel edits.

This commit is contained in:
Josh 2025-06-17 13:06:32 +00:00
parent 5eb0750dfb
commit 631e2bc0fb
6 changed files with 81 additions and 23 deletions

50
package-lock.json generated
View File

@ -36,6 +36,7 @@
"moment": "^2.30.1", "moment": "^2.30.1",
"multer": "^1.4.5-lts.2", "multer": "^1.4.5-lts.2",
"mysql2": "^3.14.1", "mysql2": "^3.14.1",
"node-cron": "^4.1.0",
"openai": "^4.97.0", "openai": "^4.97.0",
"pdf-parse": "^1.1.1", "pdf-parse": "^1.1.1",
"pdfjs-dist": "^3.11.174", "pdfjs-dist": "^3.11.174",
@ -51,6 +52,7 @@
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"tailwind-merge": "^3.2.0", "tailwind-merge": "^3.2.0",
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "^1.0.7",
"twilio": "^5.7.1",
"web-vitals": "^4.2.4", "web-vitals": "^4.2.4",
"xlsx": "^0.18.5" "xlsx": "^0.18.5"
}, },
@ -7491,6 +7493,12 @@
"url": "https://github.com/sponsors/kossnocorp" "url": "https://github.com/sponsors/kossnocorp"
} }
}, },
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
"license": "MIT"
},
"node_modules/debug": { "node_modules/debug": {
"version": "4.4.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
@ -13476,6 +13484,15 @@
"integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/node-cron": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.1.0.tgz",
"integrity": "sha512-OS+3ORu+h03/haS6Di8Qr7CrVs4YaKZZOynZwQpyPZDnR3tqRbwJmuP2gVR16JfhLgyNlloAV1VTrrWlRogCFA==",
"license": "ISC",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/node-domexception": { "node_modules/node-domexception": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@ -17185,6 +17202,12 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/scmp": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz",
"integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==",
"license": "BSD-3-Clause"
},
"node_modules/select-hose": { "node_modules/select-hose": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@ -19068,6 +19091,33 @@
"integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==",
"license": "ISC" "license": "ISC"
}, },
"node_modules/twilio": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/twilio/-/twilio-5.7.1.tgz",
"integrity": "sha512-BcoVK6FR580HRX94z2u3b+foHkvFj39DDzLU4Xv+N/7ejDIGgQdrtg7CgRqIT04UNs98HJAvjuAOzkYetI6ExQ==",
"license": "MIT",
"dependencies": {
"axios": "^1.8.3",
"dayjs": "^1.11.9",
"https-proxy-agent": "^5.0.0",
"jsonwebtoken": "^9.0.2",
"qs": "^6.9.4",
"scmp": "^2.1.0",
"xmlbuilder": "^13.0.2"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/twilio/node_modules/xmlbuilder": {
"version": "13.0.2",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz",
"integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==",
"license": "MIT",
"engines": {
"node": ">=6.0"
}
},
"node_modules/type-check": { "node_modules/type-check": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",

View File

@ -31,6 +31,7 @@
"moment": "^2.30.1", "moment": "^2.30.1",
"multer": "^1.4.5-lts.2", "multer": "^1.4.5-lts.2",
"mysql2": "^3.14.1", "mysql2": "^3.14.1",
"node-cron": "^4.1.0",
"openai": "^4.97.0", "openai": "^4.97.0",
"pdf-parse": "^1.1.1", "pdf-parse": "^1.1.1",
"pdfjs-dist": "^3.11.174", "pdfjs-dist": "^3.11.174",
@ -46,6 +47,7 @@
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"tailwind-merge": "^3.2.0", "tailwind-merge": "^3.2.0",
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "^1.0.7",
"twilio": "^5.7.1",
"web-vitals": "^4.2.4", "web-vitals": "^4.2.4",
"xlsx": "^0.18.5" "xlsx": "^0.18.5"
}, },

View File

@ -32,6 +32,7 @@ import { Button } from './ui/button.js';
import { Pencil } from 'lucide-react'; import { Pencil } from 'lucide-react';
import ScenarioEditModal from './ScenarioEditModal.js'; import ScenarioEditModal from './ScenarioEditModal.js';
import parseAIJson from "../utils/parseAIJson.js"; // your shared parser import parseAIJson from "../utils/parseAIJson.js"; // your shared parser
import InfoTooltip from "./ui/infoTooltip.js";
import './CareerRoadmap.css'; import './CareerRoadmap.css';
import './MilestoneTimeline.css'; import './MilestoneTimeline.css';
@ -1336,7 +1337,10 @@ const fetchMilestones = useCallback(async () => {
{/* --- FINANCIAL PROJECTION SECTION -------------------------------- */} {/* --- FINANCIAL PROJECTION SECTION -------------------------------- */}
<div className="bg-white p-4 rounded shadow"> <div className="bg-white p-4 rounded shadow">
<h3 className="text-lg font-semibold mb-2">Financial Projection</h3> <h3 className="text-lg font-semibold mb-2 flex items-center justify-center gap-1">
Financial Projection
<InfoTooltip message="This projection uses the salary, expense, loan and contribution inputs youve set below. Click “Edit Simulation Inputs” to adjust them, or edit your financial information in Profile -> Financial Profile." />
</h3>
{projectionData.length ? ( {projectionData.length ? (

View File

@ -1,40 +1,42 @@
import { Pencil } from 'lucide-react'; /* MilestonePanel.jsx */
import { Button } from './ui/button.js'; import { Pencil } from "lucide-react";
import { Button } from "./ui/button.js";
/* MilestonePanel.jsx ---------------------------------- */
export default function MilestonePanel({ groups, onEdit, onSelect }) { export default function MilestonePanel({ groups, onEdit, onSelect }) {
return ( return (
<aside className="w-full pr-4"> <aside className="w-full md:max-w-md mx-auto"> {/* max-width ≈ 28 rem */}
{groups.map(g => (
<details key={g.month} className="mb-2"> {groups.map((g) => (
<summary className="cursor-pointer font-semibold"> <details key={g.month} className="mb-3">
{g.monthLabel} <span className="text-xs">({g.items.length})</span> <summary className="cursor-pointer font-semibold flex items-center gap-1">
{g.monthLabel}
<span className="text-xs text-gray-500">({g.items.length})</span>
</summary> </summary>
<ul className="mt-1 space-y-2"> <ul className="mt-2 space-y-1 pl-4">
{g.items.map(m => ( {g.items.map((m) => (
<li <li
key={m.id} key={m.id}
className="flex items-start justify-between text-sm group cursor-pointer" className="grid grid-cols-[1fr_auto] items-center gap-4 pr-2
onClick={() => onSelect?.(m)} hover:bg-gray-50 rounded cursor-pointer"
onClick={() => onSelect(m)}
> >
<span>{m.title}</span> <span className="truncate">{m.title}</span>
{/* edit pencil invisible until row hover */}
<Button <Button
size="icon" onClick={(e) => { {/* stop click bubbling so pencil still edits */}
variant="ghost" e.stopPropagation();
className="opacity-0 group-hover:opacity-75 transition-opacity"
onClick={e => {
e.stopPropagation(); // dont also open drawer
onEdit(m); onEdit(m);
}} }}
size="icon"
variant="ghost"
className="text-blue-600 hover:bg-blue-50"
aria-label="Edit milestone"
> >
<Pencil className="h-4 w-4 text-gray-500 hover:text-gray-700" /> <Pencil className="w-4 h-4" />
<span className="sr-only">Edit milestone</span>
</Button> </Button>
</li> </li>
))} ))}
</ul> </ul>
</details> </details>

Binary file not shown.