From 2bacd0ef0f8d6a75672a400ff41bfc6cd537b6b2 Mon Sep 17 00:00:00 2001 From: Louis Jeckel Date: Sat, 15 Aug 2020 19:11:46 +0200 Subject: [PATCH] poll creator --- .../Admin/AdCampaignController.php | 2 + app/Http/Controllers/Admin/PollController.php | 13 +++++++ app/Http/Controllers/PollController.php | 35 +++++++++++++++++ app/Http/Requests/Admin/PollRequest.php | 18 +++++++++ app/Models/Poll.php | 35 +++++++++++++++++ app/Models/Slugs/PollSlug.php | 10 +++++ app/PollEntry.php | 25 ++++++++++++ app/Repositories/PollRepository.php | 19 ++++++++++ config/twill-navigation.php | 9 ++++- config/twill.php | 20 ++++++++++ .../2020_08_15_154338_create_polls_tables.php | 38 +++++++++++++++++++ ...08_15_165307_create_poll_entries_table.php | 34 +++++++++++++++++ public/css/app.css | 14 +++++++ resources/sass/_polls.scss | 14 +++++++ resources/sass/app.scss | 1 + .../views/admin/blocks/poll_check.blade.php | 25 ++++++++++++ .../admin/blocks/poll_check_item.blade.php | 8 ++++ .../views/admin/blocks/poll_text.blade.php | 6 +++ resources/views/admin/polls/form.blade.php | 14 +++++++ resources/views/errors/403.blade.php | 18 ++++----- resources/views/home/index.blade.php | 9 +++++ resources/views/polls/show.blade.php | 17 +++++++++ .../views/site/blocks/poll_check.blade.php | 36 ++++++++++++++++++ .../site/blocks/poll_check_item.blade.php | 0 .../views/site/blocks/poll_text.blade.php | 7 ++++ routes/admin.php | 3 ++ routes/web.php | 5 ++- 27 files changed, 423 insertions(+), 12 deletions(-) create mode 100644 app/Http/Controllers/Admin/PollController.php create mode 100644 app/Http/Controllers/PollController.php create mode 100644 app/Http/Requests/Admin/PollRequest.php create mode 100644 app/Models/Poll.php create mode 100644 app/Models/Slugs/PollSlug.php create mode 100644 app/PollEntry.php create mode 100644 app/Repositories/PollRepository.php create mode 100644 database/migrations/2020_08_15_154338_create_polls_tables.php create mode 100644 database/migrations/2020_08_15_165307_create_poll_entries_table.php create mode 100644 resources/sass/_polls.scss create mode 100644 resources/views/admin/blocks/poll_check.blade.php create mode 100644 resources/views/admin/blocks/poll_check_item.blade.php create mode 100644 resources/views/admin/blocks/poll_text.blade.php create mode 100644 resources/views/admin/polls/form.blade.php create mode 100644 resources/views/polls/show.blade.php create mode 100644 resources/views/site/blocks/poll_check.blade.php create mode 100644 resources/views/site/blocks/poll_check_item.blade.php create mode 100644 resources/views/site/blocks/poll_text.blade.php diff --git a/app/Http/Controllers/Admin/AdCampaignController.php b/app/Http/Controllers/Admin/AdCampaignController.php index b1d192f..4d80a3e 100644 --- a/app/Http/Controllers/Admin/AdCampaignController.php +++ b/app/Http/Controllers/Admin/AdCampaignController.php @@ -8,6 +8,8 @@ class AdCampaignController extends ModuleController { protected $moduleName = 'adCampaigns'; + protected $permalinkBase = 'campagnes-et-communication'; + protected $indexOptions = [ // 'reorder' => true ]; diff --git a/app/Http/Controllers/Admin/PollController.php b/app/Http/Controllers/Admin/PollController.php new file mode 100644 index 0000000..beb95c3 --- /dev/null +++ b/app/Http/Controllers/Admin/PollController.php @@ -0,0 +1,13 @@ +forSlug($slug); + \View::share('poll', $poll); + return view('polls.show'); + } + + public function submit($slug, PollRepository $repository, Request $request) + { + /** @var Poll $poll */ + $poll = $repository->forSlug($slug); + $answers = $request->except('_token'); + + + $poll->entries()->create([ + 'ip_address' => implode(', ', $request->ips()), + 'answers' => $answers + ]); + + \Session::flash('message', 'Votre réponse à bien été enregistrée ! Merci.'); + + return redirect()->action('HomeController@index'); + + } +} diff --git a/app/Http/Requests/Admin/PollRequest.php b/app/Http/Requests/Admin/PollRequest.php new file mode 100644 index 0000000..a7edca5 --- /dev/null +++ b/app/Http/Requests/Admin/PollRequest.php @@ -0,0 +1,18 @@ +hasMany(PollEntry::class); + } + + +} diff --git a/app/Models/Slugs/PollSlug.php b/app/Models/Slugs/PollSlug.php new file mode 100644 index 0000000..73404f0 --- /dev/null +++ b/app/Models/Slugs/PollSlug.php @@ -0,0 +1,10 @@ + 'array' + ]; + + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function poll() + { + return $this->belongsTo(Poll::class); + } + + +} diff --git a/app/Repositories/PollRepository.php b/app/Repositories/PollRepository.php new file mode 100644 index 0000000..a3c1531 --- /dev/null +++ b/app/Repositories/PollRepository.php @@ -0,0 +1,19 @@ +model = $model; + } +} diff --git a/config/twill-navigation.php b/config/twill-navigation.php index dce7278..cbbbc0f 100644 --- a/config/twill-navigation.php +++ b/config/twill-navigation.php @@ -76,13 +76,18 @@ return [ ] ] ], - 'other-content.socialArticles' => [ + 'otherContent' => [ 'title' => 'Autre contenu', - 'module' => true, + 'route' => 'socialArticles.index', + 'module' => true, 'primary_navigation' => [ 'socialArticles' => [ 'title' => 'Articles réseaux sociaux', 'module' => true + ], + 'polls' => [ + 'title' => 'Sondages', + 'module' => true, ] ] diff --git a/config/twill.php b/config/twill.php index 47e9883..925fd15 100644 --- a/config/twill.php +++ b/config/twill.php @@ -291,6 +291,21 @@ return [ 'title' => 'Vidéo YouTube', 'icon' => 'video', 'component' => 'a17-block-youtube' + ], + 'poll_text' => [ + 'title' => 'Question ouverte (texte)', + 'icon' => 'text', + 'component' => 'a17-block-poll_text' + ], + 'poll_check' => [ + 'title' => 'Question fermée', + 'icon' => 'check', + 'component' => 'a17-block-poll_check' + ], + 'poll_check_item' => [ + 'title' => 'Option', + 'icon' => 'check', + 'component' => 'a17-block-poll_check_item', ] ], 'crops' => [ @@ -351,6 +366,11 @@ return [ 'title' => 'Invités', 'trigger' => 'Ajotuer des invités', 'component' => 'a17-block-guests', + ], + 'poll_check_item' => [ + 'title' => 'Option', + 'trigger' => 'Ajouter une option', + 'component' => 'a17-block-check_item', ] ], ], diff --git a/database/migrations/2020_08_15_154338_create_polls_tables.php b/database/migrations/2020_08_15_154338_create_polls_tables.php new file mode 100644 index 0000000..f0bcc21 --- /dev/null +++ b/database/migrations/2020_08_15_154338_create_polls_tables.php @@ -0,0 +1,38 @@ +string('title', 200)->nullable(); + + // your generated model and form include a description field, to get you started, but feel free to get rid of it if you don't need it + $table->text('description')->nullable(); + + // add those 2 columns to enable publication timeframe fields (you can use publish_start_date only if you don't need to provide the ability to specify an end date) + // $table->timestamp('publish_start_date')->nullable(); + // $table->timestamp('publish_end_date')->nullable(); + }); + + Schema::create('poll_slugs', function (Blueprint $table) { + createDefaultSlugsTableFields($table, 'poll'); + }); + + + } + + public function down() + { + + Schema::dropIfExists('poll_slugs'); + Schema::dropIfExists('polls'); + } +} diff --git a/database/migrations/2020_08_15_165307_create_poll_entries_table.php b/database/migrations/2020_08_15_165307_create_poll_entries_table.php new file mode 100644 index 0000000..99be9ab --- /dev/null +++ b/database/migrations/2020_08_15_165307_create_poll_entries_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('ip_address')->nullable(); + $table->unsignedBigInteger('poll_id'); + $table->json('answers'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('poll_entries'); + } +} diff --git a/public/css/app.css b/public/css/app.css index f9179c4..771a7e0 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -11488,6 +11488,20 @@ div.youtube-block iframe { max-width: 100%; } +.poll.container { + max-width: 700px; +} + +.poll .form-group { + margin-bottom: 2rem; +} + +.poll .form-group > label { + font-size: larger; + font-weight: 500; + color: #074e9c; +} + body { margin-bottom: 4rem; } diff --git a/resources/sass/_polls.scss b/resources/sass/_polls.scss new file mode 100644 index 0000000..0173214 --- /dev/null +++ b/resources/sass/_polls.scss @@ -0,0 +1,14 @@ +.poll { + &.container { + max-width: 700px; + } + .form-group { + > label { + font-size: larger; + font-weight: 500; + color: $psq_blue; + } + + margin-bottom: 2rem; + } +} diff --git a/resources/sass/app.scss b/resources/sass/app.scss index b0afce1..1a68f3b 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -11,6 +11,7 @@ @import "pill_boxes"; @import "title_dots"; @import "blocks"; +@import "polls"; body { margin-bottom: 4rem; diff --git a/resources/views/admin/blocks/poll_check.blade.php b/resources/views/admin/blocks/poll_check.blade.php new file mode 100644 index 0000000..34d51c6 --- /dev/null +++ b/resources/views/admin/blocks/poll_check.blade.php @@ -0,0 +1,25 @@ +@formField('input', [ + 'name' => 'question', + 'label' => 'Question', + 'maxlength' => 250, + 'required' => true, +]) + +@formField('radios', [ + 'name' => 'type', + 'label' => 'Type', + 'default' => 'radio', + 'inline' => true, + 'options' => [ + [ + 'value' => 'radio', + 'label' => 'Choix unique' + ], + [ + 'value' => 'check', + 'label' => 'Choix multiple' + ] + ], +]) + +@formField('repeater', ['type' => 'poll_check_item']) diff --git a/resources/views/admin/blocks/poll_check_item.blade.php b/resources/views/admin/blocks/poll_check_item.blade.php new file mode 100644 index 0000000..d93605a --- /dev/null +++ b/resources/views/admin/blocks/poll_check_item.blade.php @@ -0,0 +1,8 @@ +@twillRepeaterTitle('Option') +@twillRepeaterTrigger('Ajouter une option') +@twillRepeaterGroup('app') + +@formField('input', [ + 'name' => 'option', + 'label' => 'Réponse' +]) diff --git a/resources/views/admin/blocks/poll_text.blade.php b/resources/views/admin/blocks/poll_text.blade.php new file mode 100644 index 0000000..2053ec9 --- /dev/null +++ b/resources/views/admin/blocks/poll_text.blade.php @@ -0,0 +1,6 @@ +@formField('input', [ + 'name' => 'question', + 'label' => 'Question', + 'maxlength' => 250, + 'required' => true, +]) diff --git a/resources/views/admin/polls/form.blade.php b/resources/views/admin/polls/form.blade.php new file mode 100644 index 0000000..fa4f212 --- /dev/null +++ b/resources/views/admin/polls/form.blade.php @@ -0,0 +1,14 @@ +@extends('twill::layouts.form') + +@section('contentFields') + @formField('input', [ + 'name' => 'description', + 'label' => 'Description', + 'maxlength' => 100 + ]) + + @formField('block_editor', ['blocks' => ['poll_text', 'poll_check']]) + + + +@stop diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php index 08d28d8..09c1f43 100644 --- a/resources/views/errors/403.blade.php +++ b/resources/views/errors/403.blade.php @@ -2,15 +2,15 @@ @section('content') -
-

Vous ne pouvez pas accéder à cette page !

+
+

Vous ne pouvez pas accéder à cette page !

- @guest -

Si vous possédez un compte, cliquez ici pour vous connecter

-

Sinon, cliquez ici pour découvrir nos formules d'abonnement !

- @elseguest -

Il semblerait que votre abonnement n'est plus actif...

- @endguest -
+ @guest +

Si vous possédez un compte, cliquez ici pour vous connecter

+

Sinon, cliquez ici pour découvrir nos formules d'abonnement !

+ @elseguest +

Il semblerait que votre abonnement n'est plus actif...

+ @endguest +
@endsection diff --git a/resources/views/home/index.blade.php b/resources/views/home/index.blade.php index c7e6f6c..ca31f7a 100644 --- a/resources/views/home/index.blade.php +++ b/resources/views/home/index.blade.php @@ -3,6 +3,15 @@ @section('content')
+ @if(session()->has('message')) +
+ {!! session('message') !!} + +
+ @endif +

L'actualité à la une de notre quotidien

diff --git a/resources/views/polls/show.blade.php b/resources/views/polls/show.blade.php new file mode 100644 index 0000000..948c26f --- /dev/null +++ b/resources/views/polls/show.blade.php @@ -0,0 +1,17 @@ +@extends('layouts.app') + +@section('content') +
+

+ {{$poll->title}} +

+ +
+
+ @csrf + {!! $poll->renderBlocks() !!} + +
+
+
+@endsection diff --git a/resources/views/site/blocks/poll_check.blade.php b/resources/views/site/blocks/poll_check.blade.php new file mode 100644 index 0000000..c56d207 --- /dev/null +++ b/resources/views/site/blocks/poll_check.blade.php @@ -0,0 +1,36 @@ +@php +$slug = Str::slug($question = $block->input('question')) +@endphp +
+ + + @php + $i = 0; + @endphp + @foreach($block->children as $option) + @php + $i++; + @endphp + @if($block->input('type') === 'radio') +
+ + +
+ + @else +
+ + +
+ + @endif + + @endforeach + + + +
diff --git a/resources/views/site/blocks/poll_check_item.blade.php b/resources/views/site/blocks/poll_check_item.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/site/blocks/poll_text.blade.php b/resources/views/site/blocks/poll_text.blade.php new file mode 100644 index 0000000..de7fd21 --- /dev/null +++ b/resources/views/site/blocks/poll_text.blade.php @@ -0,0 +1,7 @@ +@php +$slug = Str::slug($question = $block->input('question')) +@endphp +
+ + +
diff --git a/routes/admin.php b/routes/admin.php index 53e3dbe..c2e01d5 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -20,9 +20,12 @@ Route::prefix('settings')->group(function() { Route::prefix('otherContent')->group(function () { Route::module('socialArticles'); + Route::module('polls'); + }); + /** Publishing and mass sending process */ Route::prefix('publish')->group(function() { Route::get('', 'PublishController@letter')->name('publish.letter'); diff --git a/routes/web.php b/routes/web.php index 6ca9a52..3322cd1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -30,7 +30,6 @@ Route::domain(env('ADMIN_DOMAIN_NAME'))->middleware('auth:twill_users')->group(f - /** Client routes */ Route::domain(env('CLIENT_DOMAIN_NAME'))->group(function() { /** Home */ @@ -70,11 +69,15 @@ Route::domain(env('CLIENT_DOMAIN_NAME'))->group(function() { Route::get('article/{slug}', 'SocialArticleController@show')->name('social-article.show'); + Route::get('sondages/{slug}', 'PollController@show')->name('poll.show'); + Route::post('sondages/{slug}', 'PollController@submit')->name('poll.submit'); + /** Metadata */ Route::prefix('/files/{file:slug}')->group(function () { Route::get('/cover', 'FileController@cover'); }); + Route::get('/l/{link:slug}', 'TrackedLinkController@redirect')->name('track'); }); -- 2.39.5