]> _ Git - psq.git/commitdiff
poll creator
authorLouis Jeckel <louis.jeckel@outlook.cm>
Sat, 15 Aug 2020 17:11:46 +0000 (19:11 +0200)
committerLouis Jeckel <louis.jeckel@outlook.cm>
Sat, 15 Aug 2020 17:11:46 +0000 (19:11 +0200)
27 files changed:
app/Http/Controllers/Admin/AdCampaignController.php
app/Http/Controllers/Admin/PollController.php [new file with mode: 0644]
app/Http/Controllers/PollController.php [new file with mode: 0644]
app/Http/Requests/Admin/PollRequest.php [new file with mode: 0644]
app/Models/Poll.php [new file with mode: 0644]
app/Models/Slugs/PollSlug.php [new file with mode: 0644]
app/PollEntry.php [new file with mode: 0644]
app/Repositories/PollRepository.php [new file with mode: 0644]
config/twill-navigation.php
config/twill.php
database/migrations/2020_08_15_154338_create_polls_tables.php [new file with mode: 0644]
database/migrations/2020_08_15_165307_create_poll_entries_table.php [new file with mode: 0644]
public/css/app.css
resources/sass/_polls.scss [new file with mode: 0644]
resources/sass/app.scss
resources/views/admin/blocks/poll_check.blade.php [new file with mode: 0644]
resources/views/admin/blocks/poll_check_item.blade.php [new file with mode: 0644]
resources/views/admin/blocks/poll_text.blade.php [new file with mode: 0644]
resources/views/admin/polls/form.blade.php [new file with mode: 0644]
resources/views/errors/403.blade.php
resources/views/home/index.blade.php
resources/views/polls/show.blade.php [new file with mode: 0644]
resources/views/site/blocks/poll_check.blade.php [new file with mode: 0644]
resources/views/site/blocks/poll_check_item.blade.php [new file with mode: 0644]
resources/views/site/blocks/poll_text.blade.php [new file with mode: 0644]
routes/admin.php
routes/web.php

