diff --git a/data/www/js/slideshow.js b/data/www/js/slideshow.js index bb20112..dba8bb5 100644 --- a/data/www/js/slideshow.js +++ b/data/www/js/slideshow.js @@ -154,7 +154,7 @@ jQuery(document).ready(function ($) { $('.modal-slide-edit input:visible:eq(0)').focus().select(); $('#slide-edit-name').val(slide.name); $('#slide-edit-type').val(slide.type); - $('#slide-edit-location').val(slide.location); + $('#slide-edit-location').val(slide.location).prop('disabled', !slide.is_editable); $('#slide-edit-duration').val(slide.duration); $('#slide-edit-cron-schedule').val(slide.cron_schedule).toggleClass('hidden', !hasCron || hasDateTime); $('#slide-edit-cron-schedule-trigger').val(hasDateTime ? 'datetime' : (hasCron ? 'cron' : 'loop')); diff --git a/lang/en.json b/lang/en.json index c2e07ff..871305d 100644 --- a/lang/en.json +++ b/lang/en.json @@ -22,9 +22,6 @@ "slideshow_slide_form_label_name": "Name", "slideshow_slide_form_label_location": "Location", "slideshow_slide_form_label_type": "Type", - "slideshow_slide_form_label_type_url": "URL", - "slideshow_slide_form_label_type_video": "Video", - "slideshow_slide_form_label_type_picture": "Picture", "slideshow_slide_form_label_object": "Object", "slideshow_slide_form_label_duration": "Duration", "slideshow_slide_form_label_duration_unit": "seconds", @@ -128,5 +125,9 @@ "enum_variable_section_player_animation": "Player animation", "enum_variable_section_player_options": "Options du lecteur", "enum_application_language_english": "English", - "enum_application_language_french": "French" + "enum_application_language_french": "French", + "enum_slide_type_url": "URL", + "enum_slide_type_video": "Video", + "enum_slide_type_picture": "Picture", + "enum_slide_type_youtube": "Youtube" } diff --git a/lang/fr.json b/lang/fr.json index 4e75b3b..8d0c9a0 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -22,9 +22,6 @@ "slideshow_slide_form_label_name": "Nom", "slideshow_slide_form_label_location": "Chemin", "slideshow_slide_form_label_type": "Type", - "slideshow_slide_form_label_type_url": "URL", - "slideshow_slide_form_label_type_video": "Vidéo", - "slideshow_slide_form_label_type_picture": "Image", "slideshow_slide_form_label_object": "Objet", "slideshow_slide_form_label_duration": "Durée", "slideshow_slide_form_label_duration_unit": "secondes", @@ -128,5 +125,9 @@ "enum_variable_section_player_animation": "Animation du lecteur", "enum_variable_section_player_options": "Options du lecteur", "enum_application_language_english": "Anglais", - "enum_application_language_french": "Français" + "enum_application_language_french": "Français", + "enum_slide_type_url": "URL", + "enum_slide_type_video": "Vidéo", + "enum_slide_type_picture": "Image", + "enum_slide_type_youtube": "Youtube" } diff --git a/src/controller/FleetController.py b/src/controller/FleetController.py index 142cf69..b7186e0 100644 --- a/src/controller/FleetController.py +++ b/src/controller/FleetController.py @@ -26,7 +26,6 @@ class FleetController(ObController): def fleet_screen_list(self): return render_template( 'fleet/list.jinja.html', - l=self._model_store.lang().map(), enabled_screens=self._model_store.screen().get_enabled_screens(), disabled_screens=self._model_store.screen().get_disabled_screens(), ) diff --git a/src/controller/PlayerController.py b/src/controller/PlayerController.py index e8e5479..8754e4e 100644 --- a/src/controller/PlayerController.py +++ b/src/controller/PlayerController.py @@ -51,8 +51,7 @@ class PlayerController(ObController): ipaddr = get_ip_address() return render_template( 'player/default.jinja.html', - ipaddr=ipaddr if ipaddr else self._model_store.lang().map().get('common_unknown_ipaddr'), - l=self._model_store.lang().map() + ipaddr=ipaddr if ipaddr else self._model_store.lang().map().get('common_unknown_ipaddr') ) def player_playlist(self): diff --git a/src/controller/SettingsController.py b/src/controller/SettingsController.py index f81fa85..b87fa82 100644 --- a/src/controller/SettingsController.py +++ b/src/controller/SettingsController.py @@ -15,7 +15,6 @@ class SettingsController(ObController): def settings_variable_list(self): return render_template( 'settings/list.jinja.html', - l=self._model_store.lang().map(), system_variables=self._model_store.variable().get_editable_variables(plugin=False), plugin_variables=self._model_store.variable().get_editable_variables(plugin=True), ) diff --git a/src/controller/SlideshowController.py b/src/controller/SlideshowController.py index 10cc477..f464903 100644 --- a/src/controller/SlideshowController.py +++ b/src/controller/SlideshowController.py @@ -29,11 +29,11 @@ class SlideshowController(ObController): def slideshow(self): return render_template( 'slideshow/list.jinja.html', - l=self._model_store.lang().map(), enabled_slides=self._model_store.slide().get_enabled_slides(), disabled_slides=self._model_store.slide().get_disabled_slides(), var_last_restart=self._model_store.variable().get_one_by_name('last_restart'), - var_external_url=self._model_store.variable().get_one_by_name('external_url') + var_external_url=self._model_store.variable().get_one_by_name('external_url'), + enum_slide_type=SlideType ) def slideshow_slide_add(self): @@ -67,7 +67,13 @@ class SlideshowController(ObController): return redirect(url_for('slideshow_slide_list')) def slideshow_slide_edit(self): - self._model_store.slide().update_form(request.form['id'], request.form['name'], request.form['duration'], request.form['cron_schedule']) + self._model_store.slide().update_form( + id=request.form['id'], + name=request.form['name'], + duration=request.form['duration'], + cron_schedule=request.form['cron_schedule'], + location=request.form['location'] if 'location' in request.form else None + ) self._post_update() return redirect(url_for('slideshow_slide_list')) diff --git a/src/controller/SysinfoController.py b/src/controller/SysinfoController.py index fec4b91..2a3ef9d 100644 --- a/src/controller/SysinfoController.py +++ b/src/controller/SysinfoController.py @@ -24,7 +24,6 @@ class SysinfoController(ObController): return render_template( 'sysinfo/list.jinja.html', ipaddr=ipaddr if ipaddr else self._model_store.lang().map().get('common_unknown_ipaddr'), - l=self._model_store.lang().map(), ro_variables=self._model_store.variable().get_readonly_variables(), env_variables=self._model_store.config().map() ) diff --git a/src/interface/ObPlugin.py b/src/interface/ObPlugin.py index 651e1fc..e8205e4 100644 --- a/src/interface/ObPlugin.py +++ b/src/interface/ObPlugin.py @@ -96,7 +96,6 @@ class ObPlugin(abc.ABC): template = self.get_rendering_env().get_template(template_file) return template.render( - l=self._model_store.lang().map(), request=request, url_for=url_for, **parameters, diff --git a/src/manager/SlideManager.py b/src/manager/SlideManager.py index 7c2743e..216d297 100644 --- a/src/manager/SlideManager.py +++ b/src/manager/SlideManager.py @@ -82,12 +82,17 @@ class SlideManager(ModelManager): for slide_id, slide_position in positions.items(): self._db.update_by_id(slide_id, {"position": slide_position}) - def update_form(self, id: str, name: str, duration: int, cron_schedule: Optional[str] = '') -> None: - self._db.update_by_id(id, { + def update_form(self, id: str, name: str, duration: int, cron_schedule: Optional[str] = '', location: Optional[str] = None) -> None: + form = { "name": name, "duration": duration, "cron_schedule": get_optional_string(cron_schedule) - }) + } + + if location is not None and location: + form["location"] = location + + self._db.update_by_id(id, form) def add_form(self, slide: Union[Slide, Dict]) -> None: db_slide = slide diff --git a/src/model/entity/Slide.py b/src/model/entity/Slide.py index 3ba35cd..f5d5291 100644 --- a/src/model/entity/Slide.py +++ b/src/model/entity/Slide.py @@ -1,7 +1,7 @@ import json from typing import Optional, Union -from src.model.enum.SlideType import SlideType +from src.model.enum.SlideType import SlideType, SlideInputType from src.utils import str_to_enum @@ -99,6 +99,7 @@ class Slide: "enabled": self.enabled, "position": self.position, "type": self.type.value, + "is_editable": self.is_editable(), "duration": self.duration, "location": self.location, "cron_schedule": self.cron_schedule, @@ -109,3 +110,9 @@ class Slide: self.type == SlideType.VIDEO or self.type == SlideType.PICTURE ) + + def get_input_type(self) -> SlideInputType: + return SlideType.get_input(self.type) + + def is_editable(self) -> bool: + return SlideInputType.is_editable(self.get_input_type()) \ No newline at end of file diff --git a/src/model/enum/SlideType.py b/src/model/enum/SlideType.py index 76d5f5a..2d3463f 100644 --- a/src/model/enum/SlideType.py +++ b/src/model/enum/SlideType.py @@ -1,8 +1,33 @@ from enum import Enum +class SlideInputType(Enum): + + UPLOAD = 'upload' + TEXT = 'text' + + @staticmethod + def is_editable(value: Enum) -> bool: + if value == SlideInputType.UPLOAD: + return False + elif value == SlideInputType.TEXT: + return True + + class SlideType(Enum): PICTURE = 'picture' + YOUTUBE = 'youtube' VIDEO = 'video' URL = 'url' + + @staticmethod + def get_input(value: Enum) -> SlideInputType: + if value == SlideType.PICTURE: + return SlideInputType.UPLOAD + elif value == SlideType.VIDEO: + return SlideInputType.UPLOAD + elif value == SlideType.YOUTUBE: + return SlideInputType.TEXT + elif value == SlideType.URL: + return SlideInputType.TEXT diff --git a/src/service/TemplateRenderer.py b/src/service/TemplateRenderer.py index 731fdc9..76008c0 100644 --- a/src/service/TemplateRenderer.py +++ b/src/service/TemplateRenderer.py @@ -30,7 +30,9 @@ class TemplateRenderer: LANG=self._model_store.variable().map().get('lang').as_string(), HOOK=self._render_hook, cron_descriptor=self.cron_descriptor, - is_validate_cron_date_time=is_validate_cron_date_time + is_validate_cron_date_time=is_validate_cron_date_time, + l=self._model_store.lang().map(), + t=self._model_store.lang().translate, ) for hook in HookType: @@ -48,7 +50,6 @@ class TemplateRenderer: os.path.basename(hook_registration.template) )) content.append(template.render( - l=self._model_store.lang().map(), **self.get_view_globals() )) elif isinstance(hook_registration, FunctionalHookRegistration): diff --git a/views/player/player.jinja.html b/views/player/player.jinja.html index 730e009..0e8e903 100755 --- a/views/player/player.jinja.html +++ b/views/player/player.jinja.html @@ -116,13 +116,16 @@ case 'video': loadVideo(element, callbackReady, item); break; + case 'youtube': + loadYoutube(element, callbackReady, item); + break; default: loadUrl(element, callbackReady, item); break; } } - function loadUrl(element, callbackReady, item) { + function loadUrl(element, callbackReady, item, delay) { element.innerHTML = ``; callbackReady(function () {}); } @@ -132,6 +135,15 @@ callbackReady(function () {}); } + function loadYoutube(element, callbackReady, item) { + element.innerHTML = ``; + callbackReady(function () {}); + + setTimeout(function() { + element.innerHTML = ``; + }, Math.max(100, duration - 2000)); + } + function loadVideo(element, callbackReady, item) { element.innerHTML = ``; var video = element.querySelector('video'); diff --git a/views/slideshow/modal/add.jinja.html b/views/slideshow/modal/add.jinja.html index 272a5ea..f7adb5a 100644 --- a/views/slideshow/modal/add.jinja.html +++ b/views/slideshow/modal/add.jinja.html @@ -14,9 +14,12 @@
diff --git a/views/slideshow/modal/edit.jinja.html b/views/slideshow/modal/edit.jinja.html index 4e99dea..e02fc9a 100644 --- a/views/slideshow/modal/edit.jinja.html +++ b/views/slideshow/modal/edit.jinja.html @@ -16,9 +16,11 @@ @@ -26,7 +28,7 @@