]> _ Git - psq.git/commitdiff
envoi newsletter
authorLouis Jeckel <louis.jeckel@outlook.cm>
Fri, 14 Aug 2020 11:18:23 +0000 (13:18 +0200)
committerLouis Jeckel <louis.jeckel@outlook.cm>
Fri, 14 Aug 2020 11:18:23 +0000 (13:18 +0200)
26 files changed:
app/Http/Controllers/Admin/PublishController.php
app/Http/Controllers/HomeController.php
app/Http/Controllers/NewsletterController.php [new file with mode: 0644]
app/Jobs/ProcessEmailBatch.php
app/Mail/BatchMail.php
config/mail.php
config/twill-navigation.php
database/migrations/2020_08_14_090953_file_not_required_in_email_batches_table.php [new file with mode: 0644]
public/admin/js/admin.js
public/js/app.js
resources/js/app.js
resources/js/components/Publish/Publish.vue [deleted file]
resources/js/components/Publish/PublishLetter.vue [new file with mode: 0644]
resources/js/components/Publish/PublishNewsletter.vue [new file with mode: 0644]
resources/js/components/Publish/Step1UploadFile.vue
resources/js/components/Publish/Step1WriteNewsletter.vue [new file with mode: 0644]
resources/js/components/Publish/Step2PrepareMail.vue
resources/js/components/Publish/Step3Send.vue
resources/views/admin/publish/publish-letter.blade.php [new file with mode: 0644]
resources/views/admin/publish/publish-newsletter.blade.php [new file with mode: 0644]
resources/views/admin/publish/publish.blade.php [deleted file]
resources/views/emails/batch-pdf.blade.php [new file with mode: 0644]
resources/views/emails/batch.blade.php [deleted file]
resources/views/emails/newsletter.blade.php [new file with mode: 0644]
resources/views/podcasts/index.blade.php
routes/admin.php

index 19a8070c8603ab725ca43ec1611dcb181ce08037..25668141970e35eaa5f81c6368c5856ddc4e15bd 100644 (file)
@@ -9,6 +9,7 @@ use App\Jobs\ProcessEmailBatch;
 use App\Jobs\ProcessPdfFile;
 use App\Mail\BatchMail;
 use App\PdfFile;
+use App\User;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Request;
 use Illuminate\Http\Resources\Json\ResourceCollection;
@@ -35,6 +36,9 @@ class PublishController extends Controller
     {
         $batch = new EmailBatch();
         $data = $request->input('data');
+        $type = Arr::get($data, 'email.type', 0);
+        $recipientGroup = Arr::get($data, 'recipient_group');
+
         $batch->subject = Arr::get($data, 'email.subject');
         $batch->content = ['body' => Arr::get($data, 'email.content')];
         $batch->file_id = Arr::get($data, 'file.id');
@@ -42,7 +46,7 @@ class PublishController extends Controller
 
         $batch->save();
 
-        dispatch(new ProcessEmailBatch($batch));
+        dispatch(new ProcessEmailBatch($batch, $type, $recipientGroup));
 
         return ['data' => $batch->id];
     }
@@ -86,9 +90,18 @@ class PublishController extends Controller
     /**
      * @return \Illuminate\View\View
      */
-    public function index()
+    public function letter()
+    {
+        return view('admin.publish.publish-letter');
+    }
+
+
+    /**
+     * @return \Illuminate\View\View
+     */
+    public function newsletter()
     {
-        return view('admin.publish.publish');
+        return view('admin.publish.publish-newsletter');
     }
 
     public function live()
@@ -110,11 +123,56 @@ class PublishController extends Controller
         return (new BatchMail(
             $request->input('content'),
             $request->input('subject'),
+            $request->input('type'),
             $request->input('link')
         ))->render();
     }
 
 
+    /**
+     * @return array
+     */
+    public static function sendGroups(): array
+    {
+        return [
+            'all' => [
+                'slug' => 'all',
+                'builder' => User::query(),
+                'text' =>  "Tout le monde",
+            ],
+            'prospects' => [
+                'slug' => 'prospects',
+                'builder' => User::prospect(),
+                'text' => 'Prospects',
+            ],
+            'registered_user' => [
+                'slug' => 'registered_user',
+                'builder' => User::registeredUser(),
+                'text' => 'Utilisateurs de la plateforme',
+            ],
+            'admin' => [
+                'slug' => 'admin',
+                'builder' => User::where('email', 'louis.jeckel@outlook.com'),
+                'text' => 'Administrateur',
+            ],
+
+        ];
+    }
+
+    /**
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function sendGroupList()
+    {
+        return response()->json(array_map(function($group) {
+            $group['count'] = $group['builder']->count();
+            unset($group['builder']);
+            $group['text'] .= " ({$group['count']})";
+            return $group;
+        }, self::sendGroups()));
+
+    }
+
 
 
 
index fee95d8d22896bb44cea5242eaf5be124fb0f6fe..91a573bbed2f39cbe13b028353563b7f50a0e97f 100644 (file)
@@ -15,7 +15,7 @@ class HomeController extends Controller
      */
     public function index()
     {
-        \View::share('last_pdf', PdfFile::query()->orderByDesc('id')->take(7)->get());
+        \View::share('last_pdf', PdfFile::query()->orderByDesc('id')->published()->take(7)->get());
         return view('home.index');
     }
 
diff --git a/app/Http/Controllers/NewsletterController.php b/app/Http/Controllers/NewsletterController.php
new file mode 100644 (file)
index 0000000..ecd4691
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class NewsletterController extends Controller
+{
+    //
+}
index c8e9d809e9b8786e88687cf48ec47910d02c1d4c..fa7125d8a6fc70c98f3c7d65c2adaa63f57fad7c 100644 (file)
@@ -5,6 +5,7 @@ namespace App\Jobs;
 use App\EmailBatch;
 use App\Events\ProcessBatch;
 use App\Facades\Mailgun;
+use App\Http\Controllers\Admin\PublishController;
 use App\Mail\BatchMail;
 use App\User;
 use Illuminate\Bus\Queueable;
@@ -19,19 +20,31 @@ use Illuminate\Support\Arr;
 class ProcessEmailBatch implements ShouldQueue
 {
     use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
     /**
      * @var EmailBatch
      */
     private $batch;
 
+    private int $type;
+
+    private $users;
+
+
+
     /**
      * Create a new job instance.
      *
      * @param EmailBatch $batch
+     * @param int $type
      */
-    public function __construct(EmailBatch $batch)
+    public function __construct(EmailBatch $batch, $type, $recipientGroup = null)
     {
         $this->batch = $batch;
+        $this->type = $type;
+        $this->users = $recipientGroup === null ?
+            User::recievesEmails()->get() :
+            PublishController::sendGroups()[$recipientGroup['slug']]['builder']->get();
     }
 
     /**
@@ -53,32 +66,42 @@ class ProcessEmailBatch implements ShouldQueue
     public function handle()
     {
         /** @var Collection $users */
-        $users = User::recievesEmails()->get();
 
-        $size = env('MAILGUN_CHUNK_SIZE', 200);
-        $chunks = $users->chunk($size);
+        $size = config('mail.mailgun.chunk_size');
+        $chunks = $this->users->chunk($size);
 
         $this->processUpdate([
             'status' => 'processing',
-            'total' => $count = $users->count(),
+            'total' => $count = $this->users->count(),
             'current' => 0
         ]);
         $i = 0;
-        $this->batch->file->publish();
+
+        if($this->batch->file !== null) {
+            $this->batch->file->publish();
+        }
 
         foreach($chunks as $chunk) {
 
             $variables = json_encode($chunk->mapWithKeys(function (User $user) {
-                return [$user->email => [
+
+                $fileVar = $this->batch->file === null ?
+                    [] :
+                    ['file_url' => $this->batch->file->getUrlWithToken($user)];
+
+
+                return [
+                    $user->email => array_merge([
                     'id' => $user->id,
                     'name' => $user->name,
-                    'file_url' => $this->batch->file->getUrlWithToken($user),
-                ]];
+                    ], $fileVar)
+                ];
             }), JSON_THROW_ON_ERROR, 512);
 
             $view = (new BatchMail(
                 $this->batch->content['body'],
                 $this->batch->subject,
+                $this->type
             ))->render();
 
 
@@ -108,7 +131,7 @@ class ProcessEmailBatch implements ShouldQueue
             'current' => $count
         ]);
 
-        $this->batch->update(['sent_to' => $users->pluck('email')]);
+        $this->batch->update(['sent_to' => $this->users->pluck('email')]);
 
     }
 }
index 6636574f2a03c0a9cc0de6abc32f9731d6832c0c..64697d102b4411990a47b3adc2c365855a859fb7 100644 (file)
@@ -3,6 +3,7 @@
 namespace App\Mail;
 
 use App\Facades\Html2Markdown;
+use Arr;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Mail\Mailable;
@@ -17,20 +18,41 @@ class BatchMail extends Mailable
     public $content;
     public $link;
 
+
+    public const MAIL_TYPE_PDF_FILE = 1;
+
+    public const MAIL_TYPE_NEWSLETTER = 2;
+
+    protected array $viewMap = [
+        self::MAIL_TYPE_PDF_FILE => 'batch-pdf',
+        self::MAIL_TYPE_NEWSLETTER => 'newsletter'
+    ];
+
+
+    /**
+     * @var string
+     */
+    public $emailView;
+
     /**
      * Create a new message instance.²
      *
      * @param string $content
      * @param string $subject
+     * @param $type
      * @param string|null $link
-     * @param HtmlConverter $converter
      */
