From 42721e95726559b4a601240bb5b0fe4e5d755b2a Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Wed, 27 Nov 2019 23:43:21 +0100 Subject: Added Schedule parsing and replaced old Fahrplan importer Resolves #553 (Change Frab Import from xCal to XML) Resolves #538 (Feature Request: Multi Frab Import) --- resources/lang/de_DE/additional.po | 33 +++++++++++++ resources/lang/de_DE/default.po | 57 ++++++++++++++++++++++ resources/lang/en_US/additional.po | 33 +++++++++++++ resources/lang/en_US/default.po | 60 +++++++++++++++++++++++ resources/views/admin/schedule/index.twig | 41 ++++++++++++++++ resources/views/admin/schedule/load.twig | 79 +++++++++++++++++++++++++++++++ resources/views/macros/form.twig | 13 +++++ 7 files changed, 316 insertions(+) create mode 100644 resources/views/admin/schedule/index.twig create mode 100644 resources/views/admin/schedule/load.twig (limited to 'resources') diff --git a/resources/lang/de_DE/additional.po b/resources/lang/de_DE/additional.po index 00eb90b3..ffbd7792 100644 --- a/resources/lang/de_DE/additional.po +++ b/resources/lang/de_DE/additional.po @@ -34,3 +34,36 @@ msgstr "Deine Passwörter stimmen nicht überein." msgid "validation.password_confirmation.required" msgstr "Du musst dein Passwort bestätigen." + +msgid "schedule.import" +msgstr "Programm importieren" + +msgid "schedule.import.request-error" +msgstr "Das Programm konnte nicht abgerufen werden." + +msgid "schedule.import.read-error" +msgstr "Das Programm konnte nicht gelesen werden." + +msgid "schedule.import.invalid-shift-type" +msgstr "Der Schichttyp konnte nicht gefunden werden." + +msgid "schedule.import.success" +msgstr "Das Programm wurde erfolgreich importiert." + +msgid "validation.schedule-url.required" +msgstr "Bitte gib eine Programm URL an." + +msgid "validation.schedule-url.url" +msgstr "Die Programm URL muss eine URL sein." + +msgid "validation.shift-type.required" +msgstr "Der Schichttyp ist erforderlich." + +msgid "validation.shift-type.int" +msgstr "Der Schichttyp muss eine Zahl sein." + +msgid "validation.minutes-before.int" +msgstr "Die Minuten vor dem Talk müssen eine Zahl sein." + +msgid "validation.minutes-after.int" +msgstr "Die Minuten nach dem Talk müssen eine Zahl sein." diff --git a/resources/lang/de_DE/default.po b/resources/lang/de_DE/default.po index d5a6c59e..d5f30f22 100644 --- a/resources/lang/de_DE/default.po +++ b/resources/lang/de_DE/default.po @@ -2806,3 +2806,60 @@ msgstr "" #~ msgid "auth.no-nickname" #~ msgstr "Gib bitte einen Nick an." + +msgid "form.load_schedule" +msgstr "Programm laden" + +msgid "form.import" +msgstr "Importieren" + +msgid "schedule.import.title" +msgstr "Programm importieren" + +msgid "schedule.import.text" +msgstr "Dieser Import erstellt Räume and erstellt, aktualisiert und löscht Schichten anhand des schedule.xml exportes." + +msgid "schedule.import.load.title" +msgstr "Programm importieren: Vorschau" + +msgid "schedule.import.load.info" +msgstr "Importiere \"%s\" (Version \"%s\")" + +msgid "schedule.url" +msgstr "Programm URL (schedule.xml)" + +msgid "schedule.shift-type" +msgstr "Schichttyp" + +msgid "schedule.minutes-before" +msgstr "Minuten vor Talk beginn hinzufügen" + +msgid "schedule.minutes-after" +msgstr "Minuten nach Talk ende hinzufügen" + +msgid "schedule.import.rooms.add" +msgstr "Neue Räume" + +msgid "schedule.import.shifts.add" +msgstr "Neue Schichten" + +msgid "schedule.import.shifts.update" +msgstr "Zu aktualisierende Schichten" + +msgid "schedule.import.shifts.delete" +msgstr "Zu löschende Schichten" + +msgid "schedule.import.rooms.name" +msgstr "Name" + +msgid "schedule.import.shift.dates" +msgstr "Zeit" + +msgid "schedule.import.shift.type" +msgstr "Typ" + +msgid "schedule.import.shift.title" +msgstr "Titel" + +msgid "schedule.import.shift.room" +msgstr "Raum" diff --git a/resources/lang/en_US/additional.po b/resources/lang/en_US/additional.po index 9943b0ab..fa49ffdf 100644 --- a/resources/lang/en_US/additional.po +++ b/resources/lang/en_US/additional.po @@ -32,3 +32,36 @@ msgstr "Your passwords are not equal." msgid "validation.password_confirmation.required" msgstr "You have to confirm your password." + +msgid "schedule.import" +msgstr "Import schedule" + +msgid "schedule.import.request-error" +msgstr "The schedule could not be requested." + +msgid "schedule.import.read-error" +msgstr "Unable to parse schedule." + +msgid "schedule.import.invalid-shift-type" +msgstr "The shift type can't not be found." + +msgid "schedule.import.success" +msgstr "Schedule import successful." + +msgid "validation.schedule-url.required" +msgstr "The schedule URL is required." + +msgid "validation.schedule-url.url" +msgstr "The schedule URL needs to be of type URL." + +msgid "validation.shift-type.required" +msgstr "The shift type is required." + +msgid "validation.shift-type.int" +msgstr "The shift type has to ba a number." + +msgid "validation.minutes-before.int" +msgstr "The minutes before the talk have to be an integer." + +msgid "validation.minutes-after.int" +msgstr "The minutes after the talk have to be an integer." diff --git a/resources/lang/en_US/default.po b/resources/lang/en_US/default.po index cfb587f1..4ee92c78 100644 --- a/resources/lang/en_US/default.po +++ b/resources/lang/en_US/default.po @@ -45,3 +45,63 @@ msgstr "" "Please have a look at the " "[contributors list on GitHub](https://github.com/engelsystem/engelsystem/graphs/contributors)" " for a complete list." + +msgid "form.load_schedule" +msgstr "Load schedule" + +msgid "form.import" +msgstr "Import" + +msgid "schedule.import.title" +msgstr "Import schedule" + +msgid "schedule.import.text" +msgstr "This import creates rooms and creates, updates and deletes shifts according to the schedule.xml export." + +msgid "schedule.import.load.title" +msgstr "Import schedule: Preview" + +msgid "schedule.import.load.info" +msgstr "Import \"%s\" (version \"%s\")" + +msgid "schedule.url" +msgstr "Schedule URL (schedule.xml)" + +msgid "schedule.shift-type" +msgstr "Shift type" + +msgid "schedule.minutes-before" +msgstr "Add minutes before talk begins" + +msgid "schedule.minutes-after" +msgstr "Add minutes after talk ends" + +msgid "schedule.import.request_error" +msgstr "Unable to load schedule." + +msgid "schedule.import.rooms.add" +msgstr "Rooms to create" + +msgid "schedule.import.shifts.add" +msgstr "Shifts to create" + +msgid "schedule.import.shifts.update" +msgstr "Shifts to update" + +msgid "schedule.import.shifts.delete" +msgstr "Shifts to delete" + +msgid "schedule.import.rooms.name" +msgstr "Name" + +msgid "schedule.import.shift.dates" +msgstr "Times" + +msgid "schedule.import.shift.type" +msgstr "Type" + +msgid "schedule.import.shift.title" +msgstr "Title" + +msgid "schedule.import.shift.room" +msgstr "Room" diff --git a/resources/views/admin/schedule/index.twig b/resources/views/admin/schedule/index.twig new file mode 100644 index 00000000..08a9cb2b --- /dev/null +++ b/resources/views/admin/schedule/index.twig @@ -0,0 +1,41 @@ +{% extends 'layouts/app.twig' %} +{% import 'macros/base.twig' as m %} +{% import 'macros/form.twig' as f %} + +{% set title %}{% block title %}{{ __('schedule.import.title') }}{% endblock %}{% endset %} + +{% block content %} +
+

