{"version":3,"sources":["pages/postulaciones/PostulacionContainer.js","common/Field.tsx","common/Form.tsx","utils/rut.ts","utils/passport.ts","utils/email.ts","common/Table.tsx","common/Th.tsx","common/titulos.tsx","common/Request.tsx","utils/popups.ts","utils/errors.ts","common/attachments.tsx","pages/postulaciones/attachments.tsx","pages/postulaciones/PostulacionForm.tsx","pages/postulaciones/PostulacionHome.tsx","common/StyledTable.js","pages/postulaciones/PostulacionList.js","pages/postulaciones/PostulacionEdit.js","pages/postulaciones/PostulacionHistory.js","common/Sitios.tsx","pages/admin-concursos/DetailsModal.js","pages/concursos/ActaFinalModal.js","common/ActionButtons.tsx","pages/common/ConcursosHistory.tsx","pages/admin-concursos/ApproveModal.js","pages/admin-concursos/DeclineModal.js","pages/admin-concursos/Mantenedor.tsx","pages/common/EditConcursoModal.js","pages/concursos/DraftDeleteModal.js","pages/admin-concursos/AdminConcursosPending.tsx","pages/admin-concursos/AdminConcursosReviewed.tsx","pages/concursos/DraftSendModal.js","pages/concursos/ConcursosDraft.tsx","pages/concursos/ConcursosPendingResolution.tsx","pages/concursos/ConcursosApproved.tsx","App.js","serviceWorker.js","index.js"],"names":["useStyles","makeStyles","theme","root","flexGrow","menuButton","marginRight","spacing","toolbar","minHeight","alignItems","paddingTop","paddingBottom","justifyContent","title","alignSelf","breadcrumb","fontSize","AutoBreadcrumb","props","links","classes","React","createElement","className","Breadcrumbs","separator","NavigateNextIcon","map","link","Link","key","name","color","href","to","PostulacionContainer","related","noIntro","Fragment","AppBar","position","elevation","Container","maxWidth","Toolbar","style","width","src","IconButton","aria-label","SearchIcon","edge","MoreIcon","Grid","container","justify","item","xs","Paper","background","listStyle","children","height","Field","Object","assign","marginBottom","marginTop","valid","borderColor","borderWidth","Date","getTimezoneOffset","isBlank","s","toString","trim","length","useTextField","config","_config$defaultValue","_Boolean3","value","setValue","useState","defaultValue","hasBeenBlurred","setHasBeenBlurred","Boolean","validate","_config$requiredField","_config$validate5","_config$validate6","optional","requiredFieldMessage","call","validation","error","onChange","event","_config$onChange","target","onBlur","format","field","reset","_config$defaultValue2","render","TextField","variant","fullWidth","label","disabled","helperText","useSelectField","FormControl","InputLabel","Select","onClose","options","option","MenuItem","FormHelperText","useForm","fields","isValid","every","validateRut","p","parseRut","digits","dv","factors","push","sum","reverse","forEach","digit","i","computeDV","Number","formatRut","join","toLocaleString","_withDots$exec","toUpperCase","match","exec","pop","validatePassport","formatPassport","test","replace","validateEmail","console","assert","Table","Th","backgroundColor","useTitulosField","val","reactKey","id","defaultTitulos","List","of","titulos","setTitulos","tituloGradoField","institucionField","innerForm","isEmpty","size","addTitulo","newTitulo","titulo","institucion","Math","random","list","FieldContainer","Button","disableElevation","onClick","index","remove","removeTitulo","Request","_ref","resource","action","loading","err","showDetails","setShowDetails","redirectToHome","window","location","handleLoadingConcursoError","url","message","response","status","body","getLoadingConcursosErrorMessage","Swal","fire","icon","html","then","ENV","URL_FRONT","redirect","handleDownloadFileError","getDownloadFileErrorMessage","handlePostularError","correo","getPostularErrorMessage","popup","allowedExtensions","extension","mimeType","Attachment","constructor","nombre","archivo","deleted","this","undefined","set","new","attachmentMimeType","type","some","AttachOrDownload","enableAttach","attachment","textOverflow","files","alert","_props$onBlur","setAttachment","x","onChangeSelectedFiles","accept","enableDownload","text","axios","API_URL","route","method","responseType","file","Blob","data","fileURL","URL","createObjectURL","document","download","click","catch","PostulacionAttachment","super","antecedente","log","obligatorio","PostulacionFileField","shouldShowError","display","capitalize","marginLeft","isEditing","e","backdrop","zIndex","drawer","Section","paddingLeft","header","Label","Value","PostulacionForm","concursoPk","concurso","setConcurso","setLoading","loading2","setLoading2","clicked","setClicked","getConcursoError","setGetConcursoError","getNacionalidadesError","setGetNacionalidadesError","openSpinner","setOpenSpinner","defaultData","getCorreoContacto","correo_contacto","useEffect","get","getPostulacionErrorMessage","handlePostulacionError","finally","nacionalidades","setNacionalidades","_","sortBy","filter","nac","cl","find","clIndex","indexOf","splice","nombresField","nombres","apellidosField","apellidos","correoField","telefonoField","_config$defaultValue3","_Boolean4","phoneNumber","parsePhoneNumberFromString","formatInternational","newValue","MuiPhoneNumber","defaultCountry","preferredCountries","usePhoneField","telefono","direccionField","direccion","nacionalidadField","id_nacionalidad","paisResidenciaField","id_pais_residencia","rutPasaporteField","tipo_documento","component","RadioGroup","row","FormControlLabel","control","Radio","numDocumentoField","rut_pasaporte","datosPersonalesForm","titulosField","postulacion","enviarPostulacion","useCallback","formObj","toArray","antecedentes","attachments","formData","objectToFormData","indices","nullsAsUndefineds","booleansAsIntegers","allowEmptyArrays","headers","put","uuid","res","setTimeout","correo_postulación","confirmButtonColor","confirmButtonText","post","setAttachments","_concurso$antecedente","antecedenteConcurso","_defaultData$antecede","_defaultData$antecede2","_defaultData$antecede3","antecedentePostulacion","nombre_facultad","nombre_contacto","update","updateAttachment","formsAreValid","element","form","Backdrop","open","CircularProgress","PostulacionHome","useParams","table","boxShadow","trow","thead","tcell","paddingRight","StyledHeadCell","content","TableCell","StyledBodyCell","StyledSkeleton","opacity","Skeleton","animationDelay","delay","StyledTable","rows","skeletonHeight","skeletonTotal","Array","keys","idx","TableContainer","TableHead","TableRow","hIdx","TableBody","rIdx","cell","cIdx","ConcursosFacultad","visible","concursosFacultad","facultad","Concurso","filaConcurso","codigo","apertura","fecha_inicio","cierre","fecha_termino","concursoId","numPostulantes","creador","id_usuario_creador","contacto","id_usuario_contacto","publicacion","fecha_aviso_diario","facultades","cierreDate","getTime","cierreDateLocal","toISOString","substring","fechaCierre","moment","locale","ActionsButtons","pending","handleDownloadFilesClick","PostulacionList","concursos","setConcursos","loadingConcursos","setLoadingConcursos","setError","PostulacionEdit","setPostulacion","loadingPostulacion","setLoadingPostulacion","api_route","getEdicionConcursoErrorMessage","handleEdicionConcursoError","codigo_concurso","popUp","aperturaDate","aperturaDateLocal","fechaApertura","tab","appbar","button","dialog","tooltip","fontWeight","menuIcon","minWidth","App","useMemo","createMuiTheme","palette","primary","main","secondary","ThemeProvider","Router","Switch","ApmRoute","path","PostulacionHistory","Route","hostname","initApm","serviceName","serverUrl","SERVER","active","serviceVersion","environment","logLevel","breakdownMetrics","interceptors","request","use","ReactDOM","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.440260f7.chunk.js","sourcesContent":["import React from \"react\";\nimport Container from \"@material-ui/core/Container\";\nimport AppBar from \"@material-ui/core/AppBar\";\nimport Toolbar from \"@material-ui/core/Toolbar\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport SearchIcon from \"@material-ui/icons/Search\";\nimport MoreIcon from \"@material-ui/icons/MoreVert\";\nimport Breadcrumbs from \"@material-ui/core/Breadcrumbs\";\nimport NavigateNextIcon from \"@material-ui/icons/NavigateNext\";\nimport Link from \"@material-ui/core/Link\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Paper from \"@material-ui/core/Paper\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n },\n menuButton: {\n marginRight: theme.spacing(2),\n },\n toolbar: {\n minHeight: 128,\n alignItems: \"flex-start\",\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(2),\n justifyContent: \"space-between\",\n },\n title: {\n flexGrow: 1,\n alignSelf: \"flex-end\",\n },\n breadcrumb: {\n fontSize: \"14px\",\n },\n}));\n\nconst AutoBreadcrumb = (props) => {\n const links = props.links;\n const classes = useStyles();\n\n return (\n
\n }\n >\n {links.map((link) => (\n \n {link.name}\n \n ))}\n \n
\n );\n};\n\nconst PostulacionContainer = (props) => {\n const classes = useStyles();\n const related = props.related;\n const noIntro = props.noIntro;\n\n return (\n \n \n \n \n \n
\n \n \n \n \n \n \n
\n
\n
\n
\n\n \n
\n \n {noIntro ? null : (\n \n \n

Concursos para cargos académicos

\n

\n Como parte de un programa de fortalecimiento de su planta de\n profesores, la Universidad de Chile invita a personas con\n grado doctor (Ph.D.) a participar en concursos públicos\n convocados para proveer cargos académicos de jornada completa\n en las unidades que se indican.\n

\n
\n \n \n Enlaces relacionados\n
    \n {related.map((link) => (\n
  • \n {\" \"}\n {link.name}\n
  • \n ))}\n
\n \n
\n
\n )}\n\n {props.children}\n
\n
\n\n \n
\n
\n
\n );\n};\n\nexport default PostulacionContainer;\n","import React, {HTMLProps} from \"react\";\n\nconst Field: React.FC> = props => {\n return (\n
\n {props.children}\n
\n );\n};\nexport default Field;","import React, {\n ChangeEvent,\n CSSProperties,\n Dispatch,\n ReactElement,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { convert, LocalDate, LocalDateTime } from \"js-joda\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Button from \"@material-ui/core/Button\";\nimport TextField from \"@material-ui/core/TextField\";\nimport Select from \"@material-ui/core/Select\";\nimport MenuItem from \"@material-ui/core/MenuItem\";\nimport FormControl from \"@material-ui/core/FormControl\";\nimport InputLabel from \"@material-ui/core/InputLabel\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Radio from \"@material-ui/core/Radio\";\nimport RadioGroup from \"@material-ui/core/RadioGroup\";\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport AccessTimeIcon from \"@material-ui/icons/AccessTime\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport DateFnsUtils from \"@date-io/date-fns\";\nimport esLocale from \"date-fns/locale/es\";\nimport {\n KeyboardDatePicker,\n KeyboardTimePicker,\n MuiPickersUtilsProvider,\n} from \"@material-ui/pickers\";\nimport { FormHelperText } from \"@material-ui/core\";\nimport axios from \"axios\";\nimport {List, Record} from \"immutable\";\nimport MuiPhoneNumber from \"material-ui-phone-number\";\nimport { parsePhoneNumberFromString } from \"libphonenumber-js\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n marginTop: \"1rem\",\n },\n valid: {\n marginTop: \"1rem\",\n \"& label\": {\n color: \"limegreen\",\n },\n \"& .MuiOutlinedInput-root\": {\n \"& fieldset\": {\n borderColor: \"limegreen\",\n borderWidth: 1,\n },\n \"&:hover fieldset\": {\n borderColor: \"limegreen\",\n borderWidth: 1,\n },\n },\n },\n}));\n\nconst tzOffset = (new Date()).getTimezoneOffset() * 60000;\n\nfunction isBlank(s: string): boolean {\n const str = s.toString();\n return str.trim().length === 0;\n}\n\nexport interface Field {\n value: V;\n valid: boolean;\n validation: string;\n render(): ReactElement;\n}\n\nexport type DateField = {\n value: LocalDate | null;\n valid: boolean;\n validation: string;\n render(): ReactElement;\n};\n\nexport function useDateField(config?: {\n validate?(date: LocalDate): string;\n defaultValue?: LocalDate;\n disablePast?: boolean;\n disabled?: boolean;\n label?: string;\n name?: string;\n optional?: boolean;\n}): DateField {\n const classes = useStyles();\n const defaultJsDate: Date | null = config?.defaultValue\n ? convert(config?.defaultValue).toDate()\n : null;\n const [jsDate, setJsDate] = useState(defaultJsDate);\n const [hasBeenBlurred, setHasBeenBlurred] = useState(Boolean(config?.defaultValue) ?? false);\n\n let date: LocalDate | null = null;\n if (jsDate) {\n try {\n const offsetDate = new Date(jsDate.getTime() - tzOffset);\n date = LocalDate.parse(offsetDate.toISOString().substring(0, 10));\n } catch (pokemonException) {}\n }\n\n function validate(): string {\n if (date == null) {\n return config?.optional ? \"OK\" : \"Campo requerido\";\n }\n\n const today = LocalDate.now();\n if (config?.disablePast && date.isBefore(today)) {\n return \"La fecha no puede ser anterior a hoy\";\n }\n\n return config?.validate?.(date) ?? \"OK\";\n }\n\n const validation = validate();\n const valid = validation === \"OK\";\n const error = hasBeenBlurred && !valid;\n\n function onBlur(): void {\n setHasBeenBlurred(true);\n }\n\n function render(): ReactElement {\n return (\n \n \n \n );\n }\n\n return { value: date, valid, validation, render };\n}\n\nexport type TimeField = {\n value: LocalDateTime | null;\n valid: boolean;\n validation: string;\n render(): ReactElement;\n};\n\nexport function useTimeField(config?: {\n validate?(date: LocalDateTime): string;\n defaultValue?: LocalDateTime;\n disablePast?: boolean;\n disabled?: boolean;\n label?: string;\n name?: string;\n optional?: boolean;\n}): TimeField {\n const classes = useStyles();\n const defaultJsDate: Date | null = config?.defaultValue\n ? convert(config?.defaultValue).toDate()\n : null;\n const [jsDate, setJsDate] = useState(defaultJsDate);\n const [hasBeenBlurred, setHasBeenBlurred] = useState(Boolean(config?.defaultValue) ?? false);\n\n let date: LocalDateTime | null = null;\n if (jsDate) {\n try {\n const offsetDate = new Date(jsDate.getTime() - tzOffset);\n date = LocalDateTime.parse(offsetDate.toISOString().substring(0, 23));\n } catch (pokemonException) {}\n }\n\n function validate(): string {\n if (date == null) {\n return config?.optional ? \"OK\" : \"Campo requerido\";\n }\n\n return config?.validate?.(date) ?? \"OK\";\n }\n\n const validation = validate();\n const valid = validation === \"OK\";\n const error = hasBeenBlurred && !valid;\n\n function onBlur(): void {\n setHasBeenBlurred(true);\n }\n\n function render(): ReactElement {\n return (\n \n }\n style={{ width: \"100%\" }}\n />\n \n );\n }\n\n return { value: date, valid, validation, render };\n}\n\nexport type TextField = {\n value: string;\n valid: boolean;\n validation: string;\n validate(): string;\n render(props?: { style?: CSSProperties }): ReactElement;\n hasBeenBlurred: boolean;\n onChange(event: any): void;\n onBlur(): void;\n error: boolean;\n reset(): void;\n};\n\nexport function useTextField(config?: {\n validate?(value: string): string;\n format?(value: string): string;\n optional?: boolean;\n type?: string;\n render?(field: TextField, props?: { style?: CSSProperties }): ReactElement;\n name?: string;\n label?: string;\n fullWidth?: boolean;\n defaultValue?: string;\n disabled?: boolean;\n onChange?: (event: any) => void;\n requiredFieldMessage?: string;\n}): TextField {\n const classes = useStyles();\n const [value, setValue] = useState(config?.defaultValue ?? \"\");\n const [hasBeenBlurred, setHasBeenBlurred] = useState(Boolean(config?.defaultValue) ?? false);\n\n function validate(): string {\n return isBlank(value)\n ? config?.optional\n ? \"OK\"\n : (config?.requiredFieldMessage ?? \"Campo requerido\")\n : config?.validate?.(value) ?? \"OK\";\n }\n\n const validation = validate();\n const valid = validation === \"OK\";\n const error = hasBeenBlurred && !valid;\n\n function onChange(event: any): void {\n setValue(event.target.value);\n config?.onChange?.(event);\n }\n\n function onBlur(): void {\n if (config?.format && valid) {\n setValue(config?.format(value));\n }\n setHasBeenBlurred(true);\n }\n\n function reset(): void {\n setHasBeenBlurred(false);\n setValue(config?.defaultValue ?? \"\");\n }\n\n const field = {\n value,\n valid,\n validation,\n onChange,\n onBlur,\n validate,\n reset,\n hasBeenBlurred,\n error,\n render: function (props?: { style?: CSSProperties }): ReactElement {\n if (config?.render) {\n return config?.render(field, props);\n }\n\n return (\n \n );\n },\n };\n\n return field;\n}\n\ntype EnumFieldConfig = {\n label?: string;\n optional?: boolean;\n options: { value: string; label: string }[];\n defaultValue?: string;\n disabled?: boolean;\n onChange?: (event: any) => void;\n};\n\nexport function useRadioField(\n config: EnumFieldConfig & {\n name: string;\n defaultValue: string;\n }\n): TextField {\n return useTextField({\n name: config.name,\n optional: config.optional,\n defaultValue: config.defaultValue,\n\n render(field: TextField, props?: { style: CSSProperties }): ReactElement {\n\n return (\n \n \n {config.options.map((option) => (\n }\n label={option.label}\n />\n ))}\n \n \n )\n\n // return (\n //
\n // {config.options.map((option) => (\n // \n // \n // \n // \n // ))}\n //
\n // );\n },\n });\n}\n\nexport function useSelectField(config: EnumFieldConfig): TextField {\n const classes = useStyles();\n const disabled = config.disabled;\n\n return useTextField({\n optional: config.optional,\n defaultValue: config.defaultValue,\n onChange: config.onChange,\n\n render(field: TextField, props?: { style: CSSProperties }): ReactElement {\n return (\n \n {config.label}\n \n {config.options.map((option) => (\n \n {option.label}\n \n ))}\n \n {field.error ? field.validation : \"\"}\n \n );\n },\n });\n}\n\ninterface PhoneField extends Field {}\n\nexport function usePhoneField(config?: {\n label?: string;\n defaultValue?: string,\n\n}): PhoneField {\n const classes = useStyles();\n const [value, setValue] = useState(config?.defaultValue ?? \"+56\");\n const [hasBeenBlurred, setHasBeenBlurred] = useState(Boolean(config?.defaultValue) ?? false);\n\n\n\n function validate(): string {\n if (isBlank(value)) {\n return \"Campo requerido\";\n }\n\n const phoneNumber = parsePhoneNumberFromString(value);\n if (!phoneNumber?.isValid()) {\n return \"Teléfono inválido\";\n }\n\n return \"OK\";\n }\n\n const validation = validate();\n const valid = validation === \"OK\";\n const error = !valid && hasBeenBlurred;\n\n function format(value: string): string {\n const phoneNumber = parsePhoneNumberFromString(value);\n return phoneNumber!.formatInternational();\n }\n\n function onChange(newValue: string): void {\n setValue(newValue);\n }\n\n function onBlur(): void {\n if (valid) {\n setValue(format);\n }\n setHasBeenBlurred(true);\n }\n\n\n return {\n value,\n validation,\n valid,\n\n render(): ReactElement {\n return (\n \n );\n }\n };\n}\n\nexport type Form = {\n isValid: boolean;\n};\n\nexport function useForm(fields: Field[]): Form {\n return { isValid: fields.every((field) => field.valid) };\n}\n\n\n\nexport type Antecedente = {\n id?: number;\n nombre: string;\n estado: string;\n eliminable: boolean;\n isValid: boolean;\n deleted?: boolean;\n};\n\ntype AntecedentesFieldProps = {\n index: number;\n antecedentes: Antecedente[];\n setAntecedentes: Dispatch>;\n onDelete: () => void;\n};\n\nexport const AntecedenteField: React.FC = (props) => {\n const { index, antecedentes, onDelete, setAntecedentes } = props;\n const antecedente = antecedentes[index];\n const defaultState = antecedente.estado;\n const [state, setState] = useState(defaultState);\n\n const toggleState = (newState) => {\n setState(newState);\n antecedentes[index].estado = newState;\n setAntecedentes([...antecedentes]);\n };\n\n const changeName = (event: any) => {\n antecedentes[index].nombre = event.target.value;\n setAntecedentes([...antecedentes]);\n };\n\n const filenameField = useTextField({\n label: \"Nombre antecedente\",\n defaultValue: antecedente.nombre,\n disabled: !antecedente.eliminable,\n fullWidth: true,\n onChange: changeName,\n name: index.toString(),\n });\n\n const isValid = filenameField.valid;\n useEffect(() => {\n antecedentes[index].isValid = isValid;\n setAntecedentes([...antecedentes]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [index, isValid, setAntecedentes]);\n\n if (antecedentes[index].deleted) {\n return null;\n }\n\n return (\n \n \n \n {filenameField.render()}\n \n \n \n toggleState(newValue)}\n >\n }\n label=\"Obligatorio\"\n />\n }\n label=\"Opcional\"\n />\n \n \n \n \n \n {antecedente.eliminable ? (\n onDelete()}\n >\n \n \n ) : null}\n \n \n );\n};","type RutValidation =\n \"OK\"\n | \"Dígito verificador incorrecto\"\n | \"Rut inválido\";\n\nexport function validateRut(s: string): RutValidation {\n const p = parseRut(s);\n if (p == null) {\n return \"Rut inválido\";\n }\n\n const [digits, dv] = p;\n if (computeDV(digits.map(Number)) !== dv) {\n return \"Dígito verificador incorrecto\";\n }\n\n return \"OK\";\n}\n\nexport function formatRut(s: string): string {\n const [digits, dv] = parseRut(s)!;\n const withDots = Number(digits.join('')).toLocaleString('es-CL');\n return `${withDots}-${dv}`;\n}\n\n\n\nfunction parseRut(s: string): [string[], string] | null {\n s = s.trim().toUpperCase();\n const withDots = /^(\\d?)(\\d)\\.(\\d)(\\d)(\\d).(\\d)(\\d)(\\d)-([0-9K])$/;\n const withoutDots = /^(\\d?)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)-([0-9K])$/;\n const match = withDots.exec(s) ?? withoutDots.exec(s);\n if (match) {\n let [, ...digits] = match;\n const dv = digits.pop()!;\n return [digits, dv];\n } else return null;\n}\n\nfunction computeDV(digits: number[]): string {\n let factors: number[] = [];\n while (factors.length < digits.length) {\n factors.push(2, 3, 4, 5, 6, 7);\n }\n\n let sum = 0;\n digits.reverse().forEach((digit, i) => {\n sum += digit * factors[i];\n });\n\n const dv = 11 - (sum % 11);\n if (dv === 11) return '0';\n if (dv === 10) return 'K';\n return dv.toString();\n}\n\n\n\nconsole.assert(validateRut(\"19.208.834-8\") === \"OK\");\nconsole.assert(validateRut(\"19.208.834-9\") === \"Dígito verificador incorrecto\");\nconsole.assert(validateRut(\"19208834-8\") === \"OK\");\nconsole.assert(validateRut(\"12.345.684-K\") === \"OK\");\nconsole.assert(validateRut(\"12.345.684-k\") === \"OK\");\nconsole.assert(validateRut(\"12.345.689-0\") === \"OK\");\nconsole.assert(validateRut(\"1.234.569-0\") === \"OK\");\nconsole.assert(validateRut(\"1234569-0\") === \"OK\");\nconsole.assert(validateRut(\"19.208.834-G\") === \"Rut inválido\");\nconsole.assert(validateRut(\"19.208.834-80\") === \"Rut inválido\");\nconsole.assert(validateRut(\"K19.208.834-8\") === \"Rut inválido\");\nconsole.assert(validateRut(\"19-208-834-8\") === \"Rut inválido\");\nconsole.assert(validateRut(\"19.208834-8\") === \"Rut inválido\");\nconsole.assert(validateRut(\"19.2088.34-8\") === \"Rut inválido\");","export function validatePassport(s: string): string {\n s = formatPassport(s);\n if (s.length > 9 || !/^[A-Z0-9]+$/.test(s) || !/[0-9]/.test(s)) {\n return \"Pasaporte inválido\";\n }\n return \"OK\";\n}\n\nexport function formatPassport(s: string): string {\n return s.replace(' ', '').toUpperCase();\n}","export function validateEmail(s: string): string {\n // http://emailregex.com/\n s = s.trim();\n // eslint-disable-next-line no-control-regex\n return /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/\n .test(s) ? \"OK\" : \"E-mail inválido\";\n}","import React, {HTMLProps} from 'react';\nimport './Table.css';\n\nconst Table: React.FC> = props => {\n return (\n \n {props.children}\n
\n );\n};\nexport default Table;","import React from \"react\";\n\nconst Th: React.FC = props => {\n return (\n \n {props.children}\n \n );\n};\nexport default Th;","import React, { ReactElement, useState } from \"react\";\nimport { List } from \"immutable\";\nimport { Field, useForm, useTextField } from \"./Form\";\nimport Button from \"@material-ui/core/Button\";\nimport Table from \"./Table\";\nimport Th from \"./Th\";\nimport FieldContainer from \"./Field\";\nimport Grid from \"@material-ui/core/Grid\";\n\nexport const maxTitulos = 10;\n\nexport type Titulo = {\n id: number;\n titulo: string;\n institucion: string;\n reactKey: string;\n};\n\nexport function useTitulosField(props): Field> {\n const defaultValue = props.defaultValue\n ? props.defaultValue.map((val) => {\n return { ...val, reactKey: val.id };\n })\n : [];\n const defaultTitulos = props.defaultValue\n ? List.of(...defaultValue)\n : List();\n const [titulos, setTitulos] = useState(defaultTitulos);\n const value = titulos;\n\n const tituloGradoField = useTextField({\n fullWidth: true,\n label: \"Título/Grado\",\n });\n const institucionField = useTextField({\n fullWidth: true,\n label: \"Institución\",\n });\n\n const innerForm = useForm([tituloGradoField, institucionField]);\n\n function validate(): string {\n if (titulos.isEmpty()) {\n return \"Debe agregar al menos un título/grado\";\n } else if (titulos.size > maxTitulos) {\n return `Se permite un máximo de ${maxTitulos} título/grados`;\n } else {\n return \"OK\";\n }\n }\n\n const validation = validate();\n const valid = validation === \"OK\";\n\n function addTitulo(): void {\n const newTitulo = {\n id: -1,\n titulo: tituloGradoField.value,\n institucion: institucionField.value,\n reactKey: Math.random().toString(),\n };\n setTitulos((list) => list.push(newTitulo));\n tituloGradoField.reset();\n institucionField.reset();\n }\n\n function removeTitulo(index: number): void {\n setTitulos((list) => list.remove(index));\n }\n\n function render(): ReactElement {\n return (\n \n \n \n {tituloGradoField.render()}\n \n \n {institucionField.render()}\n \n \n \n Agregar\n \n \n \n\n
\n \n \n \n \n \n \n \n \n \n\n \n {titulos.map((titulo, index) => (\n \n \n \n \n \n \n ))}\n \n
NTítulo/GradoInstituciónAcciones
{index + 1}{titulo.titulo}{titulo.institucion}\n removeTitulo(index)}\n >\n Eliminar\n \n
\n
\n\n {!valid &&
{validation}
}\n
\n );\n }\n\n return { value, validation, valid, render };\n}\n","import React, { useState } from \"react\";\nimport \"./Request.css\";\n\ntype RequestErrorProps = {\n resource: string;\n action: string;\n loading: boolean;\n err: any | null;\n};\n\nconst Request: React.FC = ({\n resource,\n action,\n loading,\n err,\n children,\n}) => {\n const [showDetails, setShowDetails] = useState(false);\n\n function fix(s: string): string {\n s = s.replace(\"de el\", \"del\");\n return s[0].toUpperCase() + s.slice(1);\n }\n\n function replaceNewlines(s: string) {\n return (\n <>\n {s.split(\"\\n\").map((line, index) => (\n \n {line}\n
\n
\n ))}\n \n );\n }\n\n function simple(message: string) {\n return (\n
\n
\n

{replaceNewlines(fix(message))}

\n
\n
\n );\n }\n\n function detailed(message: string) {\n return (\n
\n
\n

{replaceNewlines(fix(message))}

\n\n {!showDetails && (\n \n )}\n
\n\n {showDetails && (\n
\n
{JSON.stringify(err, null, \"  \")}
\n {err.stack &&
{err.stack}
}\n
\n )}\n
\n );\n }\n\n if (loading) {\n return

Cargando...

;\n }\n\n if (!err) {\n return <>{children};\n }\n\n return null;\n};\n\nexport default Request;\n","import Swal from \"sweetalert2\";\nimport copy from \"copy-to-clipboard\";\n\n/**\nexport function popLink(link) {\n Swal.fire({\n icon: 'warning',\n title: 'Para editar su postulación, volver al siguiente link:',\n html: \"

\"+link+\"

Se le sugiere que lo guarde

\",\n confirmButtonColor: '#3085d6',\n confirmButtonText: 'Copiar el link.'\n }).then((result) => {\n if (result.value) {\n postulacionSuccess(link)\n }\n })\n}\n*/\n\nexport function postulacionSuccess(correo_postulación){\n Swal.fire({\n title: 'Postulación Finalizada',\n html: 'Su postulación se ha completado exitosamente. Hemos enviado un email de confirmación a ' + correo_postulación,\n icon: 'success',\n confirmButtonColor: '#3085d6',\n confirmButtonText: 'Volver al inicio',\n onClose(popup: HTMLElement) {\n redirectToHome()\n }\n }).then(() => redirectToHome())\n}\n\nexport function editPostulacionSuccess(correo_postulación){\n Swal.fire({\n title: 'Postulación Editada',\n html: 'Su postulación se ha editado exitosamente. Hemos enviado un email de confirmación a ' + correo_postulación,\n icon: 'success',\n confirmButtonColor: '#3085d6',\n confirmButtonText: 'Volver al inicio',\n onClose(popup: HTMLElement) {\n redirectToHome()\n }\n }).then(() => redirectToHome())\n}\n\nfunction redirectToHome() {\n window.location.href = \"/ListaConcursos/\"\n}\n\n","import Swal from \"sweetalert2\";\n\ntype errorMessage = {\n title: string\n body: string,\n}\n\nfunction redirect(url: string): void {\n if(url){\n window.location.replace((window as any).ENV.URL_FRONT + \"ListaConcursos\")\n }\n}\n\nexport function handleLoadingConcursoError(error, url) {\n const message = getLoadingConcursosErrorMessage(error)\n Swal.fire({\n icon: 'error',\n title: message.title,\n html: message.body\n }).then(() => redirect(url));\n}\n\nfunction getLoadingConcursosErrorMessage(error): errorMessage {\n if (error.response) {\n if (error.response.status === 500) {\n return {\n title: \"Ocurrió un error en nuestros servidores\",\n body: \"
Pulse OK para volver a cargar esta página.
Si el problema persiste, contacte a la Mesa de Ayuda.
\"\n }\n }\n if (error.response.status === 404) {\n return {\n title: \"La página a la que intenta acceder fue eliminada o no existe\",\n body: \"Si el problema persiste, contacte a la Mesa de Ayuda.\"\n }\n }\n } else if (error.message === \"Network Error\") {\n return {\n title: \"No se pudo establecer la conexión con nuestros servidores\",\n body: \"Revise su conexión a internet e intente nuevamente, y si el error aún persiste, intente nuevamente más tarde\"\n }\n }\n return {\n title: \"Ocurrió un error desconocido\",\n body: \"Si el problema persiste, contacte a la Mesa de Ayuda\"\n }\n}\n\nexport function handleConcursosDetailError(error) {\n const message = getConcursosDetailsErrorMessage(error)\n Swal.fire({\n icon: 'error',\n title: message.title,\n html: message.body\n }).then();\n}\n\nfunction getConcursosDetailsErrorMessage(error): errorMessage {\n if (error.response) {\n if (error.response.status === 500) {\n return {\n title: \"Ocurrió un error en nuestros servidores\",\n body: \"
Por favor vuelva a intentarlo.
Si el problema persiste, contacte a la Mesa de Ayuda.
\"\n }\n }\n if (error.response.status === 404) {\n return {\n title: \"El concurso fue eliminado o no existe\",\n body: \"Por favor intente crear otro concurso.\"\n }\n }\n } else if (error.message === \"Network Error\") {\n return {\n title: \"No se pudo establecer la conexión con nuestros servidores\",\n body: \"Revise su conexión a internet e intente nuevamente, y si el error aún persiste, intente nuevamente más tarde\"\n }\n }\n return {\n title: \"Ocurrió un error desconocido\",\n body: \"Si el problema persiste, contacte a la Mesa de Ayuda\"\n }\n}\n\nexport function handleCreateConcursoError(error) {\n const message = getCreateConcursoErrorMessage(error)\n Swal.fire({\n icon: 'error',\n title: message.title,\n html: message.body\n }).then();\n}\n\nfunction getCreateConcursoErrorMessage(error): errorMessage {\n if (error.response) {\n if (error.response.status === 500) {\n return {\n title: \"Ocurrió un error en nuestros servidores\",\n body: \"
Por favor vuelva a intentarlo.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n if (error.response.status === 404) {\n return {\n title: \"Este servicio fue eliminado o no existe\",\n body: \"
Por favor vuelva a intentarlo.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n } else if (error.message === \"Network Error\") {\n return {\n title: \"No se pudo establecer la conexión con nuestros servidores\",\n body: \"Revise su conexión a internet e intente nuevamente, y si el error aún persiste, intente nuevamente más tarde\"\n }\n }\n return {\n title: \"Ocurrió un error desconocido\",\n body: \"Si el problema persiste, contacte a la Mesa de Ayuda\"\n }\n}\n\nexport function handleDownloadFileError(error) {\n const message = getDownloadFileErrorMessage(error)\n Swal.fire({\n icon: 'error',\n title: message.title,\n html: message.body\n }).then();\n}\n\nfunction getDownloadFileErrorMessage(error): errorMessage {\n if (error.response) {\n if (error.response.status === 500) {\n return {\n title: \"Ocurrió un error en nuestros servidores\",\n body: \"
Por favor vuelva a intentarlo.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n if (error.response.status === 404) {\n return {\n title: \"El archivo fue eliminado o no existe\",\n body: \"
Por favor inténtelo más tarde.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n } else if (error.message === \"Network Error\") {\n return {\n title: \"No se pudo establecer la conexión con nuestros servidores\",\n body: \"Revise su conexión a internet e intente nuevamente, y si el error aún persiste, intente nuevamente más tarde\"\n }\n }\n return {\n title: \"Ocurrió un error desconocido\",\n body: \"Si el problema persiste, contacte a la Mesa de Ayuda\"\n }\n}\n\nexport function handlePostulacionError(error) {\n const message = getPostulacionErrorMessage(error)\n Swal.fire({\n icon: 'error',\n title: message.title,\n html: message.body\n }).then();\n}\n\nfunction getPostulacionErrorMessage(error): errorMessage {\n if (error.response) {\n if (error.response.status === 500) {\n return {\n title: \"Ocurrió un error en nuestros servidores\",\n body: \"
Por favor vuelva a intentarlo.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n if (error.response.status === 404) {\n return {\n title: \"El concurso fue eliminado o no existe\",\n body: \"
Por favor inténtelo más tarde.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n } else if (error.message === \"Network Error\") {\n return {\n title: \"No se pudo establecer la conexión con nuestros servidores\",\n body: \"Revise su conexión a internet e intente nuevamente, y si el error aún persiste, intente nuevamente más tarde\"\n }\n }\n return {\n title: \"Ocurrió un error desconocido\",\n body: \"Si el problema persiste, contacte a la Mesa de Ayuda\"\n }\n}\n\nexport function handleServerError() {\n Swal.fire({\n icon: 'error',\n title: \"Ocurrió un error en nuestros servidores\",\n html: \"
Por favor vuelva a intentarlo.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }).then();\n\n}\n\nexport function handlePostularError(error, correo) {\n const message = getPostularErrorMessage(error, correo)\n if (error.response.status === 406) {\n Swal.fire({\n icon: 'warning',\n title: message.title,\n html: message.body,\n onClose(popup: HTMLElement) {\n redirectToHome()\n }\n }).then();\n } else {\n Swal.fire({\n icon: 'error',\n title: message.title,\n html: message.body\n }).then();\n }\n}\n\nfunction getPostularErrorMessage(error, correo): errorMessage {\n if (error.response) {\n if (error.response.status === 500) {\n return {\n title: \"Ocurrió un error en nuestros servidores\",\n body: \"
Por favor vuelva a intentarlo.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n if (error.response.status === 404) {\n return {\n title: \"El concurso al que intenta postular fue eliminado o no existe\",\n body: \"
Por favor inténtelo más tarde.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n if (error.response.status === 406) {\n return {\n title: \"Error, número de documento ya ingresado\",\n body: \"
El número de documento ingresado ya se encuentra asociado a una postulación.
En caso de no tener acceso al link de edición por favor comuníquese con \" + correo + \"
\"\n }\n }\n if (error.response.status === 400) {\n return {\n title: \"El formulario presenta errores\",\n body: \"
Hubo un error en el formulario
Si necesita a asistancia, puede escribir a \" + correo + \"
\"\n }\n }\n } else if (error.message === \"Network Error\") {\n return {\n title: \"No se pudo establecer la conexión con nuestros servidores\",\n body: \"Revise su conexión a internet e intente nuevamente, y si el error aún persiste, intente nuevamente más tarde\"\n }\n }\n return {\n title: \"Ocurrió un error desconocido\",\n body: \"Si el problema persiste, contacte a la Mesa de Ayuda\"\n }\n}\n\nexport function handleEdicionConcursoError(error) {\n const message = getEdicionConcursoErrorMessage(error)\n Swal.fire({\n icon: 'error',\n title: message.title,\n html: message.body\n }).then();\n}\n\nfunction getEdicionConcursoErrorMessage(error): errorMessage {\n if (error.response) {\n if (error.response.status === 500) {\n return {\n title: \"Ocurrió un error en nuestros servidores\",\n body: \"
Por favor vuelva a intentarlo.
Si el problema persiste, contacte a la Mesa de Ayuda
\"\n }\n }\n if (error.response.status === 404) {\n return {\n title: \"Postulación no encontrada\",\n body: \"El link de postulación no es válido, o el concurso fue eliminado.\"\n }\n }\n if (error.response.status === 410) {\n return {\n title: \"El concurso ha cerrado\",\n body: \"No es posible cargar su postulación, porque el período de postulación para este concurso ha terminado.\"\n }\n }\n } else if (error.message === \"Network Error\") {\n return {\n title: \"No se pudo establecer la conexión con nuestros servidores\",\n body: \"Revise su conexión a internet e intente nuevamente, y si el error aún persiste, intente nuevamente más tarde\"\n }\n }\n return {\n title: \"Ocurrió un error desconocido\",\n body: \"Si el problema persiste, contacte a la Mesa de Ayuda\"\n }\n}\n\nfunction redirectToHome() {\n window.location.href = \"/ListaConcursos/\"\n}\n","import React, { ChangeEvent, Dispatch, SetStateAction } from \"react\";\nimport axios from \"axios\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Button from \"@material-ui/core/Button\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport { useTextField } from \"./Form\";\nimport Swal from \"sweetalert2\";\nimport { handleDownloadFileError } from \"../utils/errors\";\n\ntype FileExtension = {\n // esto es lo que ve el usuario\n extension: string; // ej. \".pdf\"\n\n // esto es lo que revisa la validación de formato\n // así nos evitamos problemas de si es por ejemplo .jpg o .jpeg\n mimeType: string; // ej. \"application/pdf\"\n};\n\nexport const allowedExtensions: FileExtension[] = [\n { extension: \".pdf\", mimeType: \"application/pdf\" },\n { extension: \".doc\", mimeType: \"application/msword\" },\n { extension: \".jpg\", mimeType: \"image/jpeg\" },\n { extension: \".png\", mimeType: \"image/png\" },\n {\n extension: \".docx\",\n mimeType:\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n },\n];\n\nexport interface IAttachment {\n readonly id?: number; // id from the backend. If present, you can't change the file anymore.\n readonly nombre: string; // Label provided by the user. This is not the name of the file in the filesystem.\n readonly archivo: File | null; // will contain a file only if the attachment hasn't been uploaded to the backend yet.\n readonly reactKey: string; // this should be unique across all attachments to avoid bugs\n readonly deleted?: boolean;\n}\n\nexport class Attachment implements IAttachment {\n readonly id?: number;\n readonly nombre: string;\n readonly archivo: File | null;\n readonly reactKey: string;\n readonly deleted?: boolean;\n\n constructor(props: IAttachment) {\n this.id = props.id;\n this.nombre = props.nombre;\n this.archivo = props.archivo;\n this.reactKey = props.reactKey;\n this.deleted = props.deleted;\n }\n\n static empty(): Attachment {\n return new Attachment({\n id: undefined, // as it hasn't been uploaded to the backend yet\n nombre: \"\",\n archivo: null,\n reactKey: Math.random().toString(), // unique across all attachments\n deleted: false,\n });\n }\n\n // Implements all the setters in a single method.\n // Note: it returns a new Attachment instance, keeping the original intact\n // example: renamedAttachment = attachment.set({ nombre: \"nuevo nombre\" });\n set(fields: Partial): Attachment {\n return this.new({ ...this, ...fields });\n }\n\n new(props: IAttachment): Attachment {\n return new Attachment(props);\n }\n\n // used by form validation\n get isValid(): boolean {\n return this.validate() === \"OK\";\n }\n\n // used by form validation\n validate(): string {\n if (this.id != null || this.id !=-1) {\n return \"OK\"; // as we assume the attachments from the backend are always valid\n }\n\n if (this.archivo == null) {\n return \"Debe elegir un archivo\";\n }\n\n const attachmentMimeType = this.archivo.type;\n if (\n !allowedExtensions.some(\n (extension) => attachmentMimeType === extension.mimeType\n )\n ) {\n return \"El archivo no pertenece a ninguno de los formatos permitidos\";\n }\n\n return \"OK\";\n }\n}\n\nexport type FileFieldProps = {\n // this is a controlled component\n attachment: Attachment;\n setAttachment: Dispatch>;\n};\n\nexport const FileField: React.FC = (props) => {\n const { attachment, setAttachment } = props;\n\n const nombreField = useTextField({\n fullWidth: true,\n label: \"Nombre archivo\",\n name: attachment.reactKey,\n defaultValue: attachment.nombre,\n requiredFieldMessage: \"Indique el nombre del documento\",\n\n onChange(event: ChangeEvent): void {\n const nombre = event.target.value;\n setAttachment((x) => x.set({ nombre }));\n },\n\n validate(_value: string): string {\n // this field will also show the validation errors of the attachment, as it doesn't have it's own field\n return attachment.validate();\n },\n });\n\n function onDelete() {\n setAttachment((x) => x.set({ deleted: true }));\n }\n\n if (attachment.deleted) {\n return null;\n }\n\n return (\n \n \n \n {nombreField.render()}\n \n \n e.mimeType).join(\",\")}\n route=\"downloadFile\"\n onBlur={nombreField.onBlur}\n />\n \n \n \n \n \n \n \n \n );\n};\n\ntype AttachOrDownloadProps = {\n attachment: Attachment;\n setAttachment: Dispatch>;\n enableAttach: boolean;\n enableDownload: boolean;\n accept: string;\n onBlur?(): void;\n route: string;\n};\n\nexport const AttachOrDownload: React.FC = (props) => {\n function onChangeSelectedFiles(files: FileList) {\n if (files.length === 0) {\n // no files selected --> do nothing\n } else if (files.length === 1) {\n const archivo = files.item(0)!;\n props.setAttachment((x) => x.set({ archivo }));\n } else {\n alert(\"Seleccione solo un archivo a la vez\");\n }\n\n props.onBlur?.();\n }\n\n function downloadFile() {\n if (props.attachment.id !== -1) {\n axios({\n url: `${(window as any).ENV.API_URL}/${props.route}/${props.attachment.id\n }/`,\n method: \"GET\",\n responseType: \"blob\", // important\n })\n .then((response) => {\n const file = new Blob([response.data], { type: response.data.type });\n const fileURL = URL.createObjectURL(file);\n const link = document.createElement(\"a\");\n link.href = fileURL;\n link.download = props.attachment.nombre; // the label provided by the user will be used as the default file name\n link.click();\n })\n .catch((error) => handleDownloadFileError(error));\n } else {\n return Swal.fire({\n icon: \"warning\",\n text: \" El antecedente no presenta documentos adjuntos\",\n });\n }\n }\n\n return (\n \n {props.enableAttach && (\n {\n if (event.target.files == null) {\n alert(\n \"event.target.files puede ser null.\\n\" +\n \"Si ves esto, dile a nuestros desarrolladores cómo lo hiciste\"\n );\n } else {\n onChangeSelectedFiles(event.target.files);\n }\n }}\n accept={props.accept}\n />\n )}\n\n {props.enableDownload && (\n \n Ver archivo\n \n )}\n \n );\n};\n","import React, { Dispatch, SetStateAction, useState } from \"react\";\nimport {\n Attachment,\n AttachOrDownload,\n FileFieldProps,\n IAttachment,\n} from \"../../common/attachments\";\nimport capitalize from \"@material-ui/core/utils/capitalize\";\nimport { Antecedente } from \"../../common/Form\";\nimport { AntecedenteDefault } from \"../admin-concursos/Mantenedor\";\n\ntype FileExtension = {\n // esto es lo que ve el usuario\n extension: string; // ej. \".pdf\"\n\n // esto es lo que revisa la validación de formato\n // así nos evitamos problemas de si es por ejemplo .jpg o .jpeg\n mimeType: string; // ej. \"application/pdf\"\n};\n\nexport const allowedExtensions: FileExtension[] = [\n { extension: \".pdf\", mimeType: \"application/pdf\" },\n { extension: \".doc\", mimeType: \"application/msword\" },\n { extension: \".jpg\", mimeType: \"image/jpeg\" },\n { extension: \".png\", mimeType: \"image/png\" },\n {\n extension: \".docx\",\n mimeType:\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n },\n //{ extension: \".jpg\", mimeType: \"image/jpeg\" },\n //{ extension: \".png\", mimeType: \"image/png\" },\n //{ extension: \".gif\", mimeType: \"image/gif\" },\n];\n\ninterface IPostulacionAttachment extends IAttachment {\n readonly antecedente: AntecedenteDefault;\n}\n\nexport class PostulacionAttachment\n extends Attachment\n implements IPostulacionAttachment {\n readonly antecedente: AntecedenteDefault;\n\n constructor(props: IPostulacionAttachment) {\n super(props);\n this.antecedente = props.antecedente;\n }\n\n // override\n validate(): string {\n console.log(this.antecedente);\n if (this.antecedente.obligatorio=='0') {\n return \"OK\";\n }\n\n if (this.archivo == null) {\n return this.id == -1 ? \"Debe elegir un archivo\" : \"OK\";\n }\n\n const attachmentMimeType = this.archivo.type;\n if (\n !allowedExtensions.some(\n (extension) => attachmentMimeType === extension.mimeType\n )\n ) {\n return \"El archivo no pertenece a ninguno de los formatos permitidos\";\n }\n\n return \"OK\";\n }\n\n // override\n new(props: IPostulacionAttachment): PostulacionAttachment {\n return new PostulacionAttachment(props);\n }\n}\n\ntype PostulacionFileFieldProps = FileFieldProps & {\n attachment: PostulacionAttachment;\n setAttachment: Dispatch>;\n isEditing: boolean;\n};\n\nexport const PostulacionFileField: React.FC = (\n props\n) => {\n const { attachment, setAttachment } = props;\n const [hasBeenBlurred, setHasBeenBlurred] = useState(false);\n\n if (attachment.deleted) {\n return null;\n }\n\n const shouldShowError = hasBeenBlurred && !attachment.isValid;\n\n return (\n
\n \n {capitalize(attachment.nombre)}\n \n\n {props.attachment.antecedente.obligatorio == '1' && (\n (Requerido, Solo se permite adjuntar un archivo por antecedente)\n )}\n\n e.mimeType).join(\",\")}\n onBlur={() => setHasBeenBlurred(true)}\n route=\"downloadFilePostulacion\"\n />\n {shouldShowError && (\n

{attachment.validate()}

\n )}\n
\n );\n};\n","import React, { SetStateAction, useEffect, useState } from \"react\";\nimport Th from \"../../common/Th\";\nimport Table from \"../../common/Table\";\nimport Field from \"../../common/Field\";\nimport {\n useTextField,\n useRadioField,\n useSelectField,\n useForm,\n usePhoneField,\n Antecedente,\n} from \"../../common/Form\";\nimport Button from \"@material-ui/core/Button\";\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\nimport Backdrop from \"@material-ui/core/Backdrop\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport { formatRut, validateRut } from \"../../utils/rut\";\nimport { formatPassport, validatePassport } from \"../../utils/passport\";\nimport { validateEmail } from \"../../utils/email\";\nimport axios from \"axios\";\nimport _ from \"lodash\";\nimport { maxTitulos, useTitulosField } from \"../../common/titulos\";\nimport { useParams } from \"react-router-dom\";\nimport Request from \"../../common/Request\";\nimport Grid from \"@material-ui/core/Grid\";\nimport { objectToFormData } from \"object-to-formdata\";\nimport { editPostulacionSuccess, postulacionSuccess } from \"../../utils/popups\";\nimport { Attachment, FileField } from \"../../common/attachments\";\nimport { List } from \"immutable\";\nimport {\n allowedExtensions,\n PostulacionAttachment,\n PostulacionFileField,\n} from \"./attachments\";\nimport { AntecedenteDefault } from \"../admin-concursos/Mantenedor\";\nimport {\n handlePostulacionError,\n handlePostularError,\n handleServerError,\n} from \"../../utils/errors\";\n\ntype SectionProps = {\n header: string;\n};\n\nconst useStyles = makeStyles((theme) => ({\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: \"#fff\",\n },\n}));\n\nconst Section: React.FC = (props) => {\n return (\n
\n \n {props.header}\n
\n {props.children}\n \n );\n};\n\nconst Label: React.FC = (props) => {\n return (\n \n {props.children}\n \n );\n};\n\nconst Value: React.FC = (props) => {\n return {props.children};\n};\n\ntype InputFileProps = {\n label: string;\n};\n\nconst InputFile: React.FC = (props) => {\n return (\n \n
{props.label}
\n \n Campo requerido\n \n \n \n \n );\n};\n\ntype Nacionalidad = {\n id: number;\n nombre: string;\n};\n\ntype Postulacion = {\n tipo_documento: string;\n id: number;\n id_nacionalidad: string;\n id_pais_residencia: string;\n concurso: number;\n codigo: string;\n correo: string;\n telefono: string;\n nombres: string;\n apellidos: string;\n rut_pasaporte: string;\n direccion: string;\n titulos: {\n id: number;\n titulo: string;\n institucion: string;\n };\n antecedentes: {\n id: number; // este es el que se le pasa a downloadFilePostulacion\n postulacion: number;\n antecedente: number;\n archivo: number;\n }[];\n};\n\ntype PostulacionFormType = {\n concursoPk: string | number;\n defaultData?: Postulacion;\n popUp?: boolean;\n uuid?: string;\n};\n\nconst PostulacionForm: React.FC = (props) => {\n const classes = useStyles();\n const concursoPk = props.concursoPk;\n const [concurso, setConcurso] = useState({});\n const [loading, setLoading] = useState(true);\n const [loading2, setLoading2] = useState(true);\n const [clicked, setClicked] = useState(false);\n const [getConcursoError, setGetConcursoError] = useState(false);\n const [getNacionalidadesError, setGetNacionalidadesError] = useState(false);\n const [openSpinner, setOpenSpinner] = useState(false);\n const defaultData = props.defaultData;\n\n function getCorreoContacto() {\n return concurso.correo_contacto\n }\n\n useEffect(() => {\n setLoading(true);\n axios\n .get(`${(window as any).ENV.API_URL}/datosConcurso/${concursoPk}/`)\n .then((response) => setConcurso(response.data))\n .catch((error) => {\n setGetConcursoError(true);\n handlePostulacionError(error);\n })\n .finally(() => setLoading(false));\n }, [concursoPk]);\n\n // cargar nacionalidades del backend\n const [nacionalidades, setNacionalidades] = useState([]);\n useEffect(() => {\n if (!getConcursoError) {\n setLoading2(true);\n axios\n .get((window as any).ENV.API_URL + \"/nacionalidades/\")\n .then((response) => {\n let nacionalidades = response.data;\n // las nacionalidades del backend no vienen ordenadas\n nacionalidades = _.sortBy(nacionalidades, \"nombre\");\n nacionalidades = nacionalidades.filter((nac) => nac.id > 0);\n let cl = nacionalidades.find((nac) => nac.nombre === \"CHILE\");\n let clIndex = nacionalidades.indexOf(cl);\n nacionalidades.splice(clIndex, 1);\n // que salga chile al principio\n nacionalidades = [cl, ...nacionalidades];\n setNacionalidades(nacionalidades);\n })\n .catch((error) => {\n setGetNacionalidadesError(true);\n handleServerError();\n })\n .finally(() => setLoading2(false));\n }\n }, []);\n\n // form datos personales\n\n const nombresField = useTextField({\n label: \"Nombres\",\n fullWidth: true,\n defaultValue: defaultData ? defaultData.nombres : \"\",\n });\n const apellidosField = useTextField({\n label: \"Apellidos\",\n fullWidth: true,\n defaultValue: defaultData ? defaultData.apellidos : \"\",\n });\n const correoField = useTextField({\n label: \"Email\",\n fullWidth: true,\n defaultValue: defaultData ? defaultData.correo : \"\",\n validate: validateEmail,\n });\n const telefonoField = usePhoneField({\n label: \"Teléfono\",\n defaultValue: defaultData ? defaultData.telefono : \"\",\n });\n\n const direccionField = useTextField({\n label: \"Dirección de Residencia\",\n fullWidth: true,\n defaultValue: defaultData ? defaultData.direccion : \"\",\n });\n\n const nacionalidadField = useSelectField({\n label: \"Nacionalidad\",\n defaultValue: defaultData ? defaultData.id_nacionalidad : \"\",\n options: nacionalidades.map((nac) => ({\n value: nac.id.toString(),\n label: nac.nombre,\n })),\n });\n\n const paisResidenciaField = useSelectField({\n label: \"Pais de Residencia\",\n defaultValue: defaultData ? defaultData.id_pais_residencia : \"\",\n options: nacionalidades.map((nac) => ({\n value: nac.id.toString(),\n label: nac.nombre,\n })),\n });\n\n const rutPasaporteField = useRadioField({\n label: \"Tipo de documento\",\n name: \"rut_pasaporte\",\n defaultValue: defaultData ? defaultData.tipo_documento : \"\",\n options: [\n { value: \"rut\", label: \"Rut\" },\n { value: \"pasaporte\", label: \"Pasaporte\" },\n ],\n });\n\n const numDocumentoField = useTextField({\n label: \"Número de documento\",\n defaultValue: defaultData ? defaultData.rut_pasaporte : \"\",\n fullWidth: true,\n ...(rutPasaporteField.value === \"rut\"\n ? {\n validate: validateRut,\n format: formatRut,\n }\n : rutPasaporteField.value === \"pasaporte\"\n ? {\n validate: validatePassport,\n format: formatPassport,\n }\n : {\n validate: () => \"Seleccione arriba el tipo de documento\",\n }),\n });\n\n const datosPersonalesForm = useForm([\n nombresField,\n apellidosField,\n correoField,\n telefonoField,\n rutPasaporteField,\n numDocumentoField,\n nacionalidadField,\n direccionField,\n paisResidenciaField,\n ]);\n\n const titulosField = useTitulosField({\n defaultValue: defaultData ? defaultData.titulos : null,\n });\n const titulosForm = useForm([titulosField]);\n\n const postulacion = {\n concurso: concursoPk,\n id_nacionalidad: nacionalidadField.value,\n id_pais_residencia: paisResidenciaField.value,\n correo: correoField.value,\n telefono: telefonoField.value,\n rut_pasaporte: numDocumentoField.value,\n nombres: nombresField.value,\n apellidos: apellidosField.value,\n tipo_documento: rutPasaporteField.value,\n direccion: direccionField.value\n };\n\n const enviarPostulacion = React.useCallback(() => {\n //showSpinner();\n setOpenSpinner(true)\n setClicked(true)\n console.log(postulacion);\n const json = {\n concurso: postulacion.concurso,\n id_nacionalidad: postulacion.id_nacionalidad,\n id_pais_residencia: postulacion.id_pais_residencia,\n correo: postulacion.correo,\n telefono: postulacion.telefono,\n rut_pasaporte: postulacion.rut_pasaporte,\n nombres: postulacion.nombres,\n apellidos: postulacion.apellidos,\n tipo_documento: postulacion.tipo_documento,\n direccion: postulacion.direccion\n };\n\n const formObj = {\n postulacion: json,\n titulos: titulosField.value.toArray(),\n antecedentes: attachments\n .map((attachment) => ({\n antecedente: attachment.antecedente.id,\n archivo: attachment.archivo,\n }))\n .toArray(),\n };\n const options = {\n indices: true,\n nullsAsUndefineds: false,\n booleansAsIntegers: false,\n allowEmptyArrays: false,\n }\n const formData = objectToFormData(formObj, options);\n const config = {\n headers: {\n \"content-type\": \"multipart/form-data\",\n },\n };\n\n if (defaultData) {\n axios\n .put(\n (window as any).ENV.API_URL + \"/postulacion/\" + props.uuid + \"/\",\n formData,\n config\n )\n .then((res) => {\n //hideSpinner(\"success\");\n setOpenSpinner(false)\n setTimeout(() => {\n editPostulacionSuccess(postulacion.correo);\n }, 1000);\n })\n .catch((error) => {\n setOpenSpinner(false)\n setClicked(false);\n handlePostularError(error, getCorreoContacto());\n });\n } else {\n axios\n .post((window as any).ENV.API_URL + \"/postulacion/\", formData, config)\n .then((res) => {\n //hideSpinner(\"success\");\n setOpenSpinner(false)\n setTimeout(() => {\n postulacionSuccess(postulacion.correo);\n }, 1000);\n })\n .catch((error) => {\n //hideSpinner(\"error\");\n setOpenSpinner(false)\n setClicked(false);\n handlePostularError(error, getCorreoContacto());\n });\n }\n }, [postulacion]);\n\n // adjuntar antecedentes\n const [attachments, setAttachments] = useState(List());\n\n useEffect(() => {\n if (attachments.isEmpty() && concurso.antecedentes != null) {\n setAttachments(\n List(\n (concurso.antecedentes ?? []).map(\n (antecedenteConcurso: AntecedenteDefault) =>\n new PostulacionAttachment({\n id:\n defaultData?.antecedentes /* postulacion */\n ?.find(\n (antecedentePostulacion) =>\n antecedentePostulacion.antecedente ===\n antecedenteConcurso.id &&\n antecedentePostulacion.archivo != -1\n )?.id ?? -1,\n nombre: antecedenteConcurso.nombre,\n archivo: null,\n reactKey: antecedenteConcurso.id.toString(),\n deleted: false,\n antecedente: antecedenteConcurso,\n })\n )\n )\n );\n }\n }, [attachments, concurso.antecedentes]);\n\n function updateAttachment(\n index: number,\n action: SetStateAction\n ): void {\n if (typeof action === \"function\") {\n const resp=(list) => list.update(index, action);\n setAttachments(resp);\n } else {\n setAttachments((list) => list.set(index, action));\n }\n }\n\n function form() {\n if (clicked === true) {\n return true\n }\n let formsAreValid = true\n if (datosPersonalesForm.isValid &&\n titulosField.value.size > 0) {\n formsAreValid = false\n attachments.forEach(element => {\n if (element.antecedente.obligatorio == '1') {\n console.log(element.nombre)\n formsAreValid = !element.isValid\n }\n\n });\n }\n console.log(formsAreValid)\n return formsAreValid\n }\n\n // render\n return (\n
\n \n
\n \n \n {concurso.nombre_facultad}\n \n
{concurso.nombre}
\n
\n\n
\n
\n \n {concurso.nombre_contacto}\n
\n
\n \n {concurso.correo_contacto}\n
\n
\n\n
\n \n \n \n {nombresField.render()}\n \n \n {apellidosField.render()}\n \n \n \n \n {correoField.render()}\n \n \n {telefonoField.render()}\n \n \n \n {nacionalidadField.render()}\n \n \n \n {rutPasaporteField.render()}\n \n \n {numDocumentoField.render()}\n \n \n {rutPasaporteField.value === \"rut\" ? (\n \n Ingrese el número de documento sin puntos y con guión. Ej:\n 12345678-9\n \n ) : rutPasaporteField.value === \"pasaporte\" ? (\n \n Ingrese el número de documento anteponiendo una P. Ej:\n P12345678\n \n ) : null}\n \n {paisResidenciaField.render()}\n \n \n {direccionField.render()}\n \n \n
\n\n
\n {titulosField.render()}\n
\n\n
\n \n Archivos permitidos:{\" \"}\n {allowedExtensions.map((e) => e.extension).join(\", \")}. La suma del tamaño de los archivos debe ser menor a 20MB.\n
\n\n {attachments.map((attachment, index) => (\n updateAttachment(index, action)}\n isEditing={defaultData != null}\n />\n ))}\n \n\n
\n \n Postular\n \n
\n \n \n \n \n \n \n );\n};\n\nexport default PostulacionForm;\n","import React from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport PostulacionContainer from \"./PostulacionContainer\";\nimport PostulacionForm from \"./PostulacionForm\";\n\nconst PostulacionHome: React.FC = () => {\n const { concursoPk } = useParams();\n\n return (\n \n

Formulario de postulación

\n \n
\n );\n};\n\nexport default PostulacionHome;\n","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Skeleton from \"@material-ui/lab/Skeleton\";\n\nconst useStyles = makeStyles({\n table: {\n boxShadow: \"none\",\n marginBottom: \"1.5rem\",\n },\n trow: {\n \"&:nth-child(even)\": {\n backgroundColor: \"#f5f5f5\",\n },\n },\n thead: {\n color: \"white !important\",\n },\n tcell: {\n height: \"max-content\",\n paddingTop: 2,\n paddingBottom: 2,\n paddingRight: \"16px\",\n },\n});\n\nconst StyledHeadCell = (props) => {\n const classes = useStyles();\n const content = props.content;\n const style = props.style;\n\n return (\n \n {content}\n \n );\n};\n\nconst StyledBodyCell = (props) => {\n const classes = useStyles();\n const content = props.content;\n const style = props.style;\n\n return (\n \n {content}\n \n );\n};\n\nconst StyledSkeleton = (props) => {\n const opacity = props.opacity || 1;\n return (\n
\n \n
\n );\n};\n\nconst StyledTable = (props) => {\n const classes = useStyles();\n const headers = props.headers;\n const rows = props.rows;\n const loading = props.loading;\n\n if (loading) {\n const skeletonHeight = 50;\n const skeletonTotal = 6;\n return (\n \n {[...Array(skeletonTotal).keys()].map((idx) => (\n \n ))}\n \n );\n }\n\n return (\n \n \n \n \n {headers.map((header, hIdx) => (\n \n ))}\n \n \n \n {rows.map((row, rIdx) => (\n \n {row.map((cell, cIdx) => (\n \n ))}\n \n ))}\n \n
\n
\n );\n};\n\nexport default StyledTable;\n","import React from \"react\";\nimport axios from \"axios\";\nimport StyledTable from \"../../common/StyledTable\";\nimport moment from \"moment\";\nimport \"moment/locale/es\";\nimport Button from \"@material-ui/core/Button\";\nimport PostulacionContainer from \"./PostulacionContainer\";\nimport Swal from \"sweetalert2\";\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\nimport Backdrop from \"@material-ui/core/Backdrop\";\nimport {makeStyles} from \"@material-ui/core/styles\";\nimport {handleDownloadFileError, handleLoadingConcursoError} from \"../../utils/errors\";\n\nconst useStyles = makeStyles((theme) => ({\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: \"#fff\",\n },\n }));\n\nconst ConcursosFacultad = (props) => {\n const classes = useStyles();\n const [openSpinner, setOpenSpinner] = React.useState(false);\n\n if (props.loading) {\n return ;\n }\n if (!props.visible && !props.error) {\n return (\n \n

No hay concursos disponibles.

\n \n );\n }\n\n return (\n
\n {props.concursosFacultad.map((facultad, index) => {\n return (\n \n
\n
\n {facultad.nombre_facultad ? facultad.nombre_facultad : \"\"}\n
\n
\n \n filaConcurso({\n id: concurso.id,\n codigo: concurso.codigo,\n nombre: concurso.nombre,\n apertura: concurso.fecha_inicio,\n cierre: concurso.fecha_termino,\n concursoId: concurso.id,\n numPostulantes: 0,\n creador: concurso.id_usuario_creador,\n contacto: concurso.id_usuario_contacto,\n publicacion: concurso.fecha_aviso_diario,\n facultades: props.facultades,\n openSpinner: setOpenSpinner,\n })\n )}\n />\n
\n
\n \n \n \n
\n );\n })}\n
\n );\n};\n\nconst Concurso = (props) => {\n const rows = props.rows;\n const headers = [\n {content: \"Código\"},\n {content: \"Nombre\"},\n {content: \"Fecha de Cierre\"},\n {content: \"Acciones\"},\n ];\n\n return ;\n};\n\nconst filaConcurso = (props) => {\n const cierreDate = props.cierre ? new Date(new Date(props.cierre).getTime()) : undefined;\n const cierreDateLocal = cierreDate ? new Date(cierreDate).toISOString().substring(0, 19) : undefined;\n\n const fechaApertura = moment(props.apertura).locale(\"es\").format(\"LLL\");\n const fechaPublicacion = moment(props.publicacion).locale(\"es\").format(\"LL\");\n const fechaCierre = moment(cierreDateLocal).locale(\"es\").format(\"LLL\");\n\n return [\n {content: props.codigo, style: {width: \"1px\"}},\n {content: props.nombre, style: {width: \"800px\"}},\n {content: fechaCierre, style: {width: \"193px\"}},\n {\n content: ,\n style: {width: props.pending ? \"180px\" : \"120px\"},\n },\n ];\n};\n\nconst ActionsButtons = (props) => {\n return (\n
\n handleDownloadFilesClick(props)}\n style={{width: \"120px\"}}>\n Descargar Documentos\n \n \n
\n )\n}\n\nconst handleDownloadFilesClick = (props) => {\n props.openSpinner(true)\n axios({\n url: window.ENV.API_URL + \"/archivosConcurso/\" + props.concursoId,\n method: \"GET\",\n responseType: \"blob\", // important\n })\n .then((response) => {\n props.openSpinner(false)\n if (response.status === 204) {\n return Swal.fire({\n icon: 'warning',\n text: ' El concurso no presenta documentos adjuntos'\n })\n }\n const file = new Blob([response.data], {\n type: \"application/zip\",\n });\n const fileURL = URL.createObjectURL(file);\n const link = document.createElement(\"a\");\n link.href = fileURL; \n link.download = \"Documentos \" + props.nombre.replace(/[^a-zA-Z0-9]/g, '_').replace(/([_]+)/g, '_');\n link.click();\n })\n .catch((error) => {\n props.openSpinner(false)\n handleDownloadFileError(error)\n });\n}\nconst PostulacionList = (props) => {\n const [concursos, setConcursos] = React.useState([]);\n const [loadingConcursos, setLoadingConcursos] = React.useState(true);\n const [error, setError] = React.useState(false);\n\n React.useEffect(() => {\n let api_route = \"/concursosPostulacion/\";\n\n axios\n .get(window.ENV.API_URL + api_route)\n .then((res) => {\n setConcursos(res.data);\n setLoadingConcursos(false);\n })\n .catch((error) => {\n handleLoadingConcursoError(error, window.ENV.URL_FRONT + \"ListaConcursos\");\n setLoadingConcursos(false);\n setError(true)\n });\n }, []);\n\n return (\n \n 0}\n concursosFacultad={concursos}\n error={error}\n />\n \n );\n\n}\n\n\nexport default PostulacionList;\n","import React from \"react\";\nimport axios from \"axios\";\nimport \"moment/locale/es\";\nimport PostulacionContainer from \"./PostulacionContainer\";\nimport { useParams } from \"react-router-dom\";\nimport PostulacionForm from \"./PostulacionForm\";\nimport {handleEdicionConcursoError} from \"../../utils/errors\";\n\nconst PostulacionEdit = (props) => {\n const { uuid, pop } = useParams();\n const [postulacion, setPostulacion] = React.useState({});\n const [loadingPostulacion, setLoadingPostulacion] = React.useState(true);\n\n React.useEffect(() => {\n let api_route = `/postulacion/${uuid}/`;\n\n axios\n .get(window.ENV.API_URL + api_route)\n .then((res) => {\n setPostulacion(res.data[0]);\n setLoadingPostulacion(false);\n })\n .catch((error) => handleEdicionConcursoError(error));\n }, []);\n\n if (loadingPostulacion) {\n return ;\n }\n\n\n return (\n \n

\n Edición de Postulación\n

\n\n \n
\n );\n};\n\nexport default PostulacionEdit;\n","import React from \"react\";\nimport axios from \"axios\";\nimport StyledTable from \"../../common/StyledTable\";\nimport moment from \"moment\";\nimport \"moment/locale/es\";\nimport Swal from \"sweetalert2\";\nimport Button from \"@material-ui/core/Button\";\nimport PostulacionContainer from \"./PostulacionContainer\";\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\nimport Backdrop from \"@material-ui/core/Backdrop\";\nimport {makeStyles} from \"@material-ui/core/styles\";\nimport {\n handleDownloadFileError,\n handleLoadingConcursoError,\n} from \"../../utils/errors\";\n\nconst useStyles = makeStyles((theme) => ({\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: \"#fff\",\n },\n}));\n\nconst ConcursosFacultad = (props) => {\n const classes = useStyles();\n const [openSpinner, setOpenSpinner] = React.useState(false);\n if (props.loading) {\n return ;\n }\n if (!props.visible) {\n return (\n \n

No hay concursos disponibles.

\n \n );\n }\n\n return (\n
\n {props.concursosFacultad.map((facultad, index) => {\n return (\n \n
\n
\n {facultad.nombre_facultad ? facultad.nombre_facultad : \"\"}\n
\n
\n \n filaConcurso({\n codigo: concurso.codigo,\n nombre: concurso.nombre,\n apertura: concurso.fecha_inicio,\n cierre: concurso.fecha_termino,\n concursoId: concurso.id,\n numPostulantes: 0,\n creador: concurso.id_usuario_creador,\n contacto: concurso.id_usuario_contacto,\n publicacion: concurso.fecha_aviso_diario,\n facultades: props.facultades,\n openSpinner: setOpenSpinner,\n })\n )}\n />\n
\n
\n \n \n \n
\n );\n })}\n
\n );\n};\n\nconst Concurso = (props) => {\n const rows = props.rows;\n const headers = [\n { content: \"Código\" },\n { content: \"Nombre\" },\n { content: \"Fecha de Apertura\" },\n { content: \"Fecha de Cierre\" },\n { content: \"Acciones\" },\n ];\n\n return ;\n};\n\nconst filaConcurso = (props) => {\n const aperturaDate = props.apertura ? new Date(new Date(props.apertura).getTime()) : undefined;\n const aperturaDateLocal = aperturaDate ? new Date(aperturaDate).toISOString().substring(0, 19) : undefined;\n const cierreDate = props.cierre ? new Date(new Date(props.cierre).getTime()) : undefined;\n const cierreDateLocal = cierreDate ? new Date(cierreDate).toISOString().substring(0, 19) : undefined;\n\n const fechaApertura = moment(aperturaDateLocal).locale(\"es\").format(\"LLL\");\n const fechaPublicacion = moment(props.publicacion).locale(\"es\").format(\"LL\");\n const fechaCierre = moment(cierreDateLocal).locale(\"es\").format(\"LLL\");\n\n return [\n { content: props.codigo, style: { width: \"1px\" } },\n { content: props.nombre },\n { content: fechaApertura, style: { width: \"193px\" } },\n { content: fechaCierre, style: { width: \"193px\" } },\n {\n content: (\n
\n handleDownloadFilesClick(props)}\n style={{ width: \"120px\" }}\n >\n Descargar Documentos\n \n
\n ),\n style: { width: \"117px\" },\n },\n ];\n};\n\nconst handleDownloadFilesClick = (props) => {\n props.openSpinner(true)\n axios({\n url: window.ENV.API_URL + \"/archivosConcurso/\" + props.concursoId,\n method: \"GET\",\n responseType: \"blob\", // important\n })\n .then((response) => {\n props.openSpinner(false)\n if (response.status === 204) {\n return Swal.fire({\n icon: \"warning\",\n text: \" El concurso no presenta documentos adjuntos\",\n });\n }\n const file = new Blob([response.data], {\n type: \"application/zip\",\n });\n const fileURL = URL.createObjectURL(file);\n const link = document.createElement(\"a\");\n link.href = fileURL;\n link.download = \"Documentos \" + props.codigo;\n link.click();\n })\n .catch((error) => { \n props.openSpinner(false);\n handleDownloadFileError(error);\n });\n};\n\nconst PostulacionList = (props) => {\n const [concursos, setConcursos] = React.useState([]);\n const [loadingConcursos, setLoadingConcursos] = React.useState(true);\n\n React.useEffect(() => {\n let api_route = \"/historialPostulacion/\";\n\n axios\n .get(window.ENV.API_URL + api_route)\n .then((res) => {\n setConcursos(res.data);\n setLoadingConcursos(false);\n })\n .catch((error) =>\n handleLoadingConcursoError(\n error,\n window.ENV.URL_FRONT + \"HistorialConcursos\"\n )\n );\n }, []);\n\n return (\n \n 0}\n concursosFacultad={concursos}\n />\n
\n );\n};\n\nexport default PostulacionList;\n","import Box from \"@material-ui/core/Box\";\nimport PropTypes from \"prop-types\";\nimport React from \"react\";\nimport {makeStyles} from \"@material-ui/core/styles\";\n\nexport const useStyles = makeStyles((theme) => ({\n tab: {\n background: \"white\",\n color: \"black\",\n },\n appbar: {\n backgroundColor: \"#50907D\",\n boxShadow: \"none\",\n paddingLeft: \"1em\",\n },\n button: {\n background: \"#f29426\",\n color: \"white\",\n paddingTop: \"10px\",\n paddingBottom: \"10px\",\n paddingLeft: \"15px\",\n paddingRight: \"15px\",\n height: \"max-content\",\n \"&:hover, &:focus\": {\n background: \"#f27500 !important\",\n },\n },\n dialog: {\n \"& .MuiDialog-paper\": {\n maxWidth: \"700px\",\n },\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: \"#fff\",\n },\n}));\n\nTabPanel.propTypes = {\n children: PropTypes.node,\n index: PropTypes.any.isRequired,\n value: PropTypes.any.isRequired,\n};\n\nexport function TabPanel(props) {\n const {children, value, index, ...other} = props;\n\n return (\n