-    public function __construct($content, $subject, $link = null)
+    public function __construct($content, $subject, $type, $link = null)
     {
         //
         $this->content = Html2Markdown::convert($content);
         $this->subject = $subject;
         $this->link = $link;
+
+        $this->emailView = Arr::get($this->viewMap, $type ?? 0);
+        if($this->emailView === null) {
+            throw new \InvalidArgumentException('Invalid email type !');
+        }
     }
 
     /**
@@ -40,6 +62,6 @@ class BatchMail extends Mailable
      */
     public function build()
     {
-        return $this->markdown('emails.batch')->with(['subject' => $this->subject]);
+        return $this->markdown("emails.{$this->emailView}")->with(['subject' => $this->subject]);
     }
 }
index 3fa2a0654c270ff3ddefd8a8610c590338fefe2f..f71b11dc1025fd99871ee109d169ca569585cf31 100644 (file)
@@ -107,7 +107,8 @@ return [
     ],
 
     'mailgun' => [
-        'api_key' => env('MAILGUN_API_KEY')
+        'api_key' => env('MAILGUN_API_KEY'),
+        'chunk_size' => env('MAILGUN_CHUNK_SIZE', 200)
     ]
 
 ];
index 5e954f262df3c4ab9d6692ee2055a6faab7a9039..a39fee17f836b95638c9d9fae916be7031cfdf2c 100644 (file)
@@ -8,8 +8,19 @@ return [
         'raw' => true,
     ],
     'publish' => [
-        'title' => 'Publier une lettre',
-        'route' => 'admin.publish',
+        'title' => 'Publier',
+        'route' => 'admin.publish.letter',
+        'primary_navigation' => [
+            'letter' => [
+                'title' => 'Publier une lettre',
+                'route' => 'admin.publish.letter'
+            ],
+            'newsletter' => [
+                'title' => 'Envoyer une newsletter',
+                'route' => 'admin.publish.newsletter'
+            ]
+
+        ]
     ],
     'content' => [
         'title' => 'Contenu du site',
diff --git a/database/migrations/2020_08_14_090953_file_not_required_in_email_batches_table.php b/database/migrations/2020_08_14_090953_file_not_required_in_email_batches_table.php
new file mode 100644 (file)
index 0000000..12cf9b1
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class FileNotRequiredInEmailBatchesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('email_batches', function (Blueprint $table) {
+            $table->unsignedBigInteger('file_id')->change()->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('email_batches', function (Blueprint $table) {
+            $table->unsignedBigInteger('file_id')->change()->nullable(false);
+        });
+    }
+}
index 0b9da0dd8e6d0e8a7675de38ad0b4faec6f5c49d..b1f95b61bfa9b514964f3a7210ad734482096dc1 100644 (file)
@@ -2581,10 +2581,10 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
-/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js&":
-/*!**************************************************************************************************************************************************************************!*\
-  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js& ***!
-  \**************************************************************************************************************************************************************************/
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js&":
+/*!********************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js& ***!
+  \********************************************************************************************************************************************************************************/
 /*! exports provided: default */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
@@ -2694,6 +2694,110 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js&":
+/*!************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js& ***!
+  \************************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var vue_stepper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-stepper */ "./node_modules/vue-stepper/src/index.js");
+/* harmony import */ var vue_stepper__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vue_stepper__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Step1WriteNewsletter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Step1WriteNewsletter */ "./resources/js/components/Publish/Step1WriteNewsletter.vue");
+/* harmony import */ var _Step3Send__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Step3Send */ "./resources/js/components/Publish/Step3Send.vue");
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+/**
+ * Step 1 : Upload PDF and preview (add title, tags)
+ * Step 2 : Add email subject and content
+ * Step 3 : Review, send and track
+ */
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  components: {
+    HorizontalStepper: vue_stepper__WEBPACK_IMPORTED_MODULE_0___default.a
+  },
+  data: function data() {
+    return {
+      steps: [{
+        icon: 'mail',
+        name: 'email',
+        title: 'Mise en forme du message',
+        subtitle: '',
+        component: _Step1WriteNewsletter__WEBPACK_IMPORTED_MODULE_1__["default"],
+        completed: false
+      }, {
+        icon: 'send',
+        name: 'review',
+        title: 'Récapitulatif et envoi',
+        subtitle: 'Suivi des envois',
+        component: _Step3Send__WEBPACK_IMPORTED_MODULE_2__["default"],
+        completed: false
+      }]
+    };
+  },
+  mounted: function mounted() {},
+  methods: {
+    // Executed when @completed-step event is triggered
+    completeStep: function completeStep(payload) {
+      this.steps.forEach(function (step) {
+        if (step.name === payload.name) {
+          step.completed = true;
+        }
+      });
+    },
+    // Executed when @active-step event is triggered
+    isStepActive: function isStepActive(payload) {
+      this.steps.forEach(function (step) {
+        if (step.name === payload.name) {
+          if (step.completed === true) {
+            step.completed = false;
+          }
+        }
+      });
+    },
+    // Executed when @stepper-finished event is triggered
+    alert: function (_alert) {
+      function alert(_x) {
+        return _alert.apply(this, arguments);
+      }
+
+      alert.toString = function () {
+        return _alert.toString();
+      };
+
+      return alert;
+    }(function (payload) {
+      alert('end');
+    })
+  }
+});
+
+/***/ }),
+
 /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1UploadFile.vue?vue&type=script&lang=js&":
 /*!**********************************************************************************************************************************************************************************!*\
   !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1UploadFile.vue?vue&type=script&lang=js& ***!
@@ -2960,6 +3064,131 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js&":
+/*!***************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js& ***!
+  \***************************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-build-classic */ "./node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.js");
+/* harmony import */ var _ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0__);
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  components: {},
+  data: function data() {
+    return {
+      file: this.$root.publishState.file,
+      editor: _ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0___default.a,
+      recipient_group: null,
+      recipient_groups: [],
+      email: {
+        content: "\n                    <p>Bonjour %recipient.name%,</p>\n                ",
+        subject: '',
+        type: 2,
+        link: ""
+      },
+      csrf: document.querySelectorAll('meta[name="csrf-token"]')[0].content,
+      editorConfig: {}
+    };
+  },
+  watch: {
+    email: {
+      deep: true,
+      handler: function handler(val, old) {
+        if (val.editorData !== '' && val.subject !== '') {
+          this.$root.publishState.email = val;
+          this.$emit('can-continue', {
+            value: true
+          });
+        } else {
+          this.$emit('can-continue', {
+            value: false
+          });
+        }
+      },
+      immediate: true
+    },
+    recipient_group: function recipient_group(val, old) {
+      this.$root.publishState.recipient_group = val;
+    }
+  },
+  methods: {},
+  mounted: function mounted() {
+    var _this = this;
+
+    this.$emit('can-continue', {
+      value: true
+    });
+    axios.get('/publish/recipient-groups').then(function (d) {
+      return _this.recipient_groups = d.data;
+    });
+  }
+});
+
+/***/ }),
+
 /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step2PrepareMail.vue?vue&type=script&lang=js&":
 /*!***********************************************************************************************************************************************************************************!*\
   !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step2PrepareMail.vue?vue&type=script&lang=js& ***!
@@ -3026,6 +3255,7 @@ __webpack_require__.r(__webpack_exports__);
 //
 //
 //
+//
 
 /* harmony default export */ __webpack_exports__["default"] = ({
   components: {},
@@ -3035,7 +3265,8 @@ __webpack_require__.r(__webpack_exports__);
       editor: _ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0___default.a,
       email: {
         content: "\n                    <p>Bonjour %recipient.name%,</p>\n                    <p>Voici la nouvelle \xE9dition du jour !</p>\n                ",
-        subject: "[".concat(this.$root.publishState.file.title, "] ")
+        subject: "[".concat(this.$root.publishState.file.title, "] "),
+        type: 1
       },
       csrf: document.querySelectorAll('meta[name="csrf-token"]')[0].content,
       editorConfig: {}
@@ -3164,7 +3395,7 @@ __webpack_require__.r(__webpack_exports__);
   },
   data: function data() {
     return {
-      file: this.$root.publishState.file,
+      email: this.$root.publishState.email,
       recipients_count: 0,
       status: 'En attente',
       counters: {
@@ -3235,9 +3466,13 @@ __webpack_require__.r(__webpack_exports__);
   mounted: function mounted() {
     var _this2 = this;
 
-    axios.get('publish/recipients').then(function (d) {
-      return _this2.recipients_count = d.data.data;
-    });
+    if (this.$root.publishState.recipient_group === undefined) {
+      axios.get('publish/recipients').then(function (d) {
+        return _this2.recipients_count = d.data.data;
+      });
+    } else {
+      this.recipients_count = this.$root.publishState.recipient_group.count;
+    }
   }
 });
 
@@ -10048,6 +10283,24 @@ exports.push([module.i, "\n.repeater[data-v-26de7527] {\n    margin-left: -18px;
 module.exports = exports;
 
 
+/***/ }),
+
+/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&":
+/*!**********************************************************************************************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/css-loader/dist/cjs.js??ref--7-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-2!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& ***!
+  \**********************************************************************************************************************************************************************************************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Imports
+var ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
+exports = ___CSS_LOADER_API_IMPORT___(false);
+// Module
+exports.push([module.i, "\n.ck-editor__editable {\n    min-height: 500px;\n}\n\n", ""]);
+// Exports
+module.exports = exports;
+
+
 /***/ }),
 
 /***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step2PrepareMail.vue?vue&type=style&index=0&lang=css&":
@@ -48723,6 +48976,37 @@ var exported = content.locals ? content.locals : {};
 
 
 
+module.exports = exported;
+
+/***/ }),
+
+/***/ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&":
+/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??ref--7-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-2!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& ***!
+  \**************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var api = __webpack_require__(/*! ../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
+            var content = __webpack_require__(/*! !../../../../node_modules/css-loader/dist/cjs.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src??ref--7-2!../../../../node_modules/vue-loader/lib??vue-loader-options!./Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& */ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&");
+
+            content = content.__esModule ? content.default : content;
+
+            if (typeof content === 'string') {
+              content = [[module.i, content, '']];
+            }
+
+var options = {};
+
+options.insert = "head";
+options.singleton = false;
+
+var update = api(content, options);
+
+var exported = content.locals ? content.locals : {};
+
+
+
 module.exports = exported;
 
 /***/ }),
