UNPKG

@krowdy-ui/views

Version:

React components that implement Google's Material Design.

404 lines (382 loc) 12.4 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import React from 'react'; import PropTypes from 'prop-types'; import { Paper, makeStyles, Typography, Divider, Dot, Avatar, Button } from '@krowdy-ui/core'; import { Grade as GradeIcon, TrendingUp as TrendingUpIcon, Work as WorkIcon, Business as BusinessIcon, Loop as LoopIcon, AttachMoney as AttachMoneyIcon, School as SchoolIcon } from '@material-ui/icons'; import clsx from 'clsx'; import dayjs from 'dayjs'; import 'dayjs/locale/es'; const legendDegree = { Doctorado: 4, Master: 3, Secundaria: 0, Técnico: 1, Universitario: 2 }; const getEducation = educations => { if (!educations.length) return null; const parsedEducation = educations.map(education => _extends({}, education, { degree: legendDegree[education.degree] })).sort((a, b) => { const n = b.degree - a.degree; if (n !== 0) return n; if (!b.endDate) return 1; if (!a.endDate) return 1; const o = dayjs(b.endDate).diff(dayjs(a.endDate)); if (o !== 0) return o; if (!b.startDate) return 1; if (!a.startDate) return 1; return dayjs(b.startDate).diff(dayjs(a.startDate)); }); return parsedEducation[0]; }; const compare = (a, b) => { if (b.workHere || dayjs(a.endDate).isBefore(b.endDate)) return 1; return -1; }; function sufix(number) { if (number >= 12) { const year = Math.floor(number / 12); return `${year} ${year > 1 ? 'años' : 'año'}`; } return `${number} ${number > 1 ? 'meses' : 'mes'}`; } const Rating = ({ rating }) => { const classes = useStyles(); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: classes.first }, /*#__PURE__*/React.createElement(Typography, { variant: "h6" }, rating), /*#__PURE__*/React.createElement(GradeIcon, { className: classes.rating, color: "primary", fontSize: "small" })), /*#__PURE__*/React.createElement(Divider, { className: classes.divider })); }; var _ref = /*#__PURE__*/React.createElement(SchoolIcon, { color: "primary", fontSize: "small" }); const Education = ({ education }) => { const classes = useStyles(); const interval = education.endDate ? dayjs().diff(dayjs(education.endDate), 'month') : null; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: classes.row }, /*#__PURE__*/React.createElement("div", { className: classes.icon }, _ref), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Typography, { className: classes.title, variant: "body1" }, education.career, " | ", education.institutionName), /*#__PURE__*/React.createElement(Typography, { className: classes.subtitle, variant: "body1" }, education.endDate ? `Hace ${sufix(interval)}` : 'A la fecha'))), /*#__PURE__*/React.createElement(Divider, { className: classes.divider })); }; var _ref2 = /*#__PURE__*/React.createElement(TrendingUpIcon, { color: "primary", fontSize: "small" }); const Ascent = ({ count, time }) => { const classes = useStyles(); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: classes.row }, /*#__PURE__*/React.createElement("div", { className: classes.icon }, _ref2), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Typography, { className: classes.title, variant: "body1" }, count, " Ascenso", count > 1 ? 's' : ''), /*#__PURE__*/React.createElement(Typography, { className: classes.subtitle, variant: "body1" }, "En ", sufix(time)))), /*#__PURE__*/React.createElement(Divider, { className: classes.divider })); }; var _ref3 = /*#__PURE__*/React.createElement(WorkIcon, { color: "primary", fontSize: "small" }); const Experience = ({ experience }) => { const classes = useStyles(); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: classes.row }, /*#__PURE__*/React.createElement("div", { className: classes.icon }, _ref3), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Typography, { className: classes.title, variant: "body1" }, "Experiencia"), /*#__PURE__*/React.createElement(Typography, { className: classes.subtitle, variant: "body1" }, sufix(experience)))), /*#__PURE__*/React.createElement(Divider, { className: classes.divider })); }; var _ref4 = /*#__PURE__*/React.createElement(BusinessIcon, { color: "primary", fontSize: "small" }); const WorkExperience = ({ name, count }) => { const classes = useStyles(); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: classes.row }, /*#__PURE__*/React.createElement("div", { className: classes.icon }, _ref4), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Typography, { className: classes.title, variant: "body1" }, "Trabaja en ", name), /*#__PURE__*/React.createElement(Typography, { className: classes.subtitle, variant: "body1" }, "Hace ", sufix(count)))), /*#__PURE__*/React.createElement(Divider, { className: classes.divider })); }; var _ref5 = /*#__PURE__*/React.createElement(LoopIcon, { color: "primary", fontSize: "small" }); const Rotation = ({ count, time }) => { const classes = useStyles(); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: classes.row }, /*#__PURE__*/React.createElement("div", { className: classes.icon }, _ref5), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Typography, { className: classes.title, variant: "body1" }, "Rotaci\xF3n"), /*#__PURE__*/React.createElement(Typography, { className: classes.subtitle, variant: "body1" }, count, " ve", count > 1 ? 'ces' : 'z', " cada ", sufix(time)))), /*#__PURE__*/React.createElement(Divider, { className: classes.divider })); }; var _ref6 = /*#__PURE__*/React.createElement(AttachMoneyIcon, { color: "primary", fontSize: "small" }); const SalaryText = ({ salaryText }) => { const classes = useStyles(); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: classes.row }, /*#__PURE__*/React.createElement("div", { className: classes.icon }, _ref6), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Typography, { className: classes.title, variant: "body1" }, "Salario"), /*#__PURE__*/React.createElement(Typography, { className: classes.subtitle, variant: "body1" }, salaryText))), /*#__PURE__*/React.createElement(Divider, { className: classes.divider })); }; var _ref7 = /*#__PURE__*/React.createElement(Dot, { color: "primary" }); var _ref8 = /*#__PURE__*/React.createElement(BusinessIcon, { color: "primary", fontSize: "small" }); const Company = ({ company }) => { const { imgUrl, companyName, workHere, startDate, endDate } = company; const classes = useStyles(); const interval = endDate ? dayjs(endDate).month() : dayjs().diff(dayjs(startDate), 'month'); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", { className: clsx(classes.experience, workHere ? classes.left : classes.experienceLeft) }, workHere ? _ref7 : null, /*#__PURE__*/React.createElement("div", { className: classes.row }, /*#__PURE__*/React.createElement(Avatar, { className: classes.small, src: imgUrl, variant: "rounded" }, companyName ? companyName.charAt(0) : _ref8), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Typography, { className: classes.title, variant: "body1" }, companyName), startDate ? /*#__PURE__*/React.createElement(Typography, { className: classes.subtitle, variant: "body1" }, sufix(interval), " \u2022 ", dayjs(startDate).format('MMM YYYY'), " - ", endDate ? dayjs(endDate).format('MMM YYYY') : 'Actualidad') : null))), /*#__PURE__*/React.createElement(Divider, { className: classes.divider })); }; const Profile = ({ name, rating, ascent, experience, workExperience, rotation, salaryText, action, experiences = [], educations = [], onCV, slice = 2 }) => { const classes = useStyles(); const parsedExperiences = experiences.filter(({ jobPosition }) => jobPosition).sort(compare); const difference = experiences.length - slice; const education = getEducation(educations); return /*#__PURE__*/React.createElement(Paper, { className: classes.container, variant: "outlined" }, /*#__PURE__*/React.createElement("div", { className: classes.contentTitle }, /*#__PURE__*/React.createElement(Typography, { className: classes.name, variant: "h6" }, name), action), rating ? /*#__PURE__*/React.createElement(Rating, { rating: rating }) : null, education ? /*#__PURE__*/React.createElement(Education, { education: education }) : null, ascent ? /*#__PURE__*/React.createElement(Ascent, { count: ascent.count, time: ascent.time }) : null, rotation ? /*#__PURE__*/React.createElement(Rotation, { count: rotation.count, time: rotation.time }) : null, experience ? /*#__PURE__*/React.createElement(Experience, { experience: experience }) : null, workExperience ? /*#__PURE__*/React.createElement(WorkExperience, { count: workExperience.count, name: workExperience.name }) : null, salaryText ? /*#__PURE__*/React.createElement(SalaryText, { salaryText: salaryText }) : null, parsedExperiences ? (difference > 0 ? parsedExperiences.slice(0, slice) : parsedExperiences).map((company, index) => /*#__PURE__*/React.createElement(Company, { company: company, key: index })) : null, difference > 0 ? /*#__PURE__*/React.createElement("div", { className: classes.difference }, /*#__PURE__*/React.createElement(Button, { color: "inherit", onClick: onCV }, "+ ", difference, " experiencia", difference > 1 ? 's' : '')) : null); }; const useStyles = makeStyles(theme => ({ container: { display: 'flex', flexDirection: 'column', height: '100%', overflow: 'hidden', padding: theme.spacing(1), width: '100%' }, contentTitle: { alignItems: 'center', display: 'flex', justifyContent: 'space-between', width: '100%' }, difference: { color: theme.palette.grey[600], display: 'flex', flexDirection: 'row-reverse' }, divider: { backgroundColor: theme.palette.secondary[10], marginLeft: -theme.spacing(1), marginRight: -theme.spacing(1) }, experience: { alignItems: 'center', display: 'flex', flexDirection: 'row' }, experienceLeft: { marginLeft: theme.spacing(2.5) }, first: { alignItems: 'center', display: 'flex', flexDirection: 'row', marginBottom: theme.spacing(2), marginTop: theme.spacing(0.5) }, icon: { marginLeft: theme.spacing(1), marginRight: theme.spacing(2) }, left: { marginLeft: theme.spacing(1.5) }, name: { color: theme.palette.secondary[600] }, rating: { marginLeft: theme.spacing(1) }, row: { alignItems: 'center', display: 'flex', flexDirection: 'row', marginBottom: theme.spacing(0.5), marginTop: theme.spacing(0.5) }, small: { height: theme.spacing(3), marginLeft: theme.spacing(1), marginRight: theme.spacing(1), width: theme.spacing(3) }, subtitle: { color: theme.palette.grey[600] }, title: { color: theme.palette.grey[800] } }), { name: 'Profile' }); process.env.NODE_ENV !== "production" ? Profile.propTypes = { action: PropTypes.node, ascent: PropTypes.shape({ count: PropTypes.number, time: PropTypes.number }), experience: PropTypes.number, name: PropTypes.string.isRequired, rating: PropTypes.number, rotation: PropTypes.shape({ count: PropTypes.number, time: PropTypes.number }), salaryText: PropTypes.string, workExperience: PropTypes.shape({ count: PropTypes.number, name: PropTypes.string }) } : void 0; export default Profile;