Merge pull request #374 from gianantoniopini/develop

Add a Birthdate field to the profile information
This commit is contained in:
Amruth Pillai
2020-11-22 12:00:26 +05:30
committed by GitHub
35 changed files with 153 additions and 82 deletions

View File

@ -38,6 +38,13 @@ const Profile = ({ id }) => {
path="profile.subtitle" path="profile.subtitle"
/> />
<Input
type="date"
name="birthDate"
label={t('builder.profile.birthDate')}
path="profile.birthDate"
/>
<hr /> <hr />
<Input <Input

View File

@ -190,6 +190,7 @@
"line2": "Brindavan Layout, Subramanyapura,", "line2": "Brindavan Layout, Subramanyapura,",
"pincode": "560061" "pincode": "560061"
}, },
"birthDate": "",
"email": "hello@amruthpillai.com", "email": "hello@amruthpillai.com",
"firstName": "Amruth", "firstName": "Amruth",
"heading": "Profile", "heading": "Profile",

View File

@ -5,6 +5,7 @@
"firstName": "", "firstName": "",
"lastName": "", "lastName": "",
"subtitle": "", "subtitle": "",
"birthDate": "",
"address": { "address": {
"line1": "", "line1": "",
"line2": "", "line2": "",

View File

@ -96,6 +96,7 @@
"photograph": "صورة فوتوغرافية", "photograph": "صورة فوتوغرافية",
"firstName": "الاسم الاول", "firstName": "الاسم الاول",
"lastName": "اسم العائلة", "lastName": "اسم العائلة",
"birthDate": "تاريخ الولادة",
"address": { "address": {
"line1": "العنوان الأول", "line1": "العنوان الأول",
"line2": "العنوان الثاني", "line2": "العنوان الثاني",

View File

@ -96,6 +96,7 @@
"photograph": "Fotografi", "photograph": "Fotografi",
"firstName": "Fornavn", "firstName": "Fornavn",
"lastName": "Efternavn", "lastName": "Efternavn",
"birthDate": "Fødselsdato",
"address": { "address": {
"line1": "Adresse linie 1", "line1": "Adresse linie 1",
"line2": "Adresse linie 2", "line2": "Adresse linie 2",

View File

@ -96,6 +96,7 @@
"photograph": "Foto", "photograph": "Foto",
"firstName": "Vorname", "firstName": "Vorname",
"lastName": "Nachname", "lastName": "Nachname",
"birthDate": "Geburtsdatum",
"address": { "address": {
"line1": "Adresszeile 1", "line1": "Adresszeile 1",
"line2": "Adresszeile 2", "line2": "Adresszeile 2",

View File

@ -96,6 +96,7 @@
"photograph": "Photograph", "photograph": "Photograph",
"firstName": "First Name", "firstName": "First Name",
"lastName": "Last Name", "lastName": "Last Name",
"birthDate": "Date of Birth",
"address": { "address": {
"line1": "Address Line 1", "line1": "Address Line 1",
"line2": "Address Line 2", "line2": "Address Line 2",

View File

@ -96,6 +96,7 @@
"photograph": "Fotografía", "photograph": "Fotografía",
"firstName": "Nombre", "firstName": "Nombre",
"lastName": "Apellido", "lastName": "Apellido",
"birthDate": "Fecha de Nacimiento",
"address": { "address": {
"line1": "Domicilio - Línea 1", "line1": "Domicilio - Línea 1",
"line2": "Dirección - Línea 2", "line2": "Dirección - Línea 2",

View File

@ -96,6 +96,7 @@
"photograph": "Valokuva", "photograph": "Valokuva",
"firstName": "Etunimi", "firstName": "Etunimi",
"lastName": "Sukunimi", "lastName": "Sukunimi",
"birthDate": "Syntymäaika",
"address": { "address": {
"line1": "Osoiterivi 1", "line1": "Osoiterivi 1",
"line2": "Osoiterivi 2", "line2": "Osoiterivi 2",

View File

@ -96,6 +96,7 @@
"photograph": "Photo", "photograph": "Photo",
"firstName": "Prénom", "firstName": "Prénom",
"lastName": "Nom", "lastName": "Nom",
"birthDate": "Date de naissance",
"address": { "address": {
"line1": "Adresse (ligne 1)", "line1": "Adresse (ligne 1)",
"line2": "Adresse (ligne 2)", "line2": "Adresse (ligne 2)",

View File

@ -96,6 +96,7 @@
"photograph": "फोटो", "photograph": "फोटो",
"firstName": "पहला नाम", "firstName": "पहला नाम",
"lastName": "उपनाम", "lastName": "उपनाम",
"birthDate": "जन्म की तारीख",
"address": { "address": {
"line1": "पता पंक्ति 1", "line1": "पता पंक्ति 1",
"line2": "पता पंक्ति नं। 2", "line2": "पता पंक्ति नं। 2",

View File

@ -96,6 +96,7 @@
"photograph": "Fotografia", "photograph": "Fotografia",
"firstName": "Nome", "firstName": "Nome",
"lastName": "Cognome", "lastName": "Cognome",
"birthDate": "Data di Nascita",
"address": { "address": {
"line1": "Riga Indirizzo 1", "line1": "Riga Indirizzo 1",
"line2": "Riga Indirizzo 2", "line2": "Riga Indirizzo 2",

View File

@ -96,6 +96,7 @@
"photograph": "写真", "photograph": "写真",
"firstName": "名", "firstName": "名",
"lastName": "姓", "lastName": "姓",
"birthDate": "生年月日",
"address": { "address": {
"line1": "都道府県", "line1": "都道府県",
"line2": "市区町村", "line2": "市区町村",

View File

@ -96,6 +96,7 @@
"photograph": "ಫೋಟೋ", "photograph": "ಫೋಟೋ",
"firstName": "ಮೊದಲ ಹೆಸರು", "firstName": "ಮೊದಲ ಹೆಸರು",
"lastName": "ಕೊನೆಯ ಹೆಸರು", "lastName": "ಕೊನೆಯ ಹೆಸರು",
"birthDate": "ಹುಟ್ತಿದ ದಿನ",
"address": { "address": {
"line1": "ವಿಳಾಸ ಸಾಲು 1", "line1": "ವಿಳಾಸ ಸಾಲು 1",
"line2": "ವಿಳಾಸ ಸಾಲು 2", "line2": "ವಿಳಾಸ ಸಾಲು 2",

View File

@ -96,6 +96,7 @@
"photograph": "Foto", "photograph": "Foto",
"firstName": "Fornavn", "firstName": "Fornavn",
"lastName": "Etternavn", "lastName": "Etternavn",
"birthDate": "Fødselsdato",
"address": { "address": {
"line1": "Adresselinje 1", "line1": "Adresselinje 1",
"line2": "Adresselinje 2", "line2": "Adresselinje 2",

View File

@ -96,6 +96,7 @@
"photograph": "foto", "photograph": "foto",
"firstName": "Voornaam", "firstName": "Voornaam",
"lastName": "Achternaam", "lastName": "Achternaam",
"birthDate": "Geboortedatum",
"address": { "address": {
"line1": "Adresveld 1", "line1": "Adresveld 1",
"line2": "Adresveld 2", "line2": "Adresveld 2",

View File

@ -96,6 +96,7 @@
"photograph": "Fotografia", "photograph": "Fotografia",
"firstName": "Imię", "firstName": "Imię",
"lastName": "Nazwisko", "lastName": "Nazwisko",
"birthDate": "Data urodzenia",
"address": { "address": {
"line1": "Pole adresowe 1", "line1": "Pole adresowe 1",
"line2": "Pole adresowe 2", "line2": "Pole adresowe 2",

View File

@ -96,6 +96,7 @@
"photograph": "Foto", "photograph": "Foto",
"firstName": "Primeiro Nome", "firstName": "Primeiro Nome",
"lastName": "Sobrenome", "lastName": "Sobrenome",
"birthDate": "Data de Nascimento",
"address": { "address": {
"line1": "Endereço Linha 1", "line1": "Endereço Linha 1",
"line2": "Endereço Linha 2", "line2": "Endereço Linha 2",

View File

@ -95,6 +95,7 @@
"photograph": "Fotografia", "photograph": "Fotografia",
"firstName": "Nome", "firstName": "Nome",
"lastName": "Apelido", "lastName": "Apelido",
"birthDate": "Data de Nascimento",
"address": { "address": {
"line1": "Morada Linha 1", "line1": "Morada Linha 1",
"line2": "Morada Linha 2", "line2": "Morada Linha 2",

View File

@ -96,6 +96,7 @@
"photograph": "Фотография", "photograph": "Фотография",
"firstName": "Имя", "firstName": "Имя",
"lastName": "Фамилия", "lastName": "Фамилия",
"birthDate": "Дата рождения",
"address": { "address": {
"line1": "Адрес, строка 1", "line1": "Адрес, строка 1",
"line2": "Адрес, строка 2", "line2": "Адрес, строка 2",

View File

@ -96,6 +96,7 @@
"photograph": "Fotografi", "photograph": "Fotografi",
"firstName": "Förnamn", "firstName": "Förnamn",
"lastName": "Efternamn", "lastName": "Efternamn",
"birthDate": "Födelsedatum",
"address": { "address": {
"line1": "Addressrad 1", "line1": "Addressrad 1",
"line2": "Addressrad 2", "line2": "Addressrad 2",

View File

@ -96,6 +96,7 @@
"photograph": "Fotoğraf", "photograph": "Fotoğraf",
"firstName": "Ad", "firstName": "Ad",
"lastName": "Soyad", "lastName": "Soyad",
"birthDate": "Doğum Tarihi",
"address": { "address": {
"line1": "Adres Satırı 1", "line1": "Adres Satırı 1",
"line2": "Adres Satırı 2", "line2": "Adres Satırı 2",

View File

@ -96,6 +96,7 @@
"photograph": "照片", "photograph": "照片",
"firstName": "姓", "firstName": "姓",
"lastName": "名", "lastName": "名",
"birthDate": "出生日期",
"address": { "address": {
"line1": "地址(第一行)", "line1": "地址(第一行)",
"line2": "地址(第二行)", "line2": "地址(第二行)",

View File

@ -12,6 +12,7 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateA from './blocks/BirthDate/BirthDateA'
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -76,7 +77,10 @@ const Castform = ({ data }) => {
<div> <div>
<HeadingD>{data.profile.heading}</HeadingD> <HeadingD>{data.profile.heading}</HeadingD>
<ContactC /> <div className="grid gap-4">
<BirthDateA />
<ContactC />
</div>
</div> </div>
{layout[0] && {layout[0] &&

View File

@ -1,9 +1,10 @@
import React from 'react'; import React from 'react';
import { useTranslation } from 'react-i18next';
import PageContext from '../contexts/PageContext'; import PageContext from '../contexts/PageContext';
import { hexToRgb } from '../utils'; import { hexToRgb } from '../utils';
import AwardsA from './blocks/Awards/AwardsA'; import AwardsA from './blocks/Awards/AwardsA';
import CertificationsA from './blocks/Certifications/CertificationsA'; import CertificationsA from './blocks/Certifications/CertificationsA';
import ContactE from './blocks/Contact/ContactE'; import ContactC from './blocks/Contact/ContactC';
import EducationA from './blocks/Education/EducationA'; import EducationA from './blocks/Education/EducationA';
import HeadingE from './blocks/Heading/HeadingE'; import HeadingE from './blocks/Heading/HeadingE';
import HobbiesA from './blocks/Hobbies/HobbiesA'; import HobbiesA from './blocks/Hobbies/HobbiesA';
@ -13,6 +14,7 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateA from './blocks/BirthDate/BirthDateA'
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -30,6 +32,7 @@ const Blocks = {
const Celebi = ({ data }) => { const Celebi = ({ data }) => {
const layout = data.metadata.layout.celebi; const layout = data.metadata.layout.celebi;
const { r, g, b } = hexToRgb(data.metadata.colors.primary) || {}; const { r, g, b } = hexToRgb(data.metadata.colors.primary) || {};
const { t } = useTranslation();
const styles = { const styles = {
header: { header: {
@ -94,8 +97,15 @@ const Celebi = ({ data }) => {
<div className="grid grid-cols-12 gap-8"> <div className="grid grid-cols-12 gap-8">
<div className="col-span-4 ml-8" style={styles.leftSection}> <div className="col-span-4 ml-8" style={styles.leftSection}>
<Photo /> <Photo />
<div className="text-center grid gap-4 mt-4 mb-8 mx-6"> <div className="text-center grid gap-4 mt-4 mb-8 mx-6">
<ContactE /> <div>
<HeadingE>{t('builder.sections.profile')}</HeadingE>
<div className="relative w-full grid gap-4 text-xs">
<BirthDateA />
<ContactC />
</div>
</div>
{layout[0] && {layout[0] &&
layout[0].map((x) => { layout[0].map((x) => {

View File

@ -13,6 +13,7 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesB from './blocks/References/ReferencesB'; import ReferencesB from './blocks/References/ReferencesB';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateC from './blocks/BirthDate/BirthDateC'
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -84,7 +85,10 @@ const Gengar = ({ data }) => {
style={{ borderColor: data.metadata.colors.background }} style={{ borderColor: data.metadata.colors.background }}
/> />
<ContactB /> <div className="grid gap-4">
<BirthDateC />
<ContactB />
</div>
</div> </div>
<div <div

View File

@ -13,6 +13,7 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateA from './blocks/BirthDate/BirthDateA'
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -70,7 +71,11 @@ const Glalie = ({ data }) => {
> >
<div className="grid gap-6 text-center p-8"> <div className="grid gap-6 text-center p-8">
<Profile /> <Profile />
<ContactD />
<div className="grid">
<BirthDateA />
<ContactD />
</div>
{layout[0] && {layout[0] &&
layout[0].map((x) => { layout[0].map((x) => {

View File

@ -12,6 +12,7 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateB from './blocks/BirthDate/BirthDateB'
const Blocks = { const Blocks = {
objective: ObjectiveA, objective: ObjectiveA,
@ -70,7 +71,10 @@ const Onyx = ({ data }) => {
</div> </div>
</div> </div>
<Contact /> <div className="grid gap-4">
<BirthDateB />
<Contact />
</div>
</div> </div>
<hr <hr

View File

@ -12,6 +12,7 @@ import ProjectsA from './blocks/Projects/ProjectsA';
import ReferencesA from './blocks/References/ReferencesA'; import ReferencesA from './blocks/References/ReferencesA';
import SkillsA from './blocks/Skills/SkillsA'; import SkillsA from './blocks/Skills/SkillsA';
import WorkA from './blocks/Work/WorkA'; import WorkA from './blocks/Work/WorkA';
import BirthDateB from './blocks/BirthDate/BirthDateB'
const Blocks = { const Blocks = {
work: WorkA, work: WorkA,
@ -89,6 +90,7 @@ const Pikachu = ({ data }) => {
<div className="col-span-4"> <div className="col-span-4">
<div className="grid gap-4"> <div className="grid gap-4">
<BirthDateB />
<ContactA /> <ContactA />
{layout[0] && {layout[0] &&

View File

@ -0,0 +1,26 @@
import React, { memo, useContext } from 'react';
import { useTranslation } from 'react-i18next';
import PageContext from '../../../contexts/PageContext';
import { formatDate } from '../../../utils';
const BirthDateA = () => {
const { t } = useTranslation();
const { data } = useContext(PageContext);
if (data.profile.birthDate) {
return (
<div className="text-xs">
<h6 className="capitalize font-semibold">
{t('builder.profile.birthDate')}
</h6>
<div>
<span>{formatDate({ date: data.profile.birthDate, language: data.metadata.language, includeDay: true })}</span>
</div>
</div>
);
}
return null;
}
export default memo(BirthDateA);

View File

@ -0,0 +1,27 @@
import React, { memo, useContext } from 'react';
import PageContext from '../../../contexts/PageContext';
import { get } from 'lodash';
import Icons from '../Icons';
import { formatDate } from '../../../utils';
const BirthDateB = () => {
const { data } = useContext(PageContext);
const Icon = get(Icons, "birthdaycake");
if (data.profile.birthDate) {
return (
<div className="text-xs flex items-center">
<Icon
size="10px"
className="mr-2"
style={{ color: data.metadata.colors.primary }}
/>
<span className="font-medium break-all">{formatDate({ date: data.profile.birthDate, language: data.metadata.language, includeDay: true })}</span>
</div>
);
}
return null;
}
export default memo(BirthDateB);

View File

@ -0,0 +1,27 @@
import React, { memo, useContext } from 'react';
import PageContext from '../../../contexts/PageContext';
import { get } from 'lodash';
import Icons from '../Icons';
import { formatDate } from '../../../utils';
const BirthDateC = () => {
const { data } = useContext(PageContext);
const Icon = get(Icons, "birthdaycake");
if (data.profile.birthDate) {
return (
<div className="text-xs flex items-center">
<Icon
size="10px"
className="mr-2"
style={{ color: data.metadata.colors.background }}
/>
<span className="font-medium break-all">{formatDate({ date: data.profile.birthDate, language: data.metadata.language, includeDay: true })}</span>
</div>
);
}
return null;
}
export default memo(BirthDateC);

View File

@ -1,72 +0,0 @@
import React, { memo, useContext } from 'react';
import { useTranslation } from 'react-i18next';
import PageContext from '../../../contexts/PageContext';
import { safetyCheck } from '../../../utils';
const ContactItem = ({ value, label, link }) => {
return value ? (
<div className="flex flex-col">
<h6 className="capitalize font-semibold">{label}</h6>
{link ? (
<a href={link} target="_blank" rel="noopener noreferrer">
<span className="font-medium break-all">{value}</span>
</a>
) : (
<span className="font-medium break-all">{value}</span>
)}
</div>
) : null;
};
const ContactE = () => {
const { t } = useTranslation();
const { data, heading: Heading } = useContext(PageContext);
return (
<div>
<Heading>{t('builder.sections.profile')}</Heading>
<div className="relative w-full grid gap-2 text-xs">
<div>
<h6 className="capitalize font-semibold">
{t('shared.forms.address')}
</h6>
<div className="flex flex-col text-xs">
<span>{data.profile.address.line1}</span>
<span>{data.profile.address.line2}</span>
<span>
{data.profile.address.city} {data.profile.address.pincode}
</span>
</div>
</div>
<ContactItem
label={t('shared.forms.phone')}
value={data.profile.phone}
link={`tel:${data.profile.phone}`}
/>
<ContactItem
label={t('shared.forms.website')}
value={data.profile.website}
link={data.profile.website}
/>
<ContactItem
label={t('shared.forms.email')}
value={data.profile.email}
link={`mailto:${data.profile.email}`}
/>
{safetyCheck(data.social) &&
data.social.items.map((x) => (
<ContactItem
key={x.id}
value={x.username}
label={x.network}
link={x.url}
/>
))}
</div>
</div>
);
};
export default memo(ContactE);

View File

@ -8,7 +8,8 @@ import {
FaInstagram, FaInstagram,
FaStackOverflow, FaStackOverflow,
FaBehance, FaBehance,
FaGitlab FaGitlab,
FaBirthdayCake
} from 'react-icons/fa'; } from 'react-icons/fa';
import { MdPhone, MdEmail } from 'react-icons/md'; import { MdPhone, MdEmail } from 'react-icons/md';
@ -24,7 +25,8 @@ const Icons = {
instagram: FaInstagram, instagram: FaInstagram,
stackoverflow: FaStackOverflow, stackoverflow: FaStackOverflow,
behance: FaBehance, behance: FaBehance,
gitlab: FaGitlab gitlab: FaGitlab,
birthdaycake: FaBirthdayCake
}; };
export default Icons; export default Icons;

View File

@ -20,8 +20,11 @@ export const isFileImage = (file) => {
return file && acceptedImageTypes.includes(file.type); return file && acceptedImageTypes.includes(file.type);
}; };
export const formatDate = ({ date, language = 'en' }) => { export const formatDate = ({ date, language = 'en', includeDay = false }) => {
return dayjs(date).locale(language.substr(0, 2)).format('MMMM YYYY'); const monthYearTemplate = 'MMMM YYYY';
const template = includeDay ? 'DD ' + monthYearTemplate : monthYearTemplate;
return dayjs(date).locale(language.substr(0, 2)).format(template);
}; };
export const formatDateRange = ({ startDate, endDate, language = 'en' }, t) => { export const formatDateRange = ({ startDate, endDate, language = 'en' }, t) => {