@@ -50227,10 +50511,10 @@ render._withStripped = true
 
 /***/ }),
 
-/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4&":
-/*!******************************************************************************************************************************************************************************************************************!*\
-  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4& ***!
-  \******************************************************************************************************************************************************************************************************************/
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a&":
+/*!************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a& ***!
+  \************************************************************************************************************************************************************************************************************************/
 /*! exports provided: render, staticRenderFns */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
@@ -50264,6 +50548,45 @@ render._withStripped = true
 
 
 
+/***/ }),
+
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6&":
+/*!****************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6& ***!
+  \****************************************************************************************************************************************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
+var render = function() {
+  var _vm = this
+  var _h = _vm.$createElement
+  var _c = _vm._self._c || _h
+  return _c(
+    "div",
+    [
+      _c("h1", { staticClass: "mb-6" }, [_vm._v("Envoyer une newsletter")]),
+      _vm._v(" "),
+      _c("horizontal-stepper", {
+        attrs: { steps: _vm.steps },
+        on: {
+          "completed-step": _vm.completeStep,
+          "active-step": _vm.isStepActive,
+          "stepper-finished": _vm.alert
+        }
+      })
+    ],
+    1
+  )
+}
+var staticRenderFns = []
+render._withStripped = true
+
+
+
 /***/ }),
 
 /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1UploadFile.vue?vue&type=template&id=26de7527&scoped=true&":
@@ -50437,7 +50760,7 @@ var render = function() {
               "post-action": "/publish/upload-file",
               multiple: false,
               drop: true,
-              "drop-directory": true,
+              "drop-directory": false,
               headers: {
                 "X-CSRF-TOKEN": _vm.csrf
               },
@@ -50645,6 +50968,211 @@ render._withStripped = true
 
 
 
+/***/ }),
+
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44&":
+/*!*******************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44& ***!
+  \*******************************************************************************************************************************************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
+var render = function() {
+  var _vm = this
+  var _h = _vm.$createElement
+  var _c = _vm._self._c || _h
+  return _c("div", { staticClass: "stepper-step" }, [
+    _c("div", [
+      _c("div", [
+        _c("div", { staticClass: "form-group" }, [
+          _c("label", { attrs: { for: "recipients" } }, [
+            _vm._v("Destinataires")
+          ]),
+          _vm._v(" "),
+          _c(
+            "select",
+            {
+              directives: [
+                {
+                  name: "model",
+                  rawName: "v-model",
+                  value: _vm.recipient_group,
+                  expression: "recipient_group"
+                }
+              ],
+              staticClass: "form-control",
+              attrs: { name: "recipients", id: "recipients" },
+              on: {
+                change: function($event) {
+                  var $$selectedVal = Array.prototype.filter
+                    .call($event.target.options, function(o) {
+                      return o.selected
+                    })
+                    .map(function(o) {
+                      var val = "_value" in o ? o._value : o.value
+                      return val
+                    })
+                  _vm.recipient_group = $event.target.multiple
+                    ? $$selectedVal
+                    : $$selectedVal[0]
+                }
+              }
+            },
+            [
+              _vm.recipient_groups.count === 0
+                ? _c(
+                    "option",
+                    { attrs: { value: "-1", selected: "seleted" } },
+                    [_vm._v("Chargement en cours...")]
+                  )
+                : _vm._e(),
+              _vm._v(" "),
+              _vm._l(_vm.recipient_groups, function(recipient) {
+                return _c("option", { domProps: { value: recipient } }, [
+                  _vm._v(_vm._s(recipient.text))
+                ])
+              })
+            ],
+            2
+          )
+        ]),
+        _vm._v(" "),
+        _c("div", { staticClass: "form-group" }, [
+          _c("label", { attrs: { for: "subject" } }, [_vm._v("Sujet")]),
+          _vm._v(" "),
+          _c("input", {
+            directives: [
+              {
+                name: "model",
+                rawName: "v-model",
+                value: _vm.email.subject,
+                expression: "email.subject"
+              }
+            ],
+            staticClass: "form-control",
+            attrs: {
+              type: "text",
+              id: "subject",
+              placeholder: "Découvrez notre nouveau podcast !"
+            },
+            domProps: { value: _vm.email.subject },
+            on: {
+              input: function($event) {
+                if ($event.target.composing) {
+                  return
+                }
+                _vm.$set(_vm.email, "subject", $event.target.value)
+              }
+            }
+          })
+        ]),
+        _vm._v(" "),
+        _c(
+          "div",
+          { staticClass: "form-group" },
+          [
+            _c("label", { attrs: { for: "content" } }, [_vm._v("Contenu")]),
+            _vm._v(" "),
+            _c("ckeditor", {
+              attrs: {
+                editor: _vm.editor,
+                config: _vm.editorConfig,
+                id: "content"
+              },
+              model: {
+                value: _vm.email.content,
+                callback: function($$v) {
+                  _vm.$set(_vm.email, "content", $$v)
+                },
+                expression: "email.content"
+              }
+            })
+          ],
+          1
+        ),
+        _vm._v(" "),
+        _c("div", { staticClass: "form-group" }, [
+          _c("label", { attrs: { for: "subject" } }, [
+            _vm._v("Lien principal")
+          ]),
+          _vm._v(" "),
+          _c("input", {
+            directives: [
+              {
+                name: "model",
+                rawName: "v-model",
+                value: _vm.email.link,
+                expression: "email.link"
+              }
+            ],
+            staticClass: "form-control",
+            attrs: {
+              type: "text",
+              id: "link",
+              placeholder: "https://exemple.fr"
+            },
+            domProps: { value: _vm.email.link },
+            on: {
+              input: function($event) {
+                if ($event.target.composing) {
+                  return
+                }
+                _vm.$set(_vm.email, "link", $event.target.value)
+              }
+            }
+          })
+        ])
+      ])
+    ]),
+    _vm._v(" "),
+    _c(
+      "form",
+      {
+        attrs: { method: "post", action: "/publish/preview", target: "_blank" }
+      },
+      [
+        _c("input", {
+          attrs: { type: "hidden", name: "_token" },
+          domProps: { value: _vm.csrf }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "subject" },
+          domProps: { value: _vm.email.subject }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "type" },
+          domProps: { value: _vm.email.type }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "content" },
+          domProps: { value: _vm.email.content }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "link" },
+          domProps: { value: _vm.email.link }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          staticClass: "btn btn-primary",
+          attrs: { type: "submit", value: "Prévisualiser l'email" }
+        })
+      ]
+    )
+  ])
+}
+var staticRenderFns = []
+render._withStripped = true
+
+
+
 /***/ }),
 
 /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step2PrepareMail.vue?vue&type=template&id=5a14ddba&":
@@ -50756,6 +51284,11 @@ var render = function() {
           domProps: { value: _vm.email.subject }
         }),
         _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "type" },
