From 91be299c429d744490d867483f3c729c342fcc7c Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Tue, 4 Oct 2022 10:16:09 +0200 Subject: [PATCH] . --- app/Http/Controllers/FrontController.php | 31 ++++++++- app/Models/Collection.php | 8 ++- app/Models/Song.php | 8 ++- config/session.php | 2 +- dockerterminal.bat | 2 +- resources/css/app.sass | 37 ++++++++++- resources/js/mmenu.js | 35 +++++----- resources/js/player.js | 6 +- resources/views/collection.blade.php | 2 +- resources/views/header.blade.php | 26 +++++--- resources/views/layout.blade.php | 12 ++-- resources/views/login.blade.php | 17 +++++ resources/views/menu.blade.php | 82 +++++++++++++----------- resources/views/song.blade.php | 2 +- resources/views/welcome.blade.php | 2 +- routes/web.php | 6 +- 16 files changed, 197 insertions(+), 81 deletions(-) create mode 100644 resources/views/login.blade.php diff --git a/app/Http/Controllers/FrontController.php b/app/Http/Controllers/FrontController.php index ba72d9d..362a952 100644 --- a/app/Http/Controllers/FrontController.php +++ b/app/Http/Controllers/FrontController.php @@ -6,6 +6,7 @@ use App\Models\Collection; use App\Models\CollectionList; use App\Models\Song; use Cubist\Backpack\Http\Controllers\CubistPWAController; +use Illuminate\Support\Facades\Session; class FrontController extends Controller @@ -18,14 +19,35 @@ class FrontController extends Controller public function collection($name) { $collection = Collection::where('slug', $name)->first(); - if (null === $collection) { return self::defaultCollection(); } + if ($p = $this->checkPassword($collection)) { + return $p; + } $lists = CollectionList::where('collection', $collection->id)->get(); $songs = $this->_getSongsOfCollection($collection->id, $lists); - return view('collection', ['songs' => $songs, 'collection' => $collection, 'collection_songs' => $songs, 'collection_lists' => $lists]); + return view('collection', ['menu' => true, 'songs' => $songs, 'collection' => $collection, 'collection_songs' => $songs, 'collection_lists' => $lists]); + } + + public function checkPassword(Collection $collection) + { + if (!$collection->password) { + return false; + } + $error = false; + if (request()->has('password')) { + if (request('password') === $collection->password) { + Session::put('loggedin-' . $collection->id, '1'); + } else { + $error = true; + } + } + if (Session::get('loggedin-' . $collection->id, '0') == '1') { + return false; + } + return view('login', ['menu' => false, 'collection' => $collection, 'error' => $error]); } public function song($collection, $song) @@ -38,8 +60,11 @@ class FrontController extends Controller if (null === $song) { abort(404); } + if ($p = $this->checkPassword($collection)) { + return $p; + } $lists = CollectionList::where('collection', $collection->id)->get(); - return view('song', ['song' => $song, 'collection' => $collection, 'collection_songs' => $this->_getSongsOfCollection($collection->id, $lists), 'collection_lists' => $lists]); + return view('song', ['menu' => true, 'song' => $song, 'collection' => $collection, 'collection_songs' => $this->_getSongsOfCollection($collection->id, $lists), 'collection_lists' => $lists]); } protected function _getSongsOfCollection($id, $lists) diff --git a/app/Models/Collection.php b/app/Models/Collection.php index 1b2b150..7af371a 100644 --- a/app/Models/Collection.php +++ b/app/Models/Collection.php @@ -3,10 +3,12 @@ namespace App\Models; use Cubist\Backpack\Http\Controllers\CubistPWAController; +use Cubist\Backpack\Magic\Fields\Checkbox; use Cubist\Backpack\Magic\Fields\Color; use Cubist\Backpack\Magic\Fields\Images; use Cubist\Backpack\Magic\Fields\Slug; use Cubist\Backpack\Magic\Fields\Table; +use Cubist\Backpack\Magic\Fields\Text; use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel; use Spatie\MediaLibrary\MediaCollections\Models\Media; @@ -17,7 +19,8 @@ class Collection extends CubistMagicAbstractModel 'singular' => 'collection', 'plural' => 'collections']; - public function setFields() + + public function setfields() { parent::setFields(); $this->addField('name', 'Text', 'Name', ['column' => true]); @@ -26,6 +29,9 @@ class Collection extends CubistMagicAbstractModel $this->addField('icon', Images::class, 'Icône'); $this->addField('theme_color', Color::class, 'Couleur d\'accentuation'); $this->addField('splashscreen_color', Color::class, 'Couleur de fond du splashscreen'); + $this->addField('password', Text::class, 'Mot de passe', ['hint' => 'Laisser vide pour désactiver']); + $this->addField('transpose', Checkbox::class, 'Activer la transposition', ['default' => true, 'database_default' => true]); + $this->addField('download_assets', Checkbox::class, 'Activer le téléchargement', ['default' => false, 'database_default' => false]); } public function registerMediaConversions(Media $media = null): void diff --git a/app/Models/Song.php b/app/Models/Song.php index bffb0c4..40ac554 100644 --- a/app/Models/Song.php +++ b/app/Models/Song.php @@ -10,6 +10,9 @@ use App\Jobs\DownloadAudioTracks; use App\SubForm\AudioTrack; use App\SubForm\SongPortion; use Cubist\Backpack\Magic\Fields\BunchOfFieldsMultiple; +use Cubist\Backpack\Magic\Fields\Checkbox; +use Cubist\Backpack\Magic\Fields\Files; +use Cubist\Backpack\Magic\Fields\SelectFromArray; use Cubist\Backpack\Magic\Fields\SelectFromModel; use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel; @@ -36,10 +39,13 @@ class Song extends CubistMagicAbstractModel $this->addField('artist', 'Text', 'Artist', ['column' => true]); $this->addField('key', Tone::class, 'Key', ['column' => true]); $this->addField('mode', Mode::class, 'Mode', ['column' => true]); + $this->addField('chorale', Checkbox::class, 'Chorale', ['default' => false, 'database_default' => false]); $this->addField('collections', \App\Field\CollectionList::class, 'Collections'); $this->addField('tempo', Tempo::class, 'Suggested tempo', ['column' => true, 'default' => 80]); - $this->addField('lyrics', BunchOfFieldsMultiple::class, 'Song Parts', ['bunch' => SongPortion::class, 'new_label' => 'New song part']); + $this->addField('partition', Files::class, 'Partition', ['acceptedFiles' => '*.pdf', 'when' => ['chorale' => 1]]); + $this->addField('lyrics_doc', Files::class, 'Paroles', ['acceptedFiles' => '*.doc', 'when' => ['chorale' => 1]]); $this->addField('audio', BunchOfFieldsMultiple::class, 'Audio tracks', ['bunch' => AudioTrack::class, 'new_label' => 'New audio track']); + $this->addField('lyrics', BunchOfFieldsMultiple::class, 'Song Parts', ['bunch' => SongPortion::class, 'new_label' => 'New song part', 'when' => ['chorale' => 0]]); // $this->addField('youtube', URL::class, 'Youtube link'); // $this->addField('spotify', URL::class, 'Spotify link'); // $this->addField('credits', 'Textarea', 'Credits'); diff --git a/config/session.php b/config/session.php index 857ebc3..bbc4ab1 100644 --- a/config/session.php +++ b/config/session.php @@ -31,7 +31,7 @@ return [ | */ - 'lifetime' => env('SESSION_LIFETIME', 120), + 'lifetime' => env('SESSION_LIFETIME', 525600), 'expire_on_close' => false, diff --git a/dockerterminal.bat b/dockerterminal.bat index 10b6bb7..9c94b63 100644 --- a/dockerterminal.bat +++ b/dockerterminal.bat @@ -1,3 +1,3 @@ @echo off cls -C:\tools\cygwin\bin\ssh.exe -t root@192.168.13.7 'docker exec -it songbook /bin/bash' +C:\tools\cygwin\bin\ssh.exe -t root@her2.cubedesigners.com 'docker exec -it songbook /bin/bash' diff --git a/resources/css/app.sass b/resources/css/app.sass index 7de1fec..748bac4 100644 --- a/resources/css/app.sass +++ b/resources/css/app.sass @@ -42,13 +42,15 @@ font-weight: 700 src: url('fonts/roboto-condensed-700.woff2') format('woff2') +$slab: 'Roboto Slab', sans-serif + * margin: 0 padding: 0 box-sizing: border-box h1, h2, h3, h4, h5, h6 - font-family: 'Roboto Slab', sans-serif + font-family: $slab font-weight: 500 a @@ -317,6 +319,10 @@ header right: 0 z-index: 100 + &.nomenu + .placeholder + padding: 10px + @media print position: absolute @@ -451,5 +457,34 @@ header bottom: 0 left: 0 +form + .error + text-align: center + padding: 20px 0 0 0 + color: #cc0000 + + input + display: block + margin: 25px auto + width: 100% + max-width: 400px + text-align: center + border-radius: 5px + border: 0 + padding: 15px + font-size: 16px + font-weight: 500 + font-family: $slab + + input[type=password] + text-align: left + outline-color: var(--theme-color) + + input[type=submit] + background-color: var(--theme-color) + color: #fff + cursor: pointer + + @import "../../node_modules/mmenu-light/dist/mmenu-light.css" @import "../../node_modules/plyr/dist/plyr.css" diff --git a/resources/js/mmenu.js b/resources/js/mmenu.js index 13d3a41..af36d08 100644 --- a/resources/js/mmenu.js +++ b/resources/js/mmenu.js @@ -4,27 +4,30 @@ import Switch from "weatherstar-switch"; document.addEventListener("DOMContentLoaded", () => { var darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; - const menu = new MmenuLight(document.querySelector("#menu")); + if ($('#menu').length > 0) { + const menu = new MmenuLight(document.querySelector("#menu")); - const navigator = menu.navigation({theme: darkMode ? 'dark' : 'light'}); - const drawer = menu.offcanvas(); - document.querySelector('#menu-icon') - .addEventListener('click', (evnt) => { - evnt.preventDefault(); - drawer.open(); - }); + const navigator = menu.navigation({theme: darkMode ? 'dark' : 'light'}); + const drawer = menu.offcanvas(); + document.querySelector('#menu-icon') + .addEventListener('click', (evnt) => { + evnt.preventDefault(); + drawer.open(); + }); - var mc = new Hammer(document.getElementsByTagName('main').item(0), {touchAction: "auto"}) - mc.on('swiperight', function (e) { - if (e.distance > 100 && e.overallVelocityX > 0.4) { - drawer.open(); - return false; - } - return true; - }); + var mc = new Hammer(document.getElementsByTagName('main').item(0), {touchAction: "auto"}) + + mc.on('swiperight', function (e) { + if (e.distance > 100 && e.overallVelocityX > 0.4) { + drawer.open(); + return false; + } + return true; + }); + } $('body').addClass('init'); }); diff --git a/resources/js/player.js b/resources/js/player.js index 139dd45..37a9560 100644 --- a/resources/js/player.js +++ b/resources/js/player.js @@ -33,7 +33,11 @@ $(this).hide(); var audio = window.getOption('audio').toString(); - var tone = window.getOption('audio_' + audio + '_tone').toString(); + var t = window.getOption('audio_' + audio + '_tone'); + if (t === undefined) { + t = 0; + } + var tone = t.toString(); if (tone === 'undefined') { tone = '0'; } diff --git a/resources/views/collection.blade.php b/resources/views/collection.blade.php index f8769d6..7987749 100644 --- a/resources/views/collection.blade.php +++ b/resources/views/collection.blade.php @@ -2,7 +2,7 @@ @php $preload=[]; @endphp -@section('title', $collection->name.' Songbook') +@section('title', $collection->name) @section('content') @include('header',['title'=>$collection->name,'subtitle'=>'']) diff --git a/resources/views/header.blade.php b/resources/views/header.blade.php index 6e04ec1..5a0e5d9 100644 --- a/resources/views/header.blade.php +++ b/resources/views/header.blade.php @@ -1,16 +1,24 @@
-
+
- - - - - - - -

{{$title}}

+ @if($menu) + + + + + + + +

{{$title}}

+ @else +

{{$title}}

+ @endif + @if($subtitle)

{{$subtitle}}

@endif diff --git a/resources/views/layout.blade.php b/resources/views/layout.blade.php index 5485d26..11bf20e 100644 --- a/resources/views/layout.blade.php +++ b/resources/views/layout.blade.php @@ -1,5 +1,5 @@ @include('menu') - + @@ -46,10 +46,12 @@
@yield('content')
- -@yield('menu') +@if($menu) + + @yield('menu') +@endif