index b1d192fa63aaf51c3001e8d87381b8408f76a647..4d80a3ed3ef09425c39113df0dd02dd15226edd7 100644 (file)
@@ -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 (file)
index 0000000..beb95c3
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use A17\Twill\Http\Controllers\Admin\ModuleController;
+
+class PollController extends ModuleController
+{
+    protected $moduleName = 'polls';
+
+    protected $permalinkBase = 'sondages';
+
+}
diff --git a/app/Http/Controllers/PollController.php b/app/Http/Controllers/PollController.php
new file mode 100644 (file)
index 0000000..d4ce130
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Poll;
+use App\Repositories\PollRepository;
+use Illuminate\Http\Request;
+
+class PollController extends Controller
+{
+    public function show($slug, PollRepository $repository)
+    {
+        $poll = $repository->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 (file)
index 0000000..a7edca5
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Requests\Admin;
+
+use A17\Twill\Http\Requests\Admin\Request;
+
+class PollRequest extends Request
+{
+    public function rulesForCreate()
+    {
+        return [];
+    }
+
+    public function rulesForUpdate()
+    {
+        return [];
+    }
+}
diff --git a/app/Models/Poll.php b/app/Models/Poll.php
new file mode 100644 (file)
index 0000000..f8ea393
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Models;
+
+use A17\Twill\Models\Behaviors\HasBlocks;
+use A17\Twill\Models\Behaviors\HasSlug;
+use A17\Twill\Models\Behaviors\HasMedias;
+use A17\Twill\Models\Model;
+use App\PollEntry;
+
+class Poll extends Model
+{
+    use HasBlocks, HasSlug, HasMedias;
+
+    protected $fillable = [
+        'published',
+        'title',
+        'description',
+    ];
+
+    public $slugAttributes = [
+        'title',
+    ];
+
+
+    /**
+     * @return \Illuminate\Database\Eloquent\Relations\HasMany
+     */
+    public function entries()
+    {
+        return $this->hasMany(PollEntry::class);
+    }
+
+
+}
diff --git a/app/Models/Slugs/PollSlug.php b/app/Models/Slugs/PollSlug.php
new file mode 100644 (file)
index 0000000..73404f0
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models\Slugs;
+
+use A17\Twill\Models\Model;
+
+class PollSlug extends Model
+{
+    protected $table = "poll_slugs";
+}
diff --git a/app/PollEntry.php b/app/PollEntry.php
new file mode 100644 (file)
index 0000000..ac4f619
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+namespace App;
+
+use App\Models\Poll;
+use Illuminate\Database\Eloquent\Model;
+
+class PollEntry extends Model
+{
+    protected $guarded = [];
+
+    protected $casts = [
+        'answers' => '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 (file)
index 0000000..a3c1531
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Repositories;
+
+use A17\Twill\Repositories\Behaviors\HandleBlocks;
+use A17\Twill\Repositories\Behaviors\HandleSlugs;
+use A17\Twill\Repositories\Behaviors\HandleMedias;
+use A17\Twill\Repositories\ModuleRepository;
+use App\Models\Poll;
+
+class PollRepository extends ModuleRepository
+{
+    use HandleBlocks, HandleSlugs, HandleMedias;
+
+    public function __construct(Poll $model)
+    {
+        $this->model = $model;
+    }
+}
index dce7278aa4d4745a28e8d2138c03d505b81ee694..cbbbc0f385cdf4f19a6aa9f5358ed7d57fd34984 100644 (file)
@@ -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,
             ]
 
         ]
index 47e98839d5c5b6e2834661e4e9eb40b9e8de4314..925fd1528ccdb2422e045b5ba92cbc888f14f9b4 100644 (file)
@@ -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 (file)
index 0000000..f0bcc21
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreatePollsTables extends Migration
+{
+    public function up()
+    {
+        Schema::create('polls', function (Blueprint $table) {
+            // this will create an id, a "published" column, and soft delete and timestamps columns
+            createDefaultTableFields($table);
+            
+            // feel free to modify the name of this column, but title is supported by default (you would need to specify the name of the column Twill should consider as your "title" column in your module controller if you change it)
+            $table->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 (file)
index 0000000..99be9ab
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreatePollEntriesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('poll_entries', function (Blueprint $table) {
+            $table->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');
+    }
+}
index f9179c4a683ab80d89ab756784cc255c53a7acfd..771a7e0cdad90a5fa67f4b55b1ae98d84fb6f278 100644 (file)
@@ -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 (file)
index 0000000..0173214
--- /dev/null
@@ -0,0 +1,14 @@
+.poll {
+    &.container {
+        max-width: 700px;
+    }
+    .form-group {
+        > label {
+            font-size: larger;
+            font-weight: 500;
+            color: $psq_blue;
+        }
+
+        margin-bottom: 2rem;
+    }
+}
index b0afce1006c40ccf80cd392ac8a22f980ae16603..1a68f3bd88fbf143e4837565655413e603c6c227 100644 (file)
@@ -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 (file)
index 0000000..34d51c6
--- /dev/null
@@ -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 (file)
index 0000000..d93605a
--- /dev/null
@@ -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 (file)
index 0000000..2053ec9
--- /dev/null
@@ -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 (file)
index 0000000..fa4f212
--- /dev/null
@@ -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
index 08d28d8e285462759f1a3b47a54bde2a0469bc5f..09c1f430cd4bae0c1329cc89874d64780ff0691b 100644 (file)
@@ -2,15 +2,15 @@
 
 @section('content')
 
-    <div class="container error-403">
-        <h1>Vous ne pouvez pas accéder à cette page !</h1>
+<div class="container error-403">
+    <h1>Vous ne pouvez pas accéder à cette page !</h1>
 
 
-        @guest
-            <p class="denim">Si vous possédez un compte, <a href="{{route('login', ['redirect_to' => request()->getUri()])}}">cliquez ici pour vous connecter</a></p>
-            <p class="orange">Sinon, <a href="{{route('not-registered')}}">cliquez ici pour découvrir nos formules d'abonnement !</a></p>
-        @elseguest
-            <h2>Il semblerait que votre abonnement n'est plus actif...</h2>
-        @endguest
-    </div>
+    @guest
+        <p class="denim">Si vous possédez un compte, <a href="{{route('login', ['redirect_to' => request()->getUri()])}}">cliquez ici pour vous connecter</a></p>
+        <p class="orange">Sinon, <a href="{{route('not-registered')}}">cliquez ici pour découvrir nos formules d'abonnement !</a></p>
+    @elseguest
+        <h2>Il semblerait que votre abonnement n'est plus actif...</h2>
+    @endguest
+</div>
 @endsection
index c7e6f6cea0bbd11dae11561a2b735e26f04ecdb9..ca31f7ad1c9a82169fc7a7276d89751a341989b4 100644 (file)
@@ -3,6 +3,15 @@
 @section('content')
 <div class="container psq-actu">
 
+       @if(session()->has('message'))
+    <div class="alert alert-success alert-dismissible">
+        {!! session('message') !!}
+        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+            <span aria-hidden="true">&times;</span>
+        </button>
+    </div>
+    @endif
+
     <h1>L'actualité à la une de notre quotidien</h1>
     <div class="row justify-content-center pt-3">
         <div class="col-md-4">
diff --git a/resources/views/polls/show.blade.php b/resources/views/polls/show.blade.php
new file mode 100644 (file)
index 0000000..948c26f
--- /dev/null
@@ -0,0 +1,17 @@
+@extends('layouts.app')
+
+@section('content')
+    <div class="container poll">
+        <h1>
+            {{$poll->title}}
+        </h1>
+
+        <div class="box p-4">
+            <form action="#" method="post">
+                @csrf
+                {!! $poll->renderBlocks() !!}
+                <button type="submit" class="btn btn-primary">Envoyer</button>
+            </form>
+        </div>
+    </div>
+@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 (file)
index 0000000..c56d207
--- /dev/null
@@ -0,0 +1,36 @@
+@php
+$slug = Str::slug($question = $block->input('question'))
+@endphp
+<div class="form-group">
+    <label for="{{$slug}}">{{$question}}</label>
+
+    @php
+        $i = 0;
+    @endphp
+    @foreach($block->children as $option)
+    @php
+        $i++;
+    @endphp
+        @if($block->input('type') === 'radio')
+            <div class="form-check">
+                <input class="form-check-input" type="radio" name="{{$slug}}" id="answer-{{$i}}-{{$slug}}" value="{{$option->input('option')}}">
+                <label class="form-check-label" for="answer-{{$i}}-{{$slug}}">
+                    {{$option->input('option')}}
+                </label>
+            </div>
+
+        @else
+            <div class="form-check">
+                <input class="form-check-input" type="checkbox" value="{{$option->input('option')}}"  name="{{$slug}}[]" id="answer-{{$i}}-{{$slug}}">
+                <label class="form-check-label" for="answer-{{$i}}-{{$slug}}">
+                    {{$option->input('option')}}
+                </label>
+            </div>
+
+        @endif
+
+    @endforeach
+
+
+
+</div>
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 (file)
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 (file)
index 0000000..de7fd21
--- /dev/null
@@ -0,0 +1,7 @@
+@php
+$slug = Str::slug($question = $block->input('question'))
+@endphp
+<div class="form-group">
+    <label for="{{$slug}}">{{$question}}</label>
+    <input type="text" name="{{$slug}}" id="{{$slug}}" class="form-control">
+</div>
index 53e3dbec8e6f8c13cb915936eb1c61cfe53779e5..c2e01d5513ceea05af3caea4482f07bfc630bee9 100644 (file)
@@ -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');
index 6ca9a52dbece16522cad2da7a49a4362fba8e2f7..3322cd12f1cb4d981520972531d0f8883f692de1 100644 (file)
@@ -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');
 });