+          domProps: { value: _vm.email.type }
+        }),
+        _vm._v(" "),
         _c("input", {
           attrs: { type: "hidden", name: "content" },
           domProps: { value: _vm.email.content }
@@ -50799,7 +51332,7 @@ var render = function() {
   return _c("div", { staticClass: "stepper-step" }, [
     _c("div", { staticClass: "mb-3" }, [
       _c("h3", { staticClass: "text-center" }, [
-        _vm._v("\n            " + _vm._s(_vm.file.title) + "\n        ")
+        _vm._v("\n            " + _vm._s(_vm.email.subject) + "\n        ")
       ])
     ]),
     _vm._v(" "),
@@ -85409,8 +85942,10 @@ var map = {
        "./components/Home/cover.vue": "./resources/js/components/Home/cover.vue",
        "./components/LiveStats.vue": "./resources/js/components/LiveStats.vue",
        "./components/Publish/HeadlineRepeater.vue": "./resources/js/components/Publish/HeadlineRepeater.vue",
-       "./components/Publish/Publish.vue": "./resources/js/components/Publish/Publish.vue",
+       "./components/Publish/PublishLetter.vue": "./resources/js/components/Publish/PublishLetter.vue",
+       "./components/Publish/PublishNewsletter.vue": "./resources/js/components/Publish/PublishNewsletter.vue",
        "./components/Publish/Step1UploadFile.vue": "./resources/js/components/Publish/Step1UploadFile.vue",
+       "./components/Publish/Step1WriteNewsletter.vue": "./resources/js/components/Publish/Step1WriteNewsletter.vue",
        "./components/Publish/Step2PrepareMail.vue": "./resources/js/components/Publish/Step2PrepareMail.vue",
        "./components/Publish/Step3Send.vue": "./resources/js/components/Publish/Step3Send.vue",
        "./components/Stats/EmailStatistics.vue": "./resources/js/components/Stats/EmailStatistics.vue",
@@ -86117,17 +86652,17 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
-/***/ "./resources/js/components/Publish/Publish.vue":
-/*!*****************************************************!*\
-  !*** ./resources/js/components/Publish/Publish.vue ***!
-  \*****************************************************/
+/***/ "./resources/js/components/Publish/PublishLetter.vue":
+/*!***********************************************************!*\
+  !*** ./resources/js/components/Publish/PublishLetter.vue ***!
+  \***********************************************************/
 /*! exports provided: default */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Publish.vue?vue&type=template&id=6a7b0cd4& */ "./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4&");
-/* harmony import */ var _Publish_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Publish.vue?vue&type=script&lang=js& */ "./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js&");
+/* harmony import */ var _PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PublishLetter.vue?vue&type=template&id=280ded1a& */ "./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a&");
+/* harmony import */ var _PublishLetter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PublishLetter.vue?vue&type=script&lang=js& */ "./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js&");
 /* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
 
 
@@ -86137,9 +86672,9 @@ __webpack_require__.r(__webpack_exports__);
 /* normalize component */
 
 var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
-  _Publish_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
-  _Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__["render"],
-  _Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+  _PublishLetter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+  _PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__["render"],
+  _PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
   false,
   null,
   null,
@@ -86149,38 +86684,107 @@ var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_
 
 /* hot reload */
 if (false) { var api; }
-component.options.__file = "resources/js/components/Publish/Publish.vue"
+component.options.__file = "resources/js/components/Publish/PublishLetter.vue"
 /* harmony default export */ __webpack_exports__["default"] = (component.exports);
 
 /***/ }),
 
-/***/ "./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js&":
-/*!******************************************************************************!*\
-  !*** ./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js& ***!
-  \******************************************************************************/
+/***/ "./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js&":
+/*!************************************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js& ***!
+  \************************************************************************************/
 /*! exports provided: default */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib??ref--4-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./Publish.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js&");
-/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib??ref--4-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./PublishLetter.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
 
 /***/ }),
 
-/***/ "./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4&":
-/*!************************************************************************************!*\
-  !*** ./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4& ***!
-  \************************************************************************************/
+/***/ "./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a&":
+/*!******************************************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a& ***!
+  \******************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./PublishLetter.vue?vue&type=template&id=280ded1a& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+
+
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/PublishNewsletter.vue":
+/*!***************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishNewsletter.vue ***!
+  \***************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PublishNewsletter.vue?vue&type=template&id=930f83a6& */ "./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6&");
+/* harmony import */ var _PublishNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PublishNewsletter.vue?vue&type=script&lang=js& */ "./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
+
+
+
+
+
+/* normalize component */
+
+var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
+  _PublishNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+  _PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__["render"],
+  _PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+  false,
+  null,
+  null,
+  null
+  
+)
+
+/* hot reload */
+if (false) { var api; }
+component.options.__file = "resources/js/components/Publish/PublishNewsletter.vue"
+/* harmony default export */ __webpack_exports__["default"] = (component.exports);
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js&":
+/*!****************************************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js& ***!
+  \****************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib??ref--4-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./PublishNewsletter.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6&":
+/*!**********************************************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6& ***!
+  \**********************************************************************************************/
 /*! exports provided: render, staticRenderFns */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./Publish.vue?vue&type=template&id=6a7b0cd4& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4&");
-/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./PublishNewsletter.vue?vue&type=template&id=930f83a6& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__["render"]; });
 
-/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
 
 
 
@@ -86271,6 +86875,93 @@ __webpack_require__.r(__webpack_exports__);
 
 
 
+/***/ }),
+
+/***/ "./resources/js/components/Publish/Step1WriteNewsletter.vue":
+/*!******************************************************************!*\
+  !*** ./resources/js/components/Publish/Step1WriteNewsletter.vue ***!
+  \******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44& */ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44&");
+/* harmony import */ var _Step1WriteNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Step1WriteNewsletter.vue?vue&type=script&lang=js& */ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport *//* harmony import */ var _Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& */ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&");
+/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
+
+
+
+
+
+
+/* normalize component */
+
+var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(
+  _Step1WriteNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+  _Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__["render"],
+  _Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+  false,
+  null,
+  null,
+  null
+  
+)
+
+/* hot reload */
+if (false) { var api; }
+component.options.__file = "resources/js/components/Publish/Step1WriteNewsletter.vue"
+/* harmony default export */ __webpack_exports__["default"] = (component.exports);
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js&":
+/*!*******************************************************************************************!*\
+  !*** ./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js& ***!
+  \*******************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib??ref--4-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./Step1WriteNewsletter.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&":
+/*!***************************************************************************************************!*\
+  !*** ./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& ***!
+  \***************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/style-loader/dist/cjs.js!../../../../node_modules/css-loader/dist/cjs.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src??ref--7-2!../../../../node_modules/vue-loader/lib??vue-loader-options!./Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& */ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&");
+/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);
+/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
+ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a); 
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44&":
+/*!*************************************************************************************************!*\
+  !*** ./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44& ***!
+  \*************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+
+
+
 /***/ }),
 
 /***/ "./resources/js/components/Publish/Step2PrepareMail.vue":
index 27a4e1ca90b593155502ae98e8e993082c791256..ab5e9d4d19c2af94c7472fd20fb60e67fcc4cbc9 100644 (file)
@@ -7776,10 +7776,10 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
-/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js&":
-/*!**************************************************************************************************************************************************************************!*\
-  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js& ***!
-  \**************************************************************************************************************************************************************************/
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js&":
+/*!********************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js& ***!
+  \********************************************************************************************************************************************************************************/
 /*! exports provided: default */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
