Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Epic/new template html #237

Merged
merged 50 commits into from
Nov 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
809a227
update exportmanfredjsontohtml to select template html
migalko94 Sep 27, 2023
185c5a2
change name of function at index of engine manfred2html
migalko94 Sep 27, 2023
902798a
implement html template 2 layout without content
migalko94 Sep 27, 2023
6f810e1
amendment
migalko94 Sep 27, 2023
5e8b3d8
implement html template 2 header to ejs
migalko94 Sep 27, 2023
d00c132
section name amendment
migalko94 Sep 27, 2023
f0d8000
remove safeguards and change default template
migalko94 Sep 27, 2023
883603f
implement my links section to ejs
migalko94 Sep 28, 2023
0333add
implement languages section to ejs
migalko94 Sep 28, 2023
7ef74f9
implement hard skills section to ejs
migalko94 Sep 28, 2023
4ef5fd3
implement soft skills section to ejs
migalko94 Sep 28, 2023
3127722
implement about me section to ejs
migalko94 Sep 28, 2023
6623146
implement experience section pending two issues
migalko94 Sep 28, 2023
dbc8b3c
implement education section pending issues
migalko94 Sep 28, 2023
323107e
change
migalko94 Oct 2, 2023
4842dab
change function
migalko94 Oct 2, 2023
5ec9324
last changes
migalko94 Oct 2, 2023
638a20a
Merge pull request #213 from migalko94/feature/#203-update-exportmanf…
juanpms2 Oct 2, 2023
9c8cc27
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 2, 2023
62016b7
adapt
migalko94 Oct 2, 2023
e6ed1d1
Merge pull request #215 from migalko94/feature/#202-implement-html-te…
juanpms2 Oct 2, 2023
a66712a
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 2, 2023
c60f5f6
adapt
migalko94 Oct 2, 2023
7eca989
Merge pull request #216 from migalko94/feature/#204-implement-html-te…
juanpms2 Oct 2, 2023
7e88953
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 2, 2023
9340beb
adapt
migalko94 Oct 2, 2023
d4484b2
Merge pull request #218 from migalko94/feature/#205-implement-my-link…
juanpms2 Oct 2, 2023
0d5e3a5
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 2, 2023
d2fbeb7
adapt
migalko94 Oct 2, 2023
b5e4c46
Merge pull request #219 from migalko94/feature/#206-implement-languag…
juanpms2 Oct 3, 2023
8537d50
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 3, 2023
c570801
adapt
migalko94 Oct 3, 2023
7c5f2a0
Merge pull request #221 from migalko94/feature/#207-implement-hard-sk…
juanpms2 Oct 3, 2023
4b6f0c1
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 3, 2023
2290664
adapt
migalko94 Oct 3, 2023
37970f9
Merge pull request #222 from migalko94/feature/#208-implement-soft-sk…
juanpms2 Oct 3, 2023
85521d5
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 3, 2023
704ee13
adapt
migalko94 Oct 3, 2023
486faa1
Merge pull request #223 from migalko94/feature/#209-implement-about-m…
juanpms2 Oct 3, 2023
7b41354
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 3, 2023
ae71241
adapt
migalko94 Oct 3, 2023
debf9de
changes date format
migalko94 Oct 3, 2023
b648c57
Merge pull request #224 from migalko94/feature/#210-implement-experie…
juanpms2 Oct 4, 2023
6b944b4
Merge remote-tracking branch 'upstream/epic/new-template-html' into f…
migalko94 Oct 4, 2023
bfa6e3e
adapt
migalko94 Oct 4, 2023
6e0cd34
Merge pull request #226 from migalko94/feature/#211-implement-educati…
juanpms2 Oct 4, 2023
2c38c24
Merge branch 'epic/manfred2html-export-settings' into epic/new-templa…
juanpms2 Nov 3, 2023
8ed378e
updated selected colors
juanpms2 Nov 3, 2023
50c5e34
changed template selected
juanpms2 Nov 3, 2023
30e35fc
refactor
juanpms2 Nov 3, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/react-app/src/common-app/components/modal/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from './modal.component'
export * from './modal.component';
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ interface Props {
isOpen: boolean;
}

