@wealthx/shadcn 1.5.1 → 1.5.2
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/.turbo/turbo-build.log +118 -118
- package/CHANGELOG.md +6 -0
- package/dist/chunk-G2EWIP2N.mjs +960 -0
- package/dist/{chunk-MHHA7QGO.mjs → chunk-ODO6BUOF.mjs} +1 -1
- package/dist/chunk-PX4M67XQ.mjs +301 -0
- package/dist/{chunk-FYUSF5KO.mjs → chunk-QRVEI6J3.mjs} +1 -1
- package/dist/{chunk-42NEC57Y.mjs → chunk-RAKBWNQH.mjs} +272 -3
- package/dist/components/ui/{contact-alert-dialog.js → contact-alert-dialog/index.js} +1029 -593
- package/dist/components/ui/contact-alert-dialog/index.mjs +31 -0
- package/dist/components/ui/file-preview-dialog.js +407 -100
- package/dist/components/ui/file-preview-dialog.mjs +3 -1
- package/dist/components/ui/kanban-column.js +408 -113
- package/dist/components/ui/kanban-column.mjs +3 -2
- package/dist/components/ui/opportunity-card.js +383 -88
- package/dist/components/ui/opportunity-card.mjs +2 -1
- package/dist/components/ui/pipeline-board.js +424 -129
- package/dist/components/ui/pipeline-board.mjs +4 -3
- package/dist/index.js +3081 -2282
- package/dist/index.mjs +39 -35
- package/dist/styles.css +1 -1
- package/package.json +5 -4
- package/src/components/index.tsx +3 -2
- package/src/components/ui/contact-alert-dialog/builder-ui.tsx +556 -0
- package/src/components/ui/contact-alert-dialog/config.ts +262 -0
- package/src/components/ui/contact-alert-dialog/contact-alert-dialog.tsx +214 -0
- package/src/components/ui/contact-alert-dialog/index.tsx +15 -0
- package/src/components/ui/contact-alert-dialog/types.ts +61 -0
- package/src/components/ui/contact-alert-dialog/utils.ts +93 -0
- package/src/components/ui/file-preview-dialog.tsx +299 -99
- package/src/components/ui/opportunity-card.tsx +328 -1
- package/src/styles/styles-css.ts +1 -1
- package/tsup.config.ts +1 -1
- package/dist/chunk-5WMFKQZ6.mjs +0 -180
- package/dist/chunk-Y24TXIFJ.mjs +0 -518
- package/dist/components/ui/contact-alert-dialog.mjs +0 -27
- package/src/components/ui/contact-alert-dialog.tsx +0 -710
|
@@ -402,6 +402,7 @@ function DropdownMenuSeparator(_a) {
|
|
|
402
402
|
}
|
|
403
403
|
|
|
404
404
|
// src/components/ui/opportunity-card.tsx
|
|
405
|
+
var import_react5 = require("react");
|
|
405
406
|
var import_lucide_react6 = require("lucide-react");
|
|
406
407
|
|
|
407
408
|
// src/lib/format-date.ts
|
|
@@ -690,16 +691,48 @@ function TaskCheckItem({
|
|
|
690
691
|
);
|
|
691
692
|
}
|
|
692
693
|
|
|
694
|
+
// src/components/ui/progress.tsx
|
|
695
|
+
var import_progress = require("@base-ui/react/progress");
|
|
696
|
+
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
697
|
+
function Progress(_a) {
|
|
698
|
+
var _b = _a, {
|
|
699
|
+
className,
|
|
700
|
+
value
|
|
701
|
+
} = _b, props = __objRest(_b, [
|
|
702
|
+
"className",
|
|
703
|
+
"value"
|
|
704
|
+
]);
|
|
705
|
+
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
706
|
+
import_progress.Progress.Root,
|
|
707
|
+
__spreadProps(__spreadValues({
|
|
708
|
+
className: cn(
|
|
709
|
+
"relative h-2 w-full overflow-hidden bg-muted",
|
|
710
|
+
className
|
|
711
|
+
),
|
|
712
|
+
"data-slot": "progress",
|
|
713
|
+
value
|
|
714
|
+
}, props), {
|
|
715
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_progress.Progress.Track, { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
716
|
+
import_progress.Progress.Indicator,
|
|
717
|
+
{
|
|
718
|
+
className: "h-full bg-primary transition-all",
|
|
719
|
+
"data-slot": "progress-indicator"
|
|
720
|
+
}
|
|
721
|
+
) })
|
|
722
|
+
})
|
|
723
|
+
);
|
|
724
|
+
}
|
|
725
|
+
|
|
693
726
|
// src/components/ui/tooltip.tsx
|
|
694
727
|
var import_tooltip = require("@base-ui/react/tooltip");
|
|
695
|
-
var
|
|
728
|
+
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
696
729
|
function TooltipProvider(_a) {
|
|
697
730
|
var _b = _a, {
|
|
698
731
|
delay = 0
|
|
699
732
|
} = _b, props = __objRest(_b, [
|
|
700
733
|
"delay"
|
|
701
734
|
]);
|
|
702
|
-
return /* @__PURE__ */ (0,
|
|
735
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
703
736
|
import_tooltip.Tooltip.Provider,
|
|
704
737
|
__spreadValues({
|
|
705
738
|
"data-slot": "tooltip-provider",
|
|
@@ -709,11 +742,11 @@ function TooltipProvider(_a) {
|
|
|
709
742
|
}
|
|
710
743
|
function Tooltip(_a) {
|
|
711
744
|
var props = __objRest(_a, []);
|
|
712
|
-
return /* @__PURE__ */ (0,
|
|
745
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_tooltip.Tooltip.Root, __spreadValues({ "data-slot": "tooltip" }, props));
|
|
713
746
|
}
|
|
714
747
|
function TooltipTrigger(_a) {
|
|
715
748
|
var props = __objRest(_a, []);
|
|
716
|
-
return /* @__PURE__ */ (0,
|
|
749
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_tooltip.Tooltip.Trigger, __spreadValues({ "data-slot": "tooltip-trigger" }, props));
|
|
717
750
|
}
|
|
718
751
|
function TooltipContent(_a) {
|
|
719
752
|
var _b = _a, {
|
|
@@ -730,7 +763,7 @@ function TooltipContent(_a) {
|
|
|
730
763
|
"style"
|
|
731
764
|
]);
|
|
732
765
|
const themeVars = useThemeVars();
|
|
733
|
-
return /* @__PURE__ */ (0,
|
|
766
|
+
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_tooltip.Tooltip.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_tooltip.Tooltip.Positioner, { sideOffset, side, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
|
|
734
767
|
import_tooltip.Tooltip.Popup,
|
|
735
768
|
__spreadProps(__spreadValues({
|
|
736
769
|
className: cn(
|
|
@@ -742,14 +775,14 @@ function TooltipContent(_a) {
|
|
|
742
775
|
}, props), {
|
|
743
776
|
children: [
|
|
744
777
|
children,
|
|
745
|
-
/* @__PURE__ */ (0,
|
|
778
|
+
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_tooltip.Tooltip.Arrow, { className: "z-50 size-2.5 rotate-45 bg-brand-secondary data-[side=bottom]:-top-1 data-[side=left]:-right-1 data-[side=right]:-left-1 data-[side=top]:-bottom-1" })
|
|
746
779
|
]
|
|
747
780
|
})
|
|
748
781
|
) }) });
|
|
749
782
|
}
|
|
750
783
|
|
|
751
784
|
// src/components/ui/opportunity-card.tsx
|
|
752
|
-
var
|
|
785
|
+
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
753
786
|
var PRIORITY_COLORS = {
|
|
754
787
|
HIGH: "var(--color-destructive)",
|
|
755
788
|
MEDIUM: "var(--color-warning)",
|
|
@@ -772,7 +805,233 @@ function resolvePriority(days, warningDays, priorityDays, priority) {
|
|
|
772
805
|
function formatLoanType(type) {
|
|
773
806
|
return type.split("-").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
|
|
774
807
|
}
|
|
808
|
+
function TaskViewCard({
|
|
809
|
+
customerName,
|
|
810
|
+
loanType,
|
|
811
|
+
loanPurposeLabel,
|
|
812
|
+
amount,
|
|
813
|
+
priority,
|
|
814
|
+
daysSinceColumnChanged,
|
|
815
|
+
warningDays,
|
|
816
|
+
priorityDays,
|
|
817
|
+
tasks = [],
|
|
818
|
+
nextTask,
|
|
819
|
+
onCardClick,
|
|
820
|
+
onViewDetails,
|
|
821
|
+
onTaskToggle,
|
|
822
|
+
onMarkAsDone,
|
|
823
|
+
onMoveToNextStage,
|
|
824
|
+
onChangePriority,
|
|
825
|
+
onDelete,
|
|
826
|
+
onPutOnHold,
|
|
827
|
+
isSubmitting = false,
|
|
828
|
+
draggable = false,
|
|
829
|
+
onDragStart,
|
|
830
|
+
className
|
|
831
|
+
}) {
|
|
832
|
+
var _a;
|
|
833
|
+
const resolvedPriority = resolvePriority(
|
|
834
|
+
daysSinceColumnChanged,
|
|
835
|
+
warningDays,
|
|
836
|
+
priorityDays,
|
|
837
|
+
priority
|
|
838
|
+
);
|
|
839
|
+
const priorityColor = PRIORITY_COLORS[resolvedPriority];
|
|
840
|
+
const completedCount = tasks.filter((t) => t.completed).length;
|
|
841
|
+
const totalCount = tasks.length;
|
|
842
|
+
const hasTasks = totalCount > 0;
|
|
843
|
+
const allDone = hasTasks && completedCount === totalCount;
|
|
844
|
+
const nextPendingTask = tasks.find((t) => !t.completed);
|
|
845
|
+
const agentName = (_a = nextPendingTask == null ? void 0 : nextPendingTask.aiAgentName) != null ? _a : null;
|
|
846
|
+
const [subtasksExpanded, setSubtasksExpanded] = (0, import_react5.useState)(false);
|
|
847
|
+
const hasMenu = onViewDetails || onChangePriority || onPutOnHold || onDelete;
|
|
848
|
+
const stopProp = (e) => {
|
|
849
|
+
e.stopPropagation();
|
|
850
|
+
};
|
|
851
|
+
const purposeLabel = loanPurposeLabel != null ? loanPurposeLabel : loanType ? formatLoanType(loanType) : null;
|
|
852
|
+
const dealRef = [
|
|
853
|
+
customerName,
|
|
854
|
+
purposeLabel,
|
|
855
|
+
amount > 0 ? formatCurrency(amount) : null
|
|
856
|
+
].filter(Boolean).join(" \xB7 ");
|
|
857
|
+
let taskHeader;
|
|
858
|
+
if (allDone) {
|
|
859
|
+
taskHeader = /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
860
|
+
"p",
|
|
861
|
+
{
|
|
862
|
+
className: "flex items-center gap-1.5 text-sm font-semibold",
|
|
863
|
+
style: { color: "var(--color-success-text)" },
|
|
864
|
+
children: [
|
|
865
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Check, { className: "size-3.5 shrink-0" }),
|
|
866
|
+
"All tasks complete"
|
|
867
|
+
]
|
|
868
|
+
}
|
|
869
|
+
);
|
|
870
|
+
} else if (nextTask) {
|
|
871
|
+
taskHeader = /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
872
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-1.5", children: [
|
|
873
|
+
agentName && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
874
|
+
import_lucide_react6.Bot,
|
|
875
|
+
{
|
|
876
|
+
className: "size-3.5 shrink-0 text-primary",
|
|
877
|
+
"aria-hidden": "true"
|
|
878
|
+
}
|
|
879
|
+
),
|
|
880
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "truncate text-sm font-semibold leading-snug", children: nextTask })
|
|
881
|
+
] }),
|
|
882
|
+
agentName && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: agentName })
|
|
883
|
+
] });
|
|
884
|
+
} else {
|
|
885
|
+
taskHeader = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-xs text-muted-foreground", children: "No tasks defined for this stage" });
|
|
886
|
+
}
|
|
887
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
888
|
+
"div",
|
|
889
|
+
{
|
|
890
|
+
className: cn(
|
|
891
|
+
"flex flex-col gap-2.5 border border-border bg-background p-3 text-foreground shadow-sm",
|
|
892
|
+
onCardClick && "cursor-pointer",
|
|
893
|
+
draggable && "cursor-grab active:cursor-grabbing",
|
|
894
|
+
isSubmitting && "opacity-60",
|
|
895
|
+
className
|
|
896
|
+
),
|
|
897
|
+
"data-slot": "opportunity-card",
|
|
898
|
+
draggable,
|
|
899
|
+
onDragStart,
|
|
900
|
+
onClick: onCardClick,
|
|
901
|
+
children: [
|
|
902
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-start gap-2", children: [
|
|
903
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "min-w-0 flex-1", children: taskHeader }),
|
|
904
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
905
|
+
"span",
|
|
906
|
+
{
|
|
907
|
+
role: "img",
|
|
908
|
+
className: "mt-0.5 inline-block size-2.5 shrink-0 rounded-full",
|
|
909
|
+
style: { backgroundColor: priorityColor },
|
|
910
|
+
"aria-label": `Priority: ${resolvedPriority}`
|
|
911
|
+
}
|
|
912
|
+
)
|
|
913
|
+
] }),
|
|
914
|
+
hasTasks && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
915
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "shrink-0 tabular-nums text-xs text-muted-foreground", children: [
|
|
916
|
+
completedCount,
|
|
917
|
+
"/",
|
|
918
|
+
totalCount
|
|
919
|
+
] }),
|
|
920
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
921
|
+
Progress,
|
|
922
|
+
{
|
|
923
|
+
value: completedCount / totalCount * 100,
|
|
924
|
+
className: cn(
|
|
925
|
+
"h-1.5 flex-1",
|
|
926
|
+
allDone && "[&_[data-slot=progress-indicator]]:bg-success"
|
|
927
|
+
)
|
|
928
|
+
}
|
|
929
|
+
)
|
|
930
|
+
] }),
|
|
931
|
+
hasTasks && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
932
|
+
"div",
|
|
933
|
+
{
|
|
934
|
+
className: "space-y-1 border-t border-border pt-2",
|
|
935
|
+
onClick: stopProp,
|
|
936
|
+
role: "presentation",
|
|
937
|
+
onKeyDown: (e) => e.stopPropagation(),
|
|
938
|
+
children: [
|
|
939
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
940
|
+
"button",
|
|
941
|
+
{
|
|
942
|
+
type: "button",
|
|
943
|
+
onClick: () => setSubtasksExpanded((v) => !v),
|
|
944
|
+
className: "flex w-full items-center justify-between text-xs text-muted-foreground hover:text-foreground",
|
|
945
|
+
children: [
|
|
946
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1", children: [
|
|
947
|
+
subtasksExpanded ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.ChevronDown, { className: "size-3" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.ChevronRight, { className: "size-3" }),
|
|
948
|
+
"Subtasks"
|
|
949
|
+
] }),
|
|
950
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { children: [
|
|
951
|
+
completedCount,
|
|
952
|
+
" / ",
|
|
953
|
+
totalCount
|
|
954
|
+
] })
|
|
955
|
+
]
|
|
956
|
+
}
|
|
957
|
+
),
|
|
958
|
+
subtasksExpanded && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("ul", { className: "space-y-1.5 pt-1", children: tasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
959
|
+
TaskCheckItem,
|
|
960
|
+
{
|
|
961
|
+
title: task.title,
|
|
962
|
+
completed: task.completed,
|
|
963
|
+
aiAgentName: task.aiAgentName,
|
|
964
|
+
onToggle: () => onTaskToggle == null ? void 0 : onTaskToggle(task.id),
|
|
965
|
+
size: "xs"
|
|
966
|
+
},
|
|
967
|
+
task.id
|
|
968
|
+
)) })
|
|
969
|
+
]
|
|
970
|
+
}
|
|
971
|
+
),
|
|
972
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "truncate text-xs text-muted-foreground", children: dealRef }),
|
|
973
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-1.5", onClick: stopProp, children: [
|
|
974
|
+
daysSinceColumnChanged !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Badge, { variant: "secondary", className: "px-1.5 text-[10px] font-normal", children: [
|
|
975
|
+
daysSinceColumnChanged,
|
|
976
|
+
"d"
|
|
977
|
+
] }),
|
|
978
|
+
hasMenu && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ml-auto", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(DropdownMenu, { children: [
|
|
979
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
980
|
+
DropdownMenuTrigger,
|
|
981
|
+
{
|
|
982
|
+
className: cn(
|
|
983
|
+
buttonVariants({ variant: "ghost", size: "icon" }),
|
|
984
|
+
"size-7 shrink-0"
|
|
985
|
+
),
|
|
986
|
+
"aria-label": "Opportunity actions",
|
|
987
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.MoreVertical, { className: "size-4" })
|
|
988
|
+
}
|
|
989
|
+
),
|
|
990
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(DropdownMenuContent, { align: "end", children: [
|
|
991
|
+
onViewDetails && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuItem, { onClick: onViewDetails, children: "View details" }),
|
|
992
|
+
onChangePriority && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuItem, { onClick: onChangePriority, children: "Change priority" }),
|
|
993
|
+
onPutOnHold && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuItem, { onClick: onPutOnHold, children: "Put on hold" }),
|
|
994
|
+
onDelete && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
995
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuSeparator, {}),
|
|
996
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuItem, { onClick: onDelete, variant: "destructive", children: "Delete" })
|
|
997
|
+
] })
|
|
998
|
+
] })
|
|
999
|
+
] }) })
|
|
1000
|
+
] }),
|
|
1001
|
+
allDone && onMoveToNextStage && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { onClick: stopProp, children: [
|
|
1002
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Separator, {}),
|
|
1003
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1004
|
+
Button,
|
|
1005
|
+
{
|
|
1006
|
+
variant: "outline",
|
|
1007
|
+
size: "sm",
|
|
1008
|
+
className: "w-full text-caption",
|
|
1009
|
+
onClick: onMoveToNextStage,
|
|
1010
|
+
disabled: isSubmitting,
|
|
1011
|
+
children: "Move to next stage"
|
|
1012
|
+
}
|
|
1013
|
+
) })
|
|
1014
|
+
] }),
|
|
1015
|
+
!allDone && nextTask && onMarkAsDone && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { onClick: stopProp, children: [
|
|
1016
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Separator, {}),
|
|
1017
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1018
|
+
Button,
|
|
1019
|
+
{
|
|
1020
|
+
variant: "default",
|
|
1021
|
+
size: "sm",
|
|
1022
|
+
className: "w-full text-caption",
|
|
1023
|
+
onClick: onMarkAsDone,
|
|
1024
|
+
disabled: isSubmitting,
|
|
1025
|
+
children: "Mark as done"
|
|
1026
|
+
}
|
|
1027
|
+
) })
|
|
1028
|
+
] })
|
|
1029
|
+
]
|
|
1030
|
+
}
|
|
1031
|
+
);
|
|
1032
|
+
}
|
|
775
1033
|
function OpportunityCard({
|
|
1034
|
+
id,
|
|
776
1035
|
customerName,
|
|
777
1036
|
customerPhone,
|
|
778
1037
|
customerEmail,
|
|
@@ -801,8 +1060,42 @@ function OpportunityCard({
|
|
|
801
1060
|
isSubmitting = false,
|
|
802
1061
|
draggable = false,
|
|
803
1062
|
onDragStart,
|
|
804
|
-
className
|
|
1063
|
+
className,
|
|
1064
|
+
viewMode = "deal"
|
|
805
1065
|
}) {
|
|
1066
|
+
if (viewMode === "task") {
|
|
1067
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1068
|
+
TaskViewCard,
|
|
1069
|
+
{
|
|
1070
|
+
customerName,
|
|
1071
|
+
customerPhone,
|
|
1072
|
+
customerEmail,
|
|
1073
|
+
additionalContacts,
|
|
1074
|
+
loanType,
|
|
1075
|
+
loanPurposeLabel,
|
|
1076
|
+
amount,
|
|
1077
|
+
date,
|
|
1078
|
+
priority,
|
|
1079
|
+
daysSinceColumnChanged,
|
|
1080
|
+
warningDays,
|
|
1081
|
+
priorityDays,
|
|
1082
|
+
tasks,
|
|
1083
|
+
nextTask,
|
|
1084
|
+
onCardClick,
|
|
1085
|
+
onViewDetails,
|
|
1086
|
+
onTaskToggle,
|
|
1087
|
+
onMarkAsDone,
|
|
1088
|
+
onMoveToNextStage,
|
|
1089
|
+
onChangePriority,
|
|
1090
|
+
onDelete,
|
|
1091
|
+
onPutOnHold,
|
|
1092
|
+
isSubmitting,
|
|
1093
|
+
draggable,
|
|
1094
|
+
onDragStart,
|
|
1095
|
+
className
|
|
1096
|
+
}
|
|
1097
|
+
);
|
|
1098
|
+
}
|
|
806
1099
|
const resolvedPriority = resolvePriority(
|
|
807
1100
|
daysSinceColumnChanged,
|
|
808
1101
|
warningDays,
|
|
@@ -815,8 +1108,10 @@ function OpportunityCard({
|
|
|
815
1108
|
const hasTasks = tasks.length > 0;
|
|
816
1109
|
const hasActions = onMarkAsDone || onMoveToNextStage;
|
|
817
1110
|
const hasMenu = onViewDetails || onChangePriority || onPutOnHold || onDelete;
|
|
818
|
-
const stopProp = (e) =>
|
|
819
|
-
|
|
1111
|
+
const stopProp = (e) => {
|
|
1112
|
+
e.stopPropagation();
|
|
1113
|
+
};
|
|
1114
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
820
1115
|
"div",
|
|
821
1116
|
{
|
|
822
1117
|
className: cn(
|
|
@@ -831,19 +1126,19 @@ function OpportunityCard({
|
|
|
831
1126
|
onDragStart,
|
|
832
1127
|
onClick: onCardClick,
|
|
833
1128
|
children: [
|
|
834
|
-
onHoldTo && /* @__PURE__ */ (0,
|
|
1129
|
+
onHoldTo && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
835
1130
|
"div",
|
|
836
1131
|
{
|
|
837
1132
|
className: "flex items-center gap-1.5 rounded border border-warning/30 bg-warning/10 px-2 py-1 text-xs font-medium",
|
|
838
1133
|
style: { color: "var(--color-warning-text)" },
|
|
839
1134
|
children: [
|
|
840
|
-
/* @__PURE__ */ (0,
|
|
1135
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Clock, { className: "size-3 shrink-0" }),
|
|
841
1136
|
"On hold until ",
|
|
842
1137
|
formatDateDayMonth(onHoldTo)
|
|
843
1138
|
]
|
|
844
1139
|
}
|
|
845
1140
|
),
|
|
846
|
-
isModifyCompletedLoan && /* @__PURE__ */ (0,
|
|
1141
|
+
isModifyCompletedLoan && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
847
1142
|
"div",
|
|
848
1143
|
{
|
|
849
1144
|
className: "flex items-center gap-1.5 rounded border border-info/30 bg-info/10 px-2 py-1 text-xs font-medium",
|
|
@@ -851,14 +1146,14 @@ function OpportunityCard({
|
|
|
851
1146
|
children: "Modify completed loan"
|
|
852
1147
|
}
|
|
853
1148
|
),
|
|
854
|
-
/* @__PURE__ */ (0,
|
|
855
|
-
/* @__PURE__ */ (0,
|
|
856
|
-
(loanPurposeLabel || loanType) && /* @__PURE__ */ (0,
|
|
857
|
-
/* @__PURE__ */ (0,
|
|
1149
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
1150
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
|
|
1151
|
+
(loanPurposeLabel || loanType) && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Badge, { variant: "outline", className: "self-start", children: loanPurposeLabel != null ? loanPurposeLabel : formatLoanType(loanType) }),
|
|
1152
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-base font-bold tabular-nums text-foreground", children: formatCurrency(amount) })
|
|
858
1153
|
] }),
|
|
859
|
-
/* @__PURE__ */ (0,
|
|
860
|
-
onLaunchAssistant && /* @__PURE__ */ (0,
|
|
861
|
-
/* @__PURE__ */ (0,
|
|
1154
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-1 -mr-1 -mt-1", onClick: stopProp, children: [
|
|
1155
|
+
onLaunchAssistant && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TooltipProvider, { delay: 0, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Tooltip, { children: [
|
|
1156
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
862
1157
|
Button,
|
|
863
1158
|
{
|
|
864
1159
|
type: "button",
|
|
@@ -867,13 +1162,13 @@ function OpportunityCard({
|
|
|
867
1162
|
className: "size-7 shrink-0",
|
|
868
1163
|
onClick: onLaunchAssistant,
|
|
869
1164
|
"aria-label": "Launch AI",
|
|
870
|
-
children: /* @__PURE__ */ (0,
|
|
1165
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Bot, { className: "size-4" })
|
|
871
1166
|
}
|
|
872
1167
|
) }),
|
|
873
|
-
/* @__PURE__ */ (0,
|
|
1168
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(TooltipContent, { children: "Launch AI" })
|
|
874
1169
|
] }) }),
|
|
875
|
-
hasMenu && /* @__PURE__ */ (0,
|
|
876
|
-
/* @__PURE__ */ (0,
|
|
1170
|
+
hasMenu && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(DropdownMenu, { children: [
|
|
1171
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
877
1172
|
DropdownMenuTrigger,
|
|
878
1173
|
{
|
|
879
1174
|
className: cn(
|
|
@@ -881,51 +1176,51 @@ function OpportunityCard({
|
|
|
881
1176
|
"size-7 shrink-0"
|
|
882
1177
|
),
|
|
883
1178
|
"aria-label": "Opportunity actions",
|
|
884
|
-
children: /* @__PURE__ */ (0,
|
|
1179
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.MoreVertical, { className: "size-4" })
|
|
885
1180
|
}
|
|
886
1181
|
),
|
|
887
|
-
/* @__PURE__ */ (0,
|
|
888
|
-
onViewDetails && /* @__PURE__ */ (0,
|
|
889
|
-
onChangePriority && /* @__PURE__ */ (0,
|
|
890
|
-
onPutOnHold && /* @__PURE__ */ (0,
|
|
891
|
-
onDelete && /* @__PURE__ */ (0,
|
|
892
|
-
/* @__PURE__ */ (0,
|
|
893
|
-
/* @__PURE__ */ (0,
|
|
1182
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(DropdownMenuContent, { align: "end", children: [
|
|
1183
|
+
onViewDetails && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuItem, { onClick: onViewDetails, children: "View details" }),
|
|
1184
|
+
onChangePriority && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuItem, { onClick: onChangePriority, children: "Change priority" }),
|
|
1185
|
+
onPutOnHold && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuItem, { onClick: onPutOnHold, children: "Put on hold" }),
|
|
1186
|
+
onDelete && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
1187
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuSeparator, {}),
|
|
1188
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuItem, { onClick: onDelete, variant: "destructive", children: "Delete" })
|
|
894
1189
|
] })
|
|
895
1190
|
] })
|
|
896
1191
|
] })
|
|
897
1192
|
] })
|
|
898
1193
|
] }),
|
|
899
|
-
/* @__PURE__ */ (0,
|
|
900
|
-
/* @__PURE__ */ (0,
|
|
901
|
-
/* @__PURE__ */ (0,
|
|
902
|
-
/* @__PURE__ */ (0,
|
|
903
|
-
additionalContacts && additionalContacts > 0 ? /* @__PURE__ */ (0,
|
|
904
|
-
/* @__PURE__ */ (0,
|
|
1194
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Separator, {}),
|
|
1195
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-1", children: [
|
|
1196
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
|
|
1197
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "truncate text-sm font-semibold text-foreground", children: customerName }),
|
|
1198
|
+
additionalContacts && additionalContacts > 0 ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Badge, { variant: "secondary", className: "shrink-0 gap-1", children: [
|
|
1199
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Users, { className: "size-3", "aria-hidden": "true" }),
|
|
905
1200
|
"Joint"
|
|
906
|
-
] }) : /* @__PURE__ */ (0,
|
|
907
|
-
/* @__PURE__ */ (0,
|
|
1201
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Badge, { variant: "secondary", className: "shrink-0 gap-1", children: [
|
|
1202
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.User, { className: "size-3", "aria-hidden": "true" }),
|
|
908
1203
|
"Individual"
|
|
909
1204
|
] })
|
|
910
1205
|
] }),
|
|
911
|
-
customerPhone && /* @__PURE__ */ (0,
|
|
912
|
-
/* @__PURE__ */ (0,
|
|
1206
|
+
customerPhone && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1207
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Phone, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
913
1208
|
customerPhone
|
|
914
1209
|
] }),
|
|
915
|
-
customerEmail && /* @__PURE__ */ (0,
|
|
916
|
-
/* @__PURE__ */ (0,
|
|
917
|
-
/* @__PURE__ */ (0,
|
|
1210
|
+
customerEmail && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1211
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Mail, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
1212
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "truncate", children: customerEmail })
|
|
918
1213
|
] })
|
|
919
1214
|
] }),
|
|
920
|
-
/* @__PURE__ */ (0,
|
|
921
|
-
/* @__PURE__ */ (0,
|
|
922
|
-
/* @__PURE__ */ (0,
|
|
923
|
-
/* @__PURE__ */ (0,
|
|
1215
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Separator, {}),
|
|
1216
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
1217
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1218
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Calendar, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
924
1219
|
formatDateShort(date)
|
|
925
1220
|
] }),
|
|
926
|
-
/* @__PURE__ */ (0,
|
|
927
|
-
daysSinceColumnChanged !== void 0 && /* @__PURE__ */ (0,
|
|
928
|
-
/* @__PURE__ */ (0,
|
|
1221
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5", children: [
|
|
1222
|
+
daysSinceColumnChanged !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
|
|
1223
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
929
1224
|
import_lucide_react6.Clock,
|
|
930
1225
|
{
|
|
931
1226
|
className: "size-3 shrink-0",
|
|
@@ -933,7 +1228,7 @@ function OpportunityCard({
|
|
|
933
1228
|
"aria-hidden": "true"
|
|
934
1229
|
}
|
|
935
1230
|
),
|
|
936
|
-
/* @__PURE__ */ (0,
|
|
1231
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
937
1232
|
"span",
|
|
938
1233
|
{
|
|
939
1234
|
className: "text-xs font-medium tabular-nums",
|
|
@@ -945,7 +1240,7 @@ function OpportunityCard({
|
|
|
945
1240
|
}
|
|
946
1241
|
)
|
|
947
1242
|
] }),
|
|
948
|
-
/* @__PURE__ */ (0,
|
|
1243
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
949
1244
|
"span",
|
|
950
1245
|
{
|
|
951
1246
|
role: "img",
|
|
@@ -957,8 +1252,8 @@ function OpportunityCard({
|
|
|
957
1252
|
] })
|
|
958
1253
|
] }),
|
|
959
1254
|
hasTasks && // stopPropagation: accordion expand/collapse + task checkboxes must not bubble to onCardClick
|
|
960
|
-
/* @__PURE__ */ (0,
|
|
961
|
-
/* @__PURE__ */ (0,
|
|
1255
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { onClick: stopProp, children: [
|
|
1256
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
962
1257
|
"div",
|
|
963
1258
|
{
|
|
964
1259
|
className: "flex gap-0.5",
|
|
@@ -967,7 +1262,7 @@ function OpportunityCard({
|
|
|
967
1262
|
"aria-valuemin": 0,
|
|
968
1263
|
"aria-valuemax": tasks.length,
|
|
969
1264
|
"aria-label": `${completedCount} of ${tasks.length} tasks complete`,
|
|
970
|
-
children: tasks.map((t, i) => /* @__PURE__ */ (0,
|
|
1265
|
+
children: tasks.map((t, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
971
1266
|
"div",
|
|
972
1267
|
{
|
|
973
1268
|
className: cn(
|
|
@@ -979,15 +1274,15 @@ function OpportunityCard({
|
|
|
979
1274
|
))
|
|
980
1275
|
}
|
|
981
1276
|
),
|
|
982
|
-
/* @__PURE__ */ (0,
|
|
983
|
-
/* @__PURE__ */ (0,
|
|
1277
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Accordion, { type: "single", collapsible: true, className: "-mx-4", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(AccordionItem, { value: "tasks", className: "border-0", children: [
|
|
1278
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(AccordionTrigger, { className: "px-4 py-1.5 text-xs font-normal text-muted-foreground hover:no-underline hover:text-foreground [&>svg]:size-3.5", children: [
|
|
984
1279
|
"Tasks (",
|
|
985
1280
|
completedCount,
|
|
986
1281
|
"/",
|
|
987
1282
|
tasks.length,
|
|
988
1283
|
")"
|
|
989
1284
|
] }),
|
|
990
|
-
/* @__PURE__ */ (0,
|
|
1285
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(AccordionContent, { className: "px-4", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "flex flex-col", children: tasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
991
1286
|
TaskCheckItem,
|
|
992
1287
|
{
|
|
993
1288
|
title: task.title,
|
|
@@ -999,23 +1294,23 @@ function OpportunityCard({
|
|
|
999
1294
|
task.id
|
|
1000
1295
|
)) }) })
|
|
1001
1296
|
] }) }),
|
|
1002
|
-
nextTask && /* @__PURE__ */ (0,
|
|
1003
|
-
/* @__PURE__ */ (0,
|
|
1297
|
+
nextTask && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-start gap-1.5 border border-primary/30 bg-primary/5 px-2 py-1.5 text-xs", children: [
|
|
1298
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1004
1299
|
import_lucide_react6.ArrowRight,
|
|
1005
1300
|
{
|
|
1006
1301
|
className: "mt-0.5 size-3 shrink-0 text-primary",
|
|
1007
1302
|
"aria-hidden": "true"
|
|
1008
1303
|
}
|
|
1009
1304
|
),
|
|
1010
|
-
/* @__PURE__ */ (0,
|
|
1011
|
-
/* @__PURE__ */ (0,
|
|
1305
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "font-medium", children: "Next:" }),
|
|
1306
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-muted-foreground", children: nextTask })
|
|
1012
1307
|
] })
|
|
1013
1308
|
] }),
|
|
1014
1309
|
hasActions && // stopPropagation: button clicks must not bubble to onCardClick
|
|
1015
|
-
/* @__PURE__ */ (0,
|
|
1016
|
-
/* @__PURE__ */ (0,
|
|
1017
|
-
(onMoveToNextStage || onMarkAsDone) && /* @__PURE__ */ (0,
|
|
1018
|
-
onMoveToNextStage && /* @__PURE__ */ (0,
|
|
1310
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { onClick: stopProp, children: [
|
|
1311
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Separator, {}),
|
|
1312
|
+
(onMoveToNextStage || onMarkAsDone) && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex gap-2 pt-2", children: [
|
|
1313
|
+
onMoveToNextStage && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1019
1314
|
Button,
|
|
1020
1315
|
{
|
|
1021
1316
|
variant: "outline",
|
|
@@ -1026,7 +1321,7 @@ function OpportunityCard({
|
|
|
1026
1321
|
children: "Move to next stage"
|
|
1027
1322
|
}
|
|
1028
1323
|
),
|
|
1029
|
-
onMarkAsDone && /* @__PURE__ */ (0,
|
|
1324
|
+
onMarkAsDone && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1030
1325
|
Button,
|
|
1031
1326
|
{
|
|
1032
1327
|
variant: "default",
|
|
@@ -1053,7 +1348,7 @@ function LeadCard({
|
|
|
1053
1348
|
isSubmitting = false,
|
|
1054
1349
|
className
|
|
1055
1350
|
}) {
|
|
1056
|
-
return /* @__PURE__ */ (0,
|
|
1351
|
+
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
|
|
1057
1352
|
"div",
|
|
1058
1353
|
{
|
|
1059
1354
|
className: cn(
|
|
@@ -1063,20 +1358,20 @@ function LeadCard({
|
|
|
1063
1358
|
),
|
|
1064
1359
|
"data-slot": "lead-card",
|
|
1065
1360
|
children: [
|
|
1066
|
-
/* @__PURE__ */ (0,
|
|
1067
|
-
/* @__PURE__ */ (0,
|
|
1068
|
-
/* @__PURE__ */ (0,
|
|
1069
|
-
customerPhone && /* @__PURE__ */ (0,
|
|
1070
|
-
/* @__PURE__ */ (0,
|
|
1361
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
1362
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
|
|
1363
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-sm font-semibold text-foreground", children: customerName }),
|
|
1364
|
+
customerPhone && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1365
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Phone, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
1071
1366
|
customerPhone
|
|
1072
1367
|
] }),
|
|
1073
|
-
customerEmail && /* @__PURE__ */ (0,
|
|
1074
|
-
/* @__PURE__ */ (0,
|
|
1075
|
-
/* @__PURE__ */ (0,
|
|
1368
|
+
customerEmail && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "flex items-center gap-1.5 text-xs text-muted-foreground", children: [
|
|
1369
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.Mail, { className: "size-3 shrink-0", "aria-hidden": "true" }),
|
|
1370
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "truncate", children: customerEmail })
|
|
1076
1371
|
] })
|
|
1077
1372
|
] }),
|
|
1078
|
-
onDelete && /* @__PURE__ */ (0,
|
|
1079
|
-
/* @__PURE__ */ (0,
|
|
1373
|
+
onDelete && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(DropdownMenu, { children: [
|
|
1374
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1080
1375
|
DropdownMenuTrigger,
|
|
1081
1376
|
{
|
|
1082
1377
|
className: cn(
|
|
@@ -1084,10 +1379,10 @@ function LeadCard({
|
|
|
1084
1379
|
"-mr-1 -mt-1 size-7 shrink-0"
|
|
1085
1380
|
),
|
|
1086
1381
|
"aria-label": "Lead actions",
|
|
1087
|
-
children: /* @__PURE__ */ (0,
|
|
1382
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_lucide_react6.MoreVertical, { className: "size-4" })
|
|
1088
1383
|
}
|
|
1089
1384
|
),
|
|
1090
|
-
/* @__PURE__ */ (0,
|
|
1385
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropdownMenuContent, { align: "end", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1091
1386
|
DropdownMenuItem,
|
|
1092
1387
|
{
|
|
1093
1388
|
onClick: onDelete,
|
|
@@ -1097,9 +1392,9 @@ function LeadCard({
|
|
|
1097
1392
|
) })
|
|
1098
1393
|
] })
|
|
1099
1394
|
] }),
|
|
1100
|
-
/* @__PURE__ */ (0,
|
|
1101
|
-
onSendLoanApplication && /* @__PURE__ */ (0,
|
|
1102
|
-
/* @__PURE__ */ (0,
|
|
1395
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Separator, {}),
|
|
1396
|
+
onSendLoanApplication && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex flex-col gap-2", children: [
|
|
1397
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1103
1398
|
Button,
|
|
1104
1399
|
{
|
|
1105
1400
|
variant: "outline",
|
|
@@ -1110,10 +1405,10 @@ function LeadCard({
|
|
|
1110
1405
|
children: "Send Loan Application Request"
|
|
1111
1406
|
}
|
|
1112
1407
|
),
|
|
1113
|
-
loanApplicationUrl && /* @__PURE__ */ (0,
|
|
1408
|
+
loanApplicationUrl && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
1114
1409
|
"Or the link below to fill out the loan application directly.",
|
|
1115
|
-
/* @__PURE__ */ (0,
|
|
1116
|
-
/* @__PURE__ */ (0,
|
|
1410
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("br", {}),
|
|
1411
|
+
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
|
|
1117
1412
|
"a",
|
|
1118
1413
|
{
|
|
1119
1414
|
href: `https://${loanApplicationUrl.replace(/^https?:\/\//, "")}`,
|
|
@@ -1131,7 +1426,7 @@ function LeadCard({
|
|
|
1131
1426
|
}
|
|
1132
1427
|
|
|
1133
1428
|
// src/components/ui/kanban-column.tsx
|
|
1134
|
-
var
|
|
1429
|
+
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
1135
1430
|
function formatTotalValue(value) {
|
|
1136
1431
|
return formatCurrency(value);
|
|
1137
1432
|
}
|
|
@@ -1187,7 +1482,7 @@ function KanbanColumn({
|
|
|
1187
1482
|
const cardId = e.dataTransfer.getData("text/plain");
|
|
1188
1483
|
if (cardId) onCardDrop(cardId);
|
|
1189
1484
|
}
|
|
1190
|
-
return /* @__PURE__ */ (0,
|
|
1485
|
+
return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1191
1486
|
"div",
|
|
1192
1487
|
{
|
|
1193
1488
|
className: cn(
|
|
@@ -1201,15 +1496,15 @@ function KanbanColumn({
|
|
|
1201
1496
|
}),
|
|
1202
1497
|
"data-slot": "kanban-column",
|
|
1203
1498
|
children: [
|
|
1204
|
-
/* @__PURE__ */ (0,
|
|
1205
|
-
/* @__PURE__ */ (0,
|
|
1206
|
-
/* @__PURE__ */ (0,
|
|
1207
|
-
/* @__PURE__ */ (0,
|
|
1499
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex flex-col gap-2 border-b border-border bg-background px-3 py-3", children: [
|
|
1500
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
|
|
1501
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("h2", { className: "text-sm font-semibold text-foreground", children: [
|
|
1502
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "text-muted-foreground", children: stage.count }),
|
|
1208
1503
|
" ",
|
|
1209
1504
|
stage.name
|
|
1210
1505
|
] }),
|
|
1211
|
-
hasMenu && /* @__PURE__ */ (0,
|
|
1212
|
-
/* @__PURE__ */ (0,
|
|
1506
|
+
hasMenu && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(DropdownMenu, { children: [
|
|
1507
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1213
1508
|
DropdownMenuTrigger,
|
|
1214
1509
|
{
|
|
1215
1510
|
className: cn(
|
|
@@ -1217,14 +1512,14 @@ function KanbanColumn({
|
|
|
1217
1512
|
"-mr-1 size-7 shrink-0"
|
|
1218
1513
|
),
|
|
1219
1514
|
"aria-label": "Column actions",
|
|
1220
|
-
children: /* @__PURE__ */ (0,
|
|
1515
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react7.MoreVertical, { className: "size-4" })
|
|
1221
1516
|
}
|
|
1222
1517
|
),
|
|
1223
|
-
/* @__PURE__ */ (0,
|
|
1224
|
-
onEditColumn && /* @__PURE__ */ (0,
|
|
1225
|
-
!isDefault && onDeleteColumn && /* @__PURE__ */ (0,
|
|
1226
|
-
onEditColumn && /* @__PURE__ */ (0,
|
|
1227
|
-
/* @__PURE__ */ (0,
|
|
1518
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(DropdownMenuContent, { align: "end", children: [
|
|
1519
|
+
onEditColumn && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuItem, { onClick: onEditColumn, children: "Edit column settings" }),
|
|
1520
|
+
!isDefault && onDeleteColumn && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
|
|
1521
|
+
onEditColumn && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(DropdownMenuSeparator, {}),
|
|
1522
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1228
1523
|
DropdownMenuItem,
|
|
1229
1524
|
{
|
|
1230
1525
|
onClick: onDeleteColumn,
|
|
@@ -1236,8 +1531,8 @@ function KanbanColumn({
|
|
|
1236
1531
|
] })
|
|
1237
1532
|
] })
|
|
1238
1533
|
] }),
|
|
1239
|
-
/* @__PURE__ */ (0,
|
|
1240
|
-
stage.growth != null ? /* @__PURE__ */ (0,
|
|
1534
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
|
|
1535
|
+
stage.growth != null ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1241
1536
|
Badge,
|
|
1242
1537
|
{
|
|
1243
1538
|
variant: "outline",
|
|
@@ -1247,11 +1542,11 @@ function KanbanColumn({
|
|
|
1247
1542
|
stage.growth
|
|
1248
1543
|
]
|
|
1249
1544
|
}
|
|
1250
|
-
) : /* @__PURE__ */ (0,
|
|
1251
|
-
/* @__PURE__ */ (0,
|
|
1545
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", {}),
|
|
1546
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "text-xs font-medium tabular-nums text-muted-foreground", children: formatTotalValue(stage.totalValue) })
|
|
1252
1547
|
] })
|
|
1253
1548
|
] }),
|
|
1254
|
-
/* @__PURE__ */ (0,
|
|
1549
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
|
|
1255
1550
|
"div",
|
|
1256
1551
|
{
|
|
1257
1552
|
className: cn(
|
|
@@ -1262,13 +1557,13 @@ function KanbanColumn({
|
|
|
1262
1557
|
onDragLeave: handleDragLeave,
|
|
1263
1558
|
onDrop: handleDrop,
|
|
1264
1559
|
children: [
|
|
1265
|
-
(isDropTarget || isDragOver) && /* @__PURE__ */ (0,
|
|
1560
|
+
(isDropTarget || isDragOver) && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "border border-dashed border-primary/40 bg-primary/5 px-3 py-2 text-center text-xs text-primary", children: [
|
|
1266
1561
|
"Drop here \u2192 ",
|
|
1267
1562
|
stage.name
|
|
1268
1563
|
] }),
|
|
1269
|
-
isLoading ? /* @__PURE__ */ (0,
|
|
1564
|
+
isLoading ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex flex-1 items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Spinner, { className: "size-5 text-muted-foreground" }) }) : opportunities.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex flex-1 items-center justify-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-xs text-muted-foreground", children: "No opportunities in this stage" }) }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
|
|
1270
1565
|
opportunities.map(
|
|
1271
|
-
(opp) => onSendLoanApplication ? /* @__PURE__ */ (0,
|
|
1566
|
+
(opp) => onSendLoanApplication ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1272
1567
|
LeadCard,
|
|
1273
1568
|
{
|
|
1274
1569
|
id: opp.id,
|
|
@@ -1281,7 +1576,7 @@ function KanbanColumn({
|
|
|
1281
1576
|
isSubmitting: submittingOpportunityId === opp.id
|
|
1282
1577
|
},
|
|
1283
1578
|
opp.id
|
|
1284
|
-
) : /* @__PURE__ */ (0,
|
|
1579
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1285
1580
|
OpportunityCard,
|
|
1286
1581
|
__spreadProps(__spreadValues({}, opp), {
|
|
1287
1582
|
draggable: !!onCardDrop,
|
|
@@ -1303,12 +1598,12 @@ function KanbanColumn({
|
|
|
1303
1598
|
opp.id
|
|
1304
1599
|
)
|
|
1305
1600
|
),
|
|
1306
|
-
hasMore && /* @__PURE__ */ (0,
|
|
1601
|
+
hasMore && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
1307
1602
|
"div",
|
|
1308
1603
|
{
|
|
1309
1604
|
ref: loaderRef,
|
|
1310
1605
|
className: "flex min-h-[50px] items-center justify-center",
|
|
1311
|
-
children: isLoadingMore && /* @__PURE__ */ (0,
|
|
1606
|
+
children: isLoadingMore && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Spinner, { className: "size-5 text-muted-foreground" })
|
|
1312
1607
|
}
|
|
1313
1608
|
)
|
|
1314
1609
|
] })
|