@@ -7889,6 +7889,110 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js&":
+/*!************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js& ***!
+  \************************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var vue_stepper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue-stepper */ "./node_modules/vue-stepper/src/index.js");
+/* harmony import */ var vue_stepper__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vue_stepper__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _Step1WriteNewsletter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Step1WriteNewsletter */ "./resources/js/components/Publish/Step1WriteNewsletter.vue");
+/* harmony import */ var _Step3Send__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Step3Send */ "./resources/js/components/Publish/Step3Send.vue");
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+/**
+ * Step 1 : Upload PDF and preview (add title, tags)
+ * Step 2 : Add email subject and content
+ * Step 3 : Review, send and track
+ */
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  components: {
+    HorizontalStepper: vue_stepper__WEBPACK_IMPORTED_MODULE_0___default.a
+  },
+  data: function data() {
+    return {
+      steps: [{
+        icon: 'mail',
+        name: 'email',
+        title: 'Mise en forme du message',
+        subtitle: '',
+        component: _Step1WriteNewsletter__WEBPACK_IMPORTED_MODULE_1__["default"],
+        completed: false
+      }, {
+        icon: 'send',
+        name: 'review',
+        title: 'Récapitulatif et envoi',
+        subtitle: 'Suivi des envois',
+        component: _Step3Send__WEBPACK_IMPORTED_MODULE_2__["default"],
+        completed: false
+      }]
+    };
+  },
+  mounted: function mounted() {},
+  methods: {
+    // Executed when @completed-step event is triggered
+    completeStep: function completeStep(payload) {
+      this.steps.forEach(function (step) {
+        if (step.name === payload.name) {
+          step.completed = true;
+        }
+      });
+    },
+    // Executed when @active-step event is triggered
+    isStepActive: function isStepActive(payload) {
+      this.steps.forEach(function (step) {
+        if (step.name === payload.name) {
+          if (step.completed === true) {
+            step.completed = false;
+          }
+        }
+      });
+    },
+    // Executed when @stepper-finished event is triggered
+    alert: function (_alert) {
+      function alert(_x) {
+        return _alert.apply(this, arguments);
+      }
+
+      alert.toString = function () {
+        return _alert.toString();
+      };
+
+      return alert;
+    }(function (payload) {
+      alert('end');
+    })
+  }
+});
+
+/***/ }),
+
 /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1UploadFile.vue?vue&type=script&lang=js&":
 /*!**********************************************************************************************************************************************************************************!*\
   !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1UploadFile.vue?vue&type=script&lang=js& ***!
@@ -8155,6 +8259,131 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js&":
+/*!***************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js& ***!
+  \***************************************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ckeditor/ckeditor5-build-classic */ "./node_modules/@ckeditor/ckeditor5-build-classic/build/ckeditor.js");
+/* harmony import */ var _ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0__);
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  components: {},
+  data: function data() {
+    return {
+      file: this.$root.publishState.file,
+      editor: _ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0___default.a,
+      recipient_group: null,
+      recipient_groups: [],
+      email: {
+        content: "\n                    <p>Bonjour %recipient.name%,</p>\n                ",
+        subject: '',
+        type: 2,
+        link: ""
+      },
+      csrf: document.querySelectorAll('meta[name="csrf-token"]')[0].content,
+      editorConfig: {}
+    };
+  },
+  watch: {
+    email: {
+      deep: true,
+      handler: function handler(val, old) {
+        if (val.editorData !== '' && val.subject !== '') {
+          this.$root.publishState.email = val;
+          this.$emit('can-continue', {
+            value: true
+          });
+        } else {
+          this.$emit('can-continue', {
+            value: false
+          });
+        }
+      },
+      immediate: true
+    },
+    recipient_group: function recipient_group(val, old) {
+      this.$root.publishState.recipient_group = val;
+    }
+  },
+  methods: {},
+  mounted: function mounted() {
+    var _this = this;
+
+    this.$emit('can-continue', {
+      value: true
+    });
+    axios.get('/publish/recipient-groups').then(function (d) {
+      return _this.recipient_groups = d.data;
+    });
+  }
+});
+
+/***/ }),
+
 /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step2PrepareMail.vue?vue&type=script&lang=js&":
 /*!***********************************************************************************************************************************************************************************!*\
   !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step2PrepareMail.vue?vue&type=script&lang=js& ***!
@@ -8221,6 +8450,7 @@ __webpack_require__.r(__webpack_exports__);
 //
 //
 //
+//
 
 /* harmony default export */ __webpack_exports__["default"] = ({
   components: {},
@@ -8230,7 +8460,8 @@ __webpack_require__.r(__webpack_exports__);
       editor: _ckeditor_ckeditor5_build_classic__WEBPACK_IMPORTED_MODULE_0___default.a,
       email: {
         content: "\n                    <p>Bonjour %recipient.name%,</p>\n                    <p>Voici la nouvelle \xE9dition du jour !</p>\n                ",
-        subject: "[".concat(this.$root.publishState.file.title, "] ")
+        subject: "[".concat(this.$root.publishState.file.title, "] "),
+        type: 1
       },
       csrf: document.querySelectorAll('meta[name="csrf-token"]')[0].content,
       editorConfig: {}
@@ -8359,7 +8590,7 @@ __webpack_require__.r(__webpack_exports__);
   },
   data: function data() {
     return {
-      file: this.$root.publishState.file,
+      email: this.$root.publishState.email,
       recipients_count: 0,
       status: 'En attente',
       counters: {
@@ -8430,9 +8661,13 @@ __webpack_require__.r(__webpack_exports__);
   mounted: function mounted() {
     var _this2 = this;
 
-    axios.get('publish/recipients').then(function (d) {
-      return _this2.recipients_count = d.data.data;
-    });
+    if (this.$root.publishState.recipient_group === undefined) {
+      axios.get('publish/recipients').then(function (d) {
+        return _this2.recipients_count = d.data.data;
+      });
+    } else {
+      this.recipients_count = this.$root.publishState.recipient_group.count;
+    }
   }
 });
 
@@ -15243,6 +15478,24 @@ exports.push([module.i, "\n.repeater[data-v-26de7527] {\n    margin-left: -18px;
 module.exports = exports;
 
 
+/***/ }),
+
+/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&":
+/*!**********************************************************************************************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/css-loader/dist/cjs.js??ref--7-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-2!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& ***!
+  \**********************************************************************************************************************************************************************************************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Imports
+var ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
+exports = ___CSS_LOADER_API_IMPORT___(false);
+// Module
+exports.push([module.i, "\n.ck-editor__editable {\n    min-height: 500px;\n}\n\n", ""]);
+// Exports
+module.exports = exports;
+
+
 /***/ }),
 
 /***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step2PrepareMail.vue?vue&type=style&index=0&lang=css&":
@@ -78149,6 +78402,37 @@ var exported = content.locals ? content.locals : {};
 
 
 
+module.exports = exported;
+
+/***/ }),
+
+/***/ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&":
+/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js??ref--7-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-2!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& ***!
+  \**************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var api = __webpack_require__(/*! ../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
+            var content = __webpack_require__(/*! !../../../../node_modules/css-loader/dist/cjs.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src??ref--7-2!../../../../node_modules/vue-loader/lib??vue-loader-options!./Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& */ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&");
+
+            content = content.__esModule ? content.default : content;
+
+            if (typeof content === 'string') {
+              content = [[module.i, content, '']];
+            }
+
+var options = {};
+
+options.insert = "head";
+options.singleton = false;
+
+var update = api(content, options);
+
+var exported = content.locals ? content.locals : {};
+
+
+
 module.exports = exported;
 
 /***/ }),
@@ -79707,10 +79991,10 @@ render._withStripped = true
 
 /***/ }),
 
-/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4&":
-/*!******************************************************************************************************************************************************************************************************************!*\
-  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4& ***!
-  \******************************************************************************************************************************************************************************************************************/
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a&":
+/*!************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a& ***!
+  \************************************************************************************************************************************************************************************************************************/
 /*! exports provided: render, staticRenderFns */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
@@ -79744,6 +80028,45 @@ render._withStripped = true
 
 
 
+/***/ }),
+
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6&":
+/*!****************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6& ***!
+  \****************************************************************************************************************************************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
+var render = function() {
+  var _vm = this
+  var _h = _vm.$createElement
+  var _c = _vm._self._c || _h
+  return _c(
+    "div",
+    [
+      _c("h1", { staticClass: "mb-6" }, [_vm._v("Envoyer une newsletter")]),
+      _vm._v(" "),
+      _c("horizontal-stepper", {
+        attrs: { steps: _vm.steps },
+        on: {
+          "completed-step": _vm.completeStep,
+          "active-step": _vm.isStepActive,
+          "stepper-finished": _vm.alert
+        }
+      })
+    ],
+    1
+  )
+}
+var staticRenderFns = []
+render._withStripped = true
+
+
+
 /***/ }),
 
 /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1UploadFile.vue?vue&type=template&id=26de7527&scoped=true&":
@@ -79917,7 +80240,7 @@ var render = function() {
               "post-action": "/publish/upload-file",
               multiple: false,
               drop: true,
-              "drop-directory": true,
+              "drop-directory": false,
               headers: {
                 "X-CSRF-TOKEN": _vm.csrf
               },
@@ -80125,6 +80448,211 @@ render._withStripped = true
 
 
 
+/***/ }),
+
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44&":
+/*!*******************************************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44& ***!
+  \*******************************************************************************************************************************************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
+var render = function() {
+  var _vm = this
+  var _h = _vm.$createElement
+  var _c = _vm._self._c || _h
+  return _c("div", { staticClass: "stepper-step" }, [
+    _c("div", [
+      _c("div", [
+        _c("div", { staticClass: "form-group" }, [
+          _c("label", { attrs: { for: "recipients" } }, [
+            _vm._v("Destinataires")
+          ]),
+          _vm._v(" "),
+          _c(
+            "select",
+            {
+              directives: [
+                {
+                  name: "model",
+                  rawName: "v-model",
+                  value: _vm.recipient_group,
+                  expression: "recipient_group"
+                }
+              ],
+              staticClass: "form-control",
+              attrs: { name: "recipients", id: "recipients" },
+              on: {
+                change: function($event) {
+                  var $$selectedVal = Array.prototype.filter
+                    .call($event.target.options, function(o) {
+                      return o.selected
+                    })
+                    .map(function(o) {
+                      var val = "_value" in o ? o._value : o.value
+                      return val
+                    })
+                  _vm.recipient_group = $event.target.multiple
+                    ? $$selectedVal
+                    : $$selectedVal[0]
+                }
+              }
+            },
+            [
+              _vm.recipient_groups.count === 0
+                ? _c(
+                    "option",
+                    { attrs: { value: "-1", selected: "seleted" } },
+                    [_vm._v("Chargement en cours...")]
+                  )
+                : _vm._e(),
+              _vm._v(" "),
+              _vm._l(_vm.recipient_groups, function(recipient) {
+                return _c("option", { domProps: { value: recipient } }, [
+                  _vm._v(_vm._s(recipient.text))
+                ])
+              })
+            ],
+            2
+          )
+        ]),
+        _vm._v(" "),
+        _c("div", { staticClass: "form-group" }, [
+          _c("label", { attrs: { for: "subject" } }, [_vm._v("Sujet")]),
+          _vm._v(" "),
+          _c("input", {
+            directives: [
+              {
+                name: "model",
+                rawName: "v-model",
+                value: _vm.email.subject,
+                expression: "email.subject"
+              }
+            ],
+            staticClass: "form-control",
+            attrs: {
+              type: "text",
+              id: "subject",
+              placeholder: "Découvrez notre nouveau podcast !"
+            },
+            domProps: { value: _vm.email.subject },
+            on: {
+              input: function($event) {
+                if ($event.target.composing) {
+                  return
+                }
+                _vm.$set(_vm.email, "subject", $event.target.value)
+              }
+            }
+          })
+        ]),
+        _vm._v(" "),
+        _c(
+          "div",
+          { staticClass: "form-group" },
+          [
+            _c("label", { attrs: { for: "content" } }, [_vm._v("Contenu")]),
+            _vm._v(" "),
+            _c("ckeditor", {
+              attrs: {
+                editor: _vm.editor,
+                config: _vm.editorConfig,
+                id: "content"
+              },
+              model: {
+                value: _vm.email.content,
+                callback: function($$v) {
+                  _vm.$set(_vm.email, "content", $$v)
+                },
+                expression: "email.content"
+              }
+            })
+          ],
+          1
+        ),
+        _vm._v(" "),
+        _c("div", { staticClass: "form-group" }, [
+          _c("label", { attrs: { for: "subject" } }, [
+            _vm._v("Lien principal")
+          ]),
+          _vm._v(" "),
+          _c("input", {
+            directives: [
+              {
+                name: "model",
+                rawName: "v-model",
+                value: _vm.email.link,
+                expression: "email.link"
+              }
+            ],
+            staticClass: "form-control",
+            attrs: {
+              type: "text",
+              id: "link",
+              placeholder: "https://exemple.fr"
+            },
+            domProps: { value: _vm.email.link },
+            on: {
+              input: function($event) {
+                if ($event.target.composing) {
+                  return
+                }
+                _vm.$set(_vm.email, "link", $event.target.value)
+              }
+            }
+          })
+        ])
+      ])
+    ]),
+    _vm._v(" "),
+    _c(
+      "form",
+      {
+        attrs: { method: "post", action: "/publish/preview", target: "_blank" }
+      },
+      [
+        _c("input", {
+          attrs: { type: "hidden", name: "_token" },
+          domProps: { value: _vm.csrf }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "subject" },
+          domProps: { value: _vm.email.subject }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "type" },
+          domProps: { value: _vm.email.type }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "content" },
+          domProps: { value: _vm.email.content }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "link" },
+          domProps: { value: _vm.email.link }
+        }),
+        _vm._v(" "),
+        _c("input", {
+          staticClass: "btn btn-primary",
+          attrs: { type: "submit", value: "Prévisualiser l'email" }
+        })
+      ]
+    )
+  ])
+}
+var staticRenderFns = []
+render._withStripped = true
+
+
+
 /***/ }),
 
 /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step2PrepareMail.vue?vue&type=template&id=5a14ddba&":
