Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 2023-ujoncdelutan
  • 2023-update
  • master
  • 1.0
  • 1.0.1
  • 1.0.10
  • 1.0.12
  • 1.0.13
  • 1.0.14
  • 1.0.15
  • 1.0.16
  • 1.0.17
  • 1.0.18
  • 1.0.19
  • 1.0.2
  • 1.0.3
  • 1.0.4
  • 1.0.5
  • 1.0.6
  • 1.0.7
  • 1.0.8
  • 1.0.9
  • 1.1.0
  • 1.1.1
  • 1.1.2
  • 1.1.3
  • 1.1.4
  • 1.1.5
  • 1.2.0
  • 1.3.0
  • 1.3.1
  • 1.3.10
  • 1.3.11
  • 1.3.12
  • 1.3.13
  • 1.3.14
  • 1.3.15
  • 1.3.16
  • 1.3.17
  • 1.3.18
  • 1.3.19
  • 1.3.2
  • 1.3.3
  • 1.3.4
  • 1.3.5
  • 1.3.6
  • 1.3.7
  • 1.3.8
  • 1.3.9
  • 1.4.0
  • 1.4.1
  • 1.4.2
  • 1.4.3
  • 1.4.4
  • 1.4.5
  • 1.4.6
  • 1.4.7
57 results

Target

Select target project
  • kszk/devteam/kszkepzes/old/kszkepzes-frontend
  • kbgergely/kszkepzes-frontend
2 results
Select Git revision
  • master
  • 1.0
  • 1.0.1
  • 1.0.10
  • 1.0.12
  • 1.0.13
  • 1.0.14
  • 1.0.15
  • 1.0.16
  • 1.0.17
  • 1.0.18
  • 1.0.19
  • 1.0.2
  • 1.0.3
  • 1.0.4
  • 1.0.5
  • 1.0.6
  • 1.0.7
  • 1.0.8
  • 1.0.9
  • 1.1.0
  • 1.1.1
  • 1.1.2
  • 1.1.3
  • 1.1.4
  • 1.1.5
  • 1.2.0
  • 1.3.0
  • 1.3.1
