diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/awards.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/awards.tsx index 969d14c0..04973795 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/awards.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/awards.tsx @@ -104,7 +104,13 @@ export const AwardsDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/certifications.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/certifications.tsx index 99004fa2..93c30e28 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/certifications.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/certifications.tsx @@ -98,7 +98,13 @@ export const CertificationsDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/custom-section.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/custom-section.tsx index 6485e38e..e47fc459 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/custom-section.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/custom-section.tsx @@ -131,7 +131,13 @@ export const CustomSectionDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/education.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/education.tsx index bf301adb..85550053 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/education.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/education.tsx @@ -141,7 +141,13 @@ export const EducationDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/experience.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/experience.tsx index eb737ece..ec522b95 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/experience.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/experience.tsx @@ -117,7 +117,13 @@ export const ExperienceDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/languages.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/languages.tsx index b80d7953..5176ad33 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/languages.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/languages.tsx @@ -74,10 +74,10 @@ export const LanguagesDialog = () => { }} /> - {field.value === 0 ? ( - {t`Hidden`} - ) : ( + {field.value > 0 ? ( {field.value} + ) : ( + {t`Hidden`} )} diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/profiles.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/profiles.tsx index db089251..e3250034 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/profiles.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/profiles.tsx @@ -51,7 +51,7 @@ export const ProfilesDialog = () => { {t`Network`} {/* eslint-disable-next-line lingui/no-unlocalized-strings */} - + @@ -79,7 +79,7 @@ export const ProfilesDialog = () => { {t`Website`} - + @@ -100,7 +100,7 @@ export const ProfilesDialog = () => { { field.onChange(event); handleIconChange(event); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/projects.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/projects.tsx index af1f7c2a..923aa226 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/projects.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/projects.tsx @@ -111,7 +111,13 @@ export const ProjectsDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/publications.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/publications.tsx index d42d7526..c1c1651a 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/publications.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/publications.tsx @@ -98,7 +98,13 @@ export const PublicationsDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/references.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/references.tsx index 71ad8ca6..617e58a9 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/references.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/references.tsx @@ -84,7 +84,13 @@ export const ReferencesDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/skills.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/skills.tsx index 8fc14741..cda2e5eb 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/skills.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/skills.tsx @@ -88,10 +88,10 @@ export const SkillsDialog = () => { }} /> - {field.value === 0 ? ( - {t`Hidden`} - ) : ( + {field.value > 0 ? ( {field.value} + ) : ( + {t`Hidden`} )} diff --git a/apps/client/src/pages/builder/sidebars/left/dialogs/volunteer.tsx b/apps/client/src/pages/builder/sidebars/left/dialogs/volunteer.tsx index 96285fb8..4bfa244a 100644 --- a/apps/client/src/pages/builder/sidebars/left/dialogs/volunteer.tsx +++ b/apps/client/src/pages/builder/sidebars/left/dialogs/volunteer.tsx @@ -112,7 +112,13 @@ export const VolunteerDialog = () => { {...field} content={field.value} footer={(editor) => ( - + { + editor.commands.setContent(value, true); + field.onChange(value); + }} + /> )} onChange={(value) => { field.onChange(value); diff --git a/apps/client/src/pages/builder/sidebars/left/sections/custom/section.tsx b/apps/client/src/pages/builder/sidebars/left/sections/custom/section.tsx index 5a618474..edba64c8 100644 --- a/apps/client/src/pages/builder/sidebars/left/sections/custom/section.tsx +++ b/apps/client/src/pages/builder/sidebars/left/sections/custom/section.tsx @@ -1,4 +1,4 @@ -import { t } from "@lingui/macro"; +import { t, Trans } from "@lingui/macro"; import { createId } from "@paralleldrive/cuid2"; import { DotsSixVertical, Envelope, Plus, X } from "@phosphor-icons/react"; import { CustomField as ICustomField } from "@reactive-resume/schema"; @@ -37,10 +37,10 @@ export const CustomField = ({ field, onChange, onRemove }: CustomFieldProps) => animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -50 }} > -
+
- + onChange({ ...field, icon: event.target.value }); }} /> + +

+ + Visit{" "} + + Phosphor Icons + {" "} + for a list of available icons + +

{ handleChange("name", event.target.value); }} /> { @@ -87,8 +103,8 @@ export const CustomField = ({ field, onChange, onRemove }: CustomFieldProps) =>
+ + + + {children} diff --git a/apps/client/src/pages/builder/sidebars/left/sections/shared/section-list-item.tsx b/apps/client/src/pages/builder/sidebars/left/sections/shared/section-list-item.tsx index 10085e3a..39f271d5 100644 --- a/apps/client/src/pages/builder/sidebars/left/sections/shared/section-list-item.tsx +++ b/apps/client/src/pages/builder/sidebars/left/sections/shared/section-list-item.tsx @@ -3,11 +3,12 @@ import { CSS } from "@dnd-kit/utilities"; import { t } from "@lingui/macro"; import { CopySimple, DotsSixVertical, PencilSimple, TrashSimple } from "@phosphor-icons/react"; import { - ContextMenu, - ContextMenuCheckboxItem, - ContextMenuContent, - ContextMenuItem, - ContextMenuTrigger, + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, } from "@reactive-resume/ui"; import { cn } from "@reactive-resume/utils"; import { motion } from "framer-motion"; @@ -68,8 +69,8 @@ export const SectionListItem = ({
{/* List Item */} - - + +
{title} {description &&

{description}

}
-
- - + + + {t`Visible`} - - + + + {t`Edit`} - - + + {t`Copy`} - - + + {t`Remove`} - - -
+ + + ); diff --git a/apps/client/src/pages/builder/sidebars/left/sections/summary.tsx b/apps/client/src/pages/builder/sidebars/left/sections/summary.tsx index de30bdad..7e038143 100644 --- a/apps/client/src/pages/builder/sidebars/left/sections/summary.tsx +++ b/apps/client/src/pages/builder/sidebars/left/sections/summary.tsx @@ -32,7 +32,13 @@ export const SummarySection = () => { ( - + { + editor.commands.setContent(value, true); + setValue("sections.summary.content", value); + }} + /> )} onChange={(value) => { setValue("sections.summary.content", value); diff --git a/apps/client/src/pages/dashboard/resumes/_layouts/grid/_components/base-card.tsx b/apps/client/src/pages/dashboard/resumes/_layouts/grid/_components/base-card.tsx index 6f619f75..2b1bfee1 100644 --- a/apps/client/src/pages/dashboard/resumes/_layouts/grid/_components/base-card.tsx +++ b/apps/client/src/pages/dashboard/resumes/_layouts/grid/_components/base-card.tsx @@ -1,5 +1,6 @@ import { Card } from "@reactive-resume/ui"; import { cn } from "@reactive-resume/utils"; +import { forwardRef } from "react"; import Tilt from "react-parallax-tilt"; import { defaultTiltProps } from "@/client/constants/parallax-tilt"; @@ -10,16 +11,19 @@ type Props = { children?: React.ReactNode; }; -export const BaseCard = ({ children, className, onClick }: Props) => ( - - - {children} - - +export const BaseCard = forwardRef( + ({ children, className, onClick }, ref) => ( + + + {children} + + + ), ); diff --git a/apps/client/src/pages/dashboard/resumes/_layouts/grid/_components/resume-card.tsx b/apps/client/src/pages/dashboard/resumes/_layouts/grid/_components/resume-card.tsx index f1da2fd9..4eefd04c 100644 --- a/apps/client/src/pages/dashboard/resumes/_layouts/grid/_components/resume-card.tsx +++ b/apps/client/src/pages/dashboard/resumes/_layouts/grid/_components/resume-card.tsx @@ -9,11 +9,11 @@ import { } from "@phosphor-icons/react"; import { ResumeDto } from "@reactive-resume/dto"; import { - ContextMenu, - ContextMenuContent, - ContextMenuItem, - ContextMenuSeparator, - ContextMenuTrigger, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, } from "@reactive-resume/ui"; import { cn } from "@reactive-resume/utils"; import dayjs from "dayjs"; @@ -33,6 +33,7 @@ export const ResumeCard = ({ resume }: Props) => { const { open } = useDialog("resume"); const { open: lockOpen } = useDialog("lock"); + const template = resume.data.metadata.template; const lastUpdated = dayjs().to(resume.updatedAt); const onOpen = () => { @@ -56,9 +57,9 @@ export const ResumeCard = ({ resume }: Props) => { }; return ( - - - + + + {resume.locked && ( {

{resume.title}

{t`Last updated ${lastUpdated}`}

-
-
- - + {template} + + + + + {t`Open`} - - + + {t`Rename`} - - + + {t`Duplicate`} - + {resume.locked ? ( - + {t`Unlock`} - + ) : ( - + {t`Lock`} - + )} - - + + {t`Delete`} - - -
+ + + ); }; diff --git a/apps/client/src/pages/dashboard/settings/_sections/openai.tsx b/apps/client/src/pages/dashboard/settings/_sections/openai.tsx index 6f5cdf43..c0dc6aa2 100644 --- a/apps/client/src/pages/dashboard/settings/_sections/openai.tsx +++ b/apps/client/src/pages/dashboard/settings/_sections/openai.tsx @@ -12,7 +12,6 @@ import { FormMessage, Input, } from "@reactive-resume/ui"; -import { cn } from "@reactive-resume/utils"; import { useForm } from "react-hook-form"; import { z } from "zod"; @@ -29,6 +28,7 @@ const formSchema = z.object({ .string() // eslint-disable-next-line lingui/no-unlocalized-strings .regex(/https?:\/\/[^/]+\/?v1$/, "That doesn't look like a valid URL") + .or(z.literal("")) .default(""), model: z.string().default(DEFAULT_MODEL), maxTokens: z.number().default(DEFAULT_MAX_TOKENS), @@ -39,7 +39,8 @@ type FormValues = z.infer; export const OpenAISettings = () => { const { apiKey, setApiKey, baseURL, setBaseURL, model, setModel, maxTokens, setMaxTokens } = useOpenAiStore(); - const isEnabled = !!apiKey || !!baseURL || !!model || !!maxTokens; + + const isEnabled = !!apiKey; const form = useForm({ resolver: zodResolver(formSchema), @@ -75,7 +76,7 @@ export const OpenAISettings = () => { return (
-

{t`OpenAI Integration`}

+

{t`OpenAI/Ollama Integration`}

{t`You can make use of the OpenAI API to help you generate content, or improve your writing while composing your resume.`}

@@ -97,16 +98,13 @@ export const OpenAISettings = () => { from your settings.

-
-

{t`Ollama Integration`}

- -

- You can integrate with Ollama simply by setting the API key to `sk-1234567890abcdef` and - the Base URL to your Ollama URL, i.e. `http://localhost:11434/v1`. You can also pick and - choose models and set the max tokens. + You can also integrate with Ollama simply by setting the API key to + `sk-1234567890abcdef` and the Base URL to your Ollama URL, i.e. + `http://localhost:11434/v1`. You can also pick and choose models and set the max tokens + as per your preference.

@@ -118,7 +116,7 @@ export const OpenAISettings = () => { control={form.control} render={({ field }) => ( - {t`OpenAI / Ollama API Key`} + {t`OpenAI/Ollama API Key`} @@ -172,12 +170,7 @@ export const OpenAISettings = () => { )} /> -
+