{% block content_title %}{{ title }}{% endblock %}

+ + {% for message in errors|default([]) %} + {{ m.alert(__(message), 'danger') }} + {% endfor %} + {% for message in success|default([]) %} + {{ m.alert(__(message), 'success') }} + {% endfor %} + +
+ {% block row_content %} +
+ {{ csrf() }} + +
+

{{ __('schedule.import.text') }}

+
+ +
+ {{ f.input('schedule-url', __('schedule.url'), 'url', {'required': true}) }} + + {{ f.select('shift-type', shift_types|default([]), __('schedule.shift-type')) }} + + {{ f.input('minutes-before', __('schedule.minutes-before'), 'number', {'value': 15, 'required': true}) }} + {{ f.input('minutes-after', __('schedule.minutes-after'), 'number', {'value': 15, 'required': true}) }} + + {{ f.submit(__('form.load_schedule')) }} +
+
+ {% endblock %} +
+
+{% endblock %} diff --git a/resources/views/admin/schedule/load.twig b/resources/views/admin/schedule/load.twig new file mode 100644 index 00000000..8c936bec --- /dev/null +++ b/resources/views/admin/schedule/load.twig @@ -0,0 +1,79 @@ +{% extends 'admin/schedule/index.twig' %} +{% import 'macros/form.twig' as f %} + +{% block title %}{{ __('schedule.import.load.title') }}{% endblock %} + +{% block row_content %} +
+ {{ csrf() }} + {{ f.hidden('schedule-url', schedule_url) }} + {{ f.hidden('shift-type', shift_type) }} + {{ f.hidden('minutes-before', minutes_before) }} + {{ f.hidden('minutes-after', minutes_after) }} + +
+