@@ -80236,6 +80764,11 @@ var render = function() {
           domProps: { value: _vm.email.subject }
         }),
         _vm._v(" "),
+        _c("input", {
+          attrs: { type: "hidden", name: "type" },
+          domProps: { value: _vm.email.type }
+        }),
+        _vm._v(" "),
         _c("input", {
           attrs: { type: "hidden", name: "content" },
           domProps: { value: _vm.email.content }
@@ -80279,7 +80812,7 @@ var render = function() {
   return _c("div", { staticClass: "stepper-step" }, [
     _c("div", { staticClass: "mb-3" }, [
       _c("h3", { staticClass: "text-center" }, [
-        _vm._v("\n            " + _vm._s(_vm.file.title) + "\n        ")
+        _vm._v("\n            " + _vm._s(_vm.email.subject) + "\n        ")
       ])
     ]),
     _vm._v(" "),
@@ -95595,8 +96128,10 @@ var map = {
        "./components/Home/cover.vue": "./resources/js/components/Home/cover.vue",
        "./components/LiveStats.vue": "./resources/js/components/LiveStats.vue",
        "./components/Publish/HeadlineRepeater.vue": "./resources/js/components/Publish/HeadlineRepeater.vue",
-       "./components/Publish/Publish.vue": "./resources/js/components/Publish/Publish.vue",
+       "./components/Publish/PublishLetter.vue": "./resources/js/components/Publish/PublishLetter.vue",
+       "./components/Publish/PublishNewsletter.vue": "./resources/js/components/Publish/PublishNewsletter.vue",
        "./components/Publish/Step1UploadFile.vue": "./resources/js/components/Publish/Step1UploadFile.vue",
+       "./components/Publish/Step1WriteNewsletter.vue": "./resources/js/components/Publish/Step1WriteNewsletter.vue",
        "./components/Publish/Step2PrepareMail.vue": "./resources/js/components/Publish/Step2PrepareMail.vue",
        "./components/Publish/Step3Send.vue": "./resources/js/components/Publish/Step3Send.vue",
        "./components/Stats/EmailStatistics.vue": "./resources/js/components/Stats/EmailStatistics.vue",
@@ -95697,7 +96232,9 @@ var app = new Vue({
       },
       email: {
         subject: "",
-        content: ""
+        content: "",
+        link: "",
+        type: 0
       }
     }
   }
@@ -96277,17 +96814,17 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
-/***/ "./resources/js/components/Publish/Publish.vue":
-/*!*****************************************************!*\
-  !*** ./resources/js/components/Publish/Publish.vue ***!
-  \*****************************************************/
+/***/ "./resources/js/components/Publish/PublishLetter.vue":
+/*!***********************************************************!*\
+  !*** ./resources/js/components/Publish/PublishLetter.vue ***!
+  \***********************************************************/
 /*! exports provided: default */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Publish.vue?vue&type=template&id=6a7b0cd4& */ "./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4&");
-/* harmony import */ var _Publish_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Publish.vue?vue&type=script&lang=js& */ "./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js&");
+/* harmony import */ var _PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PublishLetter.vue?vue&type=template&id=280ded1a& */ "./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a&");
+/* harmony import */ var _PublishLetter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PublishLetter.vue?vue&type=script&lang=js& */ "./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js&");
 /* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
 
 
@@ -96297,9 +96834,9 @@ __webpack_require__.r(__webpack_exports__);
 /* normalize component */
 
 var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
-  _Publish_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
-  _Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__["render"],
-  _Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+  _PublishLetter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+  _PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__["render"],
+  _PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
   false,
   null,
   null,
@@ -96309,38 +96846,107 @@ var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_
 
 /* hot reload */
 if (false) { var api; }
-component.options.__file = "resources/js/components/Publish/Publish.vue"
+component.options.__file = "resources/js/components/Publish/PublishLetter.vue"
 /* harmony default export */ __webpack_exports__["default"] = (component.exports);
 
 /***/ }),
 
-/***/ "./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js&":
-/*!******************************************************************************!*\
-  !*** ./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js& ***!
-  \******************************************************************************/
+/***/ "./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js&":
+/*!************************************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js& ***!
+  \************************************************************************************/
 /*! exports provided: default */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib??ref--4-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./Publish.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Publish.vue?vue&type=script&lang=js&");
-/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib??ref--4-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./PublishLetter.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishLetter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
 
 /***/ }),
 
-/***/ "./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4&":
-/*!************************************************************************************!*\
-  !*** ./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4& ***!
-  \************************************************************************************/
+/***/ "./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a&":
+/*!******************************************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a& ***!
+  \******************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./PublishLetter.vue?vue&type=template&id=280ded1a& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishLetter.vue?vue&type=template&id=280ded1a&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishLetter_vue_vue_type_template_id_280ded1a___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+
+
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/PublishNewsletter.vue":
+/*!***************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishNewsletter.vue ***!
+  \***************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PublishNewsletter.vue?vue&type=template&id=930f83a6& */ "./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6&");
+/* harmony import */ var _PublishNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./PublishNewsletter.vue?vue&type=script&lang=js& */ "./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
+
+
+
+
+
+/* normalize component */
+
+var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
+  _PublishNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+  _PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__["render"],
+  _PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+  false,
+  null,
+  null,
+  null
+  
+)
+
+/* hot reload */
+if (false) { var api; }
+component.options.__file = "resources/js/components/Publish/PublishNewsletter.vue"
+/* harmony default export */ __webpack_exports__["default"] = (component.exports);
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js&":
+/*!****************************************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js& ***!
+  \****************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib??ref--4-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./PublishNewsletter.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6&":
+/*!**********************************************************************************************!*\
+  !*** ./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6& ***!
+  \**********************************************************************************************/
 /*! exports provided: render, staticRenderFns */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./Publish.vue?vue&type=template&id=6a7b0cd4& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Publish.vue?vue&type=template&id=6a7b0cd4&");
-/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./PublishNewsletter.vue?vue&type=template&id=930f83a6& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/PublishNewsletter.vue?vue&type=template&id=930f83a6&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__["render"]; });
 
-/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Publish_vue_vue_type_template_id_6a7b0cd4___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_PublishNewsletter_vue_vue_type_template_id_930f83a6___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
 
 
 
@@ -96431,6 +97037,93 @@ __webpack_require__.r(__webpack_exports__);
 
 
 
+/***/ }),
+
+/***/ "./resources/js/components/Publish/Step1WriteNewsletter.vue":
+/*!******************************************************************!*\
+  !*** ./resources/js/components/Publish/Step1WriteNewsletter.vue ***!
+  \******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44& */ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44&");
+/* harmony import */ var _Step1WriteNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Step1WriteNewsletter.vue?vue&type=script&lang=js& */ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport *//* harmony import */ var _Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& */ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&");
+/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
+
+
+
+
+
+
+/* normalize component */
+
+var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(
+  _Step1WriteNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+  _Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__["render"],
+  _Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+  false,
+  null,
+  null,
+  null
+  
+)
+
+/* hot reload */
+if (false) { var api; }
+component.options.__file = "resources/js/components/Publish/Step1WriteNewsletter.vue"
+/* harmony default export */ __webpack_exports__["default"] = (component.exports);
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js&":
+/*!*******************************************************************************************!*\
+  !*** ./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js& ***!
+  \*******************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib??ref--4-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./Step1WriteNewsletter.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&":
+/*!***************************************************************************************************!*\
+  !*** ./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& ***!
+  \***************************************************************************************************/
+/*! no static exports found */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/style-loader/dist/cjs.js!../../../../node_modules/css-loader/dist/cjs.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src??ref--7-2!../../../../node_modules/vue-loader/lib??vue-loader-options!./Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css& */ "./node_modules/style-loader/dist/cjs.js!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=style&index=0&lang=css&");
+/* harmony import */ var _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);
+/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));
+ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_style_loader_dist_cjs_js_node_modules_css_loader_dist_cjs_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a); 
+
+/***/ }),
+
+/***/ "./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44&":
+/*!*************************************************************************************************!*\
+  !*** ./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44& ***!
+  \*************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/vue-loader/lib??vue-loader-options!./Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Publish/Step1WriteNewsletter.vue?vue&type=template&id=3f3afc44&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Step1WriteNewsletter_vue_vue_type_template_id_3f3afc44___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+
+
+
 /***/ }),
 
 /***/ "./resources/js/components/Publish/Step2PrepareMail.vue":
