From 93e286fa62e5199a9839f00ea2437b567d739b83 Mon Sep 17 00:00:00 2001 From: bkfox Date: Thu, 1 Feb 2024 19:31:30 +0100 Subject: [PATCH] music stream --- aircox/locale/fr/LC_MESSAGES/django.mo | Bin 15645 -> 16064 bytes aircox/locale/fr/LC_MESSAGES/django.po | 325 +++++++++--------- ..._station_program_streams_title_and_more.py | 42 +++ aircox/models/station.py | 7 +- aircox/static/aircox/css/admin.css | 16 +- aircox/static/aircox/css/chunk-common.css | 16 +- aircox/static/aircox/css/public.css | 37 +- aircox/templates/aircox/widgets/item.html | 4 +- aircox/templates/aircox/widgets/logs.html | 12 +- aircox/templates/aircox/widgets/page.html | 6 +- aircox/urls.py | 4 +- assets/src/assets/common.scss | 2 +- assets/src/assets/components.scss | 21 +- assets/src/assets/helpers.scss | 4 + assets/src/assets/public.scss | 13 +- 15 files changed, 276 insertions(+), 233 deletions(-) create mode 100644 aircox/migrations/0019_station_program_streams_title_and_more.py diff --git a/aircox/locale/fr/LC_MESSAGES/django.mo b/aircox/locale/fr/LC_MESSAGES/django.mo index 61c47300e79667546f0aec1ebe065fc887e6c3f4..843a96c1d059ff6ad34713c3581fa977bb0bb403 100644 GIT binary patch delta 6471 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 et(~()gp8$ delta 6183 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 1);\n" #: aircox/admin/diffusion.py:26 aircox/models/diffusion.py:122 -#: aircox/models/log.py:75 +#: aircox/models/log.py:76 msgid "start" msgstr "début" @@ -40,7 +40,7 @@ msgstr "Depuis" msgid "Until" msgstr "Jusque" -#: aircox/admin/filters.py:28 aircox/models/page.py:260 +#: aircox/admin/filters.py:28 aircox/models/page.py:263 #: aircox/tests/admin/test_filters.py:53 msgid "None" msgstr "Aucun" @@ -77,7 +77,7 @@ msgstr "Audio" msgid "Program / Episode" msgstr "Émission / Épisode" -#: aircox/admin/sound.py:135 aircox/templates/aircox/episode_detail.html:30 +#: aircox/admin/sound.py:135 aircox/templates/aircox/episode_detail.html:29 msgid "Playlist" msgstr "Playlist" @@ -115,7 +115,7 @@ msgstr "Article" msgid "Articles" msgstr "Articles" -#: aircox/models/diffusion.py:100 aircox/models/log.py:77 +#: aircox/models/diffusion.py:100 aircox/models/log.py:78 msgid "on air" msgstr "à l'antenne" @@ -123,7 +123,7 @@ msgstr "à l'antenne" msgid "not confirmed" msgstr "non confirmé" -#: aircox/models/diffusion.py:102 aircox/models/log.py:76 +#: aircox/models/diffusion.py:102 aircox/models/log.py:77 msgid "cancelled" msgstr "annulé" @@ -136,12 +136,12 @@ msgstr "épisode" msgid "schedule" msgstr "horaire" -#: aircox/models/diffusion.py:118 aircox/models/log.py:87 -#: aircox/models/sound.py:113 aircox/models/station.py:156 +#: aircox/models/diffusion.py:118 aircox/models/log.py:88 +#: aircox/models/sound.py:113 aircox/models/station.py:160 msgid "type" msgstr "type" -#: aircox/models/diffusion.py:133 aircox/models/log.py:126 +#: aircox/models/diffusion.py:133 aircox/models/log.py:127 msgid "Diffusion" msgstr "Date de diffusion" @@ -165,57 +165,57 @@ msgstr "Épisode" msgid "Episodes" msgstr "Épisodes" -#: aircox/models/log.py:74 +#: aircox/models/log.py:75 msgid "stop" msgstr "stop" -#: aircox/models/log.py:78 aircox/models/sound.py:90 +#: aircox/models/log.py:79 aircox/models/sound.py:90 msgid "other" msgstr "autre" -#: aircox/models/log.py:84 aircox/models/page.py:320 -#: aircox/models/program.py:50 aircox/models/station.py:154 +#: aircox/models/log.py:85 aircox/models/page.py:323 +#: aircox/models/program.py:50 aircox/models/station.py:158 msgid "station" msgstr "station" -#: aircox/models/log.py:85 +#: aircox/models/log.py:86 msgid "related station" msgstr "station relative" -#: aircox/models/log.py:88 aircox/models/schedule.py:48 +#: aircox/models/log.py:89 aircox/models/schedule.py:48 msgid "date" msgstr "date" -#: aircox/models/log.py:95 +#: aircox/models/log.py:96 msgid "source" msgstr "source" -#: aircox/models/log.py:96 +#: aircox/models/log.py:97 msgid "identifier of the source related to this log" msgstr "identifiant de la source relative à ce log" -#: aircox/models/log.py:102 +#: aircox/models/log.py:103 msgid "comment" msgstr "commentaire" -#: aircox/models/log.py:110 aircox/models/sound.py:163 +#: aircox/models/log.py:111 aircox/models/sound.py:163 msgid "Sound" msgstr "Son" -#: aircox/models/log.py:118 aircox/models/sound.py:294 +#: aircox/models/log.py:119 aircox/models/sound.py:294 #: aircox/templates/admin/aircox/statistics.html:24 msgid "Track" msgstr "Morceau" -#: aircox/models/log.py:150 +#: aircox/models/log.py:151 msgid "Log" msgstr "Log" -#: aircox/models/log.py:151 +#: aircox/models/log.py:152 msgid "Logs" msgstr "Logs" -#: aircox/models/page.py:43 aircox/models/page.py:323 +#: aircox/models/page.py:43 aircox/models/page.py:326 #: aircox/models/sound.py:277 msgid "title" msgstr "titre" @@ -253,125 +253,117 @@ msgstr "statut" msgid "cover" msgstr "couverture" -#: aircox/models/page.py:111 aircox/models/page.py:300 +#: aircox/models/page.py:111 aircox/models/page.py:303 msgid "content" msgstr "contenu" -#: aircox/models/page.py:205 +#: aircox/models/page.py:208 msgid "category" msgstr "catégorie" -#: aircox/models/page.py:210 +#: aircox/models/page.py:213 msgid "publication date" msgstr "date de publication" -#: aircox/models/page.py:212 +#: aircox/models/page.py:215 msgid "featured" msgstr "en avant" -#: aircox/models/page.py:216 +#: aircox/models/page.py:219 msgid "allow comments" msgstr "autoriser les commentaires" -#: aircox/models/page.py:240 +#: aircox/models/page.py:243 msgid "Publication" msgstr "Publication" -#: aircox/models/page.py:241 +#: aircox/models/page.py:244 msgid "Publications" msgstr "Publications" -#: aircox/models/page.py:261 -#, fuzzy -#| msgid "Home page" +#: aircox/models/page.py:264 msgid "Home Page" msgstr "Page d'accueil" -#: aircox/models/page.py:262 -#, fuzzy -#| msgid "Timestamp" +#: aircox/models/page.py:265 msgid "Timetable" msgstr "Temps" -#: aircox/models/page.py:263 +#: aircox/models/page.py:266 msgid "Programs list" msgstr "Liste des émissions" -#: aircox/models/page.py:264 +#: aircox/models/page.py:267 msgid "Episodes list" msgstr "Liste des épisodes" -#: aircox/models/page.py:265 +#: aircox/models/page.py:268 msgid "Articles list" msgstr "Liste des articles" -#: aircox/models/page.py:266 -#, fuzzy -#| msgid "Publications" +#: aircox/models/page.py:269 msgid "Publications list" msgstr "Publications" -#: aircox/models/page.py:267 -#, fuzzy -#| msgid "Podcasts" +#: aircox/models/page.py:270 msgid "Podcasts list" msgstr "Podcasts" -#: aircox/models/page.py:270 +#: aircox/models/page.py:273 msgid "attach to" msgstr "attacher à" -#: aircox/models/page.py:275 +#: aircox/models/page.py:278 msgid "display this page content to related element" msgstr "Afficher le contenu de cette page pour l'élément sélectionné" -#: aircox/models/page.py:293 +#: aircox/models/page.py:296 msgid "related page" msgstr "page liée" -#: aircox/models/page.py:297 +#: aircox/models/page.py:300 msgid "nickname" msgstr "pseudo" -#: aircox/models/page.py:298 +#: aircox/models/page.py:301 msgid "email" msgstr "email" -#: aircox/models/page.py:313 +#: aircox/models/page.py:316 msgid "Comment" msgstr "Commentaire" -#: aircox/models/page.py:314 aircox/templates/aircox/page_detail.html:59 +#: aircox/models/page.py:317 aircox/templates/aircox/page_detail.html:60 msgid "Comments" msgstr "Commentaires" -#: aircox/models/page.py:321 +#: aircox/models/page.py:324 msgid "menu" msgstr "menu" -#: aircox/models/page.py:322 aircox/models/sound.py:115 +#: aircox/models/page.py:325 aircox/models/sound.py:115 #: aircox/models/sound.py:267 msgid "order" msgstr "ordre" -#: aircox/models/page.py:324 +#: aircox/models/page.py:327 msgid "url" msgstr "url" -#: aircox/models/page.py:329 +#: aircox/models/page.py:332 msgid "page" msgstr "page" -#: aircox/models/page.py:335 +#: aircox/models/page.py:338 msgid "Menu item" msgstr "Élément du menu" -#: aircox/models/page.py:336 +#: aircox/models/page.py:339 msgid "Menu items" msgstr "Éléments de menu" #: aircox/models/program.py:52 aircox/models/station.py:48 -#: aircox/models/station.py:157 +#: aircox/models/station.py:161 msgid "active" msgstr "actif" @@ -533,7 +525,7 @@ msgstr "émission apparentée à celui-ci" msgid "position in the playlist" msgstr "position dans la playlist" -#: aircox/models/sound.py:125 aircox/models/station.py:151 +#: aircox/models/sound.py:125 aircox/models/station.py:155 msgid "file" msgstr "fichier" @@ -666,27 +658,35 @@ msgstr "" msgid "Default pages' cover" msgstr "Couverture par défault des pages." -#: aircox/models/station.py:133 +#: aircox/models/station.py:80 +msgid "Music stream's title" +msgstr "Titre du flux musical" + +#: aircox/models/station.py:81 +msgid "Music stream" +msgstr "Flux musical" + +#: aircox/models/station.py:137 msgid "input" msgstr "entrée" -#: aircox/models/station.py:134 +#: aircox/models/station.py:138 msgid "output" msgstr "sortie" -#: aircox/models/station.py:155 +#: aircox/models/station.py:159 msgid "direction" msgstr "direction" -#: aircox/models/station.py:157 +#: aircox/models/station.py:161 msgid "this port is active" msgstr "ce port est actif" -#: aircox/models/station.py:159 +#: aircox/models/station.py:163 msgid "port settings" msgstr "paramètres du port" -#: aircox/models/station.py:161 +#: aircox/models/station.py:165 msgid "" "list of comma separated params available; this is put in the output config " "file as raw code; plugin related" @@ -757,7 +757,7 @@ msgid "Total" msgstr "Total" #: aircox/templates/admin/base.html:72 aircox/templates/admin/index.html:12 -#: aircox/templates/aircox/home.html:48 +#: aircox/templates/aircox/home.html:51 msgid "Today" msgstr "Aujourd'hui" @@ -817,24 +817,9 @@ msgstr "Dernières publications" msgid "Administration" msgstr "Administration" -#. Translators: in page detail sidebar -#: aircox/templates/aircox/article_detail.html:12 -msgid "Latest news" -msgstr "Dernières nouvelles" - -#: aircox/templates/aircox/article_detail.html:23 -msgid "Show all news" -msgstr "Afficher toutes les nouvelles" - -#: aircox/templates/aircox/article_detail.html:24 -msgid "More news" -msgstr "Plus de nouvelles" - #: aircox/templates/aircox/base.html:61 -#, fuzzy -#| msgid "menu" msgid "Main menu" -msgstr "menu" +msgstr "Menu principal" #: aircox/templates/aircox/base.html:71 msgid "Admin" @@ -853,8 +838,8 @@ msgstr "pagination" msgid "Previous" msgstr "Précédent" -#: aircox/templates/aircox/basepage_list.html:53 -#: aircox/templates/aircox/basepage_list.html:54 +#: aircox/templates/aircox/basepage_list.html:57 +#: aircox/templates/aircox/basepage_list.html:58 msgid "Next" msgstr "Prochain" @@ -863,17 +848,17 @@ msgstr "Prochain" msgid "This week on %(station)s" msgstr "Cette semaine sur %(station)s" -#: aircox/templates/aircox/episode_detail.html:17 +#: aircox/templates/aircox/episode_detail.html:16 #: aircox/templates/aircox/episode_list.html:8 msgid "Podcasts" msgstr "Podcasts" -#: aircox/templates/aircox/episode_detail.html:35 +#: aircox/templates/aircox/episode_detail.html:34 #: aircox/templatetags/aircox_admin.py:48 msgid "Artist" msgstr "Artiste" -#: aircox/templates/aircox/episode_detail.html:36 +#: aircox/templates/aircox/episode_detail.html:35 #: aircox/templatetags/aircox_admin.py:50 msgid "Title" msgstr "Titre" @@ -915,35 +900,30 @@ msgstr "Si vous êtes un visiteur ou visiteuse, contactez votre radio favorite" msgid "Today on %(station)s" msgstr "Aujourd'hui sur %(station)s" -#: aircox/templates/aircox/home.html:40 +#: aircox/templates/aircox/home.html:42 msgid "It just happened" msgstr "Ça vient juste d'arriver" -#: aircox/templates/aircox/home.html:47 +#: aircox/templates/aircox/home.html:50 msgid "Show all program's for today" msgstr "Tous les articles de l'émission" -#: aircox/templates/aircox/home.html:57 +#: aircox/templates/aircox/home.html:60 msgid "Last podcasts" msgstr "Derniers Podcasts" -#: aircox/templates/aircox/home.html:58 +#: aircox/templates/aircox/home.html:61 msgid "All podcasts" msgstr "Tous les podcasts" -#: aircox/templates/aircox/home.html:64 +#: aircox/templates/aircox/home.html:67 msgid "Last publications" msgstr "Dernières publications" -#: aircox/templates/aircox/home.html:65 +#: aircox/templates/aircox/home.html:68 msgid "All publications" msgstr "Toutes les publications" -#: aircox/templates/aircox/log_list.html:9 -#, python-format -msgid "That happened on %(station)s" -msgstr "C'est passé sur %(station)s" - #: aircox/templates/aircox/page_detail.html:21 msgid "Edit" msgstr "Éditer" @@ -953,11 +933,11 @@ msgstr "Éditer" msgid "Related %(models)s" msgstr "%(models)s connexes" -#: aircox/templates/aircox/page_detail.html:71 +#: aircox/templates/aircox/page_detail.html:72 msgid "Post a comment" msgstr "Poster un commentaire" -#: aircox/templates/aircox/page_detail.html:98 +#: aircox/templates/aircox/page_detail.html:99 msgid "Post comment" msgstr "Commenter" @@ -971,24 +951,18 @@ msgid "Rerun" msgstr "Rediffusion" #: aircox/templates/aircox/program_detail.html:41 -#, fuzzy -#| msgid "Episodes" msgid "Last Episodes" -msgstr "Épisodes" +msgstr "Derniers Épisodes" #: aircox/templates/aircox/program_detail.html:42 msgid "All episodes" msgstr "Tous les épisodes" #: aircox/templates/aircox/program_detail.html:49 -#, fuzzy -#| msgid "Articles" msgid "Last Articles" msgstr "Derniers articles" #: aircox/templates/aircox/program_detail.html:50 -#, fuzzy -#| msgid "Articles" msgid "All articles" msgstr "Tous les articles" @@ -1019,8 +993,6 @@ msgid "Dates" msgstr "Dates" #: aircox/templates/aircox/widgets/dates_menu.html:33 -#, fuzzy -#| msgid "pick a date" msgid "Pick a date" msgstr "Choisir une date" @@ -1036,6 +1008,10 @@ msgstr "Diffusion différée" msgid "Listen" msgstr "Écouter" +#: aircox/templates/aircox/widgets/page.html:40 +msgid "Show" +msgstr "Voir" + #: aircox/templates/aircox/widgets/page_list.html:20 msgid "Show all publications" msgstr "Afficher toutes les publications" @@ -1060,11 +1036,11 @@ msgstr "Lire ou suspendre l'audio" msgid "Track currently on air" msgstr "Morceau en ce moment sur les ondes" -#: aircox/templates/aircox/widgets/player.html:42 +#: aircox/templates/aircox/widgets/player.html:44 msgid "Diffusion currently on air" msgstr "Épisode en ce moment sur les ondes" -#: aircox/templates/aircox/widgets/player.html:46 +#: aircox/templates/aircox/widgets/player.html:48 msgid "Currently playing" msgstr "En ce moment" @@ -1101,104 +1077,115 @@ msgid "Timestamp" msgstr "Temps" #: aircox/urls.py:44 -msgid "articles/" -msgstr "articles/" - -#: aircox/urls.py:49 -msgid "articles/c//" -msgstr "articles//" - -#: aircox/urls.py:52 msgid "articles//" msgstr "articles//" -#: aircox/urls.py:57 -msgid "programs/episodes/" -msgstr "emissions/episodes/" +#: aircox/urls.py:49 +msgid "articles/" +msgstr "articles/" -#: aircox/urls.py:58 -msgid "programs/episodes/c//" -msgstr "emissions/episodes/c//" +#: aircox/urls.py:54 +msgid "articles/c//" +msgstr "articles//" -#: aircox/urls.py:60 -msgid "programs/episodes//" -msgstr "emissions/episodes//" - -#: aircox/urls.py:64 -msgid "podcasts/" -msgstr "podcasts/" - -#: aircox/urls.py:65 -msgid "podcasts/c//" -msgstr "podcasts/c//" - -#: aircox/urls.py:68 +#: aircox/urls.py:59 msgid "timetable/" msgstr "grille/" -#: aircox/urls.py:70 +#: aircox/urls.py:61 msgid "timetable//" msgstr "grille//" -#: aircox/urls.py:76 +#: aircox/urls.py:67 msgid "publications/" msgstr "publications/" -#: aircox/urls.py:81 -#, fuzzy -#| msgid "publications/c//" +#: aircox/urls.py:72 msgid "publications/c/" msgstr "publications/c//" -#: aircox/urls.py:86 -msgid "pages/" -msgstr "pages/" - -#: aircox/urls.py:94 +#: aircox/urls.py:77 msgid "pages//" msgstr "pages//" -#: aircox/urls.py:102 +#: aircox/urls.py:85 +msgid "pages/" +msgstr "pages/" + +#: aircox/urls.py:93 msgid "programs/" msgstr "emissions/" -#: aircox/urls.py:103 +#: aircox/urls.py:94 msgid "programs/c//" msgstr "emissions/c//" -#: aircox/urls.py:105 -msgid "programs//" -msgstr "emissions//" +#: aircox/urls.py:96 +msgid "programs/" +msgstr "emissions/" -#: aircox/urls.py:109 -msgid "programs//articles/" -msgstr "emissions//articles/" +#: aircox/urls.py:100 +msgid "programs//articles" +msgstr "emissions//articles" + +#: aircox/urls.py:101 +msgid "programs//podcasts" +msgstr "emissions//podcasts" + +#: aircox/urls.py:102 +msgid "programs//episodes" +msgstr "emissions//episodes" + +#: aircox/urls.py:103 +msgid "programs//diffusions" +msgstr "emissions//diffusions" + +#: aircox/urls.py:105 +msgid "programs//publications" +msgstr "emissions//publications" #: aircox/urls.py:110 -msgid "programs//podcasts/" -msgstr "emissions//episodes/" +msgid "programs/episodes/" +msgstr "emissions/episodes/" #: aircox/urls.py:111 -msgid "programs//episodes/" -msgstr "emissions//episodes/" +msgid "programs/episodes/c/" +msgstr "emissions/episodes/c/" -#: aircox/urls.py:112 -msgid "programs//diffusions/" -msgstr "emissions//diffusions/" +#: aircox/urls.py:113 +msgid "programs/episodes/" +msgstr "emissions/episodes/" -#: aircox/urls.py:119 -msgid "programs//publications" -msgstr "emissions//publications/" +#: aircox/urls.py:117 +msgid "podcasts/" +msgstr "podcasts/" -#: aircox/views/page.py:69 +#: aircox/urls.py:118 +msgid "podcasts/c//" +msgstr "podcasts/c//" + +#: aircox/views/page.py:75 #, python-brace-format msgid "{model}" msgstr "{model}" -#: aircox/views/page.py:192 +#: aircox/views/page.py:180 msgid "comments are not allowed" msgstr "les commentaires ne sont pas autorisés" +#~ msgid "Latest news" +#~ msgstr "Dernières nouvelles" + +#~ msgid "Show all news" +#~ msgstr "Afficher toutes les nouvelles" + +#~ msgid "More news" +#~ msgstr "Plus de nouvelles" + +#, python-format +#~ msgid "That happened on %(station)s" +#~ msgstr "C'est passé sur %(station)s" + #~ msgid "Diffusions page" #~ msgstr "Grille horaire" diff --git a/aircox/migrations/0019_station_program_streams_title_and_more.py b/aircox/migrations/0019_station_program_streams_title_and_more.py new file mode 100644 index 0000000..20886b4 --- /dev/null +++ b/aircox/migrations/0019_station_program_streams_title_and_more.py @@ -0,0 +1,42 @@ +# Generated by Django 4.2.1 on 2024-02-01 18:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("aircox", "0018_alter_staticpage_attach_to"), + ] + + operations = [ + migrations.AddField( + model_name="station", + name="music_stream_title", + field=models.CharField( + default="Music stream", + max_length=64, + verbose_name="Music stream's title", + ), + ), + migrations.AlterField( + model_name="staticpage", + name="attach_to", + field=models.CharField( + blank=True, + choices=[ + ("", "None"), + ("home", "Home Page"), + ("timetable-list", "Timetable"), + ("program-list", "Programs list"), + ("episode-list", "Episodes list"), + ("article-list", "Articles list"), + ("page-list", "Publications list"), + ("podcast-list", "Podcasts list"), + ], + help_text="display this page content to related element", + max_length=32, + null=True, + verbose_name="attach to", + ), + ), + ] diff --git a/aircox/models/station.py b/aircox/models/station.py index da31d40..41921fb 100644 --- a/aircox/models/station.py +++ b/aircox/models/station.py @@ -67,7 +67,7 @@ class Station(models.Model): max_length=2048, null=True, blank=True, - help_text=_("Audio streams urls used by station's player. One url " "a line."), + help_text=_("Audio streams urls used by station's player. One url a line."), ) default_cover = FilerImageField( on_delete=models.SET_NULL, @@ -76,6 +76,11 @@ class Station(models.Model): blank=True, related_name="+", ) + music_stream_title = models.CharField( + _("Music stream's title"), + max_length=64, + default=_("Music stream"), + ) objects = StationQuerySet.as_manager() diff --git a/aircox/static/aircox/css/admin.css b/aircox/static/aircox/css/admin.css index 2e1801c..c9d9a86 100644 --- a/aircox/static/aircox/css/admin.css +++ b/aircox/static/aircox/css/admin.css @@ -170,13 +170,14 @@ } .preview-cover { - background-color: var(--preview-bg); + background: var(--preview-bg); background-size: cover; background-repeat: no-repeat; height: var(--cover-h); max-width: calc(var(--cover-w) * 1.5); min-width: var(--cover-w); overflow: hidden; + border: 1px #c4c4c4 solid; } .preview-cover img { height: var(--cover-h); @@ -240,24 +241,20 @@ text-align: right; min-width: 9rem; } -.list-item .media { - flex-grow: 1; -} .list-item .media-content { - display: flex; - flex-direction: column; height: 100%; margin-bottom: unset; } -.list-item .media-content .content { - flex-grow: 1; -} .list-item:not(.no-cover) .list-item .media-content { min-height: var(--preview-cover-small-size); } .list-item .actions { text-align: right; } +.list-item:not(.wide) .media { + padding: 0.6rem; + border: 1px solid var(--break-color) !important; +} @media screen and (max-width: 400px) { .list-item .headings { @@ -313,7 +310,6 @@ } .preview-card .card-content figure { box-shadow: 0em 0em 1em rgba(0, 0, 0, 0.2); - border: 1px #c4c4c4 solid; height: var(--cover-h); width: var(--cover-w); } diff --git a/aircox/static/aircox/css/chunk-common.css b/aircox/static/aircox/css/chunk-common.css index 32e77a5..4b1035b 100644 --- a/aircox/static/aircox/css/chunk-common.css +++ b/aircox/static/aircox/css/chunk-common.css @@ -6850,10 +6850,24 @@ a.tag:hover { margin-top: auto !important; } +.flex-row { + display: flex; + flex-direction: row; +} + +.flex-column { + display: flex; + flex-direction: column; +} + .flex-grow-0 { flex-grow: 0 !important; } +.flex-grow-1 { + flex-grow: 1 !important; +} + .float-right { float: right; } @@ -6973,7 +6987,7 @@ input.half-field:not(:active):not(:hover) { --body-bg: #fff; --text-color: black; --text-color-light: #555; - --break-color: rgb(245, 245, 245); + --break-color: rgb(225, 225, 225); --main-color: #EFCA08; --main-color-light: #F4da51; --main-color-dark: #F49F0A; diff --git a/aircox/static/aircox/css/public.css b/aircox/static/aircox/css/public.css index 34a9786..4bb6009 100644 --- a/aircox/static/aircox/css/public.css +++ b/aircox/static/aircox/css/public.css @@ -170,13 +170,14 @@ } .preview-cover { - background-color: var(--preview-bg); + background: var(--preview-bg); background-size: cover; background-repeat: no-repeat; height: var(--cover-h); max-width: calc(var(--cover-w) * 1.5); min-width: var(--cover-w); overflow: hidden; + border: 1px #c4c4c4 solid; } .preview-cover img { height: var(--cover-h); @@ -240,24 +241,20 @@ text-align: right; min-width: 9rem; } -.list-item .media { - flex-grow: 1; -} .list-item .media-content { - display: flex; - flex-direction: column; height: 100%; margin-bottom: unset; } -.list-item .media-content .content { - flex-grow: 1; -} .list-item:not(.no-cover) .list-item .media-content { min-height: var(--preview-cover-small-size); } .list-item .actions { text-align: right; } +.list-item:not(.wide) .media { + padding: 0.6rem; + border: 1px solid var(--break-color) !important; +} @media screen and (max-width: 400px) { .list-item .headings { @@ -313,7 +310,6 @@ } .preview-card .card-content figure { box-shadow: 0em 0em 1em rgba(0, 0, 0, 0.2); - border: 1px #c4c4c4 solid; height: var(--cover-h); width: var(--cover-w); } @@ -7435,17 +7431,18 @@ a.tag:hover { .actions.no-label label { display: none; } -.actions button, .actions .action { +.actions button, .actions .action, .actions a { justify-content: center; min-width: 2rem; + padding: 0.4rem; } -.actions button .not-selected, .actions .action .not-selected { +.actions button .not-selected, .actions .action .not-selected, .actions a .not-selected { opacity: 0.6; } -.actions button .icon, .actions .action .icon { +.actions button .icon, .actions .action .icon, .actions a .icon { margin: 0em !important; } -.actions button label, .actions .action label { +.actions button label, .actions .action label, .actions a label { margin-left: 0.4rem; } @@ -7710,15 +7707,11 @@ nav li a, nav li .button { margin-right: 0.4rem; color: var(--secondary-color-dark); } -.list-item:nth-child(3n):not(.wide) .media, .list-item.logs:nth-child(3n):not(.wide) { - padding: 0.6rem; - border-radius: 0.4rem; - border: 1px solid var(--main-color-dark) !important; +.list-item:nth-child(3n):not(.wide) .media { + border-color: var(--main-color-dark) !important; } -.list-item:nth-child(3n+1):not(.wide) .media, .list-item.logs:nth-child(3n+1):not(.wide) { - padding: 0.6rem; - border-radius: 0.4rem; - border: 1px solid var(--secondary-color-dark) !important; +.list-item:nth-child(3n+1):not(.wide) .media { + border-color: var(--secondary-color-dark) !important; } body { diff --git a/aircox/templates/aircox/widgets/item.html b/aircox/templates/aircox/widgets/item.html index f986aec..079e8f1 100644 --- a/aircox/templates/aircox/widgets/item.html +++ b/aircox/templates/aircox/widgets/item.html @@ -22,8 +22,8 @@ style="background-image: url({{ object.cover.url }})"> {% endif %} -
-
+
+
{% block content %} {% if content and with_content %} {% autoescape off %} diff --git a/aircox/templates/aircox/widgets/logs.html b/aircox/templates/aircox/widgets/logs.html index adaf4ff..632bf64 100644 --- a/aircox/templates/aircox/widgets/logs.html +++ b/aircox/templates/aircox/widgets/logs.html @@ -14,8 +14,16 @@ Context: {% elif object|is_log %} {% include "./track_item.html" with object=object.track log=object timetable=True %} {% else %} -
-
+
+
+ + + + + {{ station.music_stream_title }} + +
+
{% for obj in object %} {% include "./track_item.html" with object=obj.track log=obj timetable=True %} {% endfor %} diff --git a/aircox/templates/aircox/widgets/page.html b/aircox/templates/aircox/widgets/page.html index 99d1db9..2285821 100644 --- a/aircox/templates/aircox/widgets/page.html +++ b/aircox/templates/aircox/widgets/page.html @@ -33,7 +33,11 @@ {{ block.super }} {{ object.display_headline }} {% endif %} -{% if url %} +{% endblock %} + +{% block actions %} +{% if url and "card" not in widget_template %} {% translate "Show" %} {% endif %} +{{ block.super }} {% endblock %} diff --git a/aircox/urls.py b/aircox/urls.py index dac23de..f23c7d0 100755 --- a/aircox/urls.py +++ b/aircox/urls.py @@ -93,7 +93,7 @@ urls = [ path(_("programs/"), views.ProgramListView.as_view(), name="program-list"), path(_("programs/c//"), views.ProgramListView.as_view(), name="program-list"), path( - _("programs//"), + _("programs/"), views.ProgramDetailView.as_view(), name="program-detail", ), @@ -110,7 +110,7 @@ urls = [ path(_("programs/episodes/"), views.EpisodeListView.as_view(), name="episode-list"), path(_("programs/episodes/c/"), views.EpisodeListView.as_view(), name="episode-list"), path( - _("programs/episodes//"), + _("programs/episodes/"), views.EpisodeDetailView.as_view(), name="episode-detail", ), diff --git a/assets/src/assets/common.scss b/assets/src/assets/common.scss index 5ec85fb..4b67258 100644 --- a/assets/src/assets/common.scss +++ b/assets/src/assets/common.scss @@ -16,7 +16,7 @@ input.half-field:not(:active):not(:hover) { --body-bg: #fff; --text-color: black; --text-color-light: #555; - --break-color: rgb(245, 245, 245); + --break-color: rgb(225, 225, 225); --main-color: #EFCA08; --main-color-light: #F4da51; diff --git a/assets/src/assets/components.scss b/assets/src/assets/components.scss index cabe3f6..75805a5 100644 --- a/assets/src/assets/components.scss +++ b/assets/src/assets/components.scss @@ -266,13 +266,14 @@ .preview-cover { - background-color: var(--preview-bg); + background: var(--preview-bg); background-size: cover; background-repeat: no-repeat; height: var(--cover-h); max-width: calc( var(--cover-w) * 1.5 ); min-width: var(--cover-w); overflow: hidden; + border: 1px #c4c4c4 solid; img { height: var(--cover-h); @@ -350,29 +351,24 @@ min-width: 9rem; } - .media { - flex-grow: 1; - } - .media-content { - display: flex; - flex-direction: column; height: 100%; margin-bottom: unset; - .content { - flex-grow: 1; - } - .list-item:not(.no-cover) & { min-height: var(--preview-cover-small-size); } - } .actions { text-align: right; } + + &:not(.wide) .media { + padding: v.$mp-3; + // border-radius: v.$mp-2; + border: 1px solid var(--break-color) !important; + } } @media screen and (max-width: v.$screen-very-small) { @@ -448,7 +444,6 @@ figure { box-shadow: 0em 0em 1em rgba(0, 0, 0, 0.2); - border: 1px #c4c4c4 solid; height: var(--cover-h); width: var(--cover-w); } diff --git a/assets/src/assets/helpers.scss b/assets/src/assets/helpers.scss index 4e5b028..c646e3c 100644 --- a/assets/src/assets/helpers.scss +++ b/assets/src/assets/helpers.scss @@ -13,7 +13,11 @@ .push-right, .flex-push-right { margin-left: auto !important; } .push-bottom { margin-top: auto !important; } + +.flex-row { display: flex; flex-direction: row } +.flex-column { display: flex; flex-direction: column } .flex-grow-0 { flex-grow: 0 !important; } +.flex-grow-1 { flex-grow: 1 !important; } .float-right { float: right } .float-left { float: left } diff --git a/assets/src/assets/public.scss b/assets/src/assets/public.scss index 5cb9d8c..e5f5d11 100644 --- a/assets/src/assets/public.scss +++ b/assets/src/assets/public.scss @@ -81,9 +81,10 @@ display: none; } - button, .action { + button, .action, a { justify-content: center; min-width: 2rem; + padding: v.$mp-2; .not-selected { opacity: 0.6; } .icon { margin: 0em !important; } @@ -423,19 +424,13 @@ nav li { } &:nth-child(3n):not(.wide) .media, - &.logs:nth-child(3n):not(.wide) { - padding: v.$mp-3; - border-radius: v.$mp-2; - border: 1px solid var(--main-color-dark) !important; + border-color: var(--main-color-dark) !important; } &:nth-child(3n+1):not(.wide) .media, - &.logs:nth-child(3n+1):not(.wide) { - padding: v.$mp-3; - border-radius: v.$mp-2; - border: 1px solid var(--secondary-color-dark) !important; + border-color: var(--secondary-color-dark) !important; } }