mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-22 12:41:31 +10:00
release: v4.3.1
This commit is contained in:
@ -104,7 +104,13 @@ export const AwardsDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -98,7 +98,13 @@ export const CertificationsDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -131,7 +131,13 @@ export const CustomSectionDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -141,7 +141,13 @@ export const EducationDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -117,7 +117,13 @@ export const ExperienceDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -74,10 +74,10 @@ export const LanguagesDialog = () => {
|
||||
}}
|
||||
/>
|
||||
|
||||
{field.value === 0 ? (
|
||||
<span className="text-base font-bold">{t`Hidden`}</span>
|
||||
) : (
|
||||
{field.value > 0 ? (
|
||||
<span className="text-base font-bold">{field.value}</span>
|
||||
) : (
|
||||
<span className="text-base font-bold">{t`Hidden`}</span>
|
||||
)}
|
||||
</div>
|
||||
</FormControl>
|
||||
|
||||
@ -51,7 +51,7 @@ export const ProfilesDialog = () => {
|
||||
<FormLabel>{t`Network`}</FormLabel>
|
||||
<FormControl>
|
||||
{/* eslint-disable-next-line lingui/no-unlocalized-strings */}
|
||||
<Input {...field} placeholder="LinkedIn" />
|
||||
<Input {...field} placeholder="GitHub" />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
@ -79,7 +79,7 @@ export const ProfilesDialog = () => {
|
||||
<FormItem className="sm:col-span-2">
|
||||
<FormLabel>{t`Website`}</FormLabel>
|
||||
<FormControl>
|
||||
<URLInput {...field} placeholder="https://linkedin.com/in/johndoe" />
|
||||
<URLInput {...field} placeholder="https://github.com/johndoe" />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
@ -100,7 +100,7 @@ export const ProfilesDialog = () => {
|
||||
<Input
|
||||
{...field}
|
||||
id="iconSlug"
|
||||
placeholder="linkedin"
|
||||
placeholder="github"
|
||||
onChange={(event) => {
|
||||
field.onChange(event);
|
||||
handleIconChange(event);
|
||||
|
||||
@ -111,7 +111,13 @@ export const ProjectsDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -98,7 +98,13 @@ export const PublicationsDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -84,7 +84,13 @@ export const ReferencesDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -88,10 +88,10 @@ export const SkillsDialog = () => {
|
||||
}}
|
||||
/>
|
||||
|
||||
{field.value === 0 ? (
|
||||
<span className="text-base font-bold">{t`Hidden`}</span>
|
||||
) : (
|
||||
{field.value > 0 ? (
|
||||
<span className="text-base font-bold">{field.value}</span>
|
||||
) : (
|
||||
<span className="text-base font-bold">{t`Hidden`}</span>
|
||||
)}
|
||||
</div>
|
||||
</FormControl>
|
||||
|
||||
@ -112,7 +112,13 @@ export const VolunteerDialog = () => {
|
||||
{...field}
|
||||
content={field.value}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
field.onChange(value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
field.onChange(value);
|
||||
|
||||
@ -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 }}
|
||||
>
|
||||
<div className="flex items-end justify-between space-x-2">
|
||||
<div className="flex items-end justify-between">
|
||||
<Button
|
||||
size="icon"
|
||||
variant="link"
|
||||
variant="ghost"
|
||||
className="shrink-0"
|
||||
onPointerDown={(event) => {
|
||||
controls.start(event);
|
||||
@ -52,12 +52,12 @@ export const CustomField = ({ field, onChange, onRemove }: CustomFieldProps) =>
|
||||
<Popover>
|
||||
<Tooltip content={t`Icon`}>
|
||||
<PopoverTrigger asChild>
|
||||
<Button size="icon" variant="ghost">
|
||||
<Button size="icon" variant="ghost" className="shrink-0">
|
||||
{field.icon ? <i className={cn(`ph ph-${field.icon}`)} /> : <Envelope />}
|
||||
</Button>
|
||||
</PopoverTrigger>
|
||||
</Tooltip>
|
||||
<PopoverContent className="p-1.5">
|
||||
<PopoverContent side="bottom" align="start" className="flex flex-col gap-y-1.5 p-1.5">
|
||||
<Input
|
||||
value={field.icon}
|
||||
placeholder={t`Enter Phosphor Icon`}
|
||||
@ -65,19 +65,35 @@ export const CustomField = ({ field, onChange, onRemove }: CustomFieldProps) =>
|
||||
onChange({ ...field, icon: event.target.value });
|
||||
}}
|
||||
/>
|
||||
|
||||
<p className="text-xs opacity-80">
|
||||
<Trans>
|
||||
Visit{" "}
|
||||
<a
|
||||
href="https://phosphoricons.com/"
|
||||
target="_blank"
|
||||
className="underline"
|
||||
rel="noopener noreferrer nofollow"
|
||||
>
|
||||
Phosphor Icons
|
||||
</a>{" "}
|
||||
for a list of available icons
|
||||
</Trans>
|
||||
</p>
|
||||
</PopoverContent>
|
||||
</Popover>
|
||||
|
||||
<Input
|
||||
className="mx-2"
|
||||
placeholder={t`Name`}
|
||||
value={field.name}
|
||||
className="!ml-0"
|
||||
onChange={(event) => {
|
||||
handleChange("name", event.target.value);
|
||||
}}
|
||||
/>
|
||||
|
||||
<Input
|
||||
className="mx-2"
|
||||
placeholder={t`Value`}
|
||||
value={field.value}
|
||||
onChange={(event) => {
|
||||
@ -87,8 +103,8 @@ export const CustomField = ({ field, onChange, onRemove }: CustomFieldProps) =>
|
||||
|
||||
<Button
|
||||
size="icon"
|
||||
variant="link"
|
||||
className="!ml-0 shrink-0"
|
||||
variant="ghost"
|
||||
className="shrink-0"
|
||||
onClick={() => {
|
||||
onRemove(field.id);
|
||||
}}
|
||||
@ -111,7 +127,7 @@ export const CustomFieldsSection = ({ className }: Props) => {
|
||||
const onAddCustomField = () => {
|
||||
setValue("basics.customFields", [
|
||||
...customFields,
|
||||
{ id: createId(), icon: "", name: "", value: "" },
|
||||
{ id: createId(), icon: "envelope", name: "", value: "" },
|
||||
]);
|
||||
};
|
||||
|
||||
|
||||
@ -70,12 +70,15 @@ export const SectionBase = <T extends SectionItem>({ id, title, description }: P
|
||||
const onCreate = () => {
|
||||
open("create", { id });
|
||||
};
|
||||
|
||||
const onUpdate = (item: T) => {
|
||||
open("update", { id, item });
|
||||
};
|
||||
|
||||
const onDuplicate = (item: T) => {
|
||||
open("duplicate", { id, item });
|
||||
};
|
||||
|
||||
const onDelete = (item: T) => {
|
||||
open("delete", { id, item });
|
||||
};
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import { t } from "@lingui/macro";
|
||||
import { createId } from "@paralleldrive/cuid2";
|
||||
import { CopySimple, PencilSimple, Plus } from "@phosphor-icons/react";
|
||||
import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
|
||||
import { SectionItem, SectionWithItem } from "@reactive-resume/schema";
|
||||
import {
|
||||
AlertDialog,
|
||||
@ -14,6 +15,7 @@ import {
|
||||
Button,
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
@ -158,6 +160,10 @@ export const SectionDialog = <T extends SectionItem>({
|
||||
</h2>
|
||||
</div>
|
||||
</DialogTitle>
|
||||
|
||||
<VisuallyHidden>
|
||||
<DialogDescription />
|
||||
</VisuallyHidden>
|
||||
</DialogHeader>
|
||||
|
||||
{children}
|
||||
|
||||
@ -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 = ({
|
||||
</div>
|
||||
|
||||
{/* List Item */}
|
||||
<ContextMenu>
|
||||
<ContextMenuTrigger asChild>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<div
|
||||
className={cn(
|
||||
"flex-1 cursor-context-menu p-4 hover:bg-secondary-accent",
|
||||
@ -80,25 +81,26 @@ export const SectionListItem = ({
|
||||
<h4 className="font-medium leading-relaxed">{title}</h4>
|
||||
{description && <p className="text-xs leading-relaxed opacity-50">{description}</p>}
|
||||
</div>
|
||||
</ContextMenuTrigger>
|
||||
<ContextMenuContent>
|
||||
<ContextMenuCheckboxItem checked={visible} onCheckedChange={onToggleVisibility}>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent>
|
||||
<DropdownMenuCheckboxItem checked={visible} onCheckedChange={onToggleVisibility}>
|
||||
<span className="-ml-0.5">{t`Visible`}</span>
|
||||
</ContextMenuCheckboxItem>
|
||||
<ContextMenuItem onClick={onUpdate}>
|
||||
</DropdownMenuCheckboxItem>
|
||||
<DropdownMenuSeparator />
|
||||
<DropdownMenuItem onClick={onUpdate}>
|
||||
<PencilSimple size={14} />
|
||||
<span className="ml-2">{t`Edit`}</span>
|
||||
</ContextMenuItem>
|
||||
<ContextMenuItem onClick={onDuplicate}>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem onClick={onDuplicate}>
|
||||
<CopySimple size={14} />
|
||||
<span className="ml-2">{t`Copy`}</span>
|
||||
</ContextMenuItem>
|
||||
<ContextMenuItem className="text-error" onClick={onDelete}>
|
||||
</DropdownMenuItem>
|
||||
<DropdownMenuItem className="text-error" onClick={onDelete}>
|
||||
<TrashSimple size={14} />
|
||||
<span className="ml-2">{t`Remove`}</span>
|
||||
</ContextMenuItem>
|
||||
</ContextMenuContent>
|
||||
</ContextMenu>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</div>
|
||||
</motion.section>
|
||||
);
|
||||
|
||||
@ -32,7 +32,13 @@ export const SummarySection = () => {
|
||||
<RichInput
|
||||
content={section.content}
|
||||
footer={(editor) => (
|
||||
<AiActions value={editor.getText()} onChange={editor.commands.setContent} />
|
||||
<AiActions
|
||||
value={editor.getText()}
|
||||
onChange={(value) => {
|
||||
editor.commands.setContent(value, true);
|
||||
setValue("sections.summary.content", value);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
onChange={(value) => {
|
||||
setValue("sections.summary.content", value);
|
||||
|
||||
Reference in New Issue
Block a user