Merge pull request #102 from AmruthPillai/develop

Bringing back Parse-able Resumes, Polish Language Added
This commit is contained in:
Amruth Pillai
2020-04-16 14:51:21 +05:30
committed by GitHub
32 changed files with 251 additions and 238 deletions

View File

@ -8,6 +8,12 @@ All notable changes to this project will be documented in this file.
## April 2020
### April 16, 2020
- Brought Back Browser Print Method, you can now print parseable resumes
- Modified Templates to use ID as Key in items, instead of names
- Added Language: Polish
### April 11, 2020
- Added Language: Danish

View File

@ -25,6 +25,7 @@ If you are already familiar with the Crowdin platform and want to contribute you
- German `de`
- Hindi `hi`
- Kannada `kn`
- Polish `pl`
- Portuguese `pt`
- Spanish `es`
@ -45,7 +46,6 @@ If you are already familiar with the Crowdin platform and want to contribute you
- Malayalam `ml`
- Marathi `mr`
- Norwegian `no`
- Polish `pl`
- Punjabi `pa`
- Romanian `ro`
- Russian `ru`

View File

@ -51,13 +51,17 @@ const App = () => {
style={{ outline: 'none' }}
>
<div id="page" ref={pageRef} className="shadow-2xl break-words">
{templates.find((x) => theme.layout.toLowerCase() === x.key).component()}
{templates.find(x => theme.layout.toLowerCase() === x.key).component()}
</div>
</PanZoom>
<PageController />
</div>
<div id="printPage" className="break-words">
{templates.find(x => theme.layout.toLowerCase() === x.key).component()}
</div>
<RightSidebar />
<PanZoomAnimation />

View File

@ -38,6 +38,10 @@ const languages = [
code: 'kn',
name: 'Kannada',
},
{
code: 'pl',
name: 'Polish',
},
{
code: 'pt',
name: 'Portuguese',

View File

@ -29,6 +29,10 @@
"multiPageA4": "Multi-Page A4"
}
},
"helpText": [
"This export method makes use of HTML canvas to convert the resume to an image and print it on a PDF, which means it will lose all selecting/parsing capabilities.",
"If that is important to you, please try printing the resume instead, using Cmd/Ctrl + P or the print button below. The result may vary as the output is browser dependent, but it is known to work best on the latest version of Google Chrome."
],
"buttons": {
"cancel": "Cancel",
"saveAsPdf": "Save as PDF"

View File

@ -1,25 +1,45 @@
{
"heading": {
"placeholder": "Heading"
},
"item": {
"add": "Add {{- heading}}",
"add": "Dodaj {{- heading}}",
"startDate": {
"label": "Start Date",
"placeholder": "March 2018"
"label": "Data rozpoczęcia"
},
"endDate": {
"label": "End Date",
"placeholder": "March 2022"
"label": "Data zakończenia"
},
"description": {
"label": "Description"
"label": "Opis"
}
},
"buttons": {
"add": {
"label": "Add"
"label": "Dodaj"
}
},
"markdownHelpText": "You can use <1>GitHub Flavored Markdown</1> to style this section of the text."
"printDialog": {
"heading": "Pobierz swoje CV",
"quality": {
"label": "Jakość"
},
"printType": {
"label": "Rodzaj",
"types": {
"unconstrained": "Nieograniczony",
"fitInA4": "Dopasuj do A4",
"multiPageA4": "Wielostronne A4"
}
},
"helpText": [
"Ta metoda eksportu wykorzystuje HTML do konwersji CV jako obrazu i wydrukowania go w formacie PDF, co oznacza, że utraci on wszystkie możliwości zaznaczania / analizowania.",
"Jeśli jest to dla Ciebie ważne, spróbuj wydrukować CV za pomocą Ctrl + P lub przycisku drukowania poniżej. Wynik może się różnić, ponieważ wynik zależy od przeglądarki, ale wiemy, że najlepiej działa w najnowszej wersji Google Chrome."
],
"buttons": {
"cancel": "Anuluj",
"saveAsPdf": "Zapisz jako PDF"
}
},
"panZoomAnimation": {
"helpText": "Możesz przesuwać i powiększać obszar roboczy w dowolnym momencie, aby przyjrzeć się swojemu CV."
},
"markdownHelpText": "Możesz użyć <1>GitHub Flavored Markdown</1> aby zmienić styl tej sekcji tekstu."
}

View File

@ -1,13 +1,8 @@
{
"title": {
"label": "Title",
"placeholder": "Math & Science Olympiad"
"label": "Tytuł"
},
"subtitle": {
"label": "Subtitle",
"placeholder": "First Place, International Level"
},
"description": {
"placeholder": "You can write about what qualities made you succeed in getting this award."
"label": "Podtytuł"
}
}

View File

@ -1,13 +1,8 @@
{
"title": {
"label": "Title",
"placeholder": "Android Development Nanodegree"
"label": "Nazwa"
},
"subtitle": {
"label": "Subtitle",
"placeholder": "Udacity"
},
"description": {
"placeholder": "You can write about what you learned from your certification program."
"label": "Wydany przez"
}
}

View File

@ -1,16 +1,11 @@
{
"name": {
"label": "Name",
"placeholder": "Harvard University"
"label": "Nazwa"
},
"major": {
"label": "Major",
"placeholder": "Masters in Computer Science"
"label": "Kierunek"
},
"grade": {
"label": "Grade"
},
"description": {
"placeholder": "You can write about projects or special credit classes that you took while studying at this school."
"label": "Stopień"
}
}

View File

@ -1,10 +1,8 @@
{
"key": {
"label": "Key",
"placeholder": "Date of Birth"
"label": "Nazwa/Klucz"
},
"value": {
"label": "Value",
"placeholder": "6th August 1995"
"label": "Wartość"
}
}

View File

@ -1,9 +1,8 @@
{
"key": {
"label": "Key",
"placeholder": "Dothraki"
"label": "Nazwa"
},
"rating": {
"label": "Rating"
"label": "Ocena"
}
}

View File

@ -1,6 +1,5 @@
{
"objective": {
"label": "Objective",
"placeholder": "Looking for a challenging role in a reputable organization to utilize my technical, database, and management skills for the growth of the organization as well as to enhance my knowledge about new and emerging trends in the IT sector."
"label": "Cel"
}
}

View File

@ -1,40 +1,35 @@
{
"photoUrl": {
"label": "Photo URL"
"label": "Adres URL zdjęcia"
},
"firstName": {
"label": "First Name",
"placeholder": "Jane"
"label": "Imię"
},
"lastName": {
"label": "Last Name",
"placeholder": "Doe"
"label": "Nazwisko"
},
"subtitle": {
"label": "Subtitle",
"placeholder": "Full Stack Web Developer"
"label": "Podtytuł"
},
"address": {
"label": "Adres",
"line1": {
"label": "Address Line 1",
"placeholder": "Palladium Complex"
"label": "Wiersz adresu 1"
},
"line2": {
"label": "Address Line 2",
"placeholder": "140 E 14th St"
"label": "Wiersz adresu 2"
},
"line3": {
"label": "Address Line 3",
"placeholder": "New York, NY 10003 USA"
"label": "Wiersz adresu 3"
}
},
"phone": {
"label": "Phone Number"
"label": "Telefon"
},
"website": {
"label": "Website"
"label": "Strona WWW"
},
"email": {
"label": "Email Address"
"label": "Adres e-mail"
}
}

View File

@ -1,19 +1,14 @@
{
"name": {
"label": "Name",
"placeholder": "Richard Hendricks"
"label": "Nazwisko"
},
"position": {
"label": "Position",
"placeholder": "CEO, Pied Piper"
"label": "Stanowisko"
},
"phone": {
"label": "Phone Number"
"label": "Numer telefonu"
},
"email": {
"label": "Email Address"
},
"description": {
"placeholder": "You can write about how you and the reference contact worked together and which projects you were a part of."
"label": "Adres e-mail"
}
}

View File

@ -1,13 +1,8 @@
{
"name": {
"label": "Name",
"placeholder": "Amazon"
"label": "Nazwa"
},
"role": {
"label": "Role",
"placeholder": "Front-end Web Developer"
},
"description": {
"placeholder": "You can write about what you specialized in while working at the company and what projects you were a part of."
"label": "Stanowisko"
}
}

View File

@ -1,36 +1,36 @@
{
"title": "About",
"title": "O aplikacji",
"documentation": {
"heading": "Documentation",
"body": "Want to know more about the app? Wouldn't it be nice if there was a guide to setting it up on your local machine? Need information on how to contribute to the project? Look no further, there's comprehensive documentation made just for you.",
"heading": "Dokumentacja",
"body": "Chcesz dowiedzieć się więcej o aplikacji? Potrzebujesz informacji o tym, jak przyczynić się do rozwoju projektu? Przygotowaliśmy kompleksowy przewodnik stworzony tylko dla Ciebie.",
"buttons": {
"documentation": "Documentation"
"documentation": "Dokumentacja"
}
},
"bugOrFeatureRequest": {
"heading": "Bug? Feature Request?",
"body": "Something halting your progress from making a resume? Found a pesky bug that just won't quit? Talk about it on the GitHub Issues section, or send me and email using the actions below.",
"heading": "Błąd? Potrzebujesz nowych funkcji?",
"body": "Coś powstrzymuje twoje postępy w tworzeniu CV? Znalazłeś nieznośny błąd? Porozmawiaj o tym w sekcji Problemy na GitHub lub wyślij mi e-mail, korzystając z poniższych działań.",
"buttons": {
"raiseIssue": "Raise an Issue",
"sendEmail": "Send an Email"
"raiseIssue": "Zgłoś problem",
"sendEmail": "Wyślij email"
}
},
"sourceCode": {
"heading": "Source Code",
"body": "Want to run the project from its source? Are you a developer willing to contribute to the open-source development of this project? Click the button below.",
"heading": "Kod źródłowy",
"body": "Chcesz uruchomić projekt ze źródła? Czy jesteś programistą, który chce przyczynić się do rozwoju tego open projektu open source? Kliknij przycisk poniżej.",
"buttons": {
"githubRepo": "GitHub Repo"
}
},
"license": {
"heading": "License Information",
"body": "The project is governed under the MIT License, which you can read more about below. Basically, you are allowed to use the project anywhere provided you give credits to the original author.",
"heading": "Informacje o licencji",
"body": "Projekt podlega licencji MIT, o której więcej możesz przeczytać poniżej. Zasadniczo możesz korzystać z projektu w dowolnym miejscu, pod warunkiem, że nie zmienisz autora projektu.",
"buttons": {
"mitLicense": "MIT License"
"mitLicense": "Licencja MIT"
}
},
"footer": {
"credit": "Reactive Resume is a project by <1>Amruth Pillai</1>.",
"thanks": "Thank you for using Reactive Resume!"
"credit": "Wykonane z Miłością przez <1>Amruth Pillai</1>",
"thanks": "Dziękujemy za korzystanie z Reactive Resume!"
}
}

View File

@ -1,32 +1,31 @@
{
"title": "Actions",
"disclaimer": "Changes you make to your resume are saved automatically to your browser's local storage. No data gets out, hence your information is completely secure.",
"title": "Akcje",
"disclaimer": "Zmiany wprowadzone w CV zostaną automatycznie zapisane w lokalnej pamięci przeglądarki. Żadne dane nie są pobierane, dlatego Twoje informacje są całkowicie bezpieczne.",
"importExport": {
"heading": "Import/Export",
"body": "You can import or export your data in JSON format. With this, you can edit and print your resume from any device. Save this file for later use.",
"heading": "Importuj/Eksportuj",
"body": "Możesz importować lub eksportować swoje dane w formacie JSON. Dzięki temu możesz edytować i drukować swoje CV z dowolnego urządzenia. Zapisz ten plik do późniejszego wykorzystania.",
"buttons": {
"import": "Import",
"export": "Export"
"export": "Eksport"
}
},
"printResume": {
"heading": "Print Your Resume",
"body": "You can click on the button below to generate a PDF instantly. Alternatively, you can also use <1>Cmd/Ctrl + P</1> but it would have different effects.",
"downloadResume": {
"heading": "Pobierz swoje CV",
"body": "Możesz kliknąć na poniższy przycisk, aby natychmiast pobrać wersję PDF. Aby uzyskać najlepsze wyniki, użyj najnowszej wersji Google Chrome.",
"buttons": {
"export": "Export",
"print": "Print"
"saveAsPdf": "Zapisz jako PDF"
}
},
"loadDemoData": {
"heading": "Load Demo Data",
"body": "Unclear on what to do with a fresh blank page? Load some demo data with prepopulated values to see how a resume should look and you can start editing from there.",
"heading": "Wczytaj dane Demo",
"body": "Nie wiesz, co zrobić z czystą pustą stroną? Załaduj niektóre dane demonstracyjne z wstępnie wypełnionymi wartościami, aby zobaczyć, jak powinno wyglądać CV, i możesz rozpocząć edycję.",
"buttons": {
"loadData": "Load Data"
"loadData": "Wczytaj dane"
}
},
"reset": {
"heading": "Reset Everything!",
"body": "This action will reset all your data and remove backups made to your browser's local storage as well, so please make sure you have exported your information before you reset everything.",
"heading": "Zresetuj wszystko!",
"body": "Ta czynność zresetuje wszystkie dane i usunie kopie zapasowe utworzone w lokalnej pamięci przeglądarki, więc upewnij się, że wyeksportowałeś informacje przed zresetowaniem.",
"buttons": {
"reset": "Reset"
}

View File

@ -1,7 +1,7 @@
{
"title": "Colors",
"colorOptions": "Color Options",
"primaryColor": "Primary Color",
"accentColor": "Accent Color",
"clipboardCopyAction": "{{color}} has been copied to the clipboard."
"title": "Kolory",
"colorOptions": "Opcje kolorów",
"primaryColor": "Kolor podstawowy",
"accentColor": "Kolor dodatkowy",
"clipboardCopyAction": "{{color}} został skopiowany do schowka."
}

View File

@ -1,7 +1,7 @@
{
"title": "Fonts",
"title": "Czcionki",
"fontFamily": {
"label": "Font Family",
"helpText": "You can use any font that is installed on your system as well. Just enter the name of the font family here and the browser would load it up for you."
"label": "Rodzina czcionek",
"helpText": "Możesz także użyć dowolnej czcionki zainstalowanej w systemie. Wystarczy wpisać tutaj nazwę rodziny czcionek, a przeglądarka załaduje ją dla Ciebie."
}
}

View File

@ -1,7 +1,7 @@
{
"title": "Settings",
"title": "Ustawienia",
"language": {
"label": "Language",
"helpText": "If you would like to help translate the app into your own language, please refer to the <1>Translation Documentation</1>."
"label": "Język",
"helpText": "Jeśli chcesz pomóc w tłumaczeniu aplikacji na swój język, zapoznaj się z <1>Translation Documentation</1>."
}
}

View File

@ -1,3 +1,3 @@
{
"title": "Templates"
"title": "Szablony"
}

View File

@ -29,6 +29,10 @@
"multiPageA4": "Multi-Page A4"
}
},
"helpText": [
"This export method makes use of HTML canvas to convert the resume to an image and print it on a PDF, which means it will lose all selecting/parsing capabilities.",
"If that is important to you, please try printing the resume instead using Cmd/Ctrl + P or the print button below. The result may vary as the output is browser dependent, but it is known to work best on the latest version of Google Chrome."
],
"buttons": {
"cancel": "Cancel",
"saveAsPdf": "Save as PDF"

View File

@ -99,6 +99,10 @@ input[type='range']::-webkit-slider-thumb {
background-color: white;
}
#printPage {
display: none;
}
#pageController {
bottom: 25px;
}
@ -110,7 +114,7 @@ input[type='range']::-webkit-slider-thumb {
@page {
size: A4;
margin: 2.5em;
margin: 0;
}
@media print {
@ -122,18 +126,17 @@ input[type='range']::-webkit-slider-thumb {
visibility: hidden;
}
#page,
#page * {
#printPage,
#printPage * {
visibility: visible;
}
#page {
#printPage {
width: 21cm;
height: 29.7cm;
background-color: white;
box-shadow: none;
position: absolute;
left: 0;
top: 0;
left: 0;
right: 0;
}
}