export const Modal: React.FC<Props> = (props) => {
export const Modal: React.FC<Props> = props => {
const { children, isOpen } = props;
return isOpen && <div className={classes.container}>{children}</div>

return isOpen && <div className={classes.container}>{children}</div>;
};
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import * as classes from './customSelect.styles';
interface Props {
listOptions: string[];
label: string;
onSelectedOption: (option: string) => void;
}
export const CustomSelect: React.FC<Props> = ({ listOptions, label }) => {
export const CustomSelect: React.FC<Props> = props => {
const { listOptions, label, onSelectedOption } = props;
const [isOpen, setIsOpen] = React.useState<boolean>(false);
const [selectedOption, setSelectedOption] = React.useState<string>(label);

Expand All @@ -14,6 +16,7 @@ export const CustomSelect: React.FC<Props> = ({ listOptions, label }) => {
};

const handleOptionSelect = (option: string) => {
onSelectedOption(option);
setSelectedOption(option);
setIsOpen(false);
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './inputRadioButton.component';
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { HexColor, ColorTheme } from '@lemoncode/manfred2html';
import * as classes from './inputRadioButton.styles';

interface Props {
value: ColorTheme;
hexColor: HexColor;
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
}

export const InputRadioButton: React.FC<Props> = ({ value, hexColor, onChange }) => {
return (
<input
type="radio"
id={value}
name="color"
value={value}
className={classes.inputRadioButton(hexColor)}
onChange={onChange}
defaultChecked={value === 'default'}
/>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { css } from '@emotion/css';
import { theme } from '@/core/theme';

export const inputRadioButton = (color: string) => css`
appearance: none;
width: 82px;
height: 82px;
box-shadow: 8px 8px 16px 0px rgba(0, 0, 0, 0.25);
border-radius: 50%;
background-color: ${color};
cursor: pointer;
outline: none;
border: 15px solid ${theme.palette.info[50]};
&[type='radio']:checked {
box-shadow: 0px 0px 0px 4px ${theme.palette.dark[200]};
}
`;
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import React from 'react';
import { theme } from '@/core/theme';
import * as classes from './customSelectColor.styles';
import { cx } from '@emotion/css';
import { ColorTheme, HexColor } from '@lemoncode/manfred2html';
import { InputRadioButton } from './components';
import * as classes from './customSelectColor.styles';

interface Props {
label: string;
Expand Down Expand Up @@ -31,55 +32,14 @@ export const CustomSelectColor: React.FC<Props> = ({ label, onChange }) => {
/>
</div>
<fieldset className={classes.colorFieldset}>
<input
type="radio"
id={theme.palette.primary[600]}
name="color"
value={theme.palette.primary[600]}
className={classes.inputRadioButton(theme.palette.primary[600])}
onChange={onChange}
defaultChecked
/>
<input
type="radio"
id={theme.palette.secondary[600]}
name="color"
value={theme.palette.secondary[600]}
className={classes.inputRadioButton(theme.palette.secondary[600])}
onChange={onChange}
/>
<input
type="radio"
id={theme.palette.success[600]}
name="color"
value={theme.palette.success[600]}
className={classes.inputRadioButton(theme.palette.success[600])}
onChange={onChange}
/>
<input
type="radio"
id={theme.palette.warning[600]}
name="color"
value={theme.palette.warning[600]}
className={classes.inputRadioButton(theme.palette.warning[600])}
onChange={onChange}
/>
<input
type="radio"
id={theme.palette.error[600]}
name="color"
value={theme.palette.error[600]}
className={classes.inputRadioButton(theme.palette.error[600])}
onChange={onChange}
/>
<input
type="radio"
id={theme.palette.dark[600]}
name="color"
value={theme.palette.dark[600]}
className={classes.inputRadioButton(theme.palette.dark[600])}
onChange={onChange}
/>
{Object.keys(HexColor).map(colorKey => (
<InputRadioButton
key={colorKey}
value={colorKey as ColorTheme}
hexColor={HexColor[colorKey as keyof typeof HexColor]}
onChange={onChange}
/>
))}
</fieldset>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,20 +57,6 @@ export const colorFieldset = css`
justify-content: center;
gap: ${theme.spacing(8)};
`;
export const inputRadioButton = (color: string) => css`
appearance: none;
width: 82px;
height: 82px;
box-shadow: 8px 8px 16px 0px rgba(0, 0, 0, 0.25);
border-radius: 50%;
background-color: ${color};
cursor: pointer;
outline: none;
border: 15px solid ${theme.palette.info[50]};
&[type='radio']:checked {
box-shadow: 0px 0px 0px 4px ${theme.palette.dark[200]};
}
`;

export const rotate = (customSelectState: boolean) => css`
rotate: ${customSelectState ? '180deg' : '0deg'};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import React from 'react';
import { ExportHTMLSettings } from '@lemoncode/manfred2html';
import { theme } from '@/core/theme';
import {
TemplateCV,
ColorTheme,
Language,
ExportHTMLSettings,
createDefaultExportHTMLSettings,
} from '@lemoncode/manfred2html';
import { Button, CustomSelect } from '@/common-app/components';
import { useUserChoiceContext } from '@/core/user-choice';
import { CustomSelectColor } from '../customSelectColor/customSelectColor.component';
import * as classes from './export-config.styles';
interface Props {
Expand All @@ -13,24 +17,42 @@ interface Props {
}

const DOWNLOAD_MESSAGE_TIMEOUT = 2500;
const OPTIONSDESING = ['Item 1', 'Item 2', 'Item 3'];
const OPTIONSlANGUAGE = ['Item 1', 'Item 2', 'Item 3'];
const DESING_OPTIONS: TemplateCV[] = ['default', 'CV-1'];
const LANGUAGE_OPTIONS: Language[] = ['es', 'en'];

export const ExportConfig: React.FC<Props> = props => {
const { onExportToHTML, cancelExport, htmlTemplate, onHTMLSettingSelectionChanged } = props;
const { userChoice } = useUserChoiceContext();
const [exportHTMLSettings, setExportHTMLSettings] = React.useState<ExportHTMLSettings>({
primaryColor: theme.palette.primary[600],
});
const [exportHTMLSettings, setExportHTMLSettings] = React.useState<ExportHTMLSettings>(
createDefaultExportHTMLSettings()
);
const [isDownloadInProgress, setIsDownloadInProgress] = React.useState<boolean>(false);

const [htmlPreview, setHtmlPreview] = React.useState<string>(
onHTMLSettingSelectionChanged(htmlTemplate, exportHTMLSettings)
);

const handleColorChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setExportHTMLSettings({ primaryColor: event.target.value });
onHTMLSettingSelectionChanged(htmlTemplate, { primaryColor: event.target.value });
setExportHTMLSettings({ ...exportHTMLSettings, colorTheme: event.target.value as ColorTheme });
onHTMLSettingSelectionChanged(htmlTemplate, {
...exportHTMLSettings,
colorTheme: event.target.value as ColorTheme,
});
};

const handleTemplateChange = (templateCV: string) => {
setExportHTMLSettings({ ...exportHTMLSettings, template: templateCV as TemplateCV });
onHTMLSettingSelectionChanged(htmlTemplate, {
...exportHTMLSettings,
template: templateCV as TemplateCV,
});
};

const handleLanguageChange = (language: string) => {
setExportHTMLSettings({ ...exportHTMLSettings, language: language as Language });
onHTMLSettingSelectionChanged(htmlTemplate, {
...exportHTMLSettings,
language: language as Language,
});
};
const handleExportConfigSelection = () => {
setIsDownloadInProgress(true);
Expand All @@ -51,8 +73,12 @@ export const ExportConfig: React.FC<Props> = props => {
<div className={classes.optionsContainer}>
<div className={classes.optionsContent}>
<div className={classes.selectContainer}>
<CustomSelect listOptions={OPTIONSDESING} label={'Diseño'} />
<CustomSelect listOptions={OPTIONSlANGUAGE} label={'Idioma cabeceras'} />
<CustomSelect listOptions={DESING_OPTIONS} onSelectedOption={handleTemplateChange} label={'Diseño'} />
<CustomSelect
listOptions={LANGUAGE_OPTIONS}
onSelectedOption={handleLanguageChange}
label={'Idioma cabeceras'}
/>
</div>
<div className={classes.selectColorContainer}>
<CustomSelectColor label={'Colores'} onChange={handleColorChange} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import React from 'react';
import { ExportHTMLSettings } from '@lemoncode/manfred2html';
import { useUserChoiceContext } from '@/core';
import { Button, Footer, Header, Modal, Navbar } from '@/common-app/components';
import * as classes from './template-export.styles';
import { ExportConfig } from './components/export-config';
import * as classes from './template-export.styles';

interface Props {
error: boolean;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import { exportManfredJSonToWordAndDownload, parseStringToManfredJSon } from '@lemoncode/manfred2word';
import { exportManfredJSonToMarkdown } from '@lemoncode/manfred2md';
import { exportManfredJSonToHTML, ExportHTMLSettings } from '@lemoncode/manfred2html';
import { exportHTMLTemplate, ExportHTMLSettings } from '@lemoncode/manfred2html';
import { DEFAULT_EXPORT_FILENAME } from '@/core';
import { download } from '@/common';
import { TemplateExport } from './template-export.component';
Expand Down Expand Up @@ -38,7 +38,7 @@ export const TemplateExportContainer: React.FC = () => {
const onExportToHTML = async (text: string, exportHTMLSettings: ExportHTMLSettings) => {
try {
const manfredJsonContent = parseManfredJson(text);
const content = exportManfredJSonToHTML(manfredJsonContent, exportHTMLSettings);
const content = exportHTMLTemplate(manfredJsonContent, exportHTMLSettings);
const blob = new Blob([content], { type: 'text/html' });

await download(blob, 'manfred.html');
Expand All @@ -49,7 +49,7 @@ export const TemplateExportContainer: React.FC = () => {

const onHTMLSettingChanged = (text: string, exportHTMLSettings: ExportHTMLSettings): string => {
const manfredJsonContent = parseManfredJson(text);
const content = exportManfredJSonToHTML(manfredJsonContent, exportHTMLSettings);
const content = exportHTMLTemplate(manfredJsonContent, exportHTMLSettings);
return content;
};

Expand Down

This file was deleted.

63 changes: 13 additions & 50 deletions packages/manfred2html/src/engine/index.ts
Original file line number Diff line number Diff line change
@@ -1,57 +1,20 @@
import { ManfredAwesomicCV, ExportHTMLSettings } from '@/model';
import {
generateHtmlDocumentStart,
generateHtmlDocumentEnd,
generateHeaderElementStart,
generateHeaderElementEnd,
generateAboutMeSection,
generateAsideElementStart,
generateAsideElementEnd,
generateRelevantsLinksSection,
generateLanguageSection,
generateHardSkillsSection,
generateSoftSkillsSection,
generateMainElementStart,
generateMainElementEnd,
generateExperiencesSection,
generateStudiesSection,
} from './html-parts';
import { mapExportHTMLSettingsToSettings } from '@/mappers';
import { exportManfredJSonToHTMLTemplateA } from './template-a';
import { exportManfredJSonToHTMLTemplateB } from './template-b';

export const exportManfredJSonToHTML = (
export const exportHTMLTemplate = (
manfredJsonContent: ManfredAwesomicCV,
exportHTMLSettings: ExportHTMLSettings
): string => {
const htmlDocumentStart = generateHtmlDocumentStart(exportHTMLSettings.primaryColor);
const htmlDocumentEnd = generateHtmlDocumentEnd();
const headerElementStart = generateHeaderElementStart();
const headerElementEnd = generateHeaderElementEnd();
const aboutMeSection = generateAboutMeSection(manfredJsonContent);
const asideElementStart = generateAsideElementStart();
const asideElementEnd = generateAsideElementEnd();
const relevantsLinksSection = generateRelevantsLinksSection(manfredJsonContent);
const mainElementStart = generateMainElementStart();
const mainElementEnd = generateMainElementEnd();
const languageSection = generateLanguageSection(manfredJsonContent);
const hardSkillsSection = generateHardSkillsSection(manfredJsonContent);
const softSkillsSection = generateSoftSkillsSection(manfredJsonContent);
const experienceSection = generateExperiencesSection(manfredJsonContent);
const studiesSection = generateStudiesSection(manfredJsonContent);
const settings = mapExportHTMLSettingsToSettings(exportHTMLSettings);

return `
${htmlDocumentStart}
${headerElementStart}
${aboutMeSection}
${headerElementEnd}
${asideElementStart}
${relevantsLinksSection}
${languageSection}
${hardSkillsSection}
${softSkillsSection}
${asideElementEnd}
${mainElementStart}
${experienceSection}
${studiesSection}
${mainElementEnd}
${htmlDocumentEnd}
`;
switch (settings.template) {
case 'default':
return exportManfredJSonToHTMLTemplateA(manfredJsonContent, settings);
case 'CV-1':
return exportManfredJSonToHTMLTemplateB(manfredJsonContent, settings);
default:
throw new Error('Template not found');
}
};
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

<html lang="en">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import ejs from 'ejs';
import { HexColor } from '@/model';
import htmlDocumentStartTemplate from './html-document-start.ejs?raw';

export const generateHtmlDocumentStart = (color: HexColor): string => ejs.render(htmlDocumentStartTemplate, { color });
Loading
Loading