{{ __('schedule.import.load.info', [schedule.conference.title, schedule.version]) }}

+ +

{{ __('schedule.import.rooms.add') }}

+ {{ _self.roomsTable(rooms.add) }} + +

{{ __('schedule.import.shifts.add') }}

+ {{ _self.shiftsTable(shifts.add) }} + +

{{ __('schedule.import.shifts.update') }}

+ {{ _self.shiftsTable(shifts.update) }} + +

{{ __('schedule.import.shifts.delete') }}

+ {{ _self.shiftsTable(shifts.delete) }} + + {{ f.submit(__('form.import')) }} +
+
+{% endblock %} + + +{% macro roomsTable(rooms) %} +
+ + + + + + + + + {% for room in rooms %} + + + + {% endfor %} + +
{{ __('schedule.import.rooms.name') }}
{{ room.name }}
+
+{% endmacro %} + +{% macro shiftsTable(shifts) %} +
+ + + + + + + + + + + + {% for shift in shifts %} + + + + + + + {% endfor %} + +
{{ __('schedule.import.shift.dates') }}{{ __('schedule.import.shift.type') }}{{ __('schedule.import.shift.title') }}{{ __('schedule.import.shift.room') }}
{{ shift.date.format(__('Y-m-d H:i')) }} - {{ shift.endDate.format(__('H:i')) }}{{ shift.type }}{{ shift.title }}{% if shift.subtitle %}
{{ shift.subtitle }}{% endif %}
{{ shift.room.name }}
+
+{% endmacro %} diff --git a/resources/views/macros/form.twig b/resources/views/macros/form.twig index 6e821a28..ece85fcf 100644 --- a/resources/views/macros/form.twig +++ b/resources/views/macros/form.twig @@ -13,6 +13,19 @@ {%- endmacro %} +{% macro select(name, data, label, selected) %} +
+ {% if label -%} + + {% endif %} + +
+{%- endmacro %} + {% macro hidden(name, value) %} {%- endmacro %} -- cgit v1.2.3-54-g00ecf