Skip to content

Commit fefa29f

Browse files
authored
[CRM][Fullstack] - Sort + Searches and Cleanup (#295)
* Searching for templates now shows the proper count in tabs * Adjusted task template card sizes based on viewport * progress on position archive and deleting * Rename organization settings tab * Rename organization sidebar tab * Fixed archive and position delete behavior * Edited toast copy to be consisted throughout the app * Added unarchiving support * Added an env.example for the ws directory * Multi-select positions in assessment templates * Init sorting * prettier * remove useMemo * update hook * Updated sort functions * prettier * Removed id based selection in task template list * prettier
1 parent f6743f5 commit fefa29f

25 files changed

Lines changed: 719 additions & 172 deletions

src/app/(web)/crm/assessment-templates/[id]/edit/page.tsx

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
'use client';
22

3-
import { use, useState } from 'react';
3+
import { use } from 'react';
44
import { ChevronDown, Users } from 'lucide-react';
55
import Image from 'next/image';
6-
import { toast } from 'sonner';
76
import AddTaskModal from '@/lib/components/modal/AddTaskModal';
87
import AssessmentTemplateEditorSidebar from '@/lib/components/templates/AssessmentTemplateEditorSidebar';
98
import AssessmentTaskTemplatePreviewPanel from '@/lib/components/templates/AssessmentTaskTemplatePreviewPanel';
109
import Breadcrumbs from '@/lib/components/core/Breadcrumbs';
1110
import useAssessmentTemplateEditPage from '@/lib/hooks/useAssessmentTemplateEditPage';
1211
import { Combobox } from '@/lib/components/ui/Combobox';
12+
import { RemovableChip } from '@/lib/components/ui/RemovableChip';
1313

1414
export default function AssessmentTemplateEditPage({
1515
params,
@@ -23,7 +23,7 @@ export default function AssessmentTemplateEditPage({
2323
error,
2424
title,
2525
positions,
26-
selectedPositionId,
26+
selectedPositionIds,
2727
sections,
2828
notes,
2929
selectedSection,
@@ -35,22 +35,12 @@ export default function AssessmentTemplateEditPage({
3535
deleteSection,
3636
reorderSections,
3737
selectSection,
38-
updateSelectedPosition,
39-
save,
38+
updateSelectedPositions,
39+
onSave,
40+
addTaskOpen,
41+
setAddTaskOpen,
4042
} = useAssessmentTemplateEditPage(id);
4143

42-
const [addTaskOpen, setAddTaskOpen] = useState(false);
43-
44-
const onSave = async () => {
45-
const result = await save();
46-
if (result.success) {
47-
toast.success('Assessment template saved');
48-
} else {
49-
const message = result.errorMessage ?? 'Failed to save assessment template';
50-
toast.error(message);
51-
}
52-
};
53-
5444
if (isLoading) {
5545
return (
5646
<div className="flex h-full flex-col items-center justify-center gap-4">
@@ -97,25 +87,55 @@ export default function AssessmentTemplateEditPage({
9787
<div className="w-full max-w-[320px] shrink-0">
9888
<Combobox
9989
options={positionOptions}
100-
value={selectedPositionId ?? undefined}
101-
onChange={(value) => updateSelectedPosition((value as string) || null)}
102-
placeholder="Assign to a position"
90+
value={selectedPositionIds}
91+
onChange={(value) => updateSelectedPositions(value as string[])}
92+
multiple
93+
variant="checkbox"
94+
showSelectAll
95+
placeholder="Assign to position(s)"
10396
searchPlaceholder="Search positions..."
10497
emptyText="No positions found."
10598
showSearchIcon
106-
triggerClassName="h-14 rounded-xl border px-4"
99+
triggerClassName="rounded-xl border px-4"
107100
contentClassName="rounded-xl"
108101
trigger={
109102
<button
110103
type="button"
111-
className="border-sarge-gray-200 bg-sarge-gray-0 text-sarge-gray-800 flex h-14 w-full items-center gap-3 rounded-xl border px-4 text-left"
104+
className="border-sarge-gray-200 bg-sarge-gray-0 text-sarge-gray-800 flex min-h-14 w-full items-center gap-3 rounded-xl border px-4 text-left"
112105
>
113106
<Users className="text-sarge-gray-600 size-5 shrink-0" />
114-
<span className="text-label-s min-w-0 flex-1 truncate">
115-
{positions.find(
116-
(position) => position.id === selectedPositionId
117-
)?.title ?? 'Assign to a position'}
118-
</span>
107+
<div className="flex min-w-0 flex-1 flex-nowrap items-center gap-2 overflow-hidden py-2">
108+
{selectedPositionIds.length > 0 ? (
109+
<>
110+
{selectedPositionIds.slice(0, 2).map((id) => {
111+
const pos = positions.find((p) => p.id === id);
112+
if (!pos) return null;
113+
return (
114+
<RemovableChip
115+
key={id}
116+
label={pos.title}
117+
onRemove={() =>
118+
updateSelectedPositions(
119+
selectedPositionIds.filter(
120+
(x) => x !== id
121+
)
122+
)
123+
}
124+
/>
125+
);
126+
})}
127+
{selectedPositionIds.length > 2 && (
128+
<span className="text-label-s text-sarge-gray-500 shrink-0">
129+
...
130+
</span>
131+
)}
132+
</>
133+
) : (
134+
<span className="text-label-s text-sarge-gray-500">
135+
Assign to position(s)
136+
</span>
137+
)}
138+
</div>
119139
<ChevronDown className="text-sarge-gray-600 size-5 shrink-0" />
120140
</button>
121141
}

0 commit comments

Comments
 (0)