29 results
Show changes
Showing
with 1923 additions and 956 deletions
import { Button, Container, Header, Item, Label } from 'semantic-ui-react';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Container, Header, Item, Button, Label } from 'semantic-ui-react';
import { connect } from 'react-redux';
import { getSelectedProfile, setStatus } from '../../actions/statistics'; import { getSelectedProfile, setStatus } from '../../actions/statistics';
import ConfirmModal from '../forms/ConfirmModal'; import ConfirmModal from '../forms/ConfirmModal';
import { connect } from 'react-redux';
const groupTypes = {
HAT: {
name: 'Hallgatói Tudásbázis',
color: 'purple',
},
SYS: {
name: 'Sysadmin',
color: 'violet',
},
NET: {
name: 'NETeam',
color: 'blue',
},
ST: {
name: 'SecurITeam',
color: 'teal',
},
DT: {
name: 'DevTeam',
color: 'green',
},
};
class ApplicantProfile extends Component { class ApplicantProfile extends Component {
componentWillMount() { UNSAFE_componentWillMount() {
this.props.getSelectedProfile(this.props.match.params.id); this.props.getSelectedProfile(this.props.match.params.id);
} }
render() { render() {
const { id, signed, role, full_name, nick, motivation_about, motivation_exercise, motivation_profession } const {
= this.props.selectedProfile; id,
signed,
role,
full_name,
nick,
motivation_about,
motivation_exercise,
motivation_profession,
groups,
} = this.props.selectedProfile;
return ( return (
<Container style={{ padding: '60px' }}> <Container style={{ paddingTop: '3em', paddingBottom: '6em' }}>
<Item> <Item>
<Item.Content> <Item.Content>
<Container textAlign='center'> <Container textAlign="center" style={{ paddingBottom: '2em' }}>
<Header as='h2'>{full_name}</Header> <Header as="h2">{full_name}</Header>
<Item.Meta>{nick}</Item.Meta> <Item.Meta>{nick}</Item.Meta>
<Header as="h2">
{groups?.map((group) => (
<Label color={groupTypes[group].color}>
{groupTypes[group].name}
</Label>
))}
</Header>
</Container> </Container>
<Item.Description> <Item.Description>
<Container textAlign='justified' style={{ padding: '30px' }}> <Container textAlign="justified" style={{ padding: '1em' }}>
<Header as='h3'>Magamról, eddigi tevékenységem:</Header> <Header as="h3">Magamról, eddigi tevékenységem:</Header>
<p>{motivation_about}</p> <p>
<Header as='h3'>Szakmai motiváció:</Header> {motivation_about?.split('\n').map((item, i) => (
<p>{motivation_profession}</p> <div key={i}>{item}</div>
<Header as='h3'>Feladatok megoldása:</Header> ))}
<p>{motivation_exercise}</p> </p>
<Header as="h3">Szakmai motiváció:</Header>
<p>
{motivation_profession?.split('\n').map((item, i) => (
<div key={i}>{item}</div>
))}
</p>
<Header as="h3">Feladatok megoldása:</Header>
<p>
{motivation_exercise?.split('\n').map((item, i) => (
<div key={i}>{item}</div>
))}
</p>
</Container> </Container>
<Container textAlign='center' style={{ padding: '20px' }}> <Container textAlign="center" style={{ padding: '1em' }}>
<Header as='h3'>Státusz:</Header> <Header as="h3">Státusz:</Header>
{ signed ? {signed ? (
<div> <div>
{ role === 'Student' ? {role === 'Student' ? (
<Label color='green' size='huge'>Elfogadva</Label> <Label color="green" size="huge">
: Elfogadva
null </Label>
} ) : null}
{ role === 'Staff' ? {role === 'Staff' ? (
<Label color='blue' size='huge'>Staff</Label> <Label color="blue" size="huge">
: Staff
null </Label>
} ) : null}
{ role === 'Applicant' ? {role === 'Applicant' ? (
<Label color='orange' size='huge'>Jelentkezett</Label> <Label color="orange" size="huge">
: Jelentkezett
null </Label>
} ) : null}
{ role === 'Denied' ? {role === 'Denied' ? (
<Label color='red' size='huge'>Elutasítva</Label> <Label color="red" size="huge">
: Elutasítva
null </Label>
} ) : null}
</div> </div>
: ) : (
<Label color='red' size='huge'>Nem jelentkezett</Label> <Label color="red" size="huge">
} Nem jelentkezett
</Label>
)}
</Container> </Container>
</Item.Description> </Item.Description>
</Item.Content> </Item.Content>
</Item> </Item>
{ signed && role !== 'Staff' ? {signed && role !== 'Staff' ? (
<Container textAlign='center'> <Container textAlign="center">
<ConfirmModal <ConfirmModal
button={ button={<Button color="green">Jelentkezés elfogadása</Button>}
<Button text="elfogadod a jelentkezést"
color='green'
>Jelentkezés elfogadása
</Button>}
text='elfogadod a jelentkezést'
onAccept={() => this.props.setStatus(id, 'Student')} onAccept={() => this.props.setStatus(id, 'Student')}
/> />
<ConfirmModal <ConfirmModal
button={ button={<Button color="red">Jelentkezés elutasítása</Button>}
<Button text="elutasítod a jelentkezést"
color='red'
>Jelentkezés elutasítása
</Button>}
text='elutasítod a jelentkezést'
onAccept={() => this.props.setStatus(id, 'Denied')} onAccept={() => this.props.setStatus(id, 'Denied')}
/> />
</Container> </Container>
: ) : null}
null
}
</Container> </Container>
); );
} }
} }
const mapStateToProps = ({ trainees: { selectedProfile } }) => ({ selectedProfile }); const mapStateToProps = ({ trainees: { selectedProfile } }) => ({
selectedProfile,
});
export default connect(mapStateToProps, { getSelectedProfile, setStatus })(ApplicantProfile); export default connect(mapStateToProps, { getSelectedProfile, setStatus })(
ApplicantProfile
);
import { Button, Container, Label, Table } from 'semantic-ui-react';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Container, Table, Label, Button } from 'semantic-ui-react';
import { connect } from 'react-redux';
import { getProfiles, setStatus } from '../../actions/statistics'; import { getProfiles, setStatus } from '../../actions/statistics';
import ConfirmModal from '../forms/ConfirmModal'; import ConfirmModal from '../forms/ConfirmModal';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
const role = [
{
role: 'Staff',
text: 'Staff',
color: 'blue',
},
{
role: 'Student',
text: 'Elfogadott',
color: 'green',
},
{
role: 'Applicant',
text: 'Jelentkezett',
color: 'orange',
},
{
role: 'Denied',
text: 'Elutasított',
color: 'red',
},
{
role: 'no',
text: 'Nem jelentkezett',
color: 'red',
},
];
class Applications extends Component { class Applications extends Component {
componentWillMount() { UNSAFE_componentWillMount() {
this.props.getProfiles(); this.props.getProfiles();
} }
renderApplicants() { renderApplicants(format) {
return this.props.profiles.map((profile) => return this.props.profiles.map((profile) =>
{ return ( profile.role === format.role &&
<Table.Row> (profile.signed === true || profile.role === 'Staff') ? (
<Table.Cell> <Table.Row key={profile.id}>
<Link to={`applicant/${profile.id}`}> <Table.Cell textAlign="center">
{profile.full_name} <Link to={`applicant/${profile.id}`}>{profile.full_name}</Link>
</Link>
</Table.Cell> </Table.Cell>
{ profile.signed ? {format.role === 'Staff' ? null : (
<Table.Cell textAlign='center'> <Table.Cell textAlign="center">
{ profile.role === 'Student' ? <ConfirmModal
<Label color='green'>Elfogadva</Label> button={
: <Button color="blue" size="tiny">
null ADD STAFF STATUS
} </Button>
{ profile.role === 'Staff' ?
<Label color='blue'>Staff</Label>
:
null
}
{ profile.role === 'Applicant' ?
<Label color='orange'>Jelentkezett</Label>
:
null
}
{ profile.role === 'Denied' ?
<Label color='red'>Elutasítva</Label>
:
null
} }
text="staff jogot adsz neki"
onAccept={() => this.props.setStatus(profile.id, 'Staff')}
/>
</Table.Cell> </Table.Cell>
: )}
<Table.Cell textAlign='center'> </Table.Row>
<Label color='red'>Nem jelentkezett</Label> ) : null
</Table.Cell> );
} }
<Table.Cell>
renderNotApplicants(format) {
return this.props.profiles.map((profile) =>
profile.signed === false && profile.role !== 'Staff' ? (
<Table.Row key={profile.id}>
<Table.Cell textAlign="center">
<Link to={`applicant/${profile.id}`}>{profile.full_name}</Link>
</Table.Cell>
{format.role === 'Staff' ? null : (
<Table.Cell textAlign="center">
<ConfirmModal <ConfirmModal
button = {<Button button={
color='blue' <Button color="blue" size="tiny">
size='tiny'
>
ADD STAFF STATUS ADD STAFF STATUS
</Button>} </Button>
text='staff jogot adsz neki' }
text="staff jogot adsz neki"
onAccept={() => this.props.setStatus(profile.id, 'Staff')} onAccept={() => this.props.setStatus(profile.id, 'Staff')}
/> />
</Table.Cell> </Table.Cell>
)}
</Table.Row> </Table.Row>
) : null
); );
});
} }
render() { renderTable(format) {
return ( return (
<Container <Table color="blue" unstackable celled selectable compact>
textAlign='center'
style={{
padding: '80px'
}}
>
<Table color='blue' celled selectable compact>
<Table.Header> <Table.Header>
<Table.Row> <Table.Row>
<Table.HeaderCell>Jelentkezettek</Table.HeaderCell> <Table.HeaderCell textAlign="center">
<Table.HeaderCell textAlign='center'>Jelentkezés státusza:</Table.HeaderCell> <Label color={format.color}>{format.text}</Label>
<Table.HeaderCell /> </Table.HeaderCell>
{format.role !== 'Staff' ? (
<Table.HeaderCell width={3} textAlign="center">
<Label color={null}>
{format.role === 'no'
? this.props.profiles.filter(
(profile) =>
profile.signed === false && profile.role !== 'Staff'
).length
: this.props.profiles.filter(
(profile) =>
profile.role === format.role &&
(profile.signed === true || profile.role === 'Staff')
).length}{' '}
</Label>
</Table.HeaderCell>
) : null}
</Table.Row> </Table.Row>
</Table.Header> </Table.Header>
<Table.Body> <Table.Body>
{this.renderApplicants()} {format.role === 'no'
? this.renderNotApplicants(format)
: this.renderApplicants(format)}
</Table.Body> </Table.Body>
</Table> </Table>
);
}
render() {
return (
<Container
textAlign="center"
style={{ paddingTop: '1em', paddingBottom: '5em' }}
>
{this.renderTable(role[2])} {/* Applicant */}
{this.renderTable(role[1])} {/* Student */}
{this.renderTable(role[0])} {/* Staff */}
{this.renderTable(role[3])} {/* Denied */}
{this.renderTable(role[4])} {/* Not Signed */}
</Container> </Container>
); );
} }
} }
const mapStateToProps = ({ trainees: { profiles }, user }) => ({ profiles, user }); const mapStateToProps = ({ trainees: { profiles }, user }) => ({
profiles,
user,
});
export default connect(mapStateToProps, { getProfiles, setStatus })(Applications); export default connect(mapStateToProps, { getProfiles, setStatus })(
Applications
);
import React, { Component } from 'react';
import { import {
Container,
Item,
Button, Button,
Comment, Comment,
Container,
Divider,
Form, Form,
Header, Header,
Item,
Segment,
Table, Table,
Icon, } from "semantic-ui-react";
Checkbox, import React, { Component } from "react";
Popup, import {
Grid, clearWrite,
} from 'semantic-ui-react'; getNotesByEvent,
import { connect } from 'react-redux'; postEventNote,
import moment from 'moment'; writeNote,
import { getEventById, getTrainees, visitorChange, submitVisitors } from '../../actions/statistics'; } from "../../actions/notes";
import { getNotesByEvent, writeNote, clearWrite, postEventNote } from '../../actions/notes'; import {
import TraineeTableRow from './TraineeTableRow'; getEventById,
getTrainees,
submitVisitors,
visitorChange,
} from "../../actions/statistics";
import TraineeTableRow from "./EventDetailTableRow";
import { connect } from "react-redux";
import moment from "moment";
class EventDetail extends Component { class EventDetail extends Component {
constructor(props) { constructor(props) {
...@@ -27,40 +35,59 @@ class EventDetail extends Component { ...@@ -27,40 +35,59 @@ class EventDetail extends Component {
}; };
} }
componentWillMount() { UNSAFE_componentWillMount() {
this.props.getEventById(this.props.match.params.id); this.props.getEventById(this.props.match.params.id);
this.props.getTrainees(); this.props.getTrainees();
this.props.getNotesByEvent(this.props.match.params.id); this.props.getNotesByEvent(this.props.match.params.id);
} }
renderTrainees() { renderTrainees() {
const event = this.props.selectedEvent; const event = this.props.selectedEvent;
const note = this.props.actualNote; return this.props.trainees
return this.props.trainees.map((item) => { ?.sort(function (a, b) {
const notes = this.props.eventNotes.filter(note => note.profile === item.id); var nameA = a.full_name.toLowerCase(),
return ( nameB = b.full_name.toLowerCase();
if (nameA < nameB)
//sort string ascending
return -1;
if (nameA > nameB) return 1;
return 0; //default return value (no sorting)
})
.map((item) => {
const notes = this.props.eventNotes?.filter(
(note) => note.profile === item.id
);
return item.role === "Student" ? (
<TraineeTableRow <TraineeTableRow
selectedEvent={event} selectedEvent={event}
notes={notes} notes={notes}
trainee={item} trainee={item}
edit={this.state.edit} edit={this.state.edit}
key={item.id}
/> />
); ) : null;
}); });
} }
renderEvent() { renderEvent() {
const { name, date, description } = this.props.selectedEvent; const { name, date, description } = this.props.selectedEvent;
return ( return (
<Segment>
<Item> <Item>
<Item.Header as='h2'>{name}</Item.Header> <Divider style={{ fontSize: "2em" }} horizontal>
<Item.Header as='h3'>Dátum: {moment(date).format('LL')}</Item.Header> <Header as="h1">
<Container textAlign='justified'> {name}
<Item.Header as='h3'>Leírás</Item.Header> <Item.Header style={{ fontSize: "0.6em" }}>
{moment(date).format("LL")}
</Item.Header>
</Header>
</Divider>
<Container textAlign="justified">
<Item.Header as="h3">Leírás</Item.Header>
<Item.Content>{description}</Item.Content> <Item.Content>{description}</Item.Content>
</Container> </Container>
</Item> </Item>
</Segment>
); );
} }
...@@ -69,19 +96,20 @@ class EventDetail extends Component { ...@@ -69,19 +96,20 @@ class EventDetail extends Component {
return notes.map((note) => { return notes.map((note) => {
if (!note.profile) { if (!note.profile) {
return ( return (
<Comment> <Segment>
<Comment key={Math.random()}>
<Comment.Content> <Comment.Content>
<Comment.Author>{note.created_by_name}</Comment.Author> <Comment.Author>{note.created_by_name}</Comment.Author>
<Comment.Metadata> <Comment.Metadata>
{moment(note.created_at).format('LL')} {moment(note.created_at).format("LL")}
</Comment.Metadata> </Comment.Metadata>
<Comment.Text> <Comment.Text>{note.note}</Comment.Text>
{note.note}
</Comment.Text>
</Comment.Content> </Comment.Content>
</Comment>); </Comment>
</Segment>
);
} }
return ''; return "";
}); });
} }
...@@ -89,75 +117,57 @@ class EventDetail extends Component { ...@@ -89,75 +117,57 @@ class EventDetail extends Component {
const event = this.props.selectedEvent; const event = this.props.selectedEvent;
const note = this.props.actualNote; const note = this.props.actualNote;
return ( return (
<Container <Container style={{ paddingTop: "1em", paddingBottom: "7em" }}>
style={{ <Container textAlign="center">
padding: '80px' {this.props.selectedEvent && this.props.trainees
? this.renderEvent()
: ""}
</Container>
{!this.state.edit ? (
<Button onClick={() => this.setState({ edit: true })}>
Módosítás
</Button>
) : (
<Button
onClick={() => {
this.setState({ edit: false });
}} }}
> >
<Container textAlign='center'> {" "}
{ this.props.selectedEvent && this.props.trainees ? Kész
this.renderEvent() </Button>
: )}
'' <Table celled unstackable>
}
</Container>
<Table celled centered>
<Table.Header> <Table.Header>
<Table.Row> <Table.Row textAlign="center">
<Table.HeaderCell>Név</Table.HeaderCell> <Table.HeaderCell>Név</Table.HeaderCell>
<Table.HeaderCell>Jelen volt</Table.HeaderCell> <Table.HeaderCell>Jelen volt</Table.HeaderCell>
<Table.HeaderCell>Megjegyzések</Table.HeaderCell> <Table.HeaderCell>Megjegyzések</Table.HeaderCell>
</Table.Row> </Table.Row>
</Table.Header> </Table.Header>
<Table.Body> <Table.Body>
{ this.props.selectedEvent ? {this.props.selectedEvent ? this.renderTrainees() : null}
this.renderTrainees()
:
''
}
</Table.Body> </Table.Body>
</Table> </Table>
<Button
onClick={() => this.setState({ edit: true })}
>
Edit
</Button>
{ this.state.edit ?
<Button
onClick={() => {
this.setState({ edit: false });
this.props.submitVisitors(this.props.selectedEvent);
}
}
>Save
</Button>
:
''
}
<Comment.Group> <Comment.Group>
<Header dividing> <Header dividing>Megjegyzések</Header>
Megjegyzések {this.props.eventNotes ? this.renderComments() : ""}
</Header>
{this.props.eventNotes ?
this.renderComments()
:
''
}
<Form reply> <Form reply>
<Form.TextArea <Form.TextArea
value={note.note} value={note.note}
onChange={e => this.props.writeNote(e)} onChange={(e) => this.props.writeNote(e)}
/> />
<Button <Button
onClick={() => { onClick={() => {
this.props.postEventNote({ eventid: event.id, this.props.postEventNote({
note: note.note }); eventid: event.id,
note: note.note,
});
this.props.clearWrite(); this.props.clearWrite();
} }}
} content="Megjegyzés hozzáadása"
content='Megjegyzés hozzáadása' labelPosition="left"
labelPosition='left' icon="edit"
icon='edit'
primary primary
/> />
</Form> </Form>
...@@ -170,8 +180,13 @@ class EventDetail extends Component { ...@@ -170,8 +180,13 @@ class EventDetail extends Component {
const mapStateToProps = ({ const mapStateToProps = ({
notes: { eventNotes, actualNote }, notes: { eventNotes, actualNote },
events: { selectedEvent }, events: { selectedEvent },
trainees: { trainees } trainees: { trainees },
}) => ({ eventNotes, selectedEvent, trainees, actualNote }); }) => ({
eventNotes,
selectedEvent,
trainees,
actualNote,
});
export default connect(mapStateToProps, { export default connect(mapStateToProps, {
getEventById, getEventById,
......
import React, { Component } from 'react';
import { import {
Button,
Comment, Comment,
Table, Dropdown,
Form,
Grid,
Icon, Icon,
Popup, Popup,
Grid, Table,
Button,
Form,
Dropdown,
} from 'semantic-ui-react'; } from 'semantic-ui-react';
import React, { Component } from 'react';
import { clearWrite, postEventNote, writeNote } from '../../actions/notes';
import { submitVisitors, visitorChange } from '../../actions/statistics';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { visitorChange, submitVisitors } from '../../actions/statistics';
import { writeNote, clearWrite, postEventNote } from '../../actions/notes';
const visitStates = [ const visitStates = [
{ {
...@@ -25,8 +26,8 @@ const visitStates = [ ...@@ -25,8 +26,8 @@ const visitStates = [
{ {
text: 'Nem', text: 'Nem',
value: 'No', value: 'No',
} },
] ];
class TraineeTableRow extends Component { class TraineeTableRow extends Component {
constructor(props) { constructor(props) {
...@@ -37,102 +38,126 @@ class TraineeTableRow extends Component { ...@@ -37,102 +38,126 @@ class TraineeTableRow extends Component {
}; };
} }
triggerAdd = () => this.setState({ ...this.state, showAddPopup: !this.state.showAddPopup}) // Hides and shows the Add and More popup
triggerMore = () => this.setState({ ...this.state, showMorePopup: !this.state.showMorePopup }) triggerAdd = () =>
this.setState({ ...this.state, showAddPopup: !this.state.showAddPopup });
triggerMore = () =>
this.setState({ ...this.state, showMorePopup: !this.state.showMorePopup });
render() { render() {
const note = this.props.actualNote; const note = this.props.actualNote;
const { trainee, edit, actualNote, selectedEvent, notes } = this.props; const { trainee, selectedEvent, notes } = this.props;
const isVisitor = selectedEvent.visitors.includes(trainee.id); const isVisitor = selectedEvent.visitors.includes(trainee.id);
const isAbsent = selectedEvent.absent.includes(trainee.id); const isAbsent = selectedEvent.absent.includes(trainee.id);
let visitorStatusIcon;
let visitorStatusDropdown;
if (isVisitor) {
visitorStatusIcon = <Icon color="green" name="checkmark" />;
visitorStatusDropdown = 'Visitor';
} else if (isAbsent) {
visitorStatusIcon = <Icon color="orange" name="minus" />;
visitorStatusDropdown = 'Absent';
} else {
visitorStatusIcon = <Icon color="red" name="cancel" />;
visitorStatusDropdown = 'No';
}
return ( return (
<Table.Row> <Table.Row>
<Table.Cell> <Table.Cell textAlign="center">{trainee.full_name}</Table.Cell>
{trainee.full_name} {/* Show and change Visitors status */}
</Table.Cell> {!this.props.edit ? (
{!this.props.edit ? <Table.Cell textAlign="center">{visitorStatusIcon}</Table.Cell>
<Table.Cell textAlign='center'> ) : (
{ <Table.Cell textAlign="center">
isVisitor ?
<Icon color='green' name='checkmark' />
:
isAbsent ?
<Icon color='orange' name='minus' />
:
<Icon color='red' name='cancel' />
}
</Table.Cell>
:
<Table.Cell textAlign='center'>
<Dropdown <Dropdown
defaultValue={isVisitor ? 'Visitor' : isAbsent ? 'Absent' : 'No'} defaultValue={visitorStatusDropdown}
selection selection
options={visitStates} options={visitStates}
onChange={(_, v) => this.props.visitorChange({ id : trainee.id, value: v.value })} onChange={(_, v) => {
this.props.visitorChange({ id: trainee.id, value: v.value });
// Submit with error check
this.props
.submitVisitors(this.props.selectedEvent)
.then((value) => {
if (value === true) {
console.log('success');
} else {
console.log('error');
}
});
}}
/> />
</Table.Cell> </Table.Cell>
} )}
{/* Notes for trainees */}
<Table.Cell> <Table.Cell>
<Grid> <Grid>
<Grid.Row> <Grid.Row>
<Grid.Column floated='left' width={8} textAlign='left'> {/* Note text */}
<Grid.Column floated="left" width={8}>
{notes.length > 0 ? {notes.length > 0 ? (
<Comment> <Comment>
<Comment.Content> <Comment.Content>
<Comment.Author>{notes[0].created_by_name}</Comment.Author> <Comment.Author>
<Comment.Text> <b>{notes[0].created_by_name}:</b>
{notes[0].note.length > 50 ? notes[0].note.slice(0, 50).concat('...') </Comment.Author>
: <Comment.Text style={{ wordWrap: 'break-word' }}>
notes[0].note } {notes[0].note.length > 25
? notes[0].note.slice(0, 25).concat('...')
: notes[0].note}
</Comment.Text> </Comment.Text>
</Comment.Content> </Comment.Content>
</Comment> </Comment>
: ) : null}
null
}
</Grid.Column> </Grid.Column>
<Grid.Column floated='right' width={3} textAlign='right'> {/* Note buttons */}
{notes.length > 0 ? <Grid.Column floated="right" width={6} textAlign="right">
{notes.length > 0 ? (
<Popup <Popup
basic basic
open={this.state.showMorePopup} open={this.state.showMorePopup}
trigger={<Button icon='comment alternate outline' onClick={this.triggerMore} />} trigger={
content={notes.map((note) => { <Button
return ( icon="comment alternate outline"
onClick={this.triggerMore}
/>
}
content={notes.map((oneNote) => (
<Comment.Content> <Comment.Content>
<Comment.Author>{note.created_by_name}</Comment.Author> <Comment.Author>
<Comment.Text> <b>{oneNote.created_by_name}:</b>
{note.note} </Comment.Author>
</Comment.Text> <Comment.Text>{oneNote.note}</Comment.Text>
</Comment.Content> </Comment.Content>
); ))}
})}
/> />
: ) : null}
null}
<Popup <Popup
trigger={<Button icon='plus' onClick={this.triggerAdd}/>}
basic basic
trigger={<Button icon="plus" onClick={this.triggerAdd} />}
open={this.state.showAddPopup} open={this.state.showAddPopup}
content={ content={
<Form reply> <Form reply>
<Form.TextArea <Form.TextArea
value={note.note} value={note.note}
onChange={e => this.props.writeNote(e)} onChange={(e) => this.props.writeNote(e)}
/> />
<Button <Button
primary
onClick={() => { onClick={() => {
this.props.postEventNote({ eventid:selectedEvent.id, this.triggerAdd();
this.props.postEventNote({
eventid: selectedEvent.id,
userid: trainee.id, userid: trainee.id,
note: note.note }); note: note.note,
});
this.props.clearWrite(); this.props.clearWrite();
} }}
} content="Megjegyzés hozzáadása"
content='Megjegyzés hozzáadása' labelPosition="left"
labelPosition='left' icon="edit"
icon='edit'
primary
/> />
</Form> </Form>
} }
...@@ -145,6 +170,12 @@ class TraineeTableRow extends Component { ...@@ -145,6 +170,12 @@ class TraineeTableRow extends Component {
); );
} }
} }
const mapStateToProps = ({ notes: { actualNote } }) => ({ actualNote }) const mapStateToProps = ({ notes: { actualNote } }) => ({ actualNote });
export default connect(mapStateToProps, { writeNote, clearWrite, postEventNote, visitorChange})(TraineeTableRow) export default connect(mapStateToProps, {
writeNote,
clearWrite,
postEventNote,
visitorChange,
submitVisitors,
})(TraineeTableRow);
import { Button, Container, Table } from 'semantic-ui-react';
import React, { Component } from 'react'; import React, { Component } from 'react';
import moment from 'moment'; import { deleteEvent, getStaffEvents } from '../../actions/statistics';
import AddEventForm from '../forms/AddEventForm';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Container, Table, Button } from 'semantic-ui-react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { getStaffEvents, deleteEvent } from '../../actions/statistics'; import moment from 'moment';
import AddEventForm from '../forms/AddEventForm';
class Events extends Component { class Events extends Component {
componentWillMount() { UNSAFE_componentWillMount() {
this.props.getStaffEvents(); this.props.getStaffEvents();
} }
renderEvents() { renderEvents() {
return this.props.events.map((event) => return this.props.events.map((event) => (
{ return ( <Table.Row key={event.id}>
<Table.Row> <Table.Cell textAlign="center">
<Table.Cell> <Link to={`events/${event.id}`}>{event.name}</Link>
<Link to={`events/${event.id}`}>
{event.name}
</Link>
</Table.Cell> </Table.Cell>
<Table.Cell>{moment(event.date).format('LL')}</Table.Cell> <Table.Cell textAlign="center">
<Table.Cell>{event.visitor_number}</Table.Cell> {moment(event.date).format('LL')}
<Table.Cell> </Table.Cell>
<Table.Cell textAlign="center">{event.visitor_number}</Table.Cell>
<Table.Cell textAlign="center">
<Button <Button
onClick={() => this.props.deleteEvent(event)} onClick={() => this.props.deleteEvent(event)}
color='red' color="red"
compact compact
size='small' size="small"
> >
Delete Törlés
</Button> </Button>
</Table.Cell> </Table.Cell>
</Table.Row> </Table.Row>
); ));
});
} }
render() { render() {
return ( return (
<Container textAlign='center'> <Container textAlign="center">
<Table color='blue' celled selectable compact> <div style={{ overflowX: 'scroll' }}>
<Table
color="blue"
unstackable
celled
selectable
compact
size="small"
>
<Table.Header> <Table.Header>
<Table.Row> <Table.Row>
<Table.HeaderCell>Alkalom neve</Table.HeaderCell> <Table.HeaderCell textAlign="center">
<Table.HeaderCell>Dátum</Table.HeaderCell> Alkalom neve
<Table.HeaderCell>Jelen voltak</Table.HeaderCell> </Table.HeaderCell>
<Table.HeaderCell textAlign="center">Dátum</Table.HeaderCell>
<Table.HeaderCell textAlign="center">
Jelen voltak
</Table.HeaderCell>
<Table.HeaderCell /> <Table.HeaderCell />
</Table.Row> </Table.Row>
</Table.Header> </Table.Header>
<Table.Body> <Table.Body>
{this.props.events ? this.renderEvents() : 'Nincs még alaklom beírva'} {this.props.events
? this.renderEvents()
: 'Nincs még alkalom beírva'}
</Table.Body> </Table.Body>
</Table> </Table>
</div>
<br />
<AddEventForm /> <AddEventForm />
</Container> </Container>
); );
...@@ -62,4 +76,6 @@ class Events extends Component { ...@@ -62,4 +76,6 @@ class Events extends Component {
const mapStateToProps = ({ events: { events }, user }) => ({ events, user }); const mapStateToProps = ({ events: { events }, user }) => ({ events, user });
export default connect(mapStateToProps, { getStaffEvents, deleteEvent })(Events); export default connect(mapStateToProps, { getStaffEvents, deleteEvent })(
Events
);
import React, { Component } from 'react';
import { Container, Header, Segment, Divider } from 'semantic-ui-react';
import './Groups.css'; import './Groups.css';
export default class Groups extends Component { import { Container, Header, Segment } from 'semantic-ui-react';
import React, { Component } from 'react';
import GroupCard from '../extra/GroupCard';
import { connect } from 'react-redux';
import { getGroups } from '../../actions/groups';
class Groups extends Component {
UNSAFE_componentWillMount() {
this.props.getGroups();
}
render() { render() {
return ( return (
<div> <div>
<Segment inverted textAlign='center' vertical> <Segment inverted textAlign="center" vertical>
<Container> <Container>
<Header <Header
as='h1' as="h1"
content='Köreink' content="Köreink"
inverted inverted
style={{ style={{
fontSize: '3em', fontSize: '3em',
...@@ -22,70 +31,26 @@ export default class Groups extends Component { ...@@ -22,70 +31,26 @@ export default class Groups extends Component {
</Container> </Container>
</Segment> </Segment>
<Segment style={{ padding: '8em 0em' }} vertical> <Segment style={{ padding: '1em 0em 5em' }} vertical>
<Container text> <Container text>
<Header as='h3' style={{ fontSize: '2em' }}>DevTeam</Header> {this.props.groups
<p className='paragraph'> // eslint-disable-next-line arrow-body-style
A DevTeam a KSZK fejlesztő köre. Az informatika számos területével foglalkoznak, többek között például alkalmazás- és mobilszoftver fejlesztéssel, weblapkészítéssel. Ezen felül találkozhatsz mikrokontrollerek programozásával, legyen az akár Raspberry Pi vagy Arduino. Saját ötleteid megvalósításában is szívesen nyújtanak segítő kezet, illetve egyes gyűléseiken gyorstalpalókat tartanak, hogy az érdeklődők mielőbb be tudjanak csatlakozni a munkába. .map((item) => {
</p> return (
<p className='paragraph'> <GroupCard
Jelenlegi projektjeik közé tartozik egy Schönherz szintű kölcsönzési rendszer kialakítása, egy gyakorlóoldal készítése, melyen egyetemi tárgyak ZH-ira, vizsgáira lehet készülni, a tanuló helyiségek foglaltságát vizsgáló rendszer bevezetése, de szívesen viszik érdeklődő, lelkes tagjaik új projektötleteit is. key={item.id}
</p> label={item.name}
<p className='paragraph'> value={item.description}
A kör szeretettel vár mindenkit, legyen akár profi fejlesztő, vagy olyan, aki csak most ismerkedik a fejlesztés szépségeivel náluk mindenki talál a képességeinek megfelelő elfoglaltságot. />
</p> );
})}
<Divider as='h4' className='header' style={{ margin: '3em 0em' }} />
<Header as='h3' style={{ fontSize: '2em' }}>Hallgatói Tudásbázis</Header>
<p className='paragraph'>
A HaT (Hallgatói Tudásbázis) a VIK Wiki adminisztrációjáért, illetve üzemeltetéséért, fejlesztéséért felelős kör. Nekik köszönhető a Wiki rendezett állapota. Odafigyelnek , hogy kövessék a szerkesztői szokásokat, és rendszeresen felmérik, milyen újításra van kereslet. Azoknak a jelentkezését várják, akik nem riadnak vissza egy (rosszabb napjain) napi ötezer oldalmegtekintést produkáló rendszer ápolgatásától.
</p>
<Divider as='h4' className='header' style={{ margin: '3em 0em' }} />
<Header as='h3' style={{ fontSize: '2em' }}>NETeam</Header>
<p className='paragraph'>
A NETeam foglalkozik a kollégiumi hálózati infrastruktúra üzemeltetésével és fejlesztésével. Biztosítják a hálózat folyamatos működését, követik az új hálózati technológiák alakulását, igyekeznek gyakorlatban is kipróbálni őket, alkalomadtán pedig cégekkel kapcsolatot tartva vesznek részt új megoldások tesztelésében is.
</p>
<p className='paragraph'>
A Schönherzben a 90-es évek óta üzemelteti a Házat lefedő hálózatot a KSZK, mely azóta többször teljes cserén esett át. A KSZK reszorttá válása előtt a NETeam egy erre szakosodott csoportja volt, 2014 óta pedig önálló körként folytatja tevékenységét. A kör tagjai hagyományosan a NetAdmin és segéd-NetAdminok, akik a kollégiumi hálózat fenntartásáért felelősek, illetve a Netikai Bizottság elnöke és tagjai, akik a hálózathasználati szabályzatot tartatják be, illetve a hálózathasználati szabályzattal szemben elkövetett kihágásokat felügyelik és szankcionálják.
</p>
<p className='paragraph'>
Az ide kerülőknek lehetőségük van bekapcsolódni az ISO/OSI modell majdnem minden rétegében működő szolgáltatások üzemeltetésébe és fejlesztésébe, amit szolgáltatástól függően akár az egész karon használnak. Ilyen például a Cisco eszközök konfigurációja, WiFi hálózat, VoIP, VPN, DNS/Dinamikus DNS üzemeltetése, fejlesztése, felhasználói adatbázis kezelése, forgalommonitorozás. Ezek széleskörű rálátást engednek egy komplex hálózatra és a használt technológiák működésére. A használt hálózattól függetlenül kialakított router laborban pedig lehetőség van szinte bármilyen, az iparban használt switching/routing megoldás próba szintű felépítésére.
</p>
<p className='paragraph'>
Jelenleg várható legnagyobb projektjük a Házat teljes egészében lefedő WiFi hálózat kiépítése lesz, de a következő évben kilátásban van a Software Defined Networking megoldásokkal való ismerkedés, illetve a router labor továbbfejlesztése is.
</p>
<p className='paragraph'>
Aki csatlakozik a körbe és hálózatot vagy szolgáltatásokat üzemeltet, fejleszt, felelősséggel fog tartozni az általa irányított rendszerért, ezzel pedig fontos része lesz a Schönherzes közéletnek. Ez a felelősség, az ezzel járó nem kizárólag szakmai tapasztalat és technikai tudás pedig egy későbbi önéletrajzban is olyan tényező tud lenni, amivel kevés frissen végzett hálózati szakember rendelkezik.
</p>
<Divider as='h4' className='header' style={{ margin: '3em 0em' }} />
<Header as='h3' style={{ fontSize: '2em' }}>SecurITeam</Header>
<p className='paragraph'>
A SecurITeam-ben te is megismerkedhetsz az IT biztonságban használt technikákkal: weboldalakat, szervereket, zárakat és még hardvereket is törnek.
</p>
<p className='paragraph'>
Csináltál egy weboldalt vagy appot, de nem vagy meggyőződve arról, hogy biztonságos? Náluk mind a támadó, mind a védekező oldal technikáiról tanulhatsz, és ki is próbálhatod a tudásodat élőben. Az SQL injection, programok visszafejtése és exploitálása, webes alkalmazások biztonságának vizsgálata, ismert támadások (pl. Shellshock, Meltdown) kipróbálása, gyenge titkosítások megkerülése, valamint a privacy védelme mind olyan dolgok, amivel ez a kör foglalkozik. A szoftveres témák mellett a fizikai biztonságra is hangsúlyt fektetnek, legyen az Bluetooth sniffing, rádiós lehallgatás, RFID klónozás vagy lockpicking, náluk megtalálod ez ehhez szükséges eszközöket és szaktudást!
</p>
<p className='paragraph'>
A kör előadásokat, tanfolyamokat és workshopokattart, illetve a Schönherzes infrastruktúra biztonságát rendszeresen pentestekkel ellenőrzik.
</p>
<p className='paragraph'>
A körben lehetőséged adódik arra, hogy a korábban felsorolt tevékenységek bármelyikével foglalkozz, tanulj, versenyezz IT biztonsági versenyeken (CTF), illetve a Wargame fejlesztésébe is be tudsz csatlakozni.
</p>
<Divider as='h4' className='header' style={{ margin: '3em 0em' }} />
<Header as='h3' style={{ fontSize: '2em' }}>Sysadmin</Header>
<p className='paragraph'>
A Sysadmin a Schönherz szerverüzemeltetésével foglalkozó öntevékeny köre. A kollégiumban működő IT szolgáltatásokat nyújtó infrastruktúrát ők felügyelik, fejlesztik. Az általuk használt szoftverek között megtalálhatóak Linux, BSD, Solaris valamint Windows alapú megoldások is. Az infrastruktúra VPN szerverének segítségével akár otthonról is hozzáférhetsz azokhoz az erőforrásokhoz, amelyek csak az egyetemi hálózatból elérhetők. 2014 végén indult a legfiatalabb, RemoteApp névre hallgató szolgáltatásuk, mellyel úgy értheted el az oktatásban is használt (és egyéb) szoftvereket, hogy nem szükséges azokat telepítened a gépedre. A felhasználói igények alapján folyamatosan bővítik szolgáltatásaik palettáját.
</p>
<p className='paragraph'>
Minden félévben indítanak új projekteket. Jelenleg és a következő félévekben egy Docker (Kubernetes) alapú container cluster fejlesztésén és üzembe helyezésén, illetve konfiguráció menedzsment bevezetésén dolgoznak. Az új dolgok mellett persze komoly hangsúlyt fektetnek a jelenleg üzemelő szerverek folyamatos karbantartására is. Náluk megtanulhatod, hogyan kell egy több fizikai hosztból álló, körülbelül 150 virtuális szervert kiszolgáló virtualizációs clustert üzemeltetni, de akár a webhosting területén is fejlesztheted tudásod a Ház legnagyobb (~200 weboldat kiszolgáló) szerverének felügyelete során. Ha szeretnél a felszín mögé látni, és releváns szakmai tapasztalatot szerezni a területen, akkor köztük a helyed. Az előismeret nem követelmény, a lelkesedés igen.
</p>
</Container> </Container>
</Segment> </Segment>
</div> </div>
); );
} }
} }
const mapStateToProps = ({ groups }) => ({ groups });
export default connect(mapStateToProps, { getGroups })(Groups);
...@@ -5,8 +5,33 @@ ...@@ -5,8 +5,33 @@
.car-text-kszk { .car-text-kszk {
position: absolute; position: absolute;
width: 100%; width: 100%;
top: 0px; top: 1vw;
text-shadow: black 0px 0px 10px, black 0px 0px 6px;
-webkit-text-fill-color: white; -webkit-text-fill-color: white;
-webkit-text-stroke-color: black; }
-webkit-text-stroke-width: 0.75px;
.quote {
position: relative;
margin-bottom: 0.5rem;
}
.quote:before {
content: '“';
position: absolute;
left: -0.45em;
}
.quote::after {
content: '”';
margin-right: -1rem;
}
.quote--container {
margin: 2rem auto 0;
padding-bottom: 0.7rem;
}
.quote--author {
text-align: right;
font-weight: 300;
} }
import React, { Component } from 'react'; import "./Home.css";
import { import {
Button, Button,
Container, Container,
Divider,
Header, Header,
Icon, Icon,
Segment,
Image, Image,
Divider, Responsive,
} from 'semantic-ui-react'; Segment,
import { connect } from 'react-redux'; } from "semantic-ui-react";
import Slider from 'react-slick'; /* eslint-disable react/jsx-props-no-spreading */
import { Link } from 'react-router-dom'; import React, { Component } from "react";
import './Home.css';
import KSZKbiglogo from '../images/kszk_big_logo.png'; import KSZKbiglogo from "../images/kszk_with_shadow.png";
import { Link } from "react-router-dom";
import Slider from "react-slick";
import { connect } from "react-redux";
import { getImages } from "../../actions/home";
const settings = { const settings = {
dots: false, dots: false,
...@@ -25,191 +30,393 @@ const settings = { ...@@ -25,191 +30,393 @@ const settings = {
slidesToScroll: 1, slidesToScroll: 1,
centerMode: true, centerMode: true,
lazyLoad: true, lazyLoad: true,
initialSlide: Math.floor((Math.random() * 32) + 1), initialSlide: Math.floor(Math.random() * 32 + 1),
}; };
const range = (count) => { class Home extends Component {
const newArray = []; UNSAFE_componentWillMount() {
for (let i = 1; i < count; i += 1) { this.props.getImages();
newArray.push(i);
} }
return newArray; renderSlider(view, imageWidth) {
}; if (view === 0) {
class Home extends Component {
render() {
return ( return (
<div> <div>
<div className='car-image-kszk'> {!!this.props.images}
<Slider {...settings}> <Slider {...settings}>
{ {this.props.images &&
range(32).map(image => ( this.props.images.map((image) => (
<div key={image}> <div key={image}>
<img src={`images/${image}.jpg`} width='100%' alt='' /> <img src={image.image} width={imageWidth} alt="" />
</div> </div>
)) ))}
}
</Slider> </Slider>
<div className='car-text-kszk'> <div className="car-text-kszk">
<Segment textAlign='center' vertical> <Segment textAlign="center" vertical>
<Header <Header
as='h1' as="h1"
content='Üdvözlünk a' content="Üdvözlünk a"
inverted inverted
style={{ style={{
fontSize: '3vw', fontSize: "3vw",
fontWeight: 'normal', fontWeight: "normal",
marginBottom: 0, marginBottom: 0,
marginTop: '0.5vw',
}} }}
/> />
<Header <Header
as='h1' as="h1"
content='Kollégiumi Számítástechnikai Kör' content="Kollégiumi Számítástechnikai Kör"
inverted inverted
style={{ style={{
fontSize: '4vw', fontSize: "3.5vw",
fontWeight: 'bold', fontWeight: "bold",
marginBottom: '0.5vw', marginBottom: "0.5vw",
marginTop: '0.5vw', marginTop: "0.5vw",
}} }}
/> />
<Header <Header
as='h1' as="h1"
content='újoncképzésének weboldalán!' content="újoncképzésének weboldalán!"
inverted inverted
style={{ style={{
fontSize: '3vw', fontSize: "3vw",
fontWeight: 'normal', fontWeight: "normal",
marginBottom: 0, marginBottom: 0,
marginTop: '0.5vw', marginTop: "0.5vw",
}} }}
/> />
<Image <Image
verticalAlign='middle' verticalAlign="middle"
src={KSZKbiglogo} src={KSZKbiglogo}
style={{ marginTop: '4vw', width: '15%' }} style={{ marginTop: "1vw", width: "17%" }}
/> />
<Header <Header
as='h1' as="h1"
content='Szeretettel várunk a KSZKépzésre!' content="Szeretettel várunk a KSZKépzésre!"
inverted inverted
style={{ style={{
fontSize: '3vw', fontSize: "3vw",
fontWeight: 'normal', fontWeight: "normal",
marginBottom: 0, marginBottom: 0,
marginTop: '1vw', marginTop: "1vw",
}} }}
/> />
<Container> <Container>
{ {this.props.user.id ? (
this.props.user.id ?
<Button <Button
as={Link} as={Link}
to='/profile' to="/profile"
primary primary
size='huge' size="huge"
style={{ style={{
fontSize: '2vw', fontSize: "2vw",
marginTop: '1vw', marginTop: "1vw",
marginBottom: '1vw', marginBottom: "1vw",
fontWeight: "bold",
letterSpacing: "0.13vw",
}} }}
> >
Jelentkezés Jelentkezés
<Icon name='right arrow' /> <Icon name="right arrow" />
</Button> </Button>
: ) : (
<Button <Button
href='/api/v1/login/authsch/' href="/oidc/authenticate/"
primary primary
size='huge' size="huge"
style={{ style={{
fontSize: '2vw', fontSize: "2vw",
marginTop: '1vw', marginTop: "1vw",
marginBottom: '1vw', marginBottom: "1vw",
fontWeight: "bold",
letterSpacing: "0.13vw",
}} }}
> >
Bejelentkezés Bejelentkezés
<Icon name='right arrow' /> <Icon name="right arrow" />
</Button> </Button>
)}
</Container>
</Segment>
</div>
</div>
);
} }
if (view === 1) {
return (
<div>
<Slider {...settings}>
{this.props.images.map((image) => (
<div key={image}>
<img src={image.image} width={imageWidth} alt="" />
</div>
))}
</Slider>
<div className="car-text-kszk">
<Segment textAlign="center" vertical>
<Header
as="h1"
content="Üdvözlünk a"
inverted
style={{
fontSize: "5vw",
fontWeight: "bold",
marginBottom: 0,
}}
/>
<Header
as="h1"
content="Kollégiumi Számítástechnikai Kör"
inverted
style={{
fontSize: "6vw",
fontWeight: "bold",
marginBottom: "0.5vw",
marginTop: "0.5vw",
}}
/>
<Header
as="h1"
content="újoncképzésének weboldalán!"
inverted
style={{
fontSize: "5vw",
fontWeight: "bold",
marginBottom: 0,
marginTop: "0.5vw",
}}
/>
<Image
className="kszklogo"
verticalAlign="middle"
src={KSZKbiglogo}
style={{ marginTop: "1vw", width: "20%" }}
/>
<Header
as="h1"
content="Szeretettel várunk a KSZKépzésre!"
inverted
style={{
fontSize: "5vw",
fontWeight: "bold",
marginBottom: 0,
marginTop: "1vw",
}}
/>
<Container>
{this.props.user.id ? (
<Button
as={Link}
to="/profile"
primary
size="massive"
style={{
fontSize: "4vw",
marginTop: "1.5vw",
marginBottom: "1vw",
fontWeight: "bold",
letterSpacing: "0.15vw",
}}
>
Jelentkezés
<Icon name="right arrow" />
</Button>
) : (
<Button
href="/oidc/authenticate/"
primary
size="massive"
style={{
fontSize: "4vw",
marginTop: "1vw",
marginBottom: "1vw",
fontWeight: "bold",
letterSpacing: "0.15vw",
}}
>
Bejelentkezés
<Icon name="right arrow" />
</Button>
)}
</Container> </Container>
</Segment> </Segment>
</div> </div>
</div> </div>
<Segment style={{ padding: '8em 0em', fontFamily: 'Arial' }} vertical> );
}
}
// eslint-disable-next-line class-methods-use-this
renderText() {
const kszk_age = new Date().getFullYear() - 1976;
return (
<Segment style={{ padding: "1em 0em", fontFamily: "Arial" }} vertical>
<Container text> <Container text>
<Header as='h3' style={{ fontSize: '2em', fontFamily: 'Arial' }}> <Segment inverted color="green" tertiary>
<Header as="h3" style={{ fontSize: "2em", fontFamily: "Arial" }}>
Bemutatkozó videók
</Header>
<p style={{ fontSize: "1.33em", fontFamily: "Arial" }}>
A gólyakörtére készített videóinkat megnézhetitek a{" "}
<a
href="https://www.youtube.com/@kollegiumiszamitastechnika470/videos"
target="_blank"
rel="noopener noreferrer"
style={{ color: "white", textDecoration: "underline" }}
>
YouTube csatornánkon
</a>
!
</p>
</Segment>
<Header as="h3" style={{ fontSize: "2em", fontFamily: "Arial" }}>
Kik is vagyunk mi? Kik is vagyunk mi?
</Header> </Header>
<p style={{ fontSize: '1.33em', fontFamily: 'Arial' }}> <p style={{ fontSize: "1.33em", fontFamily: "Arial" }}>
A Kollgiumi Számítástechnikai Kr az Egyetem legrgebben működő A Kollégiumi Számítástechnikai Kör az Egyetem legrégebben működő és
és legnagyobb aktv, informatikval foglalkoz ntevkeny legnagyobb aktív, informatikával foglalkozó öntevékeny
csoportosulsa, idén ünnepeljük 42. szletsnapunkat. A patinás csoportosulása, idén ünnepeljük {kszk_age}. születésnapunkat. A
név mögött vidm hangulat, alkot kedv csapat rejlik, mely a Kar patinás név mögött vidám hangulatú, alkotó kedvű csapat rejlik, mely
jó szakmai kpességű, számítástechnika irnt kiemelten érdeklődő a Kar szakmai képességű, számítástechnika iránt kiemelten
tagjaibl verbuválódott, s bővül vente j tehetsgekkel, lelkes érdeklődő tagjaiból verbuválódott, és bővül évente új tehetségekkel,
informatikusokkal, villamosmérnökökkel. lelkes informatikusokkal, villamosmérnökökkel.
</p> </p>
<Button as={Link} size='large' to='/groups'> <Button as={Link} size="large" to="/groups">
Ismerd meg a köreinket! <Icon name='right arrow' /> Ismerd meg a köreinket! <Icon name="right arrow" />
</Button> </Button>
<Divider as='h4' className='header' style={{ margin: '3em 0em' }} /> <Divider as="h4" className="header" style={{ margin: "3em 0em" }} />
<Header as='h3' style={{ fontSize: '2em', fontFamily: 'Arial' }}> <Header as="h3" style={{ fontSize: "2em", fontFamily: "Arial" }}>
Lehetőségek Lehetőségek
</Header> </Header>
<p style={{ fontSize: '1.33em', fontFamily: 'Arial' }}> <p style={{ fontSize: "1.33em", fontFamily: "Arial" }}>
A KSZK a lehetőségek tárháza, a hely ahol Te leend mérnök A KSZK a lehetőségek tárháza, a hely ahol Te leendő mérnök
minden terleten kipróbálhatod, tovbbkpezheted magad. Nlunk minden területen kipróbálhatod, továbbképezheted magad. Nálunk
kibontakoztathatod kreativitsod, tapasztalatot, mérnöki kibontakoztathatod kreativitásod, tapasztalatot, mérnöki szemléletet
szemléletet szerezhetsz, mikzben az n. soft skill-jeidet is szerezhetsz, miközben az ún. soft skill-jeidet is fejlesztheted. Ha
fejlesztheted. Ha számodra a szakma hivats, ha szeretsz új számodra a szakma hivatás, ha szeretsz új dolgokat alkotni vagy csak
dolgokat alkotni vagy csak jó társasgra vgysz, a legjobb helyre rsaságra vágysz, a legjobb helyre kerültél. A reszort körei a
kerültél. A reszort körei a szakma egy-egy meghatroz terletével szakma egy-egy meghatározó területével foglalkoznak a fejlesztés és
foglalkoznak a fejlesztés és zemeltets terletn. üzemeltetés területén.
</p> </p>
<Divider as='h4' className='header' style={{ margin: '3em 0em' }} /> <Divider as="h4" className="header" style={{ margin: "3em 0em" }} />
<Header as='h3' style={{ fontSize: '2em', fontFamily: 'Arial' }}> <Header as="h3" style={{ fontSize: "2em", fontFamily: "Arial" }}>
Képzésünk Miért KSZK-snak lenni?
</Header> </Header>
<p style={{ fontSize: '1.33em', fontFamily: 'Arial' }}> <div
Kilenc alkalmas képzésünk végén Te is igazi KSZK-ssá válhatsz, class="quote--container"
hiszen rengeteg szakmai tudást igyekszünk átadni nektek. A style={{ fontSize: "1.5em", fontFamily: "Arial" }}
képzésalkalmak rendkívül jó hangulatban telnek, és a szociális >
irányultságú foglalkozások alatt egy nagyon jó csapat kovácsolódik <p class="quote">
az érdeklődőkből. Az első képzés időpontja február 19. hétfő Szerintem KSZK-snak lenni, mert rengeteget tanulok belőle.
20:00, ettől kezdve pedig minden héten találkozunk ugyanabban az Gyakorlok, hallok újdonságokat, kipróbálhatom magam mindenféle
időpontban. A képzés ideje alatt április 6-8 között rendezünk szerepben, és közben még barátokat is szerzek. Ezek a barátságok,
tábort. Az alkalmakon és a táborban kötelező a részvétel. tapasztalatok egyébként később is nagyon jól jönnek, például a
CV-mben egész erős fegyvertény, hogy ennyi mindent csináltam.
Tényleg rengeteget kaptam a reszorttól, szakmailag és emberileg
is. Ja, és szeretem, hogy a KSZK ilyen szabad, és abba kóstolok
bele, amibe akarok.
</p>
<p class="quote--author">&ndash; Feri</p>
</div>
<div
class="quote--container"
style={{ fontSize: "1.5em", fontFamily: "Arial" }}
>
<p class="quote">
A nulláról kezdtem a képzést és az egyetemi tanulmányaimat is,
semmilyen infós tudásom nem volt, de rengeteget fejlődtem a
KSZK-nak köszönhetően. Ezenkívül nem csak szakmai tudást
szereztem, hanem egy fantasztikus közösség részévé is váltam.
</p>
<p class="quote--author">&ndash; Patrik</p>
</div>
<div
class="quote--container"
style={{ fontSize: "1.5em", fontFamily: "Arial" }}
>
<p class="quote">
Amikor idejöttem egyetemre nem tudtam, hogy mennyire fogom
megtalálni a helyem. Aztán, elkezdtem megismerkedni a kari
közösséggel és barátokat szereztem, akik jelentős részét a
KSZK-ban ismertem meg, vagy velem csatlakozott ide. Együtt
foglalkozgatunk projektekkel, a Ház rendszereinek üzemeltetésével
és egyéb nagyon érdekes ügyes-bajos dolgokkal. Úgy érzem, hogy a
KSZK-ban igazán megtaláltam a helyem, mind emberileg, mind
szakmailag.
</p> </p>
<Divider as='h4' className='header' style={{ margin: '3em 0em' }} /> <p class="quote--author">&ndash; Mike</p>
<Segment inverted color='red' tertiary> </div>
<Header as='h3' style={{ fontSize: '2em', fontFamily: 'Arial' }}> <div
class="quote--container"
style={{ fontSize: "1.5em", fontFamily: "Arial" }}
>
<p class="quote">
Számtalan dologgal foglalkozunk, és tényleg azt csinálhatom, ami
csak érdekel. Emellett a KSZK-t a szívügyemnek tekintem, szerintem
a legjobb lehetőség a szakmai fejlődésen kívül életre szóló
barátságok alakítására.
</p>
<p class="quote--author">&ndash; Blint</p>
</div>
<Divider as="h4" className="header" style={{ margin: "3em 0em" }} />
<Header as="h3" style={{ fontSize: "2em", fontFamily: "Arial" }}>
Képzésünk
</Header>
<p style={{ fontSize: "1.33em", fontFamily: "Arial" }}>
Képzésünk végén Te is igazi KSZK-ssá válhatsz, hiszen rengeteg
szakmai tudást igyekszünk átadni nektek. A képzésalkalmak rendkívül
hangulatban telnek, és a szociális irányultságú foglalkozások
alatt egy nagyon csapat kovácsolódik az érdeklődőkből. Az első
képzés időpontja február 20. csütörtök 18:00, ettől kezdve pedig
minden héten egy közösségi és számos szakmai alkalom során
találkozunk. A képzésalkalmak után április 11-től 13-ig rendezünk
tábort. Az közösségi alkalmakon és a táboron kötelező a részvétel.
</p>
<Divider as="h4" className="header" style={{ margin: "3em 0em" }} />
<Segment inverted color="red" tertiary>
<Header as="h3" style={{ fontSize: "2em", fontFamily: "Arial" }}>
Korlátos férőhely Korlátos férőhely
</Header> </Header>
<p style={{ fontSize: '1.33em', fontFamily: 'Arial' }}> <p style={{ fontSize: "1.33em", fontFamily: "Arial" }}>
Általánosságban elmondható, hogy a KSZK tagjai rengeteg dologgal foglalkoznak Általánosságban elmondható, hogy a KSZK tagjai rengeteg dologgal
a hétköznapjaik során, hogy minden informatikai rendszer úgy működjön foglalkoznak a hétköznapjaik során, hogy minden informatikai
a kollégiumban, ahogy kell. Így van ez velünk képzőkkel is, emiatt rendszer úgy működjön a kollégiumban, ahogy kell. Így van ez
hetente csak egy képzésalkalmat tudunk tartani. Mivel az oktatóterem velünk képzőkkel is, emiatt a férőhelyek korlátosak.
férőhelyében korlátozott, ezért a képzésre maximum 35 embert tudunk befogadni.
</p> </p>
<p style={{ fontSize: '1.33em', fontFamily: 'Arial' }}> <p style={{ fontSize: "1.33em", fontFamily: "Arial" }}>
Sajnos előfordulhat olyan eset, hogy valaki már nem fér be a képzésre, Sajnos előfordulhat olyan eset, hogy valaki már nem fér be a
ezért kérünk titeket, hogy ennek tudatában jelentkezzetek majd. képzésre, ezért kérünk titeket, hogy ennek tudatában
Ilyen esetben reméljük ez nem szegi kedveteket és jövőre újra próbálkoztok majd! jelentkezzetek majd. Ilyen esetben reméljük ez nem szegi
kedveteket és jövőre újra próbálkoztok majd!
</p> </p>
</Segment> </Segment>
</Container> </Container>
</Segment> </Segment>
);
}
render() {
return (
<div>
<Responsive minWidth={600}>
<div className="car-image-kszk">
<div />
{this.renderSlider(0, "120%")}
</div>
{this.renderText()}
</Responsive>
<Responsive maxWidth={600}>
<div className="car-image-kszk">{this.renderSlider(1, "200%")}</div>
{this.renderText()}
</Responsive>
</div> </div>
); );
} }
} }
const mapStateToProps = ({ user }) => ({ const mapStateToProps = ({ user, images }) => ({
user, user,
images,
}); });
export default connect(mapStateToProps, {})(Home); export default connect(mapStateToProps, { getImages })(Home);
import React, { Component } from 'react';
import { import {
Button,
Container, Container,
Header, Header,
Segment,
Table,
Icon, Icon,
Label,
Message, Message,
Button, Segment,
Table,
} from 'semantic-ui-react'; } from 'semantic-ui-react';
import { connect } from 'react-redux'; /* eslint-disable no-nested-ternary */
import moment from 'moment'; import React, { Component } from 'react';
import { import {
getTasks,
getSolutions,
addTask, addTask,
setSelectedTask,
deleteTask, deleteTask,
addDocument,
getProfiles,
getDocuments, getDocuments,
getProfiles,
getSolutions,
getTasks,
setSelectedTask,
} from '../../actions/homework'; } from '../../actions/homework';
import AddTaskForm from '../forms/AddTaskForm';
import AddSolutionForm from '../forms/AddSolutionForm'; import AddSolutionForm from '../forms/AddSolutionForm';
import SolutionDetailsForm from '../forms/SolutionDetailsForm'; import AddTaskForm from '../forms/AddTaskForm';
import EditTaskForm from '../forms/EditTaskForm';
import ConfirmModal from '../forms/ConfirmModal'; import ConfirmModal from '../forms/ConfirmModal';
import EditTaskForm from '../forms/EditTaskForm';
import InfoModal from '../forms/InfoModal';
import SolutionDetailsForm from '../forms/SolutionDetailsForm';
import { connect } from 'react-redux';
import moment from 'moment';
// Display type for the Table Semantic UI component
// {icon} {text} - Displayed for the student for each Task
// {rowstyle} - Table row style (red text, yellow bg, ...)
const displayTypes = { const displayTypes = {
can_submit: { can_submit: {
text: 'Beadható', text: 'Beadható',
...@@ -54,7 +60,7 @@ const displayTypes = { ...@@ -54,7 +60,7 @@ const displayTypes = {
}, },
}; };
export const emptyMessage = (header, text, marginBottom, warning) => ( export const customMessage = (header, text, marginBottom, warning) => (
<Message <Message
style={{ marginBottom }} style={{ marginBottom }}
icon={warning ? 'warning' : 'info'} icon={warning ? 'warning' : 'info'}
...@@ -69,17 +75,17 @@ class Homework extends Component { ...@@ -69,17 +75,17 @@ class Homework extends Component {
componentDidMount() { componentDidMount() {
this.props.getTasks(); this.props.getTasks();
this.props.getProfiles(); this.props.getProfiles();
this.props.getSolutions(this.props.user.id); this.props.getSolutions();
this.props.getDocuments(); this.props.getDocuments();
} }
// Returns a table style for the given task
getTaskDisplayStyle(task) { getTaskDisplayStyle(task) {
const taskSolutions = this.props.homeworks.solutions.filter(solution => const taskSolution = this.props.homeworks.solutions.filter(
solution.task === task.id) (solution) => solution.task === task.id
.filter(solution => );
solution.created_by === this.props.user.id);
if (taskSolutions.length === 0) { if (taskSolution.length === 0) {
if (moment().isBefore(task.deadline)) { if (moment().isBefore(task.deadline)) {
return 'can_submit'; return 'can_submit';
} }
...@@ -87,22 +93,31 @@ class Homework extends Component { ...@@ -87,22 +93,31 @@ class Homework extends Component {
return 'no_submit'; return 'no_submit';
} }
if (taskSolutions[taskSolutions.length - 1].corrected === false) { if (taskSolution[0].corrected === false) {
return 'wait_correction'; return 'wait_correction';
} }
if (taskSolutions[taskSolutions.length - 1].accepted === false) { if (taskSolution[0].accepted === false) {
return 'no_accept'; return 'no_accept';
} }
return 'accepted'; return 'accepted';
} }
// Returns table rows for the tasks
// given parameters separates the active/inactive tasks and normal/staff users
renderTaskList(active, staff) { renderTaskList(active, staff) {
const { user, homeworks } = this.props;
const profileSolutions = homeworks.solutions.filter(
(solution) => solution.created_by === user.id
);
// Normal user
if (!staff) { if (!staff) {
return this.props.homeworks.tasks return homeworks.tasks
.filter(task => moment().isBefore(task.deadline) === active) .filter((task) => moment().isBefore(task.deadline) === active)
.map(task => ( .map((task) => (
// Style
<Table.Row <Table.Row
key={task.id} key={task.id}
warning={ warning={
...@@ -115,6 +130,7 @@ class Homework extends Component { ...@@ -115,6 +130,7 @@ class Homework extends Component {
displayTypes[this.getTaskDisplayStyle(task)].rowstyle.negative displayTypes[this.getTaskDisplayStyle(task)].rowstyle.negative
} }
> >
{/* Form component */}
<Table.Cell> <Table.Cell>
<AddSolutionForm <AddSolutionForm
taskid={task.id} taskid={task.id}
...@@ -124,30 +140,75 @@ class Homework extends Component { ...@@ -124,30 +140,75 @@ class Homework extends Component {
disabled={moment().isAfter(task.deadline)} disabled={moment().isAfter(task.deadline)}
/> />
</Table.Cell> </Table.Cell>
{/* Deadline Date */}
<Table.Cell> <Table.Cell>
{moment(task.deadline).format('YYYY. MM. DD. HH:mm')} {moment(task.deadline).format('YYYY. MM. DD. HH:mm')}
</Table.Cell> </Table.Cell>
<Table.Cell>
<Label
color={
displayTypes[this.getTaskDisplayStyle(task)].rowstyle.positive
? 'green'
: moment().isAfter(task.deadline)
? 'red'
: displayTypes[this.getTaskDisplayStyle(task)].rowstyle
.negative
? 'red'
: null
}
>
{task.bits} bit
</Label>
</Table.Cell>
{/* Status (Javításra vár, ...) */}
<Table.Cell> <Table.Cell>
<Icon name={displayTypes[this.getTaskDisplayStyle(task)].icon} />{' '} <Icon name={displayTypes[this.getTaskDisplayStyle(task)].icon} />{' '}
{displayTypes[this.getTaskDisplayStyle(task)].text} {displayTypes[this.getTaskDisplayStyle(task)].text}
{profileSolutions.filter(
(solution) => solution.task === task.id
) &&
profileSolutions
.filter((solution) => solution.task === task.id)
.slice(-1)[0] &&
profileSolutions
.filter((solution) => solution.task === task.id)
.slice(-1)[0].note ? (
<div>
<InfoModal
button={
<button type="button" id="tasknote">
(Megjegyzés <Icon name="external" />)
</button>
}
title="Megjegyzés a feladathoz"
content={
profileSolutions
.filter((solution) => solution.task === task.id)
.slice(-1)[0].note
}
onAccept={() => {}}
/>
</div>
) : (
''
)}
</Table.Cell> </Table.Cell>
</Table.Row> </Table.Row>
)); ));
} }
// Staff
const deleteButton = ( const deleteButton = (
<Button <Button inverted style={{ marginRight: '2em' }} color="red">
inverted <Icon name="x" /> Törlés
style={{ marginRight: '2em' }}
color='red'
>
<Icon name='x' /> Törlés
</Button> </Button>
); );
return this.props.homeworks.tasks return this.props.homeworks.tasks
.filter(task => moment().isBefore(task.deadline) === active) .filter((task) => moment().isBefore(task.deadline) === active)
.map(task => ( .map((task) => (
<Table.Row <Table.Row
key={task.id} key={task.id}
warning={ warning={
...@@ -160,6 +221,7 @@ class Homework extends Component { ...@@ -160,6 +221,7 @@ class Homework extends Component {
displayTypes[this.getTaskDisplayStyle(task)].rowstyle.negative displayTypes[this.getTaskDisplayStyle(task)].rowstyle.negative
} }
> >
{/* Form */}
<Table.Cell> <Table.Cell>
<SolutionDetailsForm <SolutionDetailsForm
taskid={task.id} taskid={task.id}
...@@ -167,14 +229,20 @@ class Homework extends Component { ...@@ -167,14 +229,20 @@ class Homework extends Component {
taskdesc={task.text} taskdesc={task.text}
/> />
</Table.Cell> </Table.Cell>
{/* Deadline Date */}
<Table.Cell> <Table.Cell>
{moment(task.deadline).format('YYYY. MM. DD. HH:mm')} {moment(task.deadline).format('YYYY. MM. DD. HH:mm')}
</Table.Cell> </Table.Cell>
{/* Bits */}
<Table.Cell>
<Label color={null}>{task.bits} bit</Label>
</Table.Cell>
{/* Admin buttons */}
<Table.Cell> <Table.Cell>
<EditTaskForm onClick={() => this.props.setSelectedTask(task)} /> <EditTaskForm onClick={() => this.props.setSelectedTask(task)} />
<ConfirmModal <ConfirmModal
button={deleteButton} button={deleteButton}
text='törlöd a kiválaszott feladatot a már beadott megoldásokkal együtt' text="törlöd a kiválaszott feladatot a már beadott megoldásokkal együtt"
onAccept={() => this.props.deleteTask(task)} onAccept={() => this.props.deleteTask(task)}
/> />
</Table.Cell> </Table.Cell>
...@@ -182,6 +250,7 @@ class Homework extends Component { ...@@ -182,6 +250,7 @@ class Homework extends Component {
)); ));
} }
// Active/Inactive tasks table
renderHomeworksTable(active, staff) { renderHomeworksTable(active, staff) {
let tableColor = 'green'; let tableColor = 'green';
let marginBottom = '0em'; let marginBottom = '0em';
...@@ -197,15 +266,16 @@ class Homework extends Component { ...@@ -197,15 +266,16 @@ class Homework extends Component {
<Table.Header> <Table.Header>
<Table.Row> <Table.Row>
<Table.HeaderCell> <Table.HeaderCell>
<Icon circular name='home' /> <Icon circular name="home" />
Feladat megnevezése / beadása Feladat megnevezése / beadása
</Table.HeaderCell> </Table.HeaderCell>
<Table.HeaderCell> <Table.HeaderCell>
<Icon circular name='calendar' /> <Icon circular name="calendar" />
Beadási határidő Beadási határidő
</Table.HeaderCell> </Table.HeaderCell>
<Table.HeaderCell width={2}></Table.HeaderCell>
<Table.HeaderCell> <Table.HeaderCell>
<Icon circular name='tasks' /> <Icon circular name="tasks" />
Állapot Állapot
</Table.HeaderCell> </Table.HeaderCell>
</Table.Row> </Table.Row>
...@@ -219,15 +289,16 @@ class Homework extends Component { ...@@ -219,15 +289,16 @@ class Homework extends Component {
<Table.Header> <Table.Header>
<Table.Row> <Table.Row>
<Table.HeaderCell> <Table.HeaderCell>
<Icon circular name='home' /> <Icon circular name="home" />
Feladat megnevezése / Beadások állapota Feladat megnevezése / Beadások állapota
</Table.HeaderCell> </Table.HeaderCell>
<Table.HeaderCell> <Table.HeaderCell>
<Icon circular name='calendar' /> <Icon circular name="calendar" />
Beadási határidő Beadási határidő
</Table.HeaderCell> </Table.HeaderCell>
<Table.HeaderCell width={2}></Table.HeaderCell>
<Table.HeaderCell> <Table.HeaderCell>
<Icon circular name='edit' /> <Icon circular name="edit" />
Módosítás / Törlés Módosítás / Törlés
</Table.HeaderCell> </Table.HeaderCell>
</Table.Row> </Table.Row>
...@@ -237,11 +308,12 @@ class Homework extends Component { ...@@ -237,11 +308,12 @@ class Homework extends Component {
); );
} }
// Headers and stuff around the Tables
renderHomeworks(active, staff) { renderHomeworks(active, staff) {
let empty = false; let noTask = false;
let emptyText = 'Jelenleg nincs egyetlen beadható feladat sem. '; let noTaskText = 'Jelenleg nincs egyetlen beadható feladat sem. ';
let marginBottom = '0em'; let marginBottom = '0em';
const emptyHeaderText = 'Nincs feladat.'; const noTaskHeaderText = 'Nincs feladat.';
let headerText = 'Aktív feladatok'; let headerText = 'Aktív feladatok';
if (staff) { if (staff) {
...@@ -249,19 +321,21 @@ class Homework extends Component { ...@@ -249,19 +321,21 @@ class Homework extends Component {
} }
if ( if (
this.props.homeworks.tasks.filter(task => this.props.homeworks.tasks.filter(
moment().isBefore(task.deadline) === active).length === 0 (task) => moment().isBefore(task.deadline) === active
).length === 0
) { ) {
empty = true; noTask = true;
} }
if (!active) { if (!active) {
if (staff) { if (staff) {
headerText = 'Lejárt határidejű feladatok kijavítása, módosítása vagy törlése'; headerText =
'Lejárt határidejű feladatok kijavítása, módosítása vagy törlése';
} else { } else {
headerText = 'Lejárt határidejű feladatok'; headerText = 'Lejárt határidejű feladatok';
} }
emptyText = 'Jelenleg nincs egyetlen lejárt határidejű feladat sem.'; noTaskText = 'Jelenleg nincs egyetlen lejárt határidejű feladat sem.';
marginBottom = '3em'; marginBottom = '3em';
} }
...@@ -269,7 +343,7 @@ class Homework extends Component { ...@@ -269,7 +343,7 @@ class Homework extends Component {
<Segment style={{ padding: '0 0 2em 0' }} vertical basic> <Segment style={{ padding: '0 0 2em 0' }} vertical basic>
<Container> <Container>
<Header <Header
as='h1' as="h1"
dividing dividing
content={headerText} content={headerText}
style={{ style={{
...@@ -279,31 +353,55 @@ class Homework extends Component { ...@@ -279,31 +353,55 @@ class Homework extends Component {
marginTop: '0.5em', marginTop: '0.5em',
}} }}
/> />
{empty {noTask ? (
? emptyMessage(emptyHeaderText, emptyText, marginBottom, false) customMessage(noTaskHeaderText, noTaskText, marginBottom, false)
: this.renderHomeworksTable(active, staff)} ) : (
<div>{this.renderHomeworksTable(active, staff)}</div>
)}
{!active && !staff ? (
<Header
as="h3"
content={
<div>
Jelenlegi bitjeid száma:
<Label color="green" size="large">
{this.props.user.bits} bit
</Label>
</div>
}
style={{
fontWeight: 'normal',
marginTop: '0.5em',
marginBottom: '1em',
}}
textAlign="right"
/>
) : null}
</Container> </Container>
</Segment> </Segment>
); );
} }
render() { render() {
if (this.props.user.role === 'Student') { const { user } = this.props;
if (user.role === 'Student') {
return ( return (
<div> <div style={{ paddingBottom: '2em' }}>
{this.renderHomeworks(true, false)} {this.renderHomeworks(true, false)}
{this.renderHomeworks(false, false)} {this.renderHomeworks(false, false)}
</div> </div>
); );
} else if (this.props.user.role === 'Staff') { }
if (user.role === 'Staff') {
return ( return (
<div> <div style={{ paddingBottom: '2em' }}>
<Segment style={{ padding: '0 0 2em 0' }} vertical basic> <Segment style={{ padding: '0 0 2em 0' }} vertical basic>
<Container> <Container>
<Header <Header
as='h1'
dividing dividing
content='Új házi feladat létrehozása' as="h1"
content="Új házi feladat létrehozása"
style={{ style={{
fontSize: '2em', fontSize: '2em',
fontWeight: 'normal', fontWeight: 'normal',
...@@ -321,22 +419,22 @@ class Homework extends Component { ...@@ -321,22 +419,22 @@ class Homework extends Component {
</div> </div>
); );
} }
return null; return null; // ¯\_(ツ)_/¯
} }
} }
const mapStateToProps = ({ selectedTask, homeworks, user }) => ({ selectedTask, homeworks, user }); const mapStateToProps = ({ selectedTask, homeworks, user }) => ({
selectedTask,
homeworks,
user,
});
export default connect( export default connect(mapStateToProps, {
mapStateToProps,
{
getTasks, getTasks,
setSelectedTask, setSelectedTask,
getSolutions, getSolutions,
getDocuments,
addTask, addTask,
deleteTask, deleteTask,
addDocument,
getProfiles, getProfiles,
getDocuments, })(Homework);
},
)(Homework);
import { Container, Table } from 'semantic-ui-react';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { getTrainees } from '../../actions/statistics';
class LeaderBoard extends Component {
UNSAFE_componentWillMount() {
this.props.getTrainees();
}
// Every event rendered
renderTraineeBits() {
return this.props.trainees
.sort(
(a, b) =>
(Number(b.homework_bits) + Number(b.events_visited) + Number(b.extra_bits)) -
(Number(a.homework_bits) + Number(a.events_visited) + Number(a.extra_bits))
)
.map((trainee) =>
trainee.role === 'Student' ? (
<Table.Row key={trainee.nick}>
<Table.Cell textAlign="center">{trainee.full_name}</Table.Cell>
<Table.Cell textAlign="center">{trainee.events_visited}</Table.Cell>
<Table.Cell textAlign="center">
{Number(trainee.homework_bits) + Number(trainee.extra_bits)}
</Table.Cell>
<Table.Cell textAlign="center">
{Number(trainee.homework_bits) + trainee.events_visited + Number(trainee.extra_bits)}
</Table.Cell>
</Table.Row>
) : null
);
}
render() {
return (
<Container textAlign="center" style={{ overflowX: 'scroll' }}>
<Table color="blue" unstackable celled selectable compact>
<Table.Header>
<Table.Row>
<Table.HeaderCell textAlign="center">Képződők</Table.HeaderCell>
<Table.HeaderCell textAlign="center">Jelenlét</Table.HeaderCell>
<Table.HeaderCell textAlign="center">Bitek</Table.HeaderCell>
<Table.HeaderCell textAlign="center">Szumma</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{this.props.trainees ? (
this.renderTraineeBits()
) : (
<Table.Row>
<Table.Cell>Nincsenek képződők</Table.Cell>
</Table.Row>
)}
</Table.Body>
</Table>
</Container>
);
}
}
const mapStateToProps = ({ trainees: { trainees }, user }) => ({
trainees,
user,
});
export default connect(mapStateToProps, { getTrainees })(LeaderBoard);
import {
Card,
Container,
Header,
Icon,
Image,
Item,
Label,
Responsive,
Segment,
} from 'semantic-ui-react';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { getMentors } from '../../actions/mentors';
class Mentors extends Component {
UNSAFE_componentWillMount() {
this.props.getMentors();
}
renderMentorsNormal() {
return this.props.mentors.map((item, index) => (
<Card style={{ maxWidth: '100%', minWidth: '100%' }}>
<Card.Content style={{ padding: '0' }}>
<Item.Group>
<Item>
{index % 2 === 0 ? (
<Item.Image size="medium" src={item.image} />
) : null}
<Item.Content style={{ padding: '1rem' }}>
<Item.Header>{item.name}</Item.Header>
<Item.Description>
<p dangerouslySetInnerHTML={{ __html: item.text }}></p>
</Item.Description>
<Item.Extra>
<Label>
<Icon name="mail" />
{item.email}
</Label>
</Item.Extra>
</Item.Content>
{index % 2 === 1 ? (
<Item.Image size="medium" src={item.image} />
) : null}
</Item>
</Item.Group>
</Card.Content>
</Card>
));
}
renderMentorsMobile() {
return this.props.mentors.map((item) => (
<Card key={item.id}>
<Image src={item.image} wrapped ui={false} />
<Card.Content>
<Card.Header>{item.name}</Card.Header>
<Card.Description>
<p dangerouslySetInnerHTML={{ __html: item.text }}></p>
</Card.Description>
</Card.Content>
<Card.Content extra>
<Label>
<Icon name="mail" />
{item.email}
</Label>
</Card.Content>
</Card>
));
}
render() {
return (
<div>
<Segment inverted textAlign="center" vertical>
<Container>
<Header
as="h1"
content="Mentorok"
inverted
style={{
fontSize: '3em',
fontWeight: 'normal',
marginBottom: 0,
marginTop: '0.5em',
}}
/>
</Container>
</Segment>
<Responsive minWidth={768}>
<Container style={{ paddingTop: '2em', paddingBottom: '5em' }}>
{this.renderMentorsNormal()}
</Container>
</Responsive>
<Responsive minWidth={551} maxWidth={767}>
<Container style={{ paddingTop: '2em', paddingBottom: '5em' }}>
<Card.Group centered itemsPerRow={2}>
{this.renderMentorsMobile()}
</Card.Group>
</Container>
</Responsive>
<Responsive maxWidth={550}>
<Container style={{ paddingTop: '2em', paddingBottom: '5em' }}>
<Card.Group centered itemsPerRow={1}>
{this.renderMentorsMobile()}
</Card.Group>
</Container>
</Responsive>
</div>
);
}
}
const mapStateToProps = ({ mentors, user }) => ({ mentors, user });
export default connect(mapStateToProps, { getMentors })(Mentors);
import './News.css';
import { Button, Container, Grid, Item, Segment } from 'semantic-ui-react';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Container, Segment, Item, Button, Grid } from 'semantic-ui-react'; import { deleteNews, getNews, setSelectedNews } from '../../actions/news';
import { connect } from 'react-redux';
import moment from 'moment';
import AddNewsForm from '../forms/AddNewsForm'; import AddNewsForm from '../forms/AddNewsForm';
import ConfirmModal from '../forms/ConfirmModal';
import EditNewsForm from '../forms/EditNewsForm'; import EditNewsForm from '../forms/EditNewsForm';
import { connect } from 'react-redux';
import moment from 'moment';
import { getNews, deleteNews, setSelectedNews } from '../../actions/news'; const linkify = (text) => {
const urlRegex = /(https?:\/\/[^\s]+)/g;
import './News.css'; return text.split(urlRegex).map((part, index) =>
part.match(urlRegex) ? (
<a key={index} href={part} target="_blank" rel="noopener noreferrer">
{part}
</a>
) : (
part
)
);
};
class News extends Component { class News extends Component {
componentWillMount() { UNSAFE_componentWillMount() {
this.props.getNews(); this.props.getNews();
} }
renderNews() { renderNews() {
return this.props.news.map(item => ( return this.props.news.map((item) => (
<Item key={item.id}> <Item key={item.id}>
<Item.Content> <Item.Content>
<Item.Header <Container text textAlign="left">
style={{ fontSize: '2em', width: '100%' }} <Item.Header style={{ fontSize: '2em', width: '100%' }}>
>
<Grid> <Grid>
<Grid.Column floated='center' width={12}> <Grid.Column
floated="left"
width={this.props.user.role === 'Staff' ? 12 : 16}
>
{item.title} {item.title}
</Grid.Column> </Grid.Column>
{ this.props.user.role === 'Staff' ? {this.props.user.role === 'Staff' ? (
<Grid.Column floated='right' width={4}> <Grid.Column floated="right" width={4}>
<EditNewsForm <EditNewsForm
onClick={() => this.props.setSelectedNews(item)} onClick={() => this.props.setSelectedNews(item)}
/> />
<Button <ConfirmModal
compact text={`törölni akarod a következő hírt: ${item.title}`}
color='red' button={
size='mini' <Button compact color="red" size="mini">
onClick={() => this.props.deleteNews(item)} Törlés
>
Delete
</Button> </Button>
}
onAccept={() => this.props.deleteNews(item)}
/>
</Grid.Column> </Grid.Column>
: null } ) : null}
</Grid> </Grid>
</Item.Header> </Item.Header>
<Item.Description className='news-text' style={{ fontSize: '1.33em' }}> <Item.Meta style={{ fontSize: '0.75em', fontStyle: 'italic' }}>
Közzétéve:
{moment(item.created_at).format('LLLL')}
</Item.Meta>
<Item.Description className="news-text" style={{ fontSize: '1em' }}>
{this.renderMultiLine(item.text)} {this.renderMultiLine(item.text)}
</Item.Description> </Item.Description>
<Item.Extra> </Container>
<Grid>
<Grid.Row className='news-extra'>
<Grid.Column floated='left' width={10}>
<p> Készült: {moment(item.created_at).format('LLLL')} </p>
<p> Szerkesztve: {moment(item.updated_at).format('LLLL')}</p>
</Grid.Column>
<Grid.Column floated='right' width={5}>
<p> Írta: <strong>{item.author_name}</strong></p>
{/* TODO get the edited by name */}
<p> Szerkesztette: {item.author_name}</p>
</Grid.Column>
</Grid.Row>
</Grid>
</Item.Extra>
</Item.Content> </Item.Content>
</Item> </Item>
)); ));
} }
renderMultiLine(text) { renderMultiLine = (text) => {
const strings = text.split('\n'); const strings = text.split('\n');
return strings.map(string => <p>{string}</p>); return strings.map((string) => <p key={Math.random()}>{linkify(string)}</p>);
} };
render() { render() {
return ( return (
<div> <div style={{ paddingTop: '1em', paddingBottom: '5em' }}>
<Segment style={{ padding: '3em 3em' }} vertical> <Segment vertical>
{/* { this.props.user.is_superuser ? <AddNewsForm /> : ''} */} {/* { this.props.user.is_superuser ? <AddNewsForm /> : ''} */}
<Container text textAlign='center'> <Container text textAlign="center">
{this.props.user.role === 'Staff' ? {this.props.user.role === 'Staff' ? <AddNewsForm /> : null}
<AddNewsForm /> <Item.Group divided>{this.renderNews()}</Item.Group>
:
null}
<Item.Group divided>
{this.renderNews()}
</Item.Group>
</Container> </Container>
</Segment> </Segment>
</div> </div>
...@@ -91,7 +92,10 @@ class News extends Component { ...@@ -91,7 +92,10 @@ class News extends Component {
} }
} }
const mapStateToProps = ({ news, user }) => ({ news, user }); const mapStateToProps = ({ news, user }) => ({ news, user });
export default connect(mapStateToProps, { getNews, deleteNews, setSelectedNews })(News); export default connect(mapStateToProps, {
getNews,
deleteNews,
setSelectedNews,
})(News);
import React, { Component } from 'react';
import { Button, Container, Header, Icon, Segment } from 'semantic-ui-react'; import { Button, Container, Header, Icon, Segment } from 'semantic-ui-react';
import React, { Component } from 'react';
export default class NotFound extends Component { export default class NotFound extends Component {
render() { render() {
return ( return (
<div> <div>
<Segment inverted textAlign='center' vertical> <Segment inverted textAlign="center" vertical>
<Container> <Container>
<Header <Header
as='h1' as="h1"
content='404 - A keresett oldal nem található!' content="404 - A keresett oldal nem található!"
inverted inverted
style={{ style={{
fontSize: '3em', fontSize: '3em',
...@@ -19,9 +19,9 @@ export default class NotFound extends Component { ...@@ -19,9 +19,9 @@ export default class NotFound extends Component {
}} }}
/> />
<Button <Button
href='/' href="/"
primary primary
size='huge' size="huge"
style={{ style={{
fontSize: '2em', fontSize: '2em',
marginTop: '1em', marginTop: '1em',
...@@ -29,7 +29,7 @@ export default class NotFound extends Component { ...@@ -29,7 +29,7 @@ export default class NotFound extends Component {
}} }}
> >
Vissza a Főoldalra Vissza a Főoldalra
<Icon name='right arrow' /> <Icon name="right arrow" />
</Button> </Button>
</Container> </Container>
</Segment> </Segment>
......
import { Container, Icon, Table } from 'semantic-ui-react';
import React, { Component } from 'react';
import { getStaffEvents, getTrainees } from '../../actions/statistics';
import { connect } from 'react-redux';
class Presence extends Component {
UNSAFE_componentWillMount() {
this.props.getTrainees();
this.props.getStaffEvents();
}
// Every event with visit status in table cells
renderVisitedStatus(trainee) {
return this.props.events.map((event) => {
if (event.visitors.includes(trainee.id)) {
return (
<Table.Cell textAlign="center" key={Math.random()}>
<Icon color="green" name="checkmark" />
</Table.Cell>
);
}
return (
<Table.Cell textAlign="center" key={Math.random()}>
<Icon color="red" name="cancel" />
</Table.Cell>
);
});
}
// Every event rendered
renderTraineesWithEvents() {
return this.props.trainees.map((trainee) =>
trainee.role === 'Student' ? (
<Table.Row key={Math.random()}>
<Table.Cell textAlign="center">{trainee.full_name}</Table.Cell>
{this.renderVisitedStatus(trainee)}
</Table.Row>
) : null
);
}
// Column for each event
renderTableHeaderEvents() {
return this.props.events.map((event) => (
<Table.HeaderCell textAlign="center" key={event.id}>
{event.name}
</Table.HeaderCell>
));
}
render() {
return (
<Container textAlign="center" style={{ overflowX: 'scroll' }}>
<Table color="blue" unstackable celled selectable compact>
<Table.Header>
<Table.Row>
<Table.HeaderCell textAlign="center">Képződők</Table.HeaderCell>
{this.renderTableHeaderEvents()}
</Table.Row>
</Table.Header>
<Table.Body>
{this.props.trainees ? (
this.renderTraineesWithEvents()
) : (
<Table.Row>
<Table.Cell>Nincsenek képződők</Table.Cell>
</Table.Row>
)}
</Table.Body>
</Table>
</Container>
);
}
}
const mapStateToProps = ({
trainees: { trainees },
events: { events },
user,
}) => ({ trainees, events, user });
export default connect(mapStateToProps, { getTrainees, getStaffEvents })(
Presence
);
import React, { Component } from 'react'; import { Container, Divider, Dropdown, Form, Segment } from "semantic-ui-react";
import { Container, Form, Dropdown, Divider, Segment } from 'semantic-ui-react'; import React, { Component } from "react";
import { connect } from 'react-redux'; import { groupChange, submitRegistration, textChange } from "../../actions";
import { textChange, submitRegistration, groupChange } from '../../actions';
import HiddenForm from "../forms/HiddenForm";
import { connect } from "react-redux";
import { getDeadline } from "../../actions/auth";
const options = [ const options = [
{ key: 'DT', text: 'DevTeam', value: 'DT' }, { key: "DT", text: "DevTeam", value: "DT" },
{ key: 'NET', text: 'NETeam', value: 'NET' }, { key: "NET", text: "NETeam", value: "NET" },
{ key: 'ST', text: 'SecurITeam', value: 'ST' }, { key: "ST", text: "SecurITeam", value: "ST" },
{ key: 'SYS', text: 'SysAdmin', value: 'SYS' }, { key: "SYS", text: "SysAdmin", value: "SYS" },
{ key: 'HAT', text: 'Hallgatói Tudásbázis', value: 'HAT' }, { key: "HAT", text: "Hallgatói Tudásbázis", value: "HAT" },
]; ];
class Profile extends Component { class Profile extends Component {
componentWillMount() { UNSAFE_componentWillMount() {
this.props.getDeadline();
if (!this.props.id) { if (!this.props.id) {
this.props.history.push('/home'); this.props.history.push("/home");
} }
} }
render() { render() {
const { const {
nick, groups, motivationAbout, motivationProfession, motivationExercise, signed, id, nick,
groups,
motivationAbout,
motivationProfession,
motivationExercise,
signed,
id,
deadline,
messageBefore,
messageAfter,
} = this.props; } = this.props;
const endDate = new Date(deadline);
const canEdit = Date.now() < endDate;
return ( return (
<Container <Container
style={{ style={{
marginTop: '0.5em', marginTop: "1em",
}} }}
> >
<Segment inverted color='red' tertiary> {canEdit ? (
<p style={{ fontSize: '1.33em' }}> <Segment inverted color="red" tertiary>
A profilod mentés után is módosítható a későbbiekben, egészen február 14. 23:59-ig. <p
</p> style={{ fontSize: "1.3em" }}
dangerouslySetInnerHTML={{ __html: messageBefore }}
/>
</Segment>
) : (
<Segment inverted color="red" tertiary>
<p
style={{ fontSize: "1.3em" }}
dangerouslySetInnerHTML={{ __html: messageAfter }}
/>
</Segment> </Segment>
)}
<Form> <Form>
{canEdit ? (
<Form.Input <Form.Input
fluid fluid
name='nick' name="nick"
label='Becenév' label="Becenév"
onChange={e => this.props.textChange(e)} onChange={(e) => this.props.textChange(e)}
placeholder='Becenév' placeholder="Becenév"
value={nick} value={nick}
/> />
) : (
<HiddenForm fontWeight="bold" label="Becenév" value={nick} />
)}
<Divider horizontal>Motiváció</Divider> <Divider horizontal>Motiváció</Divider>
{canEdit ? (
<Form.TextArea <Form.TextArea
rows={10} rows={10}
name='motivationAbout' name="motivationAbout"
label='Mesélj nekünk egy kicsit magadról. Milyen szakmai vagy más eredményeket értél el, amikre büszke vagy?' label="Mesélj nekünk egy kicsit magadról. Milyen szakmai vagy más eredményeket értél el, amikre büszke vagy?"
onChange={e => this.props.textChange(e)} onChange={(e) => this.props.textChange(e)}
placeholder='Mesélj nekünk egy kicsit magadról. Milyen szakmai vagy más eredményeket értél el, amikre büszke vagy?' placeholder="Mesélj nekünk egy kicsit magadról. Milyen szakmai vagy más eredményeket értél el, amikre büszke vagy?"
value={motivationAbout} value={motivationAbout}
/> />
) : (
<HiddenForm
fontWeight="bold"
label="Mesélj nekünk egy kicsit magadról. Milyen szakmai vagy más eredményeket értél el, amikre büszke vagy?"
value={motivationAbout}
/>
)}
<Divider horizontal /> <Divider horizontal />
{canEdit ? (
<Form.TextArea <Form.TextArea
rows={10} rows={10}
label='Mit vársz el a képzéstől, miért szeretnél rá jelentkezni, szerinted mire tudod majd használni az itt megszerzett tudást? Mit szeretnél elérni a szakmádban?' label="Mit vársz el a képzéstől, miért szeretnél rá jelentkezni, szerinted mire tudod majd használni az itt megszerzett tudást? Mit szeretnél elérni a szakmádban?"
name='motivationProfession' name="motivationProfession"
onChange={e => this.props.textChange(e)} onChange={(e) => this.props.textChange(e)}
placeholder='Mit vársz el a képzéstől, miért szeretnél rá jelentkezni, szerinted mire tudod majd használni az itt megszerzett tudást? Mit szeretnél elérni a szakmádban?' placeholder="Mit vársz el a képzéstől, miért szeretnél rá jelentkezni, szerinted mire tudod majd használni az itt megszerzett tudást? Mit szeretnél elérni a szakmádban?"
value={motivationProfession} value={motivationProfession}
/> />
) : (
<HiddenForm
fontWeight="bold"
label="Mit vársz el a képzéstől, miért szeretnél rá jelentkezni, szerinted mire tudod majd használni az itt megszerzett tudást? Mit szeretnél elérni a szakmádban?"
value={motivationProfession}
/>
)}
<Divider horizontal /> <Divider horizontal />
{canEdit ? (
<Form.TextArea <Form.TextArea
rows={10} rows={10}
name='motivationExercise' name="motivationExercise"
onChange={e => this.props.textChange(e)} onChange={(e) => this.props.textChange(e)}
placeholder='' placeholder=""
label={ label={
<div> <div>
<b>Alább találsz néhány elgondolkodtató kérdést, megoldandó feladatot. <b>
A kérdések és feladatok elkészítése opcionális, Alább találsz néhány elgondolkodtató kérdést, megoldandó
nem titkolt célunk ezzel a lelkesedés felmérése. feladatot. A kérdések és feladatok elkészítése opcionális,
A válaszokat a kérdések alatti szövegdobozba várjuk. nem titkolt célunk ezzel a lelkesedés felmérése. A
válaszokat a kérdések alatti szövegdobozba várjuk.
</b> </b>
<ol> <ul>
<li> <li>
Szeretnéd kedvenc tantárgyad vik.wiki oldalát elérni, Szeretnéd kedvenc tantárgyad vik.wiki oldalát elérni, de
de szomorúan látod, hogy az oldal nem jön be. szomorúan látod, hogy az oldal nem jön be. A Steam pedig
A Steam pedig hibátlanul megy a háttérben és az emailek is megérkeznek... hibátlanul megy a háttérben és az emailek is
Szobatársadnak pont megvan a vik.wiki szerverének IP-címe. megérkeznek... Szobatársadnak pont megvan a vik.wiki
Csodálkozva látod, hogy a böngésző címsorába írva eléred a kiszolgáló webszervert. szerverének IP-címe. Csodálkozva látod, hogy a böngésző
Mi lehet a baj? címsorába írva eléred a kiszolgáló webszervert. Mi lehet a
baj?
</li> </li>
<br /> <br />
<li> <li>
Két előadás közti szünetben úgy döntesz, Kicsit hosszúra nyúlt az előadás és lassan rohannod kell
hogy laptopoddal az index.hu tech cikkeit fogod görgetni. haza, ezért úgy döntesz, hogy megnézed a menetrendet a
Ám az oldal nem válaszol, a hiba okát megpróbálod kideríteni. menetrendek.hu weboldalon. Ám az oldal nem válaszol, a
Ekkor veszed észre, hogy az alábbiakat sem éred el: hiba okát megpróbálod kideríteni. Ekkor veszed észre, hogy
sze.hu, 444.hu, corvinus.hu, startlap.hu. az alábbiakat sem éred el: sze.hu, corvinus.hu,
Ugyanakkor a Facebook, a Gmail, a YouTube, de még az egyetemi startlap.hu. Ugyanakkor a Facebook, a Gmail, a YouTube, de
oldalak többsége is működik. Szerinted mi lehet a hiba oka? még az egyetemi oldalak többsége is működik. Szerinted mi
lehet a hiba oka?
</li> </li>
<br /> <br />
<li> <li>
Találsz egy értelmetlen szöveget egy honlapon (például: <a href='http://kszkepzes18.sch.bme.hu/zebra.html'>http://kszkepzes18.sch.bme.hu/zebra.html</a>), de feltűnik, hogy két egyenlőségjellel fejeződik be. Nyomozz, s a végeredményt (amit találtál) írd ide! Találsz egy értelmetlen szöveget egy honlapon (például:{" "}
<a href="https://ujonc.kszk.bme.hu/kepzes-media/public/zebra.html">
https://ujonc.kszk.bme.hu/kepzes-media/public/zebra.html
</a>
), de feltűnik, hogy egyenlőségjellel fejeződik be.
Nyomozz, s a végeredményt (amit találtál) írd ide!
</li> </li>
<br /> <br />
<li> <li>
A <b>kszkepzes18.sch.bme.hu</b> címen elérhető gépen A <b>ujonc-gres.kszk.bme.hu</b> címen elérhető gépen fut
fut egy szolgáltatás az alapértelmezett <b>5432</b> porton egy szolgáltatás az alapértelmezett <b>5432</b> porton
(használd az előző feladatban kapott adatokat). (használd az előző feladatban kapott adatokat). Belépés
Belépés után keresd meg a feladat megoldását! után írd le mit találtál!
</li> </li>
</ol> </ul>
</div> </div>
} }
value={motivationExercise} value={motivationExercise}
/> />
) : (
<HiddenForm
fontWeight="normal"
label={
<div>
<b>
Alább találsz néhány elgondolkodtató kérdést, megoldandó
feladatot. A kérdések és feladatok elkészítése opcionális,
nem titkolt célunk ezzel a lelkesedés felmérése. A
válaszokat a kérdések alatti szövegdobozba várjuk.
</b>
<ul>
<li>
Szeretnéd kedvenc tantárgyad vik.wiki oldalát elérni, de
szomorúan látod, hogy az oldal nem jön be. A Steam pedig
hibátlanul megy a háttérben és az emailek is
megérkeznek... Szobatársadnak pont megvan a vik.wiki
szerverének IP-címe. Csodálkozva látod, hogy a böngésző
címsorába írva eléred a kiszolgáló webszervert. Mi lehet a
baj?
</li>
<br />
<li>
Kicsit hosszúra nyúlt az előadás és lassan rohannod kell
haza, ezért úgy döntesz, hogy megnézed a menetrendet a
menetrendek.hu weboldalon. Ám az oldal nem válaszol, a
hiba okát megpróbálod kideríteni. Ekkor veszed észre, hogy
az alábbiakat sem éred el: sze.hu, corvinus.hu,
startlap.hu. Ugyanakkor a Facebook, a Gmail, a YouTube, de
még az egyetemi oldalak többsége is működik. Szerinted mi
lehet a hiba oka?
</li>
<br />
<li>
Találsz egy értelmetlen szöveget egy honlapon (például:{" "}
<a href="https://ujonc.kszk.bme.hu/kepzes-media/public/zebra.html">
https://ujonc.kszk.bme.hu/kepzes-media/public/zebra.html
</a>
), de feltűnik, hogy egyenlőségjellel fejeződik be.
Nyomozz, s a végeredményt (amit találtál) írd ide!
</li>
<br />
<li>
A <b>ujonc-gres.kszk.bme.hu</b> címen elérhető gépen fut
egy szolgáltatás az alapértelmezett <b>5432</b> porton
(használd az előző feladatban kapott adatokat). Belépés
után keresd meg a feladat megoldását!
</li>
</ul>
</div>
}
value={motivationExercise}
/>
)}
<Divider horizontal>Érdekelődés</Divider> <Divider horizontal>Érdeklődés</Divider>
<Dropdown <Dropdown
fluid fluid
multiple multiple
selection selection
placeholder='DevTeam, ...' placeholder="DevTeam, ..."
onChange={(_, v) => this.props.groupChange(v.value)} onChange={(_, v) => this.props.groupChange(v.value)}
options={options} options={options}
defaultValue={groups} defaultValue={groups}
disabled={!canEdit}
/> />
<br /> <br />
<Form.Checkbox <Form.Checkbox
name='signed' name="signed"
label='Szeretnék jelentkezni a KSZKépzésre' label="Szeretnék a képzés során emaileket kapni és jelentkezni a KSZKépzésre"
onChange={(_, v) => onChange={(_, v) =>
this.props.textChange({ target: { name: v.name, value: v.checked } }) this.props.textChange({
target: { name: v.name, value: v.checked },
})
} }
checked={signed} checked={signed}
readOnly={!canEdit}
style={!canEdit ? { marginBottom: "5em" } : null}
/> />
{canEdit ? (
<Form.Button <Form.Button
primary primary
style={{ marginBottom: '10em' }} style={{ marginBottom: "5em" }}
onClick={() => this.props.submitRegistration({ disabled={!signed}
nick, motivationAbout, motivationProfession, motivationExercise, signed, groups, id, onClick={() =>
})} this.props.submitRegistration({
nick,
motivationAbout,
motivationProfession,
motivationExercise,
signed,
groups,
id,
})
}
> >
Mentés Mentés
</Form.Button> </Form.Button>
) : (
""
)}
</Form> </Form>
</Container> </Container>
); );
...@@ -148,7 +273,16 @@ class Profile extends Component { ...@@ -148,7 +273,16 @@ class Profile extends Component {
const mapStateToProps = ({ const mapStateToProps = ({
user: { user: {
nick, groups, motivationAbout, motivationProfession, motivationExercise, signed, id, nick,
groups,
motivationAbout,
motivationProfession,
motivationExercise,
signed,
id,
deadline,
messageBefore,
messageAfter,
}, },
}) => ({ }) => ({
nick, nick,
...@@ -158,6 +292,14 @@ const mapStateToProps = ({ ...@@ -158,6 +292,14 @@ const mapStateToProps = ({
motivationExercise, motivationExercise,
signed, signed,
id, id,
deadline,
messageBefore,
messageAfter,
}); });
export default connect(mapStateToProps, { textChange, submitRegistration, groupChange })(Profile); export default connect(mapStateToProps, {
textChange,
submitRegistration,
groupChange,
getDeadline,
})(Profile);
import React, { Component } from 'react'; import "moment/locale/hu";
import { Container, Accordion, Icon, Grid } from 'semantic-ui-react';
import { connect } from 'react-redux'; import {
import moment from 'moment'; Accordion,
import { getStudentEvents } from '../../actions/statistics'; Container,
Grid,
Header,
Icon,
Segment,
} from "semantic-ui-react";
import React, { Component } from "react";
import { connect } from "react-redux";
import { getStudentEvents } from "../../actions/statistics";
import moment from "moment";
class Schedule extends Component { class Schedule extends Component {
state = { activeIndex: 0 } // eslint-disable-next-line react/state-in-constructor
state = { activeIndex: 0 };
componentWillMount() { UNSAFE_componentWillMount() {
this.props.getStudentEvents(); this.props.getStudentEvents();
} }
handleClick = (e, titleProps) => { handleClick = (e, titleProps) => {
const { index } = titleProps const { index } = titleProps;
const { activeIndex } = this.state const { activeIndex } = this.state;
const newIndex = activeIndex === index ? -1 : index const newIndex = activeIndex === index ? -1 : index;
this.setState({ activeIndex: newIndex }) this.setState({ activeIndex: newIndex });
} };
render() { render() {
const { activeIndex } = this.state const { activeIndex } = this.state;
const events = this.props.events; const { events } = this.props;
const panels = events.map(event => ( const panels = events
<> .sort((a, b) => a.date - b.date)
.map((event) => (
<Accordion key={Math.random()}>
<Accordion.Title <Accordion.Title
active={activeIndex === event.id} active={activeIndex === event.id}
index={event.id} index={event.id}
...@@ -32,46 +45,56 @@ class Schedule extends Component { ...@@ -32,46 +45,56 @@ class Schedule extends Component {
> >
<h2> <h2>
<Grid> <Grid>
<Grid.Column floated='left' width={5} textAlign='left'> <Grid.Column floated="left" width={5} textAlign="left">
<Icon name='quidditch' color='blue' />{event.name} <Icon name="calendar alternate outline" color="blue" />{" "}
{event.name}
</Grid.Column> </Grid.Column>
<Grid.Column floated='right' width={8} textAlign='right'> <Grid.Column floated="right" width={8} textAlign="right">
{moment(event.date).locale('hu').format('LLLL')} {moment(event.date).locale("hu").format("LLLL")}
</Grid.Column> </Grid.Column>
</Grid> </Grid>
</h2> </h2>
</Accordion.Title> </Accordion.Title>
<Accordion.Content active={activeIndex === event.id}> <Accordion.Content active={activeIndex === event.id}>
<p> <Segment textAlign="left" style={{ overflowWrap: "break-word" }}>
{event.description} {event.description}
</p> </Segment>
</Accordion.Content> </Accordion.Content>
</> </Accordion>
)); ));
return ( return (
<Container <div>
textAlign='center' <Container textAlign="center">
<Header
as="h1"
content="Képzés alkalmak"
style={{ style={{
padding: '60px' fontSize: "2em",
fontWeight: "bold",
marginBottom: "0.5em",
marginTop: "0.5em",
}} }}
> />
<h2>Képzés alkalmak:</h2> <Accordion fluid styled>
<Accordion
fluid
styled
defaultActiveIndex={-1}
panels={panels}
>
{panels} {panels}
</Accordion> </Accordion>
<h2>Tábor:</h2> <Header
as="h1"
content="Tábor: április 11-13"
style={{
fontSize: "2em",
fontWeight: "bold",
marginBottom: "0.5em",
marginTop: "1.5em",
}}
/>
</Container> </Container>
</div>
); );
} }
} }
const mapStateToProps = ({ events: { events }, user }) => ({ events, user }); const mapStateToProps = ({ events: { events }, user }) => ({ events, user });
export default connect(mapStateToProps, { getStudentEvents })(Schedule); export default connect(mapStateToProps, { getStudentEvents })(Schedule);
import React, { Component } from 'react';
import { Container, Menu } from 'semantic-ui-react'; import { Container, Menu } from 'semantic-ui-react';
import Events from './Events' import React, { Component } from 'react';
import Trainees from './Trainees'
import Events from './Events';
import LeaderBoard from './LeaderBoard';
import Presence from './Presence';
export default class Statistics extends Component { export default class Statistics extends Component {
state = { activeItem: 'events' } // eslint-disable-next-line react/state-in-constructor
handleItemClick = (e, { name }) => this.setState({ activeItem: name }) state = { activeItem: 'events' };
handleItemClick = (e, { name }) => this.setState({ activeItem: name });
render() { render() {
const { activeItem } = this.state const { activeItem } = this.state;
return ( return (
<div> <div>
<Container <Container
textAlign="center" textAlign="center"
style={{ style={{ paddingBottom: '5em', paddingTop: '1em' }}
padding: '60px',
}}
> >
<Menu <Menu tabular attached="top" size="huge" compact>
attached='top'
tabular
size='huge'
compact={true}>
<Menu.Item <Menu.Item
name='events' name="events"
active={activeItem === 'events'} active={activeItem === 'events'}
onClick={this.handleItemClick} onClick={this.handleItemClick}
>Alkalmak >
Alkalmak
</Menu.Item>
<Menu.Item
name="presence"
active={activeItem === 'presence'}
onClick={this.handleItemClick}
>
Jelenlét
</Menu.Item> </Menu.Item>
<Menu.Item <Menu.Item
name='trainees' name="leaderboard"
active={activeItem === 'trainees'} active={activeItem === 'leaderboard'}
onClick={this.handleItemClick} onClick={this.handleItemClick}
>Képződők >
Ranglista
</Menu.Item> </Menu.Item>
</Menu> </Menu>
{activeItem === 'events' ? <Events /> : ''} {activeItem === 'events' ? <Events /> : ''}
{ activeItem === 'trainees' ? <Trainees /> : '' } {activeItem === 'presence' ? <Presence /> : ''}
{activeItem === 'leaderboard' ? <LeaderBoard /> : ''}
</Container> </Container>
</div> </div>
); );
......
import React, { Component } from 'react';
import { Container, Table, Icon } from 'semantic-ui-react';
import { connect } from 'react-redux';
import { getTrainees, getStaffEvents } from '../../actions/statistics';
class Trainees extends Component {
componentWillMount() {
this.props.getTrainees();
this.props.getStaffEvents();
}
renderVisitedStatus(trainee) {
return (this.props.events.map((event) => {
if (event.visitors.includes(trainee.id)) {
return (
<Table.Cell textAlign='center'>
<Icon color='green' name='checkmark' />
</Table.Cell>);
}
return (
<Table.Cell textAlign='center'>
<Icon color='red' name='cancel' />
</Table.Cell>);
}));
}
renderTrainees() {
return this.props.trainees.map((trainee) =>
{ return (
<Table.Row>
<Table.Cell>
{trainee.full_name}
</Table.Cell>
{this.renderVisitedStatus(trainee)}
</Table.Row>
);
});
}
renderTableHeader() {
return (this.props.events.map(event => (
<Table.HeaderCell>
{event.name}
</Table.HeaderCell>)));
}
render() {
return (
<Container textAlign='center'>
<Table color='blue' celled selectable compact>
<Table.Header>
<Table.Row>
<Table.HeaderCell>Képződők</Table.HeaderCell>
{ this.renderTableHeader() }
</Table.Row>
</Table.Header>
<Table.Body>
{this.props.trainees ? this.renderTrainees() : 'Nincsenek képződők'}
</Table.Body>
</Table>
</Container>
);
}
}
const mapStateToProps = ({ trainees: { trainees }, events: { events }, user }) => ({ trainees, events, user });
export default connect(mapStateToProps, { getTrainees, getStaffEvents })(Trainees);
import React, { Component } from 'react';
import { Container, Header, Segment } from 'semantic-ui-react';
export default class Trainers extends Component {
render() {
return (
<div>
<Segment inverted textAlign='center' vertical>
<Container>
<Header
as='h1'
content='Képzők - Hamarosan'
inverted
style={{
fontSize: '3em',
fontWeight: 'normal',
marginBottom: 0,
marginTop: '0.5em',
}}
/>
</Container>
</Segment>
</div>
);
}
}