View File

@ -33,6 +33,10 @@ const PageController = () => {
<div className="text-gray-400 p-3">|</div>
<div className="p-3 hover:bg-gray-200 cursor-pointer flex" onClick={() => window.print()}>
<i className="material-icons">print</i>
</div>
<div
className="p-3 hover:bg-gray-200 cursor-pointer flex"
onClick={() => setPrintDialogOpen(true)}

View File

@ -31,7 +31,7 @@ const PrintDialog = () => {
>
<div
className="centered py-8 px-12 bg-white shadow-xl rounded w-full md:w-1/3"
onClick={(e) => {
onClick={e => {
e.stopPropagation();
e.preventDefault();
}}
@ -44,7 +44,7 @@ const PrintDialog = () => {
type="range"
className="w-full h-4 my-2 rounded-full overflow-hidden appearance-none focus:outline-none bg-gray-400"
value={quality}
onChange={(e) => setQuality(e.target.value)}
onChange={e => setQuality(e.target.value)}
min="40"
max="100"
step="5"
@ -58,13 +58,16 @@ const PrintDialog = () => {
value={type}
options={printTypes}
onChange={setType}
optionItem={(x) => (
optionItem={x => (
<option key={x.key} value={x.key}>
{x.value}
</option>
)}
/>
<p className="my-3 text-xs text-gray-600">{t('printDialog.helpText.0')}</p>
<p className="my-3 text-xs text-gray-600">{t('printDialog.helpText.1')}</p>
<div className="flex justify-between">
<button
type="button"

View File

@ -78,7 +78,7 @@ const Castform = () => {
</div>
);
const SkillItem = (x) => (
const SkillItem = x => (
<li key={x} className="text-sm my-2">
{x}
</li>
@ -96,8 +96,8 @@ const Castform = () => {
const Objective = () =>
data.objective && data.objective.enable && <p className="m-5 text-sm">{data.objective.body}</p>;
const WorkItem = (x) => (
<div key={x.title} className="my-3 px-5">
const WorkItem = x => (
<div key={x.id} className="my-3 px-5">
<div className="flex justify-between">
<div>
<h6 className="font-semibold">{x.title}</h6>
@ -116,11 +116,11 @@ const Castform = () => {
data.work.enable && (
<div>
<Heading light title={data.work.heading} />
{data.work.items.filter((x) => x.enable).map(WorkItem)}
{data.work.items.filter(x => x.enable).map(WorkItem)}
</div>
);
const ReferenceItem = (x) => (
const ReferenceItem = x => (
<div key={x.id} className="flex flex-col">
<h6 className="text-sm font-medium">{x.name}</h6>
<span className="text-xs">{x.position}</span>
@ -136,12 +136,12 @@ const Castform = () => {
<div>
<Heading light title={data.references.heading} />
<div className="grid grid-cols-2 gap-6 px-5">
{data.references.items.filter((x) => x.enable).map(ReferenceItem)}
{data.references.items.filter(x => x.enable).map(ReferenceItem)}
</div>
</div>
);
const LanguageItem = (x) => (
const LanguageItem = x => (
<div key={x.id} className="flex flex-col my-2">
<h6 className="text-sm font-medium mb-1">{x.key}</h6>
<div className="relative h-5">
@ -168,13 +168,13 @@ const Castform = () => {
<div>
<Heading title={data.languages.heading} />
<div className="px-5 mb-6">
{data.languages.items.filter((x) => x.enable).map(LanguageItem)}
{data.languages.items.filter(x => x.enable).map(LanguageItem)}
</div>
</div>
);
const EducationItem = (x) => (
<div key={x.name} className="my-3 px-5">
const EducationItem = x => (
<div key={x.id} className="my-3 px-5">
<div className="flex justify-between">
<div>
<h6 className="font-semibold">{x.name}</h6>
@ -196,12 +196,12 @@ const Castform = () => {
data.education.enable && (
<div>
<Heading light title={data.education.heading} />
{data.education.items.filter((x) => x.enable).map(EducationItem)}
{data.education.items.filter(x => x.enable).map(EducationItem)}
</div>
);
const AwardItem = (x) => (
<div key={x.title} className="my-3 px-5">
const AwardItem = x => (
<div key={x.id} className="my-3 px-5">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -213,12 +213,12 @@ const Castform = () => {
data.awards.enable && (
<div>
<Heading light title={data.awards.heading} />
{data.awards.items.filter((x) => x.enable).map(AwardItem)}
{data.awards.items.filter(x => x.enable).map(AwardItem)}
</div>
);
const CertificationItem = (x) => (
<div key={x.title} className="my-3 px-5">
const CertificationItem = x => (
<div key={x.id} className="my-3 px-5">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -230,11 +230,11 @@ const Castform = () => {
data.certifications.enable && (
<div>
<Heading title={data.certifications.heading} />
{data.certifications.items.filter((x) => x.enable).map(CertificationItem)}
{data.certifications.items.filter(x => x.enable).map(CertificationItem)}
</div>
);
const ExtraItem = (x) => (
const ExtraItem = x => (
<div key={x.id} className="px-5 my-2">
<h6 className="text-xs font-bold">{x.key}</h6>
<div className="text-sm">{x.value}</div>
@ -246,7 +246,7 @@ const Castform = () => {
data.extras.enable && (
<div>
<Heading title={data.extras.heading} />
{data.extras.items.filter((x) => x.enable).map(ExtraItem)}
{data.extras.items.filter(x => x.enable).map(ExtraItem)}
</div>
);

View File

@ -98,7 +98,7 @@ const Celebi = () => {
);
const WorkItem = x => (
<div key={x.title} className="my-3 mr-10">
<div key={x.id} className="my-3 mr-10">
<div>
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs text-gray-800">
@ -119,7 +119,7 @@ const Celebi = () => {
);
const EducationItem = x => (
<div key={x.name} className="my-3 mr-10">
<div key={x.id} className="my-3 mr-10">
<h6 className="font-semibold">{x.name}</h6>
<p className="text-xs">{x.major}</p>
<div className="text-xs">
@ -196,7 +196,7 @@ const Celebi = () => {
);
const AwardItem = x => (
<div key={x.title} className="my-2">
<div key={x.id} className="my-2">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -213,7 +213,7 @@ const Celebi = () => {
);
const CertificationItem = x => (
<div key={x.title} className="my-2">
<div key={x.id} className="my-2">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />

View File

@ -63,7 +63,7 @@ const Gengar = () => {
</div>
);
const SkillItem = (x) => (
const SkillItem = x => (
<li key={x} className="text-sm py-1">
{x}
</li>
@ -78,8 +78,8 @@ const Gengar = () => {
</div>
);
const EducationItem = (x) => (
<div key={x.name} className="mb-3">
const EducationItem = x => (
<div key={x.id} className="mb-3">
<div className="flex justify-between items-center">
<div>
<h6 className="font-semibold">
@ -109,12 +109,12 @@ const Gengar = () => {
data.education.enable && (
<div className="mb-6">
<Heading title={data.education.heading} />
{data.education.items.filter((x) => x.enable).map(EducationItem)}
{data.education.items.filter(x => x.enable).map(EducationItem)}
</div>
);
const CertificationItem = (x) => (
<div key={x.title} className="mb-3">
const CertificationItem = x => (
<div key={x.id} className="mb-3">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -126,12 +126,12 @@ const Gengar = () => {
data.certifications.enable && (
<div className="mb-6">
<Heading title={data.certifications.heading} />
{data.certifications.items.filter((x) => x.enable).map(CertificationItem)}
{data.certifications.items.filter(x => x.enable).map(CertificationItem)}
</div>
);
const AwardItem = (x) => (
<div key={x.title} className="mb-3">
const AwardItem = x => (
<div key={x.id} className="mb-3">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -143,11 +143,11 @@ const Gengar = () => {
data.awards.enable && (
<div className="mb-6">
<Heading title={data.awards.heading} />
{data.awards.items.filter((x) => x.enable).map(AwardItem)}
{data.awards.items.filter(x => x.enable).map(AwardItem)}
</div>
);
const ReferenceItem = (x) => (
const ReferenceItem = x => (
<div key={x.id} className="flex flex-col">
<h6 className="text-sm font-medium">{x.name}</h6>
<span className="text-xs">{x.position}</span>
@ -163,13 +163,13 @@ const Gengar = () => {
<div>
<Heading title={data.references.heading} />
<div className="grid grid-cols-2 gap-6">
{data.references.items.filter((x) => x.enable).map(ReferenceItem)}
{data.references.items.filter(x => x.enable).map(ReferenceItem)}
</div>
</div>
);
const WorkItem = (x) => (
<div key={x.title} className="mb-3">
const WorkItem = x => (
<div key={x.id} className="mb-3">
<div className="flex justify-between items-center">
<div>
<h6 className="font-semibold">{x.title}</h6>
@ -188,11 +188,11 @@ const Gengar = () => {
data.work.enable && (
<div className="mb-6">
<Heading title={data.work.heading} />
{data.work.items.filter((x) => x.enable).map(WorkItem)}
{data.work.items.filter(x => x.enable).map(WorkItem)}
</div>
);
const LanguageItem = (x) => (
const LanguageItem = x => (
<div key={x.id} className="grid grid-cols-2 items-center py-2">
<h6 className="text-sm font-medium">{x.key}</h6>
<div className="flex">
@ -210,11 +210,11 @@ const Gengar = () => {
data.languages.enable && (
<div>
<Heading title={data.languages.heading} />
<div className="mb-6">{data.languages.items.filter((x) => x.enable).map(LanguageItem)}</div>
<div className="mb-6">{data.languages.items.filter(x => x.enable).map(LanguageItem)}</div>
</div>
);
const ExtraItem = (x) => (
const ExtraItem = x => (
<div key={x.id} className="text-sm my-1">
<h6 className="text-xs font-bold">{x.key}</h6>
<h6>{x.value}</h6>
@ -227,7 +227,7 @@ const Gengar = () => {
<div>
<Heading title={data.extras.heading} />
<div className="grid grid-cols-2">
{data.extras.items.filter((x) => x.enable).map(ExtraItem)}
{data.extras.items.filter(x => x.enable).map(ExtraItem)}
</div>
</div>
);

View File

@ -95,8 +95,8 @@ const Glalie = () => {
</div>
);
const WorkItem = (x) => (
<div key={x.title} className="mt-3">
const WorkItem = x => (
<div key={x.id} className="mt-3">
<div className="flex justify-between">
<div>
<h6 className="font-semibold text-sm">{x.title}</h6>
@ -114,12 +114,12 @@ const Glalie = () => {
data.work.enable && (
<div>
<Heading title={data.work.heading} />
{data.work.items.filter((x) => x.enable).map(WorkItem)}
{data.work.items.filter(x => x.enable).map(WorkItem)}
</div>
);
const EducationItem = (x) => (
<div key={x.name} className="mt-3">
const EducationItem = x => (
<div key={x.id} className="mt-3">
<div>
<h6 className="font-semibold text-xs">{x.name}</h6>
<p className="text-xs opacity-75">{x.major}</p>
@ -137,13 +137,13 @@ const Glalie = () => {
<div>
<Heading title={data.education.heading} />
<div className="grid grid-cols-2 gap-4">
{data.education.items.filter((x) => x.enable).map(EducationItem)}
{data.education.items.filter(x => x.enable).map(EducationItem)}
</div>
</div>
);
const AwardItem = (x) => (
<div key={x.title} className="mt-3 text-left">
const AwardItem = x => (
<div key={x.id} className="mt-3 text-left">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -155,12 +155,12 @@ const Glalie = () => {
data.awards.enable && (
<div>
<Heading title={data.awards.heading} />
{data.awards.items.filter((x) => x.enable).map(AwardItem)}
{data.awards.items.filter(x => x.enable).map(AwardItem)}
</div>
);
const CertificationItem = (x) => (
<div key={x.title} className="mt-3 text-left">
const CertificationItem = x => (
<div key={x.id} className="mt-3 text-left">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -172,11 +172,11 @@ const Glalie = () => {
data.certifications.enable && (
<div>
<Heading title={data.certifications.heading} />
{data.certifications.items.filter((x) => x.enable).map(CertificationItem)}
{data.certifications.items.filter(x => x.enable).map(CertificationItem)}
</div>
);
const SkillItem = (x) => (
const SkillItem = x => (
<li key={x} className="text-xs font-medium">
{x}
</li>
@ -191,7 +191,7 @@ const Glalie = () => {
</div>
);
const LanguageItem = (x) => (
const LanguageItem = x => (
<div key={x.id} className="grid grid-cols-2 items-center py-2">
<h6 className="text-xs font-medium text-left">{x.key}</h6>
<div className="flex">
@ -209,13 +209,11 @@ const Glalie = () => {
data.languages.enable && (
<div>
<Heading title={data.languages.heading} />
<div className="w-3/4">
{data.languages.items.filter((x) => x.enable).map(LanguageItem)}
</div>
<div className="w-3/4">{data.languages.items.filter(x => x.enable).map(LanguageItem)}</div>
</div>
);
const ReferenceItem = (x) => (
const ReferenceItem = x => (
<div key={x.id} className="flex flex-col">
<h6 className="text-sm font-medium">{x.name}</h6>
<span className="text-xs">{x.position}</span>
@ -231,12 +229,12 @@ const Glalie = () => {
<div>
<Heading title={data.references.heading} />
<div className="grid grid-cols-3 gap-8">
{data.references.items.filter((x) => x.enable).map(ReferenceItem)}
{data.references.items.filter(x => x.enable).map(ReferenceItem)}
</div>
</div>
);
const ExtraItem = (x) => (
const ExtraItem = x => (
<tr key={x.id}>
<td className="border font-medium px-4 py-2 text-xs">{x.key}</td>
<td className="border px-4 py-2 text-xs">{x.value}</td>
@ -249,7 +247,7 @@ const Glalie = () => {
<div>
<Heading title={data.extras.heading} />
<table className="mt-4 w-2/3 table-auto">
<tbody>{data.extras.items.filter((x) => x.enable).map(ExtraItem)}</tbody>
<tbody>{data.extras.items.filter(x => x.enable).map(ExtraItem)}</tbody>
</table>
</div>
);

View File

@ -60,8 +60,8 @@ const Onyx = () => {
</div>
);
const WorkItem = (x) => (
<div key={x.title} className="mt-3">
const WorkItem = x => (
<div key={x.id} className="mt-3">
<div className="flex justify-between">
<div>
<h6 className="font-semibold">{x.title}</h6>
@ -80,12 +80,12 @@ const Onyx = () => {
data.work.enable && (
<div>
<Heading title={data.work.heading} />
{data.work.items.filter((x) => x.enable).map(WorkItem)}
{data.work.items.filter(x => x.enable).map(WorkItem)}
</div>
);
const EducationItem = (x) => (
<div key={x.name} className="mt-3">
const EducationItem = x => (
<div key={x.id} className="mt-3">
<div className="flex justify-between">
<div>
<h6 className="font-semibold">{x.name}</h6>
@ -107,12 +107,12 @@ const Onyx = () => {
data.education.enable && (
<div>
<Heading title={data.education.heading} />
{data.education.items.filter((x) => x.enable).map(EducationItem)}
{data.education.items.filter(x => x.enable).map(EducationItem)}
</div>
);
const AwardItem = (x) => (
<div key={x.title} className="mt-3">
const AwardItem = x => (
<div key={x.id} className="mt-3">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -124,12 +124,12 @@ const Onyx = () => {
data.awards.enable && (
<div>
<Heading title={data.awards.heading} />
{data.awards.items.filter((x) => x.enable).map(AwardItem)}
{data.awards.items.filter(x => x.enable).map(AwardItem)}
</div>
);
const CertificationItem = (x) => (
<div key={x.title} className="mt-3">
const CertificationItem = x => (
<div key={x.id} className="mt-3">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -141,11 +141,11 @@ const Onyx = () => {
data.certifications.enable && (
<div>
<Heading title={data.certifications.heading} />
{data.certifications.items.filter((x) => x.enable).map(CertificationItem)}
{data.certifications.items.filter(x => x.enable).map(CertificationItem)}
</div>
);
const SkillItem = (x) => (
const SkillItem = x => (
<span
key={x}
className="text-xs rounded-full px-3 py-1 font-medium my-2 mr-2"
@ -167,7 +167,7 @@ const Onyx = () => {
</div>
);
const LanguageItem = (x) => (
const LanguageItem = x => (
<div key={x.id} className="grid grid-cols-2 items-center py-2">
<h6 className="text-sm font-medium">{x.key}</h6>
<div className="flex">
@ -185,13 +185,11 @@ const Onyx = () => {
data.languages.enable && (
<div>
<Heading title={data.languages.heading} />
<div className="w-3/4">
{data.languages.items.filter((x) => x.enable).map(LanguageItem)}
</div>
<div className="w-3/4">{data.languages.items.filter(x => x.enable).map(LanguageItem)}</div>
</div>
);
const ReferenceItem = (x) => (
const ReferenceItem = x => (
<div key={x.id} className="flex flex-col">
<h6 className="text-sm font-medium">{x.name}</h6>
<span className="text-xs">{x.position}</span>
@ -207,12 +205,12 @@ const Onyx = () => {
<div>
<Heading title={data.references.heading} />
<div className="grid grid-cols-3 gap-6">
{data.references.items.filter((x) => x.enable).map(ReferenceItem)}
{data.references.items.filter(x => x.enable).map(ReferenceItem)}
</div>
</div>
);
const ExtraItem = (x) => (
const ExtraItem = x => (
<tr key={x.id}>
<td className="border font-medium px-4 py-2 text-sm">{x.key}</td>
<td className="border px-4 py-2 text-sm">{x.value}</td>
@ -225,7 +223,7 @@ const Onyx = () => {
<div>
<Heading title={data.extras.heading} />
<table className="w-2/3 table-auto">
<tbody>{data.extras.items.filter((x) => x.enable).map(ExtraItem)}</tbody>
<tbody>{data.extras.items.filter(x => x.enable).map(ExtraItem)}</tbody>
</table>
</div>
);

View File

@ -58,7 +58,7 @@ const Pikachu = () => {
</div>
);
const SkillItem = (x) => (
const SkillItem = x => (
<span
key={x}
className="leading-none rounded-lg text-sm font-medium bg-gray-300 py-3 my-1 px-4"
@ -76,7 +76,7 @@ const Pikachu = () => {
</div>
);
const ReferenceItem = (x) => (
const ReferenceItem = x => (
<div key={x.id} className="flex flex-col">
<h6 className="text-sm font-medium">{x.name}</h6>
<span className="text-xs">{x.position}</span>
@ -92,12 +92,12 @@ const Pikachu = () => {
<div>
<Heading title={data.references.heading} />
<div className="grid grid-cols-2 gap-6">
{data.references.items.filter((x) => x.enable).map(ReferenceItem)}
{data.references.items.filter(x => x.enable).map(ReferenceItem)}
</div>
</div>
);
const LanguageItem = (x) => (
const LanguageItem = x => (
<div key={x.id} className="grid grid-cols-2 items-center py-2">
<h6 className="text-sm font-medium">{x.key}</h6>
<div className="flex">
@ -115,11 +115,11 @@ const Pikachu = () => {
data.languages.enable && (
<div>
<Heading title={data.languages.heading} />
<div className="mb-6">{data.languages.items.filter((x) => x.enable).map(LanguageItem)}</div>
<div className="mb-6">{data.languages.items.filter(x => x.enable).map(LanguageItem)}</div>
</div>
);
const ExtraItem = (x) => (
const ExtraItem = x => (
<div key={x.id} className="text-sm my-1">
<h6 className="text-xs font-bold">{x.key}</h6>
<h6 className="">{x.value}</h6>
@ -132,13 +132,13 @@ const Pikachu = () => {
<div>
<Heading title={data.extras.heading} />
<div className="flex flex-col mb-6">
{data.extras.items.filter((x) => x.enable).map(ExtraItem)}
{data.extras.items.filter(x => x.enable).map(ExtraItem)}
</div>
</div>
);
const WorkItem = (x) => (
<div key={x.title} className="mb-3">
const WorkItem = x => (
<div key={x.id} className="mb-3">
<div className="flex justify-between items-center">
<div>
<h6 className="font-semibold">{x.title}</h6>
@ -158,13 +158,13 @@ const Pikachu = () => {
<div>
<Heading title={data.work.heading} />
<div className="flex flex-col mb-4">
{data.work.items.filter((x) => x.enable).map(WorkItem)}
{data.work.items.filter(x => x.enable).map(WorkItem)}
</div>
</div>
);
const EducationItem = (x) => (
<div key={x.name} className="mb-3">
const EducationItem = x => (
<div key={x.id} className="mb-3">
<div className="flex justify-between items-center">
<div>
<h6 className="font-semibold">{x.name}</h6>
@ -189,13 +189,13 @@ const Pikachu = () => {
<div>
<Heading title={data.education.heading} />
<div className="flex flex-col mb-4">
{data.education.items.filter((x) => x.enable).map(EducationItem)}
{data.education.items.filter(x => x.enable).map(EducationItem)}
</div>
</div>
);
const AwardItem = (x) => (
<div key={x.title} className="mb-3">
const AwardItem = x => (
<div key={x.id} className="mb-3">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -208,13 +208,13 @@ const Pikachu = () => {
<div>
<Heading title={data.awards.heading} />
<div className="flex flex-col mb-2">
{data.awards.items.filter((x) => x.enable).map(AwardItem)}
{data.awards.items.filter(x => x.enable).map(AwardItem)}
</div>
</div>
);
const CertificationItem = (x) => (
<div key={x.title} className="mb-3">
const CertificationItem = x => (
<div key={x.id} className="mb-3">
<h6 className="font-semibold">{x.title}</h6>
<p className="text-xs">{x.subtitle}</p>
<ReactMarkdown className="mt-2 text-sm" source={x.description} />
@ -227,7 +227,7 @@ const Pikachu = () => {
<div>
<Heading title={data.certifications.heading} />
<div className="flex flex-col mb-2">
{data.certifications.items.filter((x) => x.enable).map(CertificationItem)}
{data.certifications.items.filter(x => x.enable).map(CertificationItem)}
</div>
</div>
);

View File

@ -10,7 +10,7 @@ const move = (array, element, delta) => {
array.splice(indexes[0], 2, array[indexes[1]], array[indexes[0]]);
};
const hexToRgb = (hex) => {
const hexToRgb = hex => {
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
@ -23,7 +23,7 @@ const hexToRgb = (hex) => {
: null;
};
const copyToClipboard = (text) => {
const copyToClipboard = text => {
const textArea = document.createElement('textarea');
textArea.style.position = 'fixed';
textArea.style.top = 0;
@ -44,7 +44,7 @@ const copyToClipboard = (text) => {
return successful;
};
const saveData = (dispatch) => dispatch({ type: 'save_data' });
const saveData = dispatch => dispatch({ type: 'save_data' });
const addItem = (dispatch, key, value) => {
dispatch({
@ -105,7 +105,7 @@ const importJson = (event, dispatch) => {
};
const saveAsPdf = (pageRef, panZoomRef, quality, type) =>
new Promise((resolve) => {
new Promise(resolve => {
panZoomRef.current.autoCenter(1);
panZoomRef.current.reset();
@ -114,7 +114,7 @@ const saveAsPdf = (pageRef, panZoomRef, quality, type) =>
scale: 5,
useCORS: true,
allowTaint: true,
}).then((canvas) => {
}).then(canvas => {
const image = canvas.toDataURL('image/jpeg', quality / 100);
const doc = new jsPDF({
orientation: 'portrait',
@ -148,7 +148,7 @@ const saveAsPdf = (pageRef, panZoomRef, quality, type) =>
});
const saveAsMultiPagePdf = (pageRef, panZoomRef, quality) =>
new Promise((resolve) => {
new Promise(resolve => {
panZoomRef.current.autoCenter(1);
panZoomRef.current.reset();
@ -157,7 +157,7 @@ const saveAsMultiPagePdf = (pageRef, panZoomRef, quality) =>
scale: 5,
useCORS: true,
allowTaint: true,
}).then((canvas) => {
}).then(canvas => {
const image = canvas.toDataURL('image/jpeg', quality / 100);
const doc = new jsPDF({
orientation: 'portrait',