index 47fb0e5df7a8f58a82e73ab0e4c436a8a08adaa6..c70b81e3a421660c9930e8fbc24683e8247ddd4e 100644 (file)
@@ -54,6 +54,8 @@ const app = new Vue({
             email:{
                 subject: "",
                 content: "",
+                link: "",
+                type: 0,
             }
         },
     }
diff --git a/resources/js/components/Publish/Publish.vue b/resources/js/components/Publish/Publish.vue
deleted file mode 100644 (file)
index 418a67b..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<template>
-    <div>
-        <h1 class="mb-6">Publier une lettre</h1>
-
-<!--        <card-->
-<!--            class="flex flex-col items-center justify-center"-->
-<!--            style="min-height: 300px"-->
-<!--        >-->
-<!--        </card>-->
-            <horizontal-stepper :steps="steps"
-                                @completed-step="completeStep"
-                                @active-step="isStepActive"
-                                @stepper-finished="alert"
-            >
-            </horizontal-stepper>
-
-
-    </div>
-</template>
-
-<script>
-    /**
-     * Step 1 : Upload PDF and preview (add title, tags)
-     * Step 2 : Add email subject and content
-     * Step 3 : Review, send and track
-     */
-    import HorizontalStepper from 'vue-stepper';
-    import Step1UploadFile from "./Step1UploadFile";
-    import Step2PrepareMail from "./Step2PrepareMail";
-    import Step3Send from "./Step3Send";
-
-    export default {
-        components : {
-            HorizontalStepper
-        },
-        data(){
-                return {
-                    steps: [
-                        {
-                            icon: 'cloud_upload',
-                            name: 'upload',
-                            title: 'Mise en ligne du PDF',
-                            subtitle: 'Création de la liseuse',
-                            component: Step1UploadFile,
-                            completed: false
-
-                        },
-                        {
-                            icon: 'mail',
-                            name: 'email',
-                            title: 'Mise en forme du message',
-                            subtitle: '',
-                            component: Step2PrepareMail,
-                            completed: false
-
-                        },
-                        {
-                            icon: 'send',
-                            name: 'review',
-                            title: 'Récapitulatif et envoi',
-                            subtitle: 'Suivi des envois',
-                            component: Step3Send,
-                            completed: false
-
-                        },
-                    ]
-                }
-            },
-        mounted() {
-
-        },
-        methods: {
-            // Executed when @completed-step event is triggered
-            completeStep(payload) {
-                this.steps.forEach((step) => {
-                    if (step.name === payload.name) {
-                        step.completed = true;
-                    }
-                })
-            },
-            // Executed when @active-step event is triggered
-            isStepActive(payload) {
-                this.steps.forEach((step) => {
-                    if (step.name === payload.name) {
-                        if(step.completed === true) {
-                            step.completed = false;
-                        }
-                    }
-                })
-            },
-            // Executed when @stepper-finished event is triggered
-            alert(payload) {
-                alert('end')
-            },
-
-        }
-    }
-</script>
-
-<style>
-
-</style>
diff --git a/resources/js/components/Publish/PublishLetter.vue b/resources/js/components/Publish/PublishLetter.vue
new file mode 100644 (file)
index 0000000..418a67b
--- /dev/null
@@ -0,0 +1,102 @@
+<template>
+    <div>
+        <h1 class="mb-6">Publier une lettre</h1>
+
+<!--        <card-->
+<!--            class="flex flex-col items-center justify-center"-->
+<!--            style="min-height: 300px"-->
+<!--        >-->
+<!--        </card>-->
+            <horizontal-stepper :steps="steps"
+                                @completed-step="completeStep"
+                                @active-step="isStepActive"
+                                @stepper-finished="alert"
+            >
+            </horizontal-stepper>
+
+
+    </div>
+</template>
+
+<script>
+    /**
+     * Step 1 : Upload PDF and preview (add title, tags)
+     * Step 2 : Add email subject and content
+     * Step 3 : Review, send and track
+     */
+    import HorizontalStepper from 'vue-stepper';
+    import Step1UploadFile from "./Step1UploadFile";
+    import Step2PrepareMail from "./Step2PrepareMail";
+    import Step3Send from "./Step3Send";
+
+    export default {
+        components : {
+            HorizontalStepper
+        },
+        data(){
+                return {
+                    steps: [
+                        {
+                            icon: 'cloud_upload',
+                            name: 'upload',
+                            title: 'Mise en ligne du PDF',
+                            subtitle: 'Création de la liseuse',
+                            component: Step1UploadFile,
+                            completed: false
+
+                        },
+                        {
+                            icon: 'mail',
+                            name: 'email',
+                            title: 'Mise en forme du message',
+                            subtitle: '',
+                            component: Step2PrepareMail,
+                            completed: false
+
+                        },
+                        {
+                            icon: 'send',
+                            name: 'review',
+                            title: 'Récapitulatif et envoi',
+                            subtitle: 'Suivi des envois',
+                            component: Step3Send,
+                            completed: false
+
+                        },
+                    ]
+                }
+            },
+        mounted() {
+
+        },
+        methods: {
+            // Executed when @completed-step event is triggered
+            completeStep(payload) {
+                this.steps.forEach((step) => {
+                    if (step.name === payload.name) {
+                        step.completed = true;
+                    }
+                })
+            },
+            // Executed when @active-step event is triggered
+            isStepActive(payload) {
+                this.steps.forEach((step) => {
+                    if (step.name === payload.name) {
+                        if(step.completed === true) {
+                            step.completed = false;
+                        }
+                    }
+                })
+            },
+            // Executed when @stepper-finished event is triggered
+            alert(payload) {
+                alert('end')
+            },
+
+        }
+    }
+</script>
+
+<style>
+
+</style>
diff --git a/resources/js/components/Publish/PublishNewsletter.vue b/resources/js/components/Publish/PublishNewsletter.vue
new file mode 100644 (file)
index 0000000..87542a6
--- /dev/null
@@ -0,0 +1,92 @@
+<template>
+    <div>
+        <h1 class="mb-6">Envoyer une newsletter</h1>
+
+<!--        <card-->
+<!--            class="flex flex-col items-center justify-center"-->
+<!--            style="min-height: 300px"-->
+<!--        >-->
+<!--        </card>-->
+            <horizontal-stepper :steps="steps"
+                                @completed-step="completeStep"
+                                @active-step="isStepActive"
+                                @stepper-finished="alert"
+            >
+            </horizontal-stepper>
+
+
+    </div>
+</template>
+
+<script>
+    /**
+     * Step 1 : Upload PDF and preview (add title, tags)
+     * Step 2 : Add email subject and content
+     * Step 3 : Review, send and track
+     */
+    import HorizontalStepper from 'vue-stepper';
+    import Step1WriteNewsletter from "./Step1WriteNewsletter";
+    import Step3Send from "./Step3Send";
+
+    export default {
+        components : {
+            HorizontalStepper
+        },
+        data(){
+                return {
+                    steps: [
+                        {
+                            icon: 'mail',
+                            name: 'email',
+                            title: 'Mise en forme du message',
+                            subtitle: '',
+                            component: Step1WriteNewsletter,
+                            completed: false
+
+                        },
+                        {
+                            icon: 'send',
+                            name: 'review',
+                            title: 'Récapitulatif et envoi',
+                            subtitle: 'Suivi des envois',
+                            component: Step3Send,
+                            completed: false
+
+                        },
+                    ]
+                }
+            },
+        mounted() {
+
+        },
+        methods: {
+            // Executed when @completed-step event is triggered
+            completeStep(payload) {
+                this.steps.forEach((step) => {
+                    if (step.name === payload.name) {
+                        step.completed = true;
+                    }
+                })
+            },
+            // Executed when @active-step event is triggered
+            isStepActive(payload) {
+                this.steps.forEach((step) => {
+                    if (step.name === payload.name) {
+                        if(step.completed === true) {
+                            step.completed = false;
+                        }
+                    }
+                })
+            },
+            // Executed when @stepper-finished event is triggered
+            alert(payload) {
+                alert('end')
+            },
+
+        }
+    }
+</script>
+
+<style>
+
+</style>
index 344c5b2286acc23f6b38534f782b791e15e6d612..6e774b2bb8a82783bbdeeb56d1caed817b3c7b21 100644 (file)
@@ -40,7 +40,7 @@
                 @input-file="inputFile"
                 :multiple="false"
                 :drop="true"
-                :drop-directory="true"
+                :drop-directory="false"
                 v-model="files"
                 :headers="{
                 'X-CSRF-TOKEN': csrf
diff --git a/resources/js/components/Publish/Step1WriteNewsletter.vue b/resources/js/components/Publish/Step1WriteNewsletter.vue
new file mode 100644 (file)
index 0000000..a872f7a
--- /dev/null
@@ -0,0 +1,116 @@
+<template>
+
+    <div class="stepper-step">
+
+        <div>
+
+            <div>
+                <div class="form-group">
+                    <label for="recipients">Destinataires</label>
+                    <select name="recipients" id="recipients" v-model="recipient_group" class="form-control">
+                        <option v-if="recipient_groups.count === 0" value="-1" selected="seleted">Chargement en cours...</option>
+                        <option v-for="recipient in recipient_groups" :value="recipient" >{{recipient.text}}</option>
+                    </select>
+
+                </div>
+                <div class="form-group">
+                    <label for="subject">Sujet</label>
+                    <input v-model="email.subject" type="text" class="form-control" id="subject" placeholder="Découvrez notre nouveau podcast !">
+                </div>
+
+                <div class="form-group">
+                    <label for="content">Contenu</label>
+                    <ckeditor :editor="editor" v-model="email.content" :config="editorConfig" id="content"></ckeditor>
+                </div>
+
+                <div class="form-group">
+                    <label for="subject">Lien principal</label>
+                    <input v-model="email.link" type="text" class="form-control" id="link" placeholder="https://exemple.fr">
+                </div>
+            </div>
+        </div>
+
+
+
+        <form method="post" action="/publish/preview"
+          target="_blank">
+            <input type="hidden" name="_token" :value="csrf">
+            <input type="hidden" name="subject" :value="email.subject">
+            <input type="hidden" name="type" :value="email.type">
+            <input type="hidden" name="content" :value="email.content">
+            <input type="hidden" name="link" :value="email.link">
+            <input type="submit" class="btn btn-primary" value="Prévisualiser l'email">
+        </form>
+
+
+    </div>
+
+
+
+</template>
+
+<style>
+
+.ck-editor__editable {
+    min-height: 500px;
+}
+
+</style>
+
+<script>
+    import ClassicEditor from '@ckeditor/ckeditor5-build-classic';
+
+
+    export default {
+        components: {
+
+        },
+        data() {
+            return {
+                file: this.$root.publishState.file,
+                editor: ClassicEditor,
+                recipient_group: null,
+                recipient_groups: [],
+                email: {
+                    content: `
+                        <p>Bonjour %recipient.name%,</p>
+                    `,
+                    subject: '',
+                    type: 2,
+                    link: ""
+                },
+                csrf: document.querySelectorAll('meta[name="csrf-token"]')[0].content,
+                editorConfig: {
+
+                }
+            }
+        },
+
+        watch: {
+            email: {
+                deep: true,
+                handler: function(val, old) {
+                    if(val.editorData !== '' && val.subject !== ''){
+                        this.$root.publishState.email = val;
+                        this.$emit('can-continue', {value: true});
+                    } else {
+                        this.$emit('can-continue', {value: false});
+                    }
+
+                },
+                immediate: true,
+            },
+            recipient_group: function(val, old) {
+                this.$root.publishState.recipient_group = val
+            }
+        },
+        methods: {
+
+        },
+        mounted() {
+            this.$emit('can-continue', {value: true});
+            axios.get('/publish/recipient-groups').then(d => this.recipient_groups = d.data);
+        }
+
+    }
+</script>
index 2129884e98a2bf71142c483f85da30c3f143c400..6acedaffbae6e8457f7034fe39bb7d76ba4996cc 100644 (file)
@@ -33,6 +33,7 @@
           target="_blank">
             <input type="hidden" name="_token" :value="csrf">
             <input type="hidden" name="subject" :value="email.subject">
+            <input type="hidden" name="type" :value="email.type">
             <input type="hidden" name="content" :value="email.content">
             <input type="hidden" name="link" :value="'/preview/'+file.slug">
             <input type="submit" class="btn btn-primary" value="Prévisualiser l'email">
@@ -70,7 +71,8 @@
                         <p>Bonjour %recipient.name%,</p>
                         <p>Voici la nouvelle édition du jour !</p>
                     `,
-                    subject: `[${this.$root.publishState.file.title}] `
+                    subject: `[${this.$root.publishState.file.title}] `,
+                    type: 1
                 },
                 csrf: document.querySelectorAll('meta[name="csrf-token"]')[0].content,
                 editorConfig: {
index 07dad6c2120a3038d3df47f0bc60e42569f0a9a3..9ae969ae21665eb4a795796eded56e28279f8b9b 100644 (file)
@@ -4,7 +4,7 @@
 
         <div class="mb-3">
             <h3 class="text-center">
-                {{file.title}}
+                {{email.subject}}
             </h3>
         </div>
         <div class="alert alert-info my-2 mx-auto d-block mw-400"  v-if="!publishing">
@@ -84,7 +84,7 @@
         },
         data() {
             return {
-                file: this.$root.publishState.file,
+                email: this.$root.publishState.email,
                 recipients_count: 0,
                 status: 'En attente',
                 counters : {
 
         },
         mounted() {
-            axios.get('publish/recipients').then(d => this.recipients_count = d.data.data)
+            if(this.$root.publishState.recipient_group === undefined){
+                axios.get('publish/recipients').then(d => this.recipients_count = d.data.data)
+            } else {
+                this.recipients_count = this.$root.publishState.recipient_group.count;
+            }
         }
     }
 </script>
diff --git a/resources/views/admin/publish/publish-letter.blade.php b/resources/views/admin/publish/publish-letter.blade.php
new file mode 100644 (file)
index 0000000..066064d
--- /dev/null
@@ -0,0 +1,10 @@
+@extends('admin.layouts.free')
+
+
+@section('content')
+    <div class="bootstrap">
+        <div class="container mt-3">
+            <publish-letter></publish-letter>
+        </div>
+    </div>
+@endsection
diff --git a/resources/views/admin/publish/publish-newsletter.blade.php b/resources/views/admin/publish/publish-newsletter.blade.php
new file mode 100644 (file)
index 0000000..81aaf26
--- /dev/null
@@ -0,0 +1,10 @@
+@extends('admin.layouts.free')
+
+
+@section('content')
+    <div class="bootstrap">
+        <div class="container mt-3">
+            <publish-newsletter></publish-newsletter>
+        </div>
+    </div>
+@endsection
diff --git a/resources/views/admin/publish/publish.blade.php b/resources/views/admin/publish/publish.blade.php
deleted file mode 100644 (file)
index e9cedbd..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-@extends('admin.layouts.free')
-
-
-@section('content')
-    <div class="bootstrap">
-        <div class="container mt-3">
-            <publish></publish>
-        </div>
-    </div>
-@endsection
diff --git a/resources/views/emails/batch-pdf.blade.php b/resources/views/emails/batch-pdf.blade.php
new file mode 100644 (file)
index 0000000..7ef2bc1
--- /dev/null
@@ -0,0 +1,15 @@
+@component('mail::message')
+
+# L’ÉDITION DU JOUR
+
+## {{$subject}}
+
+{!! $content !!}
+
+@component('mail::button', ['url' =>  $link ?? '%recipient.file_url%', 'color' => 'primary'])
+Cliquez ici pour lire !
+@endcomponent
+
+
+@endcomponent
+
diff --git a/resources/views/emails/batch.blade.php b/resources/views/emails/batch.blade.php
deleted file mode 100644 (file)
index 7ef2bc1..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-@component('mail::message')
-
-# L’ÉDITION DU JOUR
-
-## {{$subject}}
-
-{!! $content !!}
-
-@component('mail::button', ['url' =>  $link ?? '%recipient.file_url%', 'color' => 'primary'])
-Cliquez ici pour lire !
-@endcomponent
-
-
-@endcomponent
-
diff --git a/resources/views/emails/newsletter.blade.php b/resources/views/emails/newsletter.blade.php
new file mode 100644 (file)
index 0000000..ed4792e
--- /dev/null
@@ -0,0 +1,14 @@
+@component('mail::message')
+
+
+{!! $content !!}
+
+@unless($link === null)
+@component('mail::button', ['url' =>  $link , 'color' => 'primary'])
+Cliquez ici
+@endcomponent
+@endunless
+
+
+@endcomponent
+
index 6233abeb2adf3dee329db49171d927d36a96496e..ca2768aa765df43d83e61fcf5d6e144a77ae21d7 100644 (file)
@@ -59,7 +59,7 @@
     </div>
 
 
-    <div class="row mt-4 text-justify">
+    <div class="row mt-4">
         <div class="col-12 mb-3">
             <h2 class="text-center">Nos rubriques du mois</h2>
         </div>
index afdd22d0f02658c91a541ce5e113cb768f135fb0..9c31dea09f9ef3de0ab01a5e153bf7ada454fbe8 100644 (file)
@@ -25,7 +25,7 @@ Route::prefix('other-content')->group(function () {
 
 /** Publishing and mass sending process */
 Route::prefix('publish')->group(function() {
-    Route::get('', 'PublishController@index')->name('publish');
+    Route::get('', 'PublishController@letter')->name('publish.letter');
     Route::post('', 'PublishController@publish');
 
     Route::post('upload-file', 'PublishController@uploadFile');
@@ -35,6 +35,15 @@ Route::prefix('publish')->group(function() {
     Route::get('tags', 'PublishController@tags');
     Route::get('recipients', 'PublishController@recipientsCount');
 
+    Route::get('recipient-groups', 'PublishController@sendGroupList');
+
+    Route::prefix('newsletter')->group(function(){
+        Route::get('/', 'PublishController@newsletter')->name('publish.newsletter');
+
+
+
+    });
+
 });
 
 Route::prefix('statistics')->group(function () {