├── .env.example ├── .gitattributes ├── .gitignore ├── LICENSE ├── app ├── Console │ ├── Commands │ │ ├── DemoCommand.php │ │ └── InstallCommand.php │ └── Kernel.php ├── Exceptions │ └── Handler.php ├── Filters │ ├── CampaignFilter.php │ ├── MailingListFilter.php │ ├── SubscriptionFilter.php │ └── TemplateFilter.php ├── Http │ ├── Controllers │ │ ├── Account │ │ │ ├── GeneralController.php │ │ │ └── PasswordController.php │ │ ├── Auth │ │ │ ├── ForgotPasswordController.php │ │ │ ├── LoginController.php │ │ │ ├── RegisterController.php │ │ │ └── ResetPasswordController.php │ │ ├── CampaignController.php │ │ ├── Controller.php │ │ ├── HomeController.php │ │ ├── MailingListController.php │ │ ├── Settings │ │ │ ├── ApplicationController.php │ │ │ ├── MailController.php │ │ │ └── UserController.php │ │ ├── SubscribeController.php │ │ ├── SubscriptionController.php │ │ └── TemplateController.php │ ├── Kernel.php │ ├── Middleware │ │ ├── EncryptCookies.php │ │ ├── LocaleMiddleware.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php │ └── Requests │ │ ├── Account │ │ ├── GeneralUpdateRequest.php │ │ └── PasswordUpdateRequest.php │ │ ├── CampaignRequest.php │ │ ├── MailingListRequest.php │ │ ├── Settings │ │ ├── ApplicationSettingsUpdateRequest.php │ │ └── MailSettingsUpdateRequest.php │ │ ├── SubscribeRequest.php │ │ ├── SubscriptionRequest.php │ │ └── TemplateRequest.php ├── Jobs │ ├── ImportSubscriptions.php │ └── SendCampaign.php ├── Listeners │ ├── EmailClicked.php │ ├── EmailSent.php │ └── EmailViewed.php ├── Mail │ ├── CampaignMail.php │ ├── CampaignSendMail.php │ ├── ListImported.php │ └── PasswordUpdated.php ├── Models │ ├── Campaign.php │ ├── CampaignViews.php │ ├── Email.php │ ├── MailingList.php │ ├── Subscription.php │ ├── Template.php │ └── User.php ├── Policies │ ├── CampaignPolicy.php │ ├── MailingListPolicy.php │ ├── SubscriptionPolicy.php │ └── TemplatePolicy.php ├── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php └── Utilities │ └── helpers.php ├── artisan ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── database.php ├── debugbar.php ├── dotenveditor.php ├── eloquentfilter.php ├── excel.php ├── filesystems.php ├── hashing.php ├── logging.php ├── mail-tracker.php ├── mail.php ├── queue.php ├── services.php ├── session.php └── view.php ├── database ├── .gitignore ├── factories │ └── UserFactory.php ├── migrations │ ├── .gitkeep │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ ├── 2016_12_13_183420_create_subscriptions_table.php │ ├── 2016_12_13_184729_create_campaigns_table.php │ ├── 2016_12_13_192237_create_mailing_lists_table.php │ ├── 2016_12_15_154112_create_templates_table.php │ ├── 2016_12_30_113350_edit_subscriptions_table.php │ ├── 2016_12_30_113830_edit_campaigns_table.php │ ├── 2016_12_31_114918_create_campaign_mailing_list_pivot_table.php │ ├── 2017_01_03_122943_create_jobs_table.php │ ├── 2017_01_03_122956_create_failed_jobs_table.php │ ├── 2017_06_17_190952_create_emails_table.php │ └── 2018_04_11_222237_edit_users_table.php └── seeds │ ├── .gitkeep │ ├── DatabaseSeeder.php │ └── DemoSeeder.php ├── logo.png ├── package-lock.json ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── css │ ├── app.css │ ├── chosen-sprite.png │ ├── chosen-sprite@2x.png │ ├── chosen.css │ └── sweetalert.css ├── favicon.ico ├── fonts │ └── vendor │ │ └── bootstrap-sass │ │ └── bootstrap │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 ├── images │ └── vendor │ │ └── bootstrap-chosen │ │ ├── chosen-sprite.png │ │ └── chosen-sprite@2x.png ├── index.php ├── mix-manifest.json ├── robots.txt └── web.config ├── readme.md ├── resources ├── assets │ ├── css │ │ ├── app.css │ │ ├── chosen-sprite.png │ │ ├── chosen-sprite@2x.png │ │ ├── chosen.css │ │ ├── custom.css │ │ └── sweetalert.css │ ├── js │ │ ├── Chart.js │ │ ├── app.js │ │ ├── bootstrap.js │ │ ├── chosen.jquery.js │ │ ├── components │ │ │ ├── BarChart.vue │ │ │ ├── LineChart.vue │ │ │ ├── PieChart.vue │ │ │ └── passport │ │ │ │ ├── AuthorizedClients.vue │ │ │ │ ├── Clients.vue │ │ │ │ └── PersonalAccessTokens.vue │ │ └── sweetalert.min.js │ └── sass │ │ ├── _variables.scss │ │ └── app.scss ├── backups │ └── dotenv-editor │ │ └── 1481978518_env ├── lang │ ├── en │ │ ├── account.php │ │ ├── auth.php │ │ ├── campaigns.php │ │ ├── emails.php │ │ ├── forms.php │ │ ├── general.php │ │ ├── language.php │ │ ├── lists.php │ │ ├── menu.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── settings.php │ │ ├── subscriptions.php │ │ ├── templates.php │ │ └── validation.php │ └── nl │ │ ├── account.php │ │ ├── auth.php │ │ ├── campaigns.php │ │ ├── emails.php │ │ ├── forms.php │ │ ├── general.php │ │ ├── language.php │ │ ├── lists.php │ │ ├── menu.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── settings.php │ │ ├── subscriptions.php │ │ ├── templates.php │ │ └── validation.php └── views │ ├── account │ ├── general.blade.php │ ├── parts │ │ └── navigation.blade.php │ └── password.blade.php │ ├── auth │ ├── login.blade.php │ ├── passwords │ │ ├── email.blade.php │ │ └── reset.blade.php │ └── register.blade.php │ ├── campaigns │ ├── edit.blade.php │ ├── index.blade.php │ ├── new.blade.php │ ├── send.blade.php │ └── show.blade.php │ ├── emails │ ├── account │ │ ├── 2fa │ │ │ ├── disabled.blade.php │ │ │ └── enabled.blade.php │ │ └── password │ │ │ └── updated.blade.php │ ├── campaign.blade.php │ ├── campaigns │ │ └── send.blade.php │ └── lists │ │ └── imported.blade.php │ ├── errors │ ├── 503.blade.php │ └── validation_errors.blade.php │ ├── forms │ ├── account │ │ ├── general.blade.php │ │ └── password.blade.php │ ├── campaigns.blade.php │ ├── editor.blade.php │ ├── lists.blade.php │ ├── lists │ │ └── import.blade.php │ ├── settings │ │ ├── application.blade.php │ │ └── mail.blade.php │ ├── subscriptions.blade.php │ └── templates.blade.php │ ├── home.blade.php │ ├── layouts │ └── app.blade.php │ ├── lists │ ├── edit.blade.php │ ├── import.blade.php │ ├── index.blade.php │ ├── new.blade.php │ └── show.blade.php │ ├── parts │ └── success.blade.php │ ├── settings │ ├── application.blade.php │ ├── mail.blade.php │ ├── parts │ │ └── navigation.blade.php │ └── users │ │ └── index.blade.php │ ├── subscriptions │ ├── edit.blade.php │ ├── index.blade.php │ ├── new.blade.php │ ├── show.blade.php │ └── unsubscribe.blade.php │ ├── templates │ ├── edit.blade.php │ ├── index.blade.php │ ├── new.blade.php │ ├── preview.blade.php │ └── show.blade.php │ └── vendor │ ├── .gitkeep │ ├── dotenv-editor │ ├── master.blade.php │ └── overview.blade.php │ ├── emailTrakingViews │ ├── emails │ │ ├── mensaje.blade.php │ │ └── mensaje_layout.blade.php │ ├── index.blade.php │ ├── layouts │ │ └── app.blade.php │ ├── show.blade.php │ ├── smtp_detail.blade.php │ └── url_detail.blade.php │ ├── mail │ ├── html │ │ ├── button.blade.php │ │ ├── footer.blade.php │ │ ├── header.blade.php │ │ ├── layout.blade.php │ │ ├── message.blade.php │ │ ├── panel.blade.php │ │ ├── promotion.blade.php │ │ ├── promotion │ │ │ └── button.blade.php │ │ ├── subcopy.blade.php │ │ ├── table.blade.php │ │ └── themes │ │ │ └── default.css │ └── markdown │ │ ├── button.blade.php │ │ ├── footer.blade.php │ │ ├── header.blade.php │ │ ├── layout.blade.php │ │ ├── message.blade.php │ │ ├── panel.blade.php │ │ ├── promotion.blade.php │ │ ├── promotion │ │ └── button.blade.php │ │ ├── subcopy.blade.php │ │ └── table.blade.php │ ├── notifications │ └── email.blade.php │ ├── pagination │ ├── bootstrap-4.blade.php │ ├── default.blade.php │ ├── simple-bootstrap-4.blade.php │ └── simple-default.blade.php │ └── passport │ └── authorize.blade.php ├── routes ├── api.php ├── channels.php ├── console.php └── web.php ├── server.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── debugbar │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── CreatesApplication.php ├── Feature │ └── ExampleTest.php ├── TestCase.php └── Unit │ └── ExampleTest.php └── webpack.mix.js /.env.example: -------------------------------------------------------------------------------- 1 | APP_ENV=production 2 | APP_KEY= 3 | APP_DEBUG=false 4 | APP_LOG_LEVEL=debug 5 | APP_NAME="Newsletter" 6 | APP_URL=http://laranewsletter.nu 7 | APP_EMAIL=info@laranewsletter.nu 8 | APP_FROM=LaraNewsletter.nu 9 | 10 | APP_REGISTER=true 11 | APP_EDITOR=html 12 | APP_LOCALE=en 13 | 14 | NOTIFICATIONS=true 15 | 16 | DB_CONNECTION=mysql 17 | DB_HOST=127.0.0.1 18 | DB_PORT=3306 19 | DB_DATABASE=homestead 20 | DB_USERNAME=homestead 21 | DB_PASSWORD=secret 22 | 23 | BROADCAST_DRIVER=log 24 | CACHE_DRIVER=file 25 | SESSION_DRIVER=file 26 | QUEUE_DRIVER=sync 27 | 28 | REDIS_HOST=127.0.0.1 29 | REDIS_PASSWORD=null 30 | REDIS_PORT=6379 31 | 32 | MAIL_DRIVER=smtp 33 | MAIL_HOST=mailtrap.io 34 | MAIL_PORT=2525 35 | MAIL_USERNAME=null 36 | MAIL_PASSWORD=null 37 | MAIL_ENCRYPTION=null 38 | 39 | PUSHER_APP_ID= 40 | PUSHER_KEY= 41 | PUSHER_SECRET= -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/storage 3 | /public/css/all.css 4 | /public/js/all.js 5 | /vendor 6 | /.idea 7 | Homestead.json 8 | Homestead.yaml 9 | .env 10 | /.phpstorm.meta.php 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Nathan Geerinck 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/Console/Commands/DemoCommand.php: -------------------------------------------------------------------------------- 1 | line("\nImporting demo data.."); 41 | 42 | $this->callSilent('db:seed --class=DemoSeeder'); 43 | 44 | $this->line("Demo data imported.\n"); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('queue:work') 33 | ->everyMinute(); 34 | } 35 | } 36 | 37 | /** 38 | * Register the Closure based commands for the application. 39 | * 40 | * @return void 41 | */ 42 | protected function commands() 43 | { 44 | $this->load(__DIR__.'/Commands'); 45 | require base_path('routes/console.php'); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | [input_key1, input_key2]]. 12 | * 13 | * @var array 14 | */ 15 | public $relations = []; 16 | 17 | /** 18 | * @param $name 19 | * @return $this 20 | */ 21 | public function name($name) 22 | { 23 | return $this->where('name', 'LIKE', '%'.$name.'%'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Filters/MailingListFilter.php: -------------------------------------------------------------------------------- 1 | [input_key1, input_key2]]. 12 | * 13 | * @var array 14 | */ 15 | public $relations = []; 16 | 17 | /** 18 | * @param $name 19 | * @return $this 20 | */ 21 | public function name($name) 22 | { 23 | return $this->where('name', 'LIKE', '%'.$name.'%'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Filters/SubscriptionFilter.php: -------------------------------------------------------------------------------- 1 | [input_key1, input_key2]]. 12 | * 13 | * @var array 14 | */ 15 | public $relations = []; 16 | 17 | /** 18 | * @param $filter 19 | * @return $this 20 | */ 21 | public function filter($filter) 22 | { 23 | return $this->where(function ($q) use ($filter) { 24 | return $q->where('email', 'LIKE', '%'.$filter.'%') 25 | ->orWhere('name', 'LIKE', '%'.$filter.'%'); 26 | }); 27 | } 28 | 29 | /** 30 | * @param $id 31 | * @return $this 32 | */ 33 | public function mailing_list($id) 34 | { 35 | return $this->where('mailing_list_id', $id); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Filters/TemplateFilter.php: -------------------------------------------------------------------------------- 1 | [input_key1, input_key2]]. 12 | * 13 | * @var array 14 | */ 15 | public $relations = []; 16 | 17 | /** 18 | * @param $name 19 | * @return $this 20 | */ 21 | public function name($name) 22 | { 23 | return $this->where('name', 'LIKE', '%'.$name.'%'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Controllers/Account/GeneralController.php: -------------------------------------------------------------------------------- 1 | user(); 16 | 17 | return view('account.general', compact('account')); 18 | } 19 | 20 | /** 21 | * @param GeneralUpdateRequest $request 22 | * @return \Illuminate\Http\RedirectResponse 23 | */ 24 | public function update(GeneralUpdateRequest $request) 25 | { 26 | $request->user()->update($request->all()); 27 | 28 | notify()->flash(trans('general.woohoo'), 'success', [ 29 | 'timer' => 2000, 30 | 'text' => trans('general.success.update'), 31 | ]); 32 | 33 | return redirect()->back(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Http/Controllers/Account/PasswordController.php: -------------------------------------------------------------------------------- 1 | user(); 19 | 20 | return view('account.password', compact('account')); 21 | } 22 | 23 | public function update(PasswordUpdateRequest $request) 24 | { 25 | $check = Hash::check($request->input('old_password'), auth()->user()->password); 26 | 27 | if (! $check) { 28 | return redirect()->back()->withErrors(['Your current password is incorrect!']); 29 | } 30 | 31 | $user = $request->user(); 32 | $user->password = bcrypt($request->input('new_password')); 33 | $user->save(); 34 | 35 | if (env('NOTIFICATIONS') == true) { 36 | Mail::to($user)->queue(new PasswordUpdated()); 37 | } 38 | 39 | notify()->flash('Password', 'success', [ 40 | 'timer' => 2000, 41 | 'text' => 'Successfully updated!', 42 | ]); 43 | 44 | return redirect()->back(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/LoginController.php: -------------------------------------------------------------------------------- 1 | middleware('guest', ['except' => 'logout']); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/RegisterController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 40 | } 41 | 42 | /** 43 | * Get a validator for an incoming registration request. 44 | * 45 | * @param array $data 46 | * @return \Illuminate\Contracts\Validation\Validator 47 | */ 48 | protected function validator(array $data) 49 | { 50 | return Validator::make($data, [ 51 | 'username' => 'required|max:255', 52 | 'email' => 'required|email|max:255|unique:users', 53 | 'password' => 'required|min:6|confirmed', 54 | ]); 55 | } 56 | 57 | /** 58 | * Create a new user instance after a valid registration. 59 | * 60 | * @param array $data 61 | * @return User 62 | */ 63 | protected function create(array $data) 64 | { 65 | return User::create([ 66 | 'username' => $data['username'], 67 | 'email' => $data['email'], 68 | 'password' => bcrypt($data['password']), 69 | ]); 70 | } 71 | 72 | /** 73 | * Just a custom override to prevent register when option is disabled. 74 | * 75 | * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector 76 | */ 77 | public function showRegistrationForm() 78 | { 79 | abort_unless(env('APP_REGISTER'), 404); 80 | 81 | return view('auth.register'); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ResetPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 13 | } 14 | 15 | /** 16 | * Show the application dashboard. 17 | */ 18 | public function index() 19 | { 20 | return view('home'); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Controllers/Settings/ApplicationController.php: -------------------------------------------------------------------------------- 1 | changeEnv([ 31 | 'APP_NAME' => '"'.$request->input('APP_NAME').'"', 32 | 'APP_URL' => $request->input('APP_URL'), 33 | 'APP_EMAIL' => $request->input('APP_EMAIL'), 34 | 'APP_FROM' => '"'.$request->input('APP_FROM').'"', 35 | 'APP_REGISTER' => $request->input('APP_REGISTER'), 36 | 'APP_EDITOR' => $request->input('APP_EDITOR'), 37 | 'APP_LOCALE' => $request->input('APP_LOCALE'), 38 | ]); 39 | 40 | notify()->flash(trans('general.woohoo'), 'success', [ 41 | 'timer' => 2000, 42 | 'text' => trans('general.success.update'), 43 | ]); 44 | 45 | return redirect()->route('settings.application'); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Http/Controllers/Settings/MailController.php: -------------------------------------------------------------------------------- 1 | changeEnv([ 31 | 'MAIL_DRIVER' => $request->input('MAIL_DRIVER'), 32 | 'MAIL_PORT' => $request->input('MAIL_PORT'), 33 | 'MAIL_HOST' => $request->input('MAIL_HOST'), 34 | 'MAIL_USERNAME' => $request->input('MAIL_USERNAME'), 35 | 'MAIL_PASSWORD' => $request->input('MAIL_PASSWORD'), 36 | ]); 37 | 38 | notify()->flash(trans('general.woohoo'), 'success', [ 39 | 'timer' => 2000, 40 | 'text' => trans('general.success.update'), 41 | ]); 42 | 43 | return redirect()->route('settings.mail'); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/Http/Controllers/Settings/UserController.php: -------------------------------------------------------------------------------- 1 | public, 404); 18 | 19 | return view('subscribe.list', compact('list')); 20 | } 21 | 22 | /** 23 | * @param SubscribeRequest $request 24 | * @param MailingList $list 25 | * @return \Illuminate\Http\RedirectResponse 26 | */ 27 | public function subscribe(SubscribeRequest $request, MailingList $list) 28 | { 29 | $subscription = $list->subscriptions()->create($request->all()); 30 | 31 | notify()->flash($list->name, 'success', [ 32 | 'timer' => 2000, 33 | 'text' => trans('subscriptions.subscribe.success'), 34 | ]); 35 | 36 | return redirect()->back(); 37 | } 38 | 39 | /** 40 | * @param $email 41 | * @param $unSubscribe 42 | * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View 43 | */ 44 | public function preUnSubscribe($email, $unSubscribe) 45 | { 46 | $subscription = Subscription::whereEmail($email)->whereUnsubscribe($unSubscribe)->first(); 47 | 48 | abort_unless($subscription, 404); 49 | 50 | return view('subscriptions.unsubscribe', compact('subscription')); 51 | } 52 | 53 | /** 54 | * @param Subscription $subscription 55 | * @return \Illuminate\Http\RedirectResponse 56 | */ 57 | public function unSubscribe(Subscription $subscription) 58 | { 59 | $subscription->delete(); 60 | 61 | notify()->flash(trans('general.woohoo'), 'success', [ 62 | 'timer' => 3500, 63 | 'text' => trans('subscriptions.unsubscribe.success'), 64 | ]); 65 | 66 | return redirect()->route('index'); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/Http/Kernel.php: -------------------------------------------------------------------------------- 1 | [ 31 | \App\Http\Middleware\EncryptCookies::class, 32 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 33 | \Illuminate\Session\Middleware\StartSession::class, 34 | // \Illuminate\Session\Middleware\AuthenticateSession::class, 35 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 36 | \App\Http\Middleware\VerifyCsrfToken::class, 37 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 38 | \App\Http\Middleware\LocaleMiddleware::class, 39 | 40 | ], 41 | 42 | 'api' => [ 43 | 'throttle:60,1', 44 | 'bindings', 45 | ], 46 | ]; 47 | 48 | /** 49 | * The application's route middleware. 50 | * 51 | * These middleware may be assigned to groups or used individually. 52 | * 53 | * @var array 54 | */ 55 | protected $routeMiddleware = [ 56 | 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 57 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 58 | 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 59 | 'can' => \Illuminate\Auth\Middleware\Authorize::class, 60 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 61 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 62 | ]; 63 | } 64 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | preferences['language']; 23 | 24 | app()->setLocale($lang); 25 | } else { 26 | app()->setLocale(env('APP_LOCALE')); 27 | } 28 | 29 | return $next($request); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 21 | return redirect('/'); 22 | } 23 | 24 | return $next($request); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 'required|min:3', 31 | 'email' => 'required', 32 | 'preferences' => [ 33 | 'language' => 'required', 34 | 'notifications' => 'required' 35 | ], 36 | ]; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Http/Requests/Account/PasswordUpdateRequest.php: -------------------------------------------------------------------------------- 1 | 'required', 28 | 'new_password' => 'required|confirmed|min:6', 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Http/Requests/CampaignRequest.php: -------------------------------------------------------------------------------- 1 | 'required', 28 | 'subject' => 'required', 29 | 'template_id' => 'required', 30 | 'mailing_lists' => 'required' 31 | ]; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Http/Requests/MailingListRequest.php: -------------------------------------------------------------------------------- 1 | 'required|min:3', 28 | 'description' => 'max:150' 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Http/Requests/Settings/ApplicationSettingsUpdateRequest.php: -------------------------------------------------------------------------------- 1 | 'required|min:3|max:30', 28 | 'APP_URL' => 'required|url', 29 | 'APP_EMAIL' => 'required|email', 30 | 'APP_FROM' => 'required|min:3|max:55', 31 | 'APP_REGISTER' => 'required', 32 | 'APP_EDITOR' => 'required', 33 | 'APP_LOCALE' => 'required', 34 | ]; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Http/Requests/Settings/MailSettingsUpdateRequest.php: -------------------------------------------------------------------------------- 1 | 'required', 28 | 'MAIL_PORT' => 'required', 29 | 'MAIL_HOST' => 'required', 30 | 'MAIL_USERNAME' => 'required', 31 | 'MAIL_PASSWORD' => 'required', 32 | ]; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Http/Requests/SubscribeRequest.php: -------------------------------------------------------------------------------- 1 | 'required' 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Requests/SubscriptionRequest.php: -------------------------------------------------------------------------------- 1 | 'email|required', 28 | 'mailing_list_id' => 'required' 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Http/Requests/TemplateRequest.php: -------------------------------------------------------------------------------- 1 | 'required', 28 | 'content' => 'required' 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Jobs/ImportSubscriptions.php: -------------------------------------------------------------------------------- 1 | user = $user; 39 | $this->list = $list; 40 | $this->results = $results; 41 | } 42 | 43 | public function handle() 44 | { 45 | foreach ($this->results as $result) { 46 | $this->list->subscriptions()->create($result); 47 | } 48 | 49 | if (env('NOTIFICATIONS') == true) { 50 | Mail::to($this->user)->queue(new ListImported($this->list)); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/Jobs/SendCampaign.php: -------------------------------------------------------------------------------- 1 | user = $user; 41 | $this->campaign = $campaign; 42 | $this->template = $template; 43 | } 44 | 45 | /** 46 | * Execute the job. 47 | * 48 | * @return void 49 | */ 50 | public function handle() 51 | { 52 | $lists = $this->campaign 53 | ->mailingLists() 54 | ->with('subscriptions') 55 | ->get(); 56 | 57 | $chunk = ceil($lists->count() / 4); 58 | 59 | $lists->each(function ($list) use ($chunk) { 60 | $list->subscriptions()->chunk($chunk, function ($subscriptions) { 61 | $subscriptions->each(function ($subscription) { 62 | Mail::to($subscription)->queue(new CampaignMail($subscription, $this->campaign, $this->template)); 63 | }); 64 | }); 65 | }); 66 | 67 | $this->campaign->update([ 68 | 'send' => 1 69 | ]); 70 | 71 | if ($this->user->preferences['notifications']) { 72 | Mail::to($this->user)->queue(new CampaignSendMail($this->campaign->getSubscriptions(), $this->campaign)); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/Listeners/EmailClicked.php: -------------------------------------------------------------------------------- 1 | sent_email->getHeader('X-Campaign-ID'); 29 | 30 | if ($campaign_id) { 31 | $email = Email::where('message_id', $event->sent_email->message_id)->first(); 32 | $email->clicks = $email->clicks + 1; 33 | $email->save(); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Listeners/EmailSent.php: -------------------------------------------------------------------------------- 1 | sent_email->getHeader('X-Campaign-ID'); 24 | 25 | if ($campaign_id) { 26 | Email::create([ 27 | 'campaign_id' => $campaign_id, 28 | 'message_id' => $event->sent_email->message_id 29 | ]); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Listeners/EmailViewed.php: -------------------------------------------------------------------------------- 1 | sent_email->getHeader('X-Campaign-ID'); 18 | 19 | if ($campaign_id) { 20 | $email = Email::where('message_id', $event->sent_email->message_id)->first(); 21 | $email->opens = $email->opens + 1; 22 | $email->save(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Mail/CampaignMail.php: -------------------------------------------------------------------------------- 1 | subscription = $subscription; 29 | $this->campaign = $campaign; 30 | $this->template = $template; 31 | } 32 | 33 | /** 34 | * Build the message. 35 | * 36 | * @return $this 37 | */ 38 | public function build() 39 | { 40 | return $this->subject($this->campaign->subject) 41 | ->view('emails.campaign') 42 | ->with([ 43 | 'content' => $this->str_replace_dynamic([ 44 | '%subject%' => $this->campaign->subject, 45 | '%email%' => $this->subscription->email, 46 | '%name%' => $this->subscription->name, 47 | '%country%' => countries($this->subscription->country), 48 | '%unsubscribe_link%' => route('subscriptions.preunsubscribe', [$this->subscription->email, $this->subscription->unsubscribe]) 49 | ], $this->template->content) 50 | ])->withSwiftMessage(function ($message) { 51 | $headers = $message->getHeaders(); 52 | $headers->addTextHeader('X-Campaign-ID', $this->campaign->id); 53 | }); 54 | } 55 | 56 | public function str_replace_dynamic(array $replace, $string) 57 | { 58 | return str_replace(array_keys($replace), array_values($replace), $string); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/Mail/CampaignSendMail.php: -------------------------------------------------------------------------------- 1 | subscriptions = $subscriptions; 24 | $this->campaign = $campaign; 25 | } 26 | 27 | /** 28 | * Build the message. 29 | * 30 | * @return $this 31 | */ 32 | public function build() 33 | { 34 | return $this->markdown('emails.campaigns.send', ['campaign' => $this->campaign->name, 'subscribers' => count($this->subscriptions)]) 35 | ->subject(trans('emails.campaigns.send.subject')); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Mail/ListImported.php: -------------------------------------------------------------------------------- 1 | list = $list; 26 | } 27 | 28 | /** 29 | * Build the message. 30 | * 31 | * @return $this 32 | */ 33 | public function build() 34 | { 35 | return $this->markdown('emails.lists.imported') 36 | ->subject(trans('emails.lists.imported.subject')) 37 | ->with(['list' => $this->list]); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Mail/PasswordUpdated.php: -------------------------------------------------------------------------------- 1 | markdown('emails.password.updated.subject') 31 | ->subject('emails.password.updated.subject'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Models/Campaign.php: -------------------------------------------------------------------------------- 1 | 'boolean' 32 | ]; 33 | 34 | public function mailingLists() 35 | { 36 | return $this->belongsToMany(MailingList::class)->withPivot('campaign_id', 'mailing_list_id'); 37 | } 38 | 39 | public function user() 40 | { 41 | return $this->belongsTo(User::class); 42 | } 43 | 44 | public function template() 45 | { 46 | return $this->belongsTo(Template::class); 47 | } 48 | 49 | public function emails() 50 | { 51 | return $this->hasMany(Email::class); 52 | } 53 | 54 | public function scopeNotSent($query) 55 | { 56 | return $query->whereSend(false); 57 | } 58 | 59 | public function getSubscriptions() 60 | { 61 | return $this->mailingLists->pluck('subscriptions')->flatten(); 62 | } 63 | 64 | public function getRecipients() 65 | { 66 | return $this->mailingLists->pluck('subscriptions'); 67 | } 68 | 69 | public function getMailingList() 70 | { 71 | return $this->mailingLists->flatten(); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /app/Models/CampaignViews.php: -------------------------------------------------------------------------------- 1 | belongsTo(Campaign::class); 20 | } 21 | 22 | public function scopeOpened($query) 23 | { 24 | return $query->where('opens', '>', 0); 25 | } 26 | 27 | public function scopeUnOpened($query) 28 | { 29 | return $query->where('opens', 0); 30 | } 31 | 32 | public function scopeClicked($query) 33 | { 34 | return $query->where('clicks', '>', 0); 35 | } 36 | 37 | public function scopeNotClicked($query) 38 | { 39 | return $query->where('clicks', 0); 40 | } 41 | 42 | public function scopeThisYear($query) 43 | { 44 | return $query->where('created_at', '>', Carbon::now()->firstOfYear()); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/Models/MailingList.php: -------------------------------------------------------------------------------- 1 | hasMany(Subscription::class); 29 | } 30 | 31 | public function campaigns() 32 | { 33 | return $this->belongsToMany(Campaign::class)->withPivot('campaign_id', 'mailing_list_id'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Models/Subscription.php: -------------------------------------------------------------------------------- 1 | where('mailing_list_id', $type); 41 | } 42 | 43 | /** 44 | * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 45 | */ 46 | public function mailingList() 47 | { 48 | return $this->belongsTo(MailingList::class); 49 | } 50 | 51 | /** 52 | * @return \Illuminate\Database\Eloquent\Relations\HasOne 53 | */ 54 | public function user() 55 | { 56 | return $this->hasOne(User::class); 57 | } 58 | 59 | /** 60 | * @return mixed 61 | */ 62 | public function getCampaigns() 63 | { 64 | return $this->mailingList->pluck('campaigns')->flatten(); 65 | } 66 | 67 | public static function boot() 68 | { 69 | parent::boot(); 70 | 71 | static::creating(function ($subscription) { 72 | $subscription->unsubscribe = str_random(25); 73 | }); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /app/Models/Template.php: -------------------------------------------------------------------------------- 1 | belongsToMany(Campaign::class); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Models/User.php: -------------------------------------------------------------------------------- 1 | 'array', 41 | ]; 42 | 43 | /** 44 | * @return \Illuminate\Database\Eloquent\Relations\HasMany 45 | */ 46 | public function subscription() 47 | { 48 | return $this->hasMany(Subscription::class); 49 | } 50 | 51 | /** 52 | * @return \Illuminate\Database\Eloquent\Relations\HasMany 53 | */ 54 | public function mailingList() 55 | { 56 | return $this->hasMany(MailingList::class); 57 | } 58 | 59 | /** 60 | * @return \Illuminate\Database\Eloquent\Relations\HasMany 61 | */ 62 | public function template() 63 | { 64 | return $this->hasMany(Template::class); 65 | } 66 | 67 | /** 68 | * @return \Illuminate\Database\Eloquent\Relations\HasMany 69 | */ 70 | public function campaigns() 71 | { 72 | return $this->hasMany(Campaign::class); 73 | } 74 | 75 | public function generate2faKey() 76 | { 77 | if (! $this->google2fa_secret) { 78 | $google2fa = new Google2FA(); 79 | 80 | $this->google2fa_secret = $google2fa->generateSecretKey(); 81 | $this->save(); 82 | } 83 | } 84 | 85 | public function verifyKey($secret) 86 | { 87 | $google2fa = new Google2FA(); 88 | 89 | return $google2fa->verifyKey($this->google2fa_secret, $secret); 90 | } 91 | 92 | public function twoFactorBackupCodes() 93 | { 94 | return $this->hasMany(TwofactorBackupCodes::class, 'user_id'); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /app/Policies/CampaignPolicy.php: -------------------------------------------------------------------------------- 1 | id === $campaign->user_id; 23 | } 24 | 25 | /** 26 | * @param User $user 27 | * @param Campaign $campaign 28 | * @return bool 29 | */ 30 | public function edit(User $user, Campaign $campaign) 31 | { 32 | return $user->id === $campaign->user_id; 33 | } 34 | 35 | /** 36 | * Determine whether the user can update the campaign. 37 | * 38 | * @param \App\Models\User $user 39 | * @param Campaign $campaign 40 | * @return mixed 41 | */ 42 | public function update(User $user, Campaign $campaign) 43 | { 44 | return $user->id === $campaign->user_id; 45 | } 46 | 47 | /** 48 | * Determine whether the user can delete the campaign. 49 | * 50 | * @param \App\Models\User $user 51 | * @param Campaign $campaign 52 | * @return mixed 53 | */ 54 | public function delete(User $user, Campaign $campaign) 55 | { 56 | return $user->id === $campaign->user_id; 57 | } 58 | 59 | /** 60 | * @param User $user 61 | * @param Campaign $campaign 62 | * @return bool 63 | */ 64 | public function export(User $user, Campaign $campaign) 65 | { 66 | return $user->id === $campaign->user_id; 67 | } 68 | 69 | /** 70 | * @param User $user 71 | * @param Campaign $campaign 72 | * @return bool 73 | */ 74 | public function send(User $user, Campaign $campaign) 75 | { 76 | return $user->id === $campaign->user_id; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /app/Policies/MailingListPolicy.php: -------------------------------------------------------------------------------- 1 | id === $mailingList->user_id; 23 | } 24 | 25 | /** 26 | * Determine whether the user can update the mailingList. 27 | * 28 | * @param \App\Models\User $user 29 | * @param MailingList $mailingList 30 | * @return mixed 31 | */ 32 | public function update(User $user, MailingList $mailingList) 33 | { 34 | return $user->id === $mailingList->user_id; 35 | } 36 | 37 | /** 38 | * Determine whether the user can delete the mailingList. 39 | * 40 | * @param \App\Models\User $user 41 | * @param MailingList $mailingList 42 | * @return mixed 43 | */ 44 | public function delete(User $user, MailingList $mailingList) 45 | { 46 | return $user->id === $mailingList->user_id; 47 | } 48 | 49 | /** 50 | * Determine whether the user can send the mailingList. 51 | * 52 | * @param \App\Models\User $user 53 | * @param MailingList $mailingList 54 | * @return mixed 55 | */ 56 | public function send(User $user, MailingList $mailingList) 57 | { 58 | return $user->id === $mailingList->user_id; 59 | } 60 | 61 | /** 62 | * Determine whether the user can export the mailingList. 63 | * 64 | * @param \App\Models\User $user 65 | * @param MailingList $mailingList 66 | * @return mixed 67 | */ 68 | public function export(User $user, MailingList $mailingList) 69 | { 70 | return $user->id === $mailingList->user_id; 71 | } 72 | 73 | /** 74 | * Determine whether the user can import the mailingList. 75 | * 76 | * @param \App\Models\User $user 77 | * @param MailingList $mailingList 78 | * @return mixed 79 | */ 80 | public function imoort(User $user, MailingList $mailingList) 81 | { 82 | return $user->id === $mailingList->user_id; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/Policies/SubscriptionPolicy.php: -------------------------------------------------------------------------------- 1 | id === $subscription->user_id; 23 | } 24 | 25 | /** 26 | * Determine whether the user can update the subscription. 27 | * 28 | * @param \App\Models\User $user 29 | * @param Subscription $subscription 30 | * @return mixed 31 | */ 32 | public function update(User $user, Subscription $subscription) 33 | { 34 | return $user->id === $subscription->user_id; 35 | } 36 | 37 | /** 38 | * Determine whether the user can delete the subscription. 39 | * 40 | * @param \App\Models\User $user 41 | * @param Subscription $subscription 42 | * @return mixed 43 | */ 44 | public function delete(User $user, Subscription $subscription) 45 | { 46 | return $user->id === $subscription->user_id; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/Policies/TemplatePolicy.php: -------------------------------------------------------------------------------- 1 | id === $template->user_id; 23 | } 24 | 25 | /** 26 | * Determine whether the user can update the template. 27 | * 28 | * @param \App\Models\User $user 29 | * @param Template $template 30 | * @return mixed 31 | */ 32 | public function update(User $user, Template $template) 33 | { 34 | return $user->id === $template->user_id; 35 | } 36 | 37 | /** 38 | * Determine whether the user can delete the template. 39 | * 40 | * @param \App\Models\User $user 41 | * @param Template $template 42 | * @return mixed 43 | */ 44 | public function delete(User $user, Template $template) 45 | { 46 | return $user->id === $template->user_id; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | app->environment() == 'local') { 28 | // $this->app->register('Laracasts\Generators\GeneratorsServiceProvider'); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Providers/AuthServiceProvider.php: -------------------------------------------------------------------------------- 1 | \App\Policies\CampaignPolicy::class, 16 | \App\Models\MailingList::class => \App\Policies\MailingListPolicy::class, 17 | \App\Models\Subscription::class => \App\Policies\SubscriptionPolicy::class, 18 | \App\Models\Template::class => \App\Policies\TemplatePolicy::class, 19 | ]; 20 | 21 | /** 22 | * Register any authentication / authorization services. 23 | * 24 | * @return void 25 | */ 26 | public function boot() 27 | { 28 | $this->registerPolicies(); 29 | 30 | // 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 17 | \App\Listeners\EmailSent::class, 18 | ], 19 | 'jdavidbakr\MailTracker\Events\ViewEmailEvent' => [ 20 | \App\Listeners\EmailViewed::class, 21 | ], 22 | 'jdavidbakr\MailTracker\Events\LinkClickedEvent' => [ 23 | \App\Listeners\EmailClicked::class, 24 | ], 25 | ]; 26 | 27 | /** 28 | * Register any events for your application. 29 | * 30 | * @return void 31 | */ 32 | public function boot() 33 | { 34 | parent::boot(); 35 | 36 | // 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | mapApiRoutes(); 39 | 40 | $this->mapWebRoutes(); 41 | 42 | // 43 | } 44 | 45 | /** 46 | * Define the "web" routes for the application. 47 | * 48 | * These routes all receive session state, CSRF protection, etc. 49 | * 50 | * @return void 51 | */ 52 | protected function mapWebRoutes() 53 | { 54 | Route::middleware('web') 55 | ->namespace($this->namespace) 56 | ->group(base_path('routes/web.php')); 57 | } 58 | 59 | /** 60 | * Define the "api" routes for the application. 61 | * 62 | * These routes are typically stateless. 63 | * 64 | * @return void 65 | */ 66 | protected function mapApiRoutes() 67 | { 68 | Route::prefix('api') 69 | ->middleware('api') 70 | ->namespace($this->namespace) 71 | ->group(base_path('routes/api.php')); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "description": "The Laravel Framework.", 4 | "keywords": [ 5 | "framework", 6 | "laravel" 7 | ], 8 | "license": "MIT", 9 | "type": "project", 10 | "require": { 11 | "php": ">=7.0.0", 12 | "laravel/framework": "5.7.*", 13 | "laravelcollective/html": "^5.7.1", 14 | "tucker-eric/eloquentfilter": "^1.0", 15 | "brotzka/laravel-dotenv-editor": "^2.0", 16 | "codecourse/notify": "^1.1", 17 | "maatwebsite/excel": "^2.1", 18 | "graham-campbell/markdown": "^10.0", 19 | "laravel/tinker": "~1.0", 20 | "pragmarx/google2fa": "^1.0", 21 | "jdavidbakr/mail-tracker": "~2.1", 22 | "laravel/passport": "^7.0", 23 | "fideloper/proxy": "~4.0" 24 | }, 25 | "require-dev": { 26 | "fzaninotto/faker": "~1.4", 27 | "mockery/mockery": "0.9.*", 28 | "phpunit/phpunit": "~7.0", 29 | "filp/whoops": "~2.0", 30 | "barryvdh/laravel-debugbar": "^3.1.4", 31 | "barryvdh/laravel-ide-helper": "^2.4" 32 | }, 33 | "autoload": { 34 | "classmap": [ 35 | "database" 36 | ], 37 | "files": [ 38 | "app/Utilities/helpers.php" 39 | ], 40 | "psr-4": { 41 | "App\\": "app/" 42 | } 43 | }, 44 | "autoload-dev": { 45 | "psr-4": { 46 | "Tests\\": "tests/" 47 | } 48 | }, 49 | "scripts": { 50 | "post-root-package-install": [ 51 | "php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 52 | ], 53 | "post-create-project-cmd": [ 54 | "php artisan key:generate" 55 | ], 56 | "post-autoload-dump": [ 57 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 58 | "@php artisan package:discover" 59 | ], 60 | "post-update-cmd": [ 61 | "Illuminate\\Foundation\\ComposerScripts::postUpdate", 62 | "php artisan ide-helper:generate", 63 | "php artisan ide-helper:meta" 64 | ] 65 | }, 66 | "config": { 67 | "preferred-install": "dist" 68 | }, 69 | "extra": { 70 | "laravel": { 71 | "dont-discover": [] 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'cluster' => env('PUSHER_APP_CLUSTER'), 40 | 'encrypted' => true, 41 | ], 42 | ], 43 | 44 | 'redis' => [ 45 | 'driver' => 'redis', 46 | 'connection' => 'default', 47 | ], 48 | 49 | 'log' => [ 50 | 'driver' => 'log', 51 | ], 52 | 53 | 'null' => [ 54 | 'driver' => 'null', 55 | ], 56 | 57 | ], 58 | 59 | ]; 60 | -------------------------------------------------------------------------------- /config/dotenveditor.php: -------------------------------------------------------------------------------- 1 | base_path().'/.env', 19 | 'backupPath' => base_path().'/resources/backups/dotenv-editor/', // Make sure, you have a "/" at the end 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | GUI-Settings 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Here you can set the different parameter for the view, where you can edit 27 | | .env via a graphical interface. 28 | | 29 | | Comma-separate your different middlewares. 30 | | 31 | */ 32 | 33 | // Activate or deactivate the graphical interface 34 | 'activated' => false, 35 | 36 | // Set the base-route. All requests start here 37 | 'route' => '/enveditor', 38 | 39 | // middleware and middlewaregroups. Add your own middleware if you want. 40 | 'middleware' => ['web'], 41 | 'middlewareGroups' => [] 42 | ]; 43 | -------------------------------------------------------------------------------- /config/eloquentfilter.php: -------------------------------------------------------------------------------- 1 | 'App\\Filters\\', 15 | 16 | ]; 17 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "s3", "rackspace" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_ACCESS_KEY_ID'), 61 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 62 | 'region' => env('AWS_DEFAULT_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | ], 65 | 66 | ], 67 | 68 | ]; 69 | -------------------------------------------------------------------------------- /config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | ]; 21 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Log Channels 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the log channels for your application. Out of 24 | | the box, Laravel uses the Monolog PHP logging library. This gives 25 | | you a variety of powerful log handlers / formatters to utilize. 26 | | 27 | | Available Drivers: "single", "daily", "slack", "syslog", 28 | | "errorlog", "custom", "stack" 29 | | 30 | */ 31 | 32 | 'channels' => [ 33 | 'stack' => [ 34 | 'driver' => 'stack', 35 | 'channels' => ['single'], 36 | ], 37 | 38 | 'single' => [ 39 | 'driver' => 'single', 40 | 'path' => storage_path('logs/laravel.log'), 41 | 'level' => 'debug', 42 | ], 43 | 44 | 'daily' => [ 45 | 'driver' => 'daily', 46 | 'path' => storage_path('logs/laravel.log'), 47 | 'level' => 'debug', 48 | 'days' => 7, 49 | ], 50 | 51 | 'slack' => [ 52 | 'driver' => 'slack', 53 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 54 | 'username' => 'Laravel Log', 55 | 'emoji' => ':boom:', 56 | 'level' => 'critical', 57 | ], 58 | 59 | 'syslog' => [ 60 | 'driver' => 'syslog', 61 | 'level' => 'debug', 62 | ], 63 | 64 | 'errorlog' => [ 65 | 'driver' => 'errorlog', 66 | 'level' => 'debug', 67 | ], 68 | ], 69 | 70 | ]; 71 | -------------------------------------------------------------------------------- /config/mail-tracker.php: -------------------------------------------------------------------------------- 1 | true, 9 | 10 | /* 11 | * To disable injecting tracking links, set this to false. 12 | */ 13 | 'track-links' => true, 14 | 15 | /* 16 | * Optionally expire old emails, set to 0 to keep forever. 17 | */ 18 | 'expire-days' => 60, 19 | 20 | /* 21 | * Where should the pingback URL route be? 22 | */ 23 | 'route' => [ 24 | 'prefix' => 'email', 25 | 'middleware' => ['web'], 26 | ], 27 | 28 | /* 29 | * Where should the admin route be? 30 | */ 31 | 'admin-route' => [ 32 | 'prefix' => 'email-manager', 33 | 'middleware' => ['web'], 34 | ], 35 | 36 | /* 37 | * Admin Tamplate 38 | * example 39 | * 'name' => 'layouts.app' for Default emailTraking use 'emailTrakingViews::layouts.app' 40 | * 'section' => 'content' for Default emailTraking use 'content' 41 | * 'styles_section' => 'styles' for Default emailTraking use 'styles' 42 | */ 43 | 'admin-template' => [ 44 | 'name' => 'emailTrakingViews::layouts.app', 45 | 'section' => 'content', 46 | ], 47 | 48 | /* 49 | * Number of emails per page in the admin view 50 | */ 51 | 'emails-per-page' => 30, 52 | 53 | /* 54 | * Date Format 55 | */ 56 | 'date-format' => 'd/m/Y g:i a', 57 | 58 | /* 59 | * Default database connection name (optional - use null for default) 60 | */ 61 | 'connection' => null 62 | ]; 63 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | ], 21 | 22 | 'ses' => [ 23 | 'key' => env('SES_KEY'), 24 | 'secret' => env('SES_SECRET'), 25 | 'region' => 'us-east-1', 26 | ], 27 | 28 | 'sparkpost' => [ 29 | 'secret' => env('SPARKPOST_SECRET'), 30 | ], 31 | 32 | 'stripe' => [ 33 | 'model' => App\User::class, 34 | 'key' => env('STRIPE_KEY'), 35 | 'secret' => env('STRIPE_SECRET'), 36 | ], 37 | 38 | ]; 39 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => realpath(storage_path('framework/views')), 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | define(App\User::class, function (Faker $faker) { 17 | return [ 18 | 'name' => $faker->name, 19 | 'email' => $faker->unique()->safeEmail, 20 | 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 21 | 'remember_token' => str_random(10), 22 | ]; 23 | }); 24 | -------------------------------------------------------------------------------- /database/migrations/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('username')->unique(); 19 | $table->string('firstname')->nullable(); 20 | $table->string('lastname')->nullable(); 21 | $table->string('email')->unique(); 22 | $table->string('password'); 23 | $table->string('language')->default('en'); 24 | $table->tinyInteger('notifications_on')->default(true); 25 | $table->rememberToken(); 26 | $table->timestamps(); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | * 33 | * @return void 34 | */ 35 | public function down() 36 | { 37 | Schema::drop('users'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token')->index(); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::drop('password_resets'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2016_12_13_183420_create_subscriptions_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | 19 | $table->string('email'); 20 | $table->string('name')->nullable(); 21 | $table->string('country')->nullable(); 22 | $table->string('language')->nullable(); 23 | $table->string('unsubscribe'); 24 | 25 | $table->integer('user_id')->unsigned()->index(); 26 | $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 27 | 28 | $table->timestamps(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('subscriptions'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /database/migrations/2016_12_13_184729_create_campaigns_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('subject'); 20 | $table->tinyInteger('send')->default('0'); 21 | 22 | $table->integer('user_id')->unsigned()->index(); 23 | $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 24 | 25 | $table->timestamps(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('campaigns'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /database/migrations/2016_12_13_192237_create_mailing_lists_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('description'); 20 | $table->tinyInteger('public')->default(false); 21 | 22 | $table->integer('user_id')->unsigned()->index(); 23 | $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 24 | 25 | $table->timestamps(); 26 | }); 27 | } 28 | 29 | /** 30 | * Reverse the migrations. 31 | * 32 | * @return void 33 | */ 34 | public function down() 35 | { 36 | Schema::dropIfExists('mailing_lists'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /database/migrations/2016_12_15_154112_create_templates_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->longText('content'); 20 | 21 | $table->integer('user_id')->unsigned()->index(); 22 | $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 23 | 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::disableForeignKeyConstraints(); 36 | 37 | Schema::dropIfExists('templates'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /database/migrations/2016_12_30_113350_edit_subscriptions_table.php: -------------------------------------------------------------------------------- 1 | integer('mailing_list_id')->unsigned()->nullable(); 17 | $table->foreign('mailing_list_id')->references('id')->on('mailing_lists')->onDelete('cascade'); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('subscriptions', function ($table) { 29 | // $table->dropIndex(['mailing_list_id']); 30 | $table->dropForeign(['mailing_list_id']); 31 | $table->dropColumn(['mailing_list_id']); 32 | }); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2016_12_30_113830_edit_campaigns_table.php: -------------------------------------------------------------------------------- 1 | integer('template_id')->unsigned()->index(); 17 | $table->foreign('template_id')->references('id')->on('templates')->onDelete('cascade'); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('campaigns', function ($table) { 29 | $table->dropForeign(['template_id']); 30 | $table->dropIndex(['template_id']); 31 | $table->dropColumn(['template_id']); 32 | }); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2016_12_31_114918_create_campaign_mailing_list_pivot_table.php: -------------------------------------------------------------------------------- 1 | integer('campaign_id')->unsigned()->index(); 17 | $table->foreign('campaign_id')->references('id')->on('campaigns')->onDelete('cascade'); 18 | 19 | $table->integer('mailing_list_id')->unsigned()->index(); 20 | $table->foreign('mailing_list_id')->references('id')->on('mailing_lists')->onDelete('cascade'); 21 | 22 | $table->primary(['campaign_id', 'mailing_list_id']); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::disableForeignKeyConstraints(); 34 | 35 | Schema::drop('campaign_mailing_list'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /database/migrations/2017_01_03_122943_create_jobs_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->string('queue'); 19 | $table->longText('payload'); 20 | $table->tinyInteger('attempts')->unsigned(); 21 | $table->unsignedInteger('reserved_at')->nullable(); 22 | $table->unsignedInteger('available_at'); 23 | $table->unsignedInteger('created_at'); 24 | $table->index(['queue', 'reserved_at']); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('jobs'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /database/migrations/2017_01_03_122956_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->text('connection'); 19 | $table->text('queue'); 20 | $table->longText('payload'); 21 | $table->longText('exception'); 22 | $table->timestamp('failed_at')->useCurrent(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('failed_jobs'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2017_06_17_190952_create_emails_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('message_id')->nullable(); 19 | $table->integer('campaign_id')->unsigned()->index(); 20 | $table->foreign('campaign_id')->references('id')->on('campaigns')->onDelete('cascade'); 21 | $table->integer('opens')->default(0); 22 | $table->integer('clicks')->default(0); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('emails'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2018_04_11_222237_edit_users_table.php: -------------------------------------------------------------------------------- 1 | dropColumn([ 17 | 'language', 18 | 'notifications_on' 19 | ]); 20 | 21 | $table->json('preferences')->nullable()->after('password'); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | * 28 | * @return void 29 | */ 30 | public function down() 31 | { 32 | Schema::table('users', function ($table) { 33 | $table->dropColumn(['preferences']); 34 | 35 | $table->string('language')->default('en'); 36 | $table->tinyInteger('notifications_on')->default(true); 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /database/seeds/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | 'John', 16 | 'email' => 'john.doe@gmail.com', 17 | 'password' => bcrypt('test123'), 18 | 'language' => 'en', 19 | 'notifications_on' => true, 20 | ]); 21 | 22 | \App\Models\MailingList::create([ 23 | 'name' => 'Awesome newsfeed', 24 | 'description' => 'This is a the mailinglist of the Awesome Newsfeed!', 25 | 'user_id' => 1, 26 | 'public' => 1, 27 | ]); 28 | 29 | \App\Models\Template::create([ 30 | 'name' => 'HTML Template', 31 | 'content' => '%subject%This is the subject: %subject%
This is your name: %name%
This is your country: %country%
This is your unsubscribe link: %unsubscribe_link% ', 32 | 'user_id' => 1, 33 | ]); 34 | 35 | \App\Models\Campaign::create([ 36 | 'name' => 'Awesome newsfeed #1', 37 | 'subject' => 'Awesome Newsfeed #1', 38 | 'template_id' => 1, 39 | 'user_id' => 1, 40 | ]); 41 | 42 | \App\Models\Subscription::create([ 43 | 'name' => 'John Doe', 44 | 'email' => 'john.doe@gmail.com', 45 | 'country' => 'be', 46 | 'mailing_list_id' => 1, 47 | 'user_id' => 1, 48 | ]); 49 | 50 | \App\Models\Subscription::create([ 51 | 'name' => 'Jane Doe', 52 | 'email' => 'jane.doe@gmail.com', 53 | 'country' => 'be', 54 | 'mailing_list_id' => 1, 55 | 'user_id' => 1, 56 | ]); 57 | 58 | \App\Models\Subscription::create([ 59 | 'name' => 'Tim Doe', 60 | 'email' => 'tim.doe@gmail.com', 61 | 'country' => 'us', 62 | 'mailing_list_id' => 1, 63 | 'user_id' => 1, 64 | ]); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/logo.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.17", 14 | "bootstrap-sass": "^3.3.7", 15 | "cross-env": "^5.1.6", 16 | "jquery": "^3.3.1", 17 | "laravel-mix": "^2.1.11", 18 | "lodash": "^4.17.10", 19 | "vue": "^2.5.16" 20 | }, 21 | "dependencies": { 22 | "bootstrap-chosen": "^1.4.2", 23 | "chart.js": "^2.7.2", 24 | "sweetalert2": "^7.20.10", 25 | "vue-chartjs": "^3.3.1", 26 | "vue-codemirror": "^4.0.5" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Feature 14 | 15 | 16 | 17 | ./tests/Unit 18 | 19 | 20 | 21 | 22 | ./app 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/css/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/css/chosen-sprite.png -------------------------------------------------------------------------------- /public/css/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/css/chosen-sprite@2x.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/fonts/vendor/bootstrap-sass/bootstrap/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /public/images/vendor/bootstrap-chosen/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/images/vendor/bootstrap-chosen/chosen-sprite.png -------------------------------------------------------------------------------- /public/images/vendor/bootstrap-chosen/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/public/images/vendor/bootstrap-chosen/chosen-sprite@2x.png -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | 7 | */ 8 | define('LARAVEL_START', microtime(true)); 9 | 10 | /* 11 | |-------------------------------------------------------------------------- 12 | | Register The Auto Loader 13 | |-------------------------------------------------------------------------- 14 | | 15 | | Composer provides a convenient, automatically generated class loader for 16 | | our application. We just need to utilize it! We'll simply require it 17 | | into the script here so that we don't have to worry about manual 18 | | loading any of our classes later on. It feels great to relax. 19 | | 20 | */ 21 | 22 | require __DIR__.'/../vendor/autoload.php'; 23 | 24 | /* 25 | |-------------------------------------------------------------------------- 26 | | Turn On The Lights 27 | |-------------------------------------------------------------------------- 28 | | 29 | | We need to illuminate PHP development, so let us turn on the lights. 30 | | This bootstraps the framework and gets it ready for use, then it 31 | | will load up this application so that we can run it and send 32 | | the responses back to the browser and delight our users. 33 | | 34 | */ 35 | 36 | $app = require_once __DIR__.'/../bootstrap/app.php'; 37 | 38 | /* 39 | |-------------------------------------------------------------------------- 40 | | Run The Application 41 | |-------------------------------------------------------------------------- 42 | | 43 | | Once we have the application, we can handle the incoming request 44 | | through the kernel, and send the associated response back to 45 | | the client's browser allowing them to enjoy the creative 46 | | and wonderful application we have prepared for them. 47 | | 48 | */ 49 | 50 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 51 | 52 | $response = $kernel->handle( 53 | $request = Illuminate\Http\Request::capture() 54 | ); 55 | 56 | $response->send(); 57 | 58 | $kernel->terminate($request, $response); 59 | -------------------------------------------------------------------------------- /public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/js/app.js": "/js/app.js", 3 | "/css/app.css": "/css/app.css" 4 | } -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /resources/assets/css/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/resources/assets/css/chosen-sprite.png -------------------------------------------------------------------------------- /resources/assets/css/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NathanGeerinck/laravel-newsletter/971b795f761ba280ce2f8326bbe0a088324d3ac1/resources/assets/css/chosen-sprite@2x.png -------------------------------------------------------------------------------- /resources/assets/css/custom.css: -------------------------------------------------------------------------------- 1 | body{ 2 | font-family: "Open Sans", Helvetica, Arial, sans-serif; 3 | } 4 | .list-group-item 5 | .panel > .list-group 6 | { 7 | margin-bottom: 0; 8 | } 9 | .panel > .list-group .list-group-item 10 | { 11 | border-width: 1px 0; 12 | } 13 | .panel > .list-group .list-group-item:first-child 14 | { 15 | border-top-right-radius: 0; 16 | border-top-left-radius: 0; 17 | } 18 | .panel > .list-group .list-group-item:last-child 19 | { 20 | border-bottom: 0; 21 | } 22 | .panel-heading + .list-group .list-group-item:first-child 23 | { 24 | border-top-width: 0; 25 | } 26 | .panel-default .list-group-item.active 27 | { 28 | color: #000; 29 | background-color: #DDD; 30 | border-color: #DDD; 31 | } 32 | .panel-primary .list-group-item.active 33 | { 34 | color: #FFF; 35 | background-color: #428BCA; 36 | border-color: #428BCA; 37 | } 38 | .panel-success .list-group-item.active 39 | { 40 | color: #3C763D; 41 | background-color: #DFF0D8; 42 | border-color: #D6E9C6; 43 | } 44 | .panel-info .list-group-item.active 45 | { 46 | color: #31708F; 47 | background-color: #D9EDF7; 48 | border-color: #BCE8F1; 49 | } 50 | .panel-warning .list-group-item.active 51 | { 52 | color: #8A6D3B; 53 | background-color: #FCF8E3; 54 | border-color: #FAEBCC; 55 | } 56 | .panel-danger .list-group-item.active 57 | { 58 | color: #A94442; 59 | background-color: #F2DEDE; 60 | border-color: #EBCCD1; 61 | } 62 | .panel a.list-group-item.active:hover, a.list-group-item.active:focus 63 | { 64 | color: #000; 65 | background-color: #DDD; 66 | border-color: #DDD; 67 | } -------------------------------------------------------------------------------- /resources/assets/js/app.js: -------------------------------------------------------------------------------- 1 | require('./bootstrap'); 2 | 3 | window.swal = require('sweetalert2'); 4 | 5 | import 'sweetalert2/dist/sweetalert2.css'; 6 | 7 | require('./chosen.jquery'); 8 | 9 | // Vue.component('line-chart', require('./components/LineChart.vue')); 10 | // Vue.component('bar-chart', require('./components/BarChart.vue')); 11 | // Vue.component('pie-chart', require('./components/PieChart.vue')); 12 | 13 | const app = new Vue({ 14 | el: '#app' 15 | }); 16 | 17 | $(document).ready( function() { 18 | // Tooltips 19 | $("[data-toggle='tooltip']").tooltip({container:"body"}); 20 | 21 | // Popovers 22 | $("[data-toggle='popover']").popover(); 23 | 24 | // Chosen select 25 | $(".chosen-select").chosen({ allow_single_deselect: true }); 26 | 27 | // Logout button > navigation 28 | let logout = $('#logout-btn'); 29 | logout.on('click', function(e) { 30 | e.preventDefault(); 31 | $('#logout-form').submit(); 32 | }); 33 | }); 34 | 35 | window.deleteEntity = function (element, subject) { 36 | swal({ 37 | title: "Are you sure you want to delete '" + subject + "'?", 38 | text: 'This cannot be undone', 39 | type: "warning", 40 | showCancelButton: true, 41 | cancelButtonText: 'Cancel', 42 | confirmButtonColor: "#DD6B55", 43 | confirmButtonText: "Delete", 44 | closeOnConfirm: false, 45 | showLoaderOnConfirm: true 46 | }, function () { 47 | $(element).closest('form').submit(); 48 | }); 49 | }; 50 | 51 | window.deleteSubscription = function (element, subject) { 52 | swal({ 53 | title: "Are you sure that you want to unsubscribe?", 54 | text: 'This cannot be undone', 55 | type: "warning", 56 | showCancelButton: true, 57 | cancelButtonText: 'Cancel', 58 | confirmButtonColor: "#DD6B55", 59 | confirmButtonText: "Yes, I'm sure!", 60 | closeOnConfirm: false, 61 | showLoaderOnConfirm: true 62 | }, function () { 63 | $(element).closest('form').submit(); 64 | }); 65 | }; 66 | -------------------------------------------------------------------------------- /resources/assets/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | window._ = require('lodash'); 2 | 3 | /** 4 | * We'll load jQuery and the Bootstrap jQuery plugin which provides support 5 | * for JavaScript based Bootstrap features such as modals and tabs. This 6 | * code may be modified to fit the specific needs of your application. 7 | */ 8 | 9 | window.$ = window.jQuery = require('jquery'); 10 | 11 | require('bootstrap-sass'); 12 | 13 | window.Vue = require('vue'); 14 | 15 | /** 16 | * We'll load the axios HTTP library which allows us to easily issue requests 17 | * to our Laravel back-end. This library automatically handles sending the 18 | * CSRF token as a header based on the value of the "XSRF" token cookie. 19 | */ 20 | 21 | window.axios = require('axios'); 22 | 23 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 24 | 25 | /** 26 | * Next we will register the CSRF Token as a common header with Axios so that 27 | * all outgoing HTTP requests automatically have it attached. This is just 28 | * a simple convenience so we don't have to attach every token manually. 29 | */ 30 | 31 | window.axios.defaults.headers.common = { 32 | 'X-CSRF-TOKEN': window.Laravel.csrfToken, 33 | 'X-Requested-With': 'XMLHttpRequest' 34 | }; -------------------------------------------------------------------------------- /resources/assets/js/components/BarChart.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/assets/js/components/LineChart.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/assets/js/components/PieChart.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/assets/sass/_variables.scss: -------------------------------------------------------------------------------- 1 | 2 | // Body 3 | $body-bg: #f5f8fa; 4 | 5 | // Borders 6 | $laravel-border-color: darken($body-bg, 10%); 7 | $list-group-border: $laravel-border-color; 8 | $navbar-default-border: $laravel-border-color; 9 | $panel-default-border: $laravel-border-color; 10 | $panel-inner-border: $laravel-border-color; 11 | 12 | // Brands 13 | $brand-primary: #3097D1; 14 | $brand-info: #8eb4cb; 15 | $brand-success: #2ab27b; 16 | $brand-warning: #cbb956; 17 | $brand-danger: #bf5329; 18 | 19 | // Typography 20 | $font-family-sans-serif: "Raleway", sans-serif; 21 | $font-size-base: 14px; 22 | $line-height-base: 1.6; 23 | $text-color: #636b6f; 24 | 25 | // Navbar 26 | $navbar-default-bg: #fff; 27 | 28 | // Buttons 29 | $btn-default-color: $text-color; 30 | 31 | // Inputs 32 | $input-border: lighten($text-color, 40%); 33 | $input-border-focus: lighten($brand-primary, 25%); 34 | $input-color-placeholder: lighten($text-color, 30%); 35 | 36 | // Panels 37 | $panel-default-heading-bg: #fff; 38 | -------------------------------------------------------------------------------- /resources/assets/sass/app.scss: -------------------------------------------------------------------------------- 1 | 2 | // Fonts 3 | @import url(https://fonts.googleapis.com/css?family=Raleway:300,400,600); 4 | 5 | // Variables 6 | @import "variables"; 7 | 8 | // Bootstrap 9 | @import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap"; 10 | -------------------------------------------------------------------------------- /resources/backups/dotenv-editor/1481978518_env: -------------------------------------------------------------------------------- 1 | APP_ENV=local 2 | APP_KEY=base64:2/aMMWcdWZlZ3XTiKz4qhY4iub6zM031FhEHA3QOViE= 3 | APP_DEBUG=true 4 | APP_LOG_LEVEL=debug 5 | APP_URL=http://ger.geericnk.gent 6 | 7 | DB_CONNECTION=mysql 8 | DB_HOST=127.0.0.1 9 | DB_PORT=3306 10 | DB_DATABASE=ger_local 11 | DB_USERNAME=root 12 | DB_PASSWORD=root 13 | 14 | BROADCAST_DRIVER=log 15 | CACHE_DRIVER=file 16 | SESSION_DRIVER=file 17 | QUEUE_DRIVER=sync 18 | 19 | REDIS_HOST=127.0.0.1 20 | REDIS_PASSWORD=null 21 | REDIS_PORT=6379 22 | 23 | MAIL_DRIVER=smtp 24 | MAIL_HOST=mailtrap.io 25 | MAIL_PORT=2525 26 | MAIL_USERNAME=null 27 | MAIL_PASSWORD=null 28 | MAIL_ENCRYPTION=null 29 | 30 | PUSHER_APP_ID= 31 | PUSHER_KEY= 32 | PUSHER_SECRET= 33 | -------------------------------------------------------------------------------- /resources/lang/en/account.php: -------------------------------------------------------------------------------- 1 | 'Account', 5 | 6 | 'general' => [ 7 | 'name' => 'General', 8 | 'full_name' => 'Name', 9 | 'email' => 'Email', 10 | 'language' => 'Language', 11 | 'notifications' => 'Notifications', 12 | ], 13 | 14 | 'password' => [ 15 | 'name' => 'Password', 16 | 'old' => 'Current password', 17 | 'new' => 'New password', 18 | 'new_confirm' => 'Confirm new password', 19 | ], 20 | 21 | '2fa' => [ 22 | 'name' => '2FA', 23 | 'enable' => 'Enable Google Authenticator', 24 | 'disable' => 'Disable Google Authenticator', 25 | 'enabled' => 'Google Two Factor authentication is currently enabled.', 26 | 'disabled' => 'Google Two Factor authentication is currently disabled.', 27 | ], 28 | ]; 29 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | 'login' => 'Login', 20 | 'register' => 'Register', 21 | 'password.reset' => 'Reset password', 22 | 'password.reset.send' => 'Send password reset link', 23 | 'email' => 'Email', 24 | 'password' => 'Password', 25 | 'password.confirm' => 'Confirm password', 26 | 'username' => 'Username', 27 | 'remember' => 'Remember', 28 | 'forgot' => 'Forgot your password?', 29 | 30 | ]; 31 | -------------------------------------------------------------------------------- /resources/lang/en/campaigns.php: -------------------------------------------------------------------------------- 1 | 'Campaigns', 5 | 'show' => 'Campaign', 6 | 'new' => 'New campaign', 7 | 'edit' => 'Edit campaign', 8 | 'send' => 'Send campaign', 9 | 'empty' => 'You haven\'t created a campaign yet', 10 | 11 | 'send.message' => 'You\'re sending this campaign to :count recipients', 12 | 'send.success' => 'Successfully send :name to :subscribers recipients!', 13 | 14 | 'stats' => 'Statistics', 15 | 'stats.opens' => 'Opens', 16 | 'stats.opened' => 'Opened', 17 | 'stats.unopened' => 'Unopened', 18 | 'stats.clicks' => 'Clicks', 19 | 'stats.clicked' => 'Clicked', 20 | 'stats.notClicked' => 'Not clicked', 21 | ]; 22 | -------------------------------------------------------------------------------- /resources/lang/en/emails.php: -------------------------------------------------------------------------------- 1 | 'Dear :name', 5 | 6 | //Campaigns 7 | 'campaigns.send.subject' => 'Your campaign has been send!', 8 | 'campaigns.send.text' => 'The campaign named _:campaign_ has been send successfully to :subscribers subscribers.', 9 | 'campaigns.send.closing' => 'You\'re the master in sending ~~spam~~ newsletters!', 10 | 11 | //Lists 12 | 'lists.imported.subject' => 'The import of subscriptions went successfully!', 13 | 'lists.imported.text' => 'You\'ve imported the xls, xlsx or csv successfully in the mailing list named _:list:_', 14 | 'lists.imported.button' => 'Go to :list', 15 | 16 | //Password 17 | 'password.updated.subject' => 'You\'re password has been updated successfully', 18 | 'password.updated.text' => 'You\'ve recently changed your password. If you have not done this yourself, we recommend that you contact the administrator.', 19 | 'password.updated.closing' => 'You can improve the security of your account by enabling Two Factor authentication!', 20 | 'password.updated.button' => 'Enable Two Factor Authentication', 21 | 22 | //2FA 23 | '2fa.enabled.subject' => 'Two Factor Authentication has been enabled!', 24 | '2fa.enabled.text' => 'You\'ve recently enabled authentication with Google Two Factor Authentication. A step closer to worldwide security!', 25 | '2fa.enabled.button' => 'Get the Google Authenticator app', 26 | '2fa.enabled.backupcodes' => 'We also generated 5 backup codes that you can use when you are unable to use the Google Authenticator app:', 27 | '2fa.disabled.subject' => 'Two Factor Authentication has been disabled!', 28 | '2fa.disabled.text' => 'You\'ve recently disabled authentication with Google TwoFactor Authentication. If this wasn\'t you, please contact the system administrator.', 29 | ]; 30 | -------------------------------------------------------------------------------- /resources/lang/en/forms.php: -------------------------------------------------------------------------------- 1 | 'Save', 5 | 'search' => 'Search', 6 | 'verify' => 'Verify', 7 | 'cancel' => 'Cancel', 8 | 9 | 'name' => 'Name', 10 | 'content' => 'Content', 11 | 'subject' => 'Subject', 12 | 'country' => 'Country', 13 | 'email' => 'Email', 14 | 'list' => 'Mailing lists', 15 | 'mailing_lists' => 'List', 16 | 'template' => 'Template', 17 | 'description' => 'Description', 18 | 'public/private' => 'Public/Private', 19 | 'key' => 'Key', 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/lang/en/general.php: -------------------------------------------------------------------------------- 1 | 'Back to overview', 5 | 'id' => 'ID', 6 | 'name' => 'Name', 7 | 'email' => 'Email', 8 | 'subject' => 'Subject', 9 | 'country' => 'Country', 10 | 'lists' => 'List(s)', 11 | 'list' => 'List', 12 | 'recipients' => 'Recipients', 13 | 'template' => 'Template', 14 | 'subscriptions' => 'Subscriptions', 15 | 'campaigns' => 'Campaigns', 16 | 'status' => 'Status', 17 | 'description' => 'Description', 18 | 'created_at' => 'Created at', 19 | 'updated_at' => 'Updated at', 20 | 21 | 'new' => 'New', 22 | 'edit' => 'Edit', 23 | 'clone' => 'Clone', 24 | 'delete' => 'Delete', 25 | 'preview' => 'Preview', 26 | 'send' => 'Send', 27 | 'import' => 'Import', 28 | 'export' => 'Export', 29 | 30 | 'woohoo' => 'Woohoo!', 31 | 'success.delete' => 'Successfully deleted!', 32 | 'success.update' => 'Successfully updated!', 33 | 'success.create' => 'Successfully created!', 34 | 'success.import' => 'Successfully imported!', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/en/language.php: -------------------------------------------------------------------------------- 1 | 'English', 5 | 'nl' => 'Dutch' 6 | ]; 7 | -------------------------------------------------------------------------------- /resources/lang/en/lists.php: -------------------------------------------------------------------------------- 1 | 'Lists', 5 | 'show' => 'List', 6 | 'new' => 'New list', 7 | 'edit' => 'Edit list', 8 | 'import' => 'Import list', 9 | 'empty' => 'You haven\'t created any lists yet', 10 | 'file' => 'Choose a file (xls, xlsx and csv)', 11 | ]; 12 | -------------------------------------------------------------------------------- /resources/lang/en/menu.php: -------------------------------------------------------------------------------- 1 | 'Newsletter', 6 | 7 | 'subscriptions' => 'Subscriptions', 8 | 'lists' => 'Lists', 9 | 'campaigns' => 'Campaigns', 10 | 'templates' => 'Templates', 11 | 'settings' => 'Settings', 12 | 13 | 'login' => 'Login', 14 | 'register' => 'Register', 15 | 16 | 'account' => 'Account', 17 | 'logout' => 'Logout', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Passwords must be at least six characters and match the confirmation.', 17 | 'reset' => 'Your password has been reset!', 18 | 'sent' => 'We have e-mailed your password reset link!', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that e-mail address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/lang/en/settings.php: -------------------------------------------------------------------------------- 1 | 'Settings', 5 | 6 | 'application' => [ 7 | 'name' => 'Application', 8 | 'name2' => 'Name', 9 | 'url' => 'URL', 10 | 'from' => [ 11 | 'name' => 'From (name)', 12 | 'email' => 'From (email)', 13 | ], 14 | 'notifications' => 'Notification emails', 15 | 'registration' => 'Allow registration', 16 | 'templateEditor' => 'Template editor', 17 | 'language' => 'Language', 18 | ], 19 | 20 | 'mail' => [ 21 | 'name' => 'Mail', 22 | 'driver' => 'Driver', 23 | 'host' => 'Host', 24 | 'port' => 'Port', 25 | 'username' => 'Username', 26 | 'password' => 'Password', 27 | ], 28 | ]; 29 | -------------------------------------------------------------------------------- /resources/lang/en/subscriptions.php: -------------------------------------------------------------------------------- 1 | 'Subscriptions', 5 | 'show' => 'Subscription', 6 | 'add' => 'Add subscription', 7 | 'clone' => 'Clone subscription', 8 | 'edit' => 'Edit subscription', 9 | 'export.csv' => 'Export all subscriptions to CSV', 10 | 'export.xlsx' => 'Export all subscriptions to XLSX', 11 | 'empty' => 'You haven\'t added any subscriptions yet', 12 | 'subscriptions.country.none' => 'No country selected', 13 | 'confirm.unsubscribe' => 'Are you sure that you want to unsubscribe?', 14 | 'unsubscribe' => 'Unsubscribe', 15 | 'unsubscribe.success' => 'You\'re successfully unsubscribed!', 16 | ]; 17 | -------------------------------------------------------------------------------- /resources/lang/en/templates.php: -------------------------------------------------------------------------------- 1 | 'Templates', 5 | 'show' => 'Template', 6 | 'new' => 'New template', 7 | 'edit' => 'Edit template', 8 | 'empty' => 'You haven\'t created a template yet', 9 | 'available_variables' => 'Available variables', 10 | ]; 11 | -------------------------------------------------------------------------------- /resources/lang/nl/account.php: -------------------------------------------------------------------------------- 1 | 'Account', 5 | 6 | 'general' => [ 7 | 'name' => 'Algemeen', 8 | 'full_name' => 'Naam', 9 | 'email' => 'E-mail', 10 | 'language' => 'Taal', 11 | 'notifications' => 'Notificaties', 12 | ], 13 | 14 | 'password' => [ 15 | 'name' => 'Wachtwoord', 16 | 'old' => 'Huidig wachtwoord', 17 | 'new' => 'Nieuw wachtwoord', 18 | 'new_confirm' => 'Bevestig nieuw wachtwoord', 19 | ], 20 | 21 | '2fa' => [ 22 | 'name' => '2FA', 23 | 'enable' => 'Schakel Google Authenticator in', 24 | 'disable' => 'Schakel Google Authenticator uit', 25 | 'enabled' => 'Google Two Factor is momenteel ingschakeld.', 26 | 'disabled' => 'Google Two Factor is momenteel uitgeschakeld.', 27 | ], 28 | ]; 29 | -------------------------------------------------------------------------------- /resources/lang/nl/auth.php: -------------------------------------------------------------------------------- 1 | 'Deze combinatie van e-mailadres en wachtwoord is niet geldig.', 17 | 'throttle' => 'Teveel mislukte loginpogingen. Probeer het over :seconds seconden nogmaals.', 18 | 19 | 'login' => 'Login', 20 | 'register' => 'Registreer', 21 | 'password.reset' => 'Reset wachtwoord', 22 | 'password.reset.send' => 'Verzend resetlinl', 23 | 'email' => 'E-mail adress', 24 | 'password' => 'Wachtwoord', 25 | 'password.confirm' => 'Herhaal wachtwoord', 26 | 'username' => 'Gebruikersnaam', 27 | 'remember' => 'Onthou mij', 28 | 'forgot' => 'Wachtwoord vergeten?', 29 | 30 | ]; 31 | -------------------------------------------------------------------------------- /resources/lang/nl/campaigns.php: -------------------------------------------------------------------------------- 1 | 'Campagnes', 5 | 'show' => 'Campagne', 6 | 'new' => 'Nieuwe campagne', 7 | 'edit' => 'Bewerk campagne', 8 | 'send' => 'Verzend campagne', 9 | 'empty' => 'U heeft nog geen campagnes aangemaakt', 10 | 11 | 'send.message' => 'U verzend deze campagne naar :count abonnees', 12 | 'send.success' => 'U heeft de campagne genaamd :name successvol verzonden naar :subscribers abonnees!', 13 | 14 | 'stats' => 'Statistieken', 15 | 'stats.opens' => 'Geopend', 16 | 'stats.opened' => 'Geopend', 17 | 'stats.unopened' => 'Niet geopend', 18 | 'stats.clicks' => 'Kliks', 19 | 'stats.clicked' => 'geklikt', 20 | 'stats.notClicked' => 'Niet geklikt', 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/lang/nl/emails.php: -------------------------------------------------------------------------------- 1 | 'Dear :name', 5 | 6 | //Campaigns 7 | 'campaigns.send.subject' => 'Uw campagne werd verzonden!', 8 | 'campaigns.send.text' => 'De campagne genaamd _:campaign_ werd succesvol verzonden naar :subscribers abonnees.', 9 | 'campaigns.send.closing' => 'U bent de meester in het verzenden van ~~spam~~ nieuwsbrieven!', 10 | 11 | //Lists 12 | 'lists.imported.subject' => 'Het importeren van abonnees is succesvol verlopen!', 13 | 'lists.imported.text' => 'U heeft de xls, xlsx of csv succesvol geïmporteerd in de mailinglijst genaamd _:list:_', 14 | 'lists.imported.button' => 'Ga naar :list', 15 | 16 | //Password 17 | 'password.updated.subject' => 'Uw wachtwoord is succesvol gewijzigd', 18 | 'password.updated.text' => 'U hebt recentelijk uw wachtwoord gewijzigd. Indien u deze actie niet zelf heeft uitgevoerd dan raden wij u aan om een administrator te contacteren.', 19 | 'password.updated.closing' => 'U kan de veiligheid van uw account optimaliseren door Two Factor authentication in te schakelen!', 20 | 'password.updated.button' => 'Schakel Two Factor Authentication in', 21 | 22 | //2FA 23 | '2fa.enabled.subject' => 'Two Factor Authentication werd zonet ingeschakeld!', 24 | '2fa.enabled.text' => 'U heeft recentelijk Two Factor Authentication ingeschakeld. Dat is een stap dichterbij wereldwijde veiligheid!', 25 | '2fa.enabled.button' => 'Download de Google Authenticator app', 26 | '2fa.enabled.backupcodes' => 'We hebben ook 5 backupcodes gegenereerd voor wanneer u niet in staat bent om de Google Authenticator app te gebruiken:', 27 | '2fa.disabled.subject' => 'Two Factor Authentication werd zonet uitgeschakeld!', 28 | '2fa.disabled.text' => 'U heeft recentelijk Two Factor Authentication uitgeschakeld. Indien u deze actie niet zelf heeft uitgevoerd dan raden wij u aan om een administrator te contacteren.', 29 | ]; 30 | -------------------------------------------------------------------------------- /resources/lang/nl/forms.php: -------------------------------------------------------------------------------- 1 | 'Opslaan', 5 | 'search' => 'Zoek', 6 | 'verify' => 'Bevestig', 7 | 'cancel' => 'Annuleer', 8 | 9 | 'name' => 'Naam', 10 | 'content' => 'Content', 11 | 'subject' => 'Onderwerp', 12 | 'country' => 'Land', 13 | 'email' => 'E-mail adres', 14 | 'list' => 'Mailing lijst', 15 | 'mailing_lists' => 'Lijst', 16 | 'template' => 'Template', 17 | 'description' => 'Beschrijving', 18 | 'public/private' => 'Publiek/priné', 19 | 'key' => 'Sleutel', 20 | ]; 21 | -------------------------------------------------------------------------------- /resources/lang/nl/general.php: -------------------------------------------------------------------------------- 1 | 'Terug naar het overzicht', 5 | 'id' => 'ID', 6 | 'name' => 'Naam', 7 | 'email' => 'E-mail adres', 8 | 'subject' => 'Onderwerp', 9 | 'country' => 'Land', 10 | 'lists' => 'Lijst(en)', 11 | 'list' => 'Lijst', 12 | 'recipients' => 'Ontvangers', 13 | 'template' => 'Template', 14 | 'subscriptions' => 'Abonnees', 15 | 'campaigns' => 'Campagnes', 16 | 'status' => 'Status', 17 | 'description' => 'Beschrijving', 18 | 'created_at' => 'Gemaakt op', 19 | 'updated_at' => 'Bewerkt op', 20 | 21 | 'new' => 'Nieuw', 22 | 'edit' => 'Bewerk', 23 | 'clone' => 'Dupliceer', 24 | 'delete' => 'Verwijder', 25 | 'preview' => 'Preview', 26 | 'send' => 'Verzend', 27 | 'import' => 'Importeer', 28 | 'export' => 'Exporteer', 29 | 30 | 'woohoo' => 'Woohoo!', 31 | 'success.delete' => 'Succesvol verwijderd!', 32 | 'success.update' => 'Succesvol bewerkt!', 33 | 'success.create' => 'Succesvol opgeslagen!', 34 | 'success.import' => 'Succesvol geïmporteerd!', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/nl/language.php: -------------------------------------------------------------------------------- 1 | 'Engels', 5 | 'nl' => 'Nederlands' 6 | ]; 7 | -------------------------------------------------------------------------------- /resources/lang/nl/lists.php: -------------------------------------------------------------------------------- 1 | 'Lijsten', 5 | 'show' => 'Lijst', 6 | 'new' => 'Nieuwe lijst', 7 | 'edit' => 'Bewerk lijst', 8 | 'import' => 'Importeer lijst', 9 | 'empty' => 'U heeft nog geen lijsten aangemaakt', 10 | 'file' => 'Kies een bestand (xls, xlsx and csv)', 11 | ]; 12 | -------------------------------------------------------------------------------- /resources/lang/nl/menu.php: -------------------------------------------------------------------------------- 1 | 'Nieuwbrief', 6 | 7 | 'subscriptions' => 'Abonnees', 8 | 'lists' => 'Lijsten', 9 | 'campaigns' => 'Campagnes', 10 | 'templates' => 'Templates', 11 | 'settings' => 'Instellingen', 12 | 13 | 'login' => 'Login', 14 | 'register' => 'Registreer', 15 | 16 | 'account' => 'Account', 17 | 'logout' => 'Uitloggen', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/nl/pagination.php: -------------------------------------------------------------------------------- 1 | '« Vorige', 17 | 'next' => 'Volgende »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/nl/passwords.php: -------------------------------------------------------------------------------- 1 | 'Wachtwoord moet minimaal zes tekens lang zijn en de wachtwoorden moeten overeenkomen.', 17 | 'reset' => 'Het wachtwoord van uw account is gewijzigd.', 18 | 'sent' => 'We hebben een e-mail verstuurd met instructies om een nieuw wachtwoord in te stellen.', 19 | 'token' => 'Dit wachtwoord reset token is niet geldig.', 20 | 'user' => 'Geen gebruiker bekend met dat e-mailadres.', 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/lang/nl/settings.php: -------------------------------------------------------------------------------- 1 | 'Instellingen', 5 | 6 | 'application' => [ 7 | 'name' => 'Applicatie', 8 | 'name2' => 'Naam', 9 | 'url' => 'URL', 10 | 'from' => [ 11 | 'name' => 'Van (naam)', 12 | 'email' => 'Van (e-mail)', 13 | ], 14 | 'notifications' => 'Notificatie e-mails', 15 | 'registration' => 'Registratie toestaan', 16 | 'templateEditor' => 'Template editor', 17 | 'language' => 'Taal', 18 | ], 19 | 20 | 'mail' => [ 21 | 'name' => 'Mail', 22 | 'driver' => 'Driver', 23 | 'host' => 'Host', 24 | 'port' => 'Poort', 25 | 'username' => 'Gebruikersnaam', 26 | 'password' => 'Wachtwoord', 27 | ], 28 | ]; 29 | -------------------------------------------------------------------------------- /resources/lang/nl/subscriptions.php: -------------------------------------------------------------------------------- 1 | 'Abonnees', 5 | 'show' => 'Abonnee', 6 | 'add' => 'Voeg abonnee toe', 7 | 'clone' => 'Dupliceer abonnee', 8 | 'edit' => 'Bewerk abonee', 9 | 'export.csv' => 'Exporteer alle abonnees naar CSV', 10 | 'export.xlsx' => 'Exporteer alle abonnees naar XLSX', 11 | 'empty' => 'U heeft nog geen abonnees toegevoegd', 12 | 'subscriptions.country.none' => 'Geen land geselecteerd', 13 | 'confirm.unsubscribe' => 'Bent u zeker dat u zich wilt afmelden?', 14 | 'unsubscribe' => 'Afmelden', 15 | 'unsubscribe.success' => 'U bent succesvol afgemeld!', 16 | ]; 17 | -------------------------------------------------------------------------------- /resources/lang/nl/templates.php: -------------------------------------------------------------------------------- 1 | 'Templates', 5 | 'show' => 'Template', 6 | 'new' => 'Nieuwe template', 7 | 'edit' => 'Bewerk template', 8 | 'empty' => 'U heeft nog geen templates toegevoegd', 9 | 'available_variables' => 'Beschikbare variabels', 10 | ]; 11 | -------------------------------------------------------------------------------- /resources/views/account/general.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('account.account') . ': ' . trans('account.general.name')) 4 | 5 | @section('content') 6 |
7 | @include('account.parts.navigation') 8 |
9 |
10 |
11 |
@yield('title')
12 | 13 |
14 | {!! Form::model($account, ['route' => ['account.general.update']]) !!} 15 | 16 | @include('forms.account.general') 17 | 18 | {!! Form::close() !!} 19 | 20 |
21 |
22 |
23 | @endsection -------------------------------------------------------------------------------- /resources/views/account/parts/navigation.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{ trans('account.general.name') }} 3 | {{ trans('account.password.name') }} 4 |
-------------------------------------------------------------------------------- /resources/views/account/password.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('account.account') . ': ' . trans('account.password.name')) 4 | 5 | @section('content') 6 |
7 | @include('account.parts.navigation') 8 |
9 |
10 |
11 |
@yield('title')
12 | 13 |
14 | {!! Form::model(null, ['route' => ['account.password.update']]) !!} 15 | 16 | @include('forms.account.password') 17 | 18 | {!! Form::close() !!} 19 | 20 |
21 |
22 |
23 | @endsection -------------------------------------------------------------------------------- /resources/views/auth/passwords/email.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('auth.password.reset')) 4 | 5 | 6 | @section('content') 7 |
8 |
9 |
10 |
11 |
@yield('title')
12 |
13 | @if (session('status')) 14 |
15 | {{ session('status') }} 16 |
17 | @endif 18 | 19 |
20 | {{ csrf_field() }} 21 | 22 |
23 | 24 | 25 |
26 | 27 | 28 | @if ($errors->has('email')) 29 | 30 | {{ $errors->first('email') }} 31 | 32 | @endif 33 |
34 |
35 | 36 |
37 |
38 | 41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | @endsection 50 | -------------------------------------------------------------------------------- /resources/views/campaigns/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('campaigns.edit') . ': ' . $campaign->name) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::model($campaign, ['route' => ['campaigns.update', $campaign]]) !!} 18 | 19 | @include('forms.campaigns') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection -------------------------------------------------------------------------------- /resources/views/campaigns/new.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('campaigns.new')) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::model((request()->is('campaigns/clone*')) ? $campaign : 'null', ['route' => ['campaigns.create']]) !!} 18 | 19 | @include('forms.campaigns') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection -------------------------------------------------------------------------------- /resources/views/campaigns/send.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('campaigns.send') . ': ' . $campaign->name) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | 18 | {{ Form::open(['route' => ['campaigns.send', $campaign]]) }} 19 | {!! Form::submit(trans('campaigns.send'), ['class' => 'btn btn-default btn-lg btn-']) !!} 20 | {!! Form::close() !!} 21 |
22 |
23 |
24 | @endsection -------------------------------------------------------------------------------- /resources/views/emails/account/2fa/disabled.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{ trans('emails.2fa.disabled.text') }} 3 | @endcomponent -------------------------------------------------------------------------------- /resources/views/emails/account/2fa/enabled.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{ trans('emails.2fa.enabled.text') }} 3 | 4 | @component('mail::button', ['url' => 'https://support.google.com/accounts/answer/1066447']) 5 | {{ trans('emails.2fa.enabled.button') }} 6 | @endcomponent 7 | 8 | {{ trans('emails.2fa.enabled.backupcodes') }} 9 | 10 | @foreach($backupCodes as $backupCode) 11 | {{ $backupCode['code'] }} 12 | @endforeach 13 | @endcomponent -------------------------------------------------------------------------------- /resources/views/emails/account/password/updated.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{ trans('emails.password.updated.text') }} 3 | 4 | {{ trans('emails.password.updated.closing') }} 5 | 6 | @component('mail::button', ['url' => route('account.2fa.enable')]) 7 | {{ trans('emails.password.updated.button') }} 8 | @endcomponent 9 | 10 | @endcomponent 11 | -------------------------------------------------------------------------------- /resources/views/emails/campaign.blade.php: -------------------------------------------------------------------------------- 1 | {!! $content !!} -------------------------------------------------------------------------------- /resources/views/emails/campaigns/send.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{ trans('emails.campaigns.send.text', ['campaign' => $campaign->name, 'subscribers' => count($subscriptions)]) }} 3 | 4 | {{ trans('emails.campaigns.send.closing') }} 5 | @endcomponent 6 | -------------------------------------------------------------------------------- /resources/views/emails/lists/imported.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{ trans('emails.lists.imported.text', ['list' => $list->name]) }} 3 | 4 | 5 | @component('mail::button', ['url' => route('lists.show', $list)]) 6 | {{ trans('emails.lists.imported.button', ['list' => $list->name]) }} 7 | @endcomponent 8 | 9 | @endcomponent -------------------------------------------------------------------------------- /resources/views/errors/503.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Be right back. 5 | 6 | 7 | 8 | 39 | 40 | 41 |
42 |
43 |
Be right back.
44 |
45 |
46 | 47 | 48 | -------------------------------------------------------------------------------- /resources/views/errors/validation_errors.blade.php: -------------------------------------------------------------------------------- 1 | @if(session()->get('errors')) 2 |
3 | 4 | @foreach(session()->get('errors')->all() as $error) 5 |
{{ ucfirst($error) }}
6 | @endforeach 7 |
8 | @endif -------------------------------------------------------------------------------- /resources/views/forms/account/general.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('username', trans('account.general.full_name') . ' *') !!} 3 | {!! Form::text('username', null, ['class' => 'form-control']) !!} 4 |
5 | 6 |
7 | {!! Form::label('email', trans('account.general.email') . ' *') !!} 8 | {!! Form::email('email', null, ['class' => 'form-control']) !!} 9 |
10 | 11 |
12 | {!! Form::label('preferences[language]', trans('account.general.language') . ' *') !!} 13 | {!! Form::select('preferences[language]', ['en' => trans('language.en'), 'nl' => trans('language.nl')], null, ['class' => 'chosen-select']) !!} 14 |
15 | 16 |
17 | {!! Form::label('preferences[notifications]', trans('account.general.notifications') . ' *') !!} 18 | {!! Form::select('preferences[notifications]', [0 => 'No', 1 => 'Yes'], null, ['class' => 'chosen-select']) !!} 19 |
20 | 21 | {!! Form::submit(trans('forms.save'), ['class' => 'btn btn-default']) !!} 22 | -------------------------------------------------------------------------------- /resources/views/forms/account/password.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('old_password', trans('account.password.old') . ' *') !!} 3 | {!! Form::password('old_password', ['class' => 'form-control']) !!} 4 |
5 | 6 |
7 | {!! Form::label('new_password', trans('account.password.new') . ' *') !!} 8 | {!! Form::password('new_password', ['class' => 'form-control']) !!} 9 |
10 | 11 |
12 | {!! Form::label('new_password_confirmation', trans('account.password.new_confirm') . ' *') !!} 13 | {!! Form::password('new_password_confirmation', ['class' => 'form-control']) !!} 14 |
15 | 16 | {!! Form::submit(trans('forms.save'), ['class' => 'btn btn-default']) !!} 17 | -------------------------------------------------------------------------------- /resources/views/forms/campaigns.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('name', trans('forms.name') . ' *') !!} 3 | {!! Form::text('name', null, ['class' => 'form-control']) !!} 4 |
5 | 6 |
7 | {!! Form::label('subject', trans('forms.subject') . ' *') !!} 8 | {!! Form::text('subject', null, ['class' => 'form-control']) !!} 9 |
10 | 11 |
12 | {!! Form::label('mailing_lists', trans('forms.mailing_lists') . ' *') !!} 13 | {!! Form::select('mailing_lists[]', $lists, (request()->is('campaigns/edit*') || request()->is('campaigns/clone*')) ? $mailingLists : 'null', ['class' => 'chosen-select', 'multiple']) !!} 14 |
15 | 16 |
17 | {!! Form::label('template_id', trans('forms.template') . ' *') !!} 18 | {!! Form::select('template_id', $templates, null, ['class' => 'chosen-select']) !!} 19 |
20 | 21 | {!! Form::submit(trans('forms.save'), ['class' => 'btn btn-default']) !!} -------------------------------------------------------------------------------- /resources/views/forms/editor.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | @if(env('APP_EDITOR') == 'html') 4 | 5 | {!! Form::label($name, trans('forms.content') . ' *') !!} 6 | {!! Form::textarea($name, null, ['class' => 'form-control', 'id' => $name]) !!} 7 | 8 | @section('javascript') 9 | 10 | 11 | 14 | 15 | @endsection 16 | 17 | @else 18 | 19 | {!! Form::label($name, trans('forms.content') . ' *') !!} 20 | {!! Form::textarea($name, null, ['class' => 'form-control']) !!} 21 | 22 | @endif 23 | 24 |
-------------------------------------------------------------------------------- /resources/views/forms/lists.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('name', trans('forms.name') . ' *') !!} 3 | {!! Form::text('name', null, ['class' => 'form-control']) !!} 4 |
5 | 6 |
7 | {!! Form::label('description', trans('forms.description')) !!} 8 | {!! Form::textarea('description', null, ['class' => 'form-control']) !!} 9 |
10 | 11 |
12 | {!! Form::label('public', trans('forms.public/private')) !!} 13 | {!! Form::select('public', ['1' => 'Public', '0' => 'Private'], null, ['class' => 'chosen-select']) !!} 14 |
15 | 16 | {!! Form::submit('Save', ['class' => 'btn btn-default']) !!} -------------------------------------------------------------------------------- /resources/views/forms/lists/import.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('file', trans('lists.file'), ['class' => 'control-label']) !!} 3 | {!! Form::file('file', ['required']) !!} 4 |
5 | 6 | {!! Form::submit(trans('lists.import'), ['class' => 'btn btn-default']) !!} -------------------------------------------------------------------------------- /resources/views/forms/settings/application.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('APP_NAME', trans('settings.application.name2') . ' *') !!} 3 | {!! Form::text('APP_NAME', env('APP_NAME'), ['class' => 'form-control']) !!} 4 |
5 | 6 |
7 | {!! Form::label('APP_URL', trans('settings.application.url') . ' *') !!} 8 | {!! Form::text('APP_URL', env('APP_URL'), ['class' => 'form-control']) !!} 9 |
10 | 11 |
12 | {!! Form::label('APP_EMAIL', trans('settings.application.from.email') . ' *') !!} 13 | {!! Form::email('APP_EMAIL', env('APP_EMAIL'), ['class' => 'form-control']) !!} 14 |
15 | 16 |
17 | {!! Form::label('APP_FROM', trans('settings.application.from.name') . ' *') !!} 18 | {!! Form::text('APP_FROM', env('APP_FROM'), ['class' => 'form-control']) !!} 19 |
20 | 21 |
22 | {!! Form::label('APP_LOCALE', trans('settings.application.language') . ' *') !!} 23 | {!! Form::select('APP_LOCALE', ['en' => trans('language.en'), 'nl' => trans('language.nl')], env('APP_LOCALE'), ['class' => 'chosen-select']) !!} 24 |
25 | 26 |
27 | {!! Form::label('APP_REGISTER', trans('settings.application.registration') . ' *') !!} 28 | {!! Form::select('APP_REGISTER', ['false' => 'No', 'true' => 'Yes'], (env('APP_REGISTER') == 1) ? 'true' : 'false', ['class' => 'chosen-select']) !!} 29 |
30 | 31 |
32 | {!! Form::label('APP_EDITOR', trans('settings.application.templateEditor') . ' *') !!} 33 | {!! Form::select('APP_EDITOR', ['textarea' => 'Textarea', 'html' => 'HTML Editor'], env('APP_EDITOR'), ['class' => 'chosen-select']) !!} 34 |
35 | 36 | {!! Form::submit(trans('forms.save'), ['class' => 'btn btn-default']) !!} 37 | 38 | -------------------------------------------------------------------------------- /resources/views/forms/settings/mail.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('MAIL_DRIVER', trans('settings.mail.driver') . ' *') !!} 3 | {!! Form::text('MAIL_DRIVER', env('MAIL_DRIVER'), ['class' => 'form-control', 'placeholder' => 'smtp']) !!} 4 |
5 | 6 |
7 | {!! Form::label('MAIL_HOST', trans('settings.mail.host') . ' *') !!} 8 | {!! Form::text('MAIL_HOST', env('MAIL_HOST'), ['class' => 'form-control', 'placeholder' => 'smtp.example.com']) !!} 9 |
10 | 11 |
12 | {!! Form::label('MAIL_PORT', trans('settings.mail.port') . ' *') !!} 13 | {!! Form::text('MAIL_PORT', env('MAIL_PORT'), ['class' => 'form-control', 'placeholder' => '2525']) !!} 14 |
15 | 16 |
17 | {!! Form::label('MAIL_USERNAME', trans('settings.mail.username') . ' *') !!} 18 | {!! Form::text('MAIL_USERNAME', env('MAIL_USERNAME'), ['class' => 'form-control', 'placeholder' => 'info@test.com']) !!} 19 |
20 | 21 |
22 | {!! Form::label('MAIL_PASSWORD', trans('settings.mail.password') . ' *') !!} 23 | {!! Form::text('MAIL_PASSWORD', env('MAIL_PASSWORD'), ['class' => 'form-control', 'placeholder' => 'MySuPERs4fePasSw0rD']) !!} 24 |
25 | 26 | {!! Form::submit(trans('forms.save'), ['class' => 'btn btn-default']) !!} -------------------------------------------------------------------------------- /resources/views/forms/subscriptions.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('email', trans('forms.email') . ' *') !!} 3 | {!! Form::email('email', null, ['class' => 'form-control']) !!} 4 |
5 | 6 |
7 | {!! Form::label('name', trans('forms.name') . ' *') !!} 8 | {!! Form::text('name', null, ['class' => 'form-control']) !!} 9 |
10 | 11 |
12 | {!! Form::label('country', trans('forms.country') . ' *') !!} 13 | {!! Form::select('country', countries(), null, ['class' => 'chosen-select']) !!} 14 |
15 | 16 |
17 | {!! Form::label('mailing_list_id', trans('forms.list') . ' *') !!} 18 | {!! Form::select('mailing_list_id', $lists, null, ['class' => 'chosen-select']) !!} 19 |
20 | 21 | {!! Form::submit('Save', ['class' => 'btn btn-default']) !!} 22 | -------------------------------------------------------------------------------- /resources/views/forms/templates.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {!! Form::label('name', trans('forms.name') . ' *') !!} 3 | {!! Form::text('name', null, ['class' => 'form-control']) !!} 4 |
5 | 6 | @include('forms.editor', ['name' => 'content']) 7 | 8 |

{{ trans('templates.available_variables') }} %subject%, %email%, %name%, %country%, %unsubscribe_link%

9 | 10 | {!! Form::submit(trans('forms.save'), ['class' => 'btn btn-default']) !!} -------------------------------------------------------------------------------- /resources/views/home.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', 'Dashboard') 4 | 5 | @section('content') 6 | 7 |
8 |
9 |
Dashboard
10 |
11 | Welcome to Laravel Newsletter, an application where you can send easily a newsletter to your subscribers. 12 |

13 | Made with by @NathanGeerinck 14 |
15 |
16 |
17 | @endsection -------------------------------------------------------------------------------- /resources/views/lists/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('lists.edit') . ': ' . $list->name) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::model($list, ['route' => ['lists.update', $list]]) !!} 18 | 19 | @include('forms.lists') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection 26 | 27 | -------------------------------------------------------------------------------- /resources/views/lists/import.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('lists.import') . ': ' . $list->name) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::open(['route' => ['lists.import', $list], 'files' => true]) !!} 18 | 19 | @include('forms.lists.import') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection 26 | 27 | -------------------------------------------------------------------------------- /resources/views/lists/new.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('lists.new')) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::model((request()->is('lists/clone*')) ? $list : 'null', ['route' => ['lists.create']]) !!} 18 | 19 | @include('forms.lists') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection 26 | 27 | -------------------------------------------------------------------------------- /resources/views/parts/success.blade.php: -------------------------------------------------------------------------------- 1 | {{--@if(Session::get('success'))--}} 2 | {{--
--}} 3 | {{----}} 4 | {{--Success! {!! Session::get('success') !!}--}} 5 | {{--
--}} 6 | {{--@endif--}} 7 | @if (notify()->ready()) 8 | @section('javascript') 9 | 20 | @endsection 21 | @endif -------------------------------------------------------------------------------- /resources/views/settings/application.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('settings.settings') . ': ' . trans('settings.application.name')) 4 | 5 | @section('content') 6 |
7 | @include('settings.parts.navigation') 8 |
9 |
10 |
11 |
@yield('title')
12 | 13 |
14 | {!! Form::model(null, ['route' => ['settings.application.update']]) !!} 15 | 16 | @include('forms.settings.application') 17 | 18 | {!! Form::close() !!} 19 | 20 |
21 |
22 |
23 | @endsection -------------------------------------------------------------------------------- /resources/views/settings/mail.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('settings.settings') . ': ' . trans('settings.mail.name')) 4 | 5 | @section('content') 6 |
7 | @include('settings.parts.navigation') 8 |
9 |
10 |
11 |
@yield('title')
12 | 13 |
14 | {!! Form::model(null, ['route' => ['settings.mail.update']]) !!} 15 | 16 | @include('forms.settings.mail') 17 | 18 | {!! Form::close() !!} 19 | 20 |
21 | 22 |
23 |
24 | @endsection -------------------------------------------------------------------------------- /resources/views/settings/parts/navigation.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{ trans('settings.application.name') }} 3 | {{ trans('settings.mail.name') }} 4 | {{--Users--}} 5 |
-------------------------------------------------------------------------------- /resources/views/settings/users/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', 'Settings: users') 4 | 5 | @section('content') 6 |
7 | @include('settings.parts.navigation') 8 |
9 |
10 |
11 |
@yield('title')
12 | 13 |
14 | You are logged in! 15 |
16 |
17 |
18 | @endsection -------------------------------------------------------------------------------- /resources/views/subscriptions/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('subscriptions.show') . ': ' . $subscription->email) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::model($subscription, ['route' => ['subscriptions.update', $subscription]]) !!} 18 | 19 | @include('forms.subscriptions') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection -------------------------------------------------------------------------------- /resources/views/subscriptions/new.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('subscriptions.add')) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::model((request()->is('subscriptions/clone*')) ? $subscription : 'null', ['route' => ['subscriptions.create']]) !!} 18 | 19 | @include('forms.subscriptions') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection -------------------------------------------------------------------------------- /resources/views/subscriptions/unsubscribe.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('subscriptions.unsubscribe')) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 |
12 | {!! Form::open(['route' => ['subscriptions.unsubscribe', $subscription], 'method' => 'DELETE']) !!} 13 | 14 | {!! Form::close() !!} 15 |
16 |
17 |
18 | @endsection -------------------------------------------------------------------------------- /resources/views/templates/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('general.edit') . ' ' . trans('templates.show') . ': ' . $template->name) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::model($template, ['route' => ['templates.update', $template]]) !!} 18 | 19 | @include('forms.templates') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection -------------------------------------------------------------------------------- /resources/views/templates/new.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('title', trans('templates.new')) 4 | 5 | @section('content') 6 |
7 |
8 |
9 | @yield('title') 10 |
11 | 14 |
15 |
16 |
17 | {!! Form::model((request()->is('templates/clone*')) ? $template : 'null', ['route' => ['templates.create']]) !!} 18 | 19 | @include('forms.templates') 20 | 21 | {!! Form::close() !!} 22 |
23 |
24 |
25 | @endsection -------------------------------------------------------------------------------- /resources/views/templates/preview.blade.php: -------------------------------------------------------------------------------- 1 | {!! $template->content !!} -------------------------------------------------------------------------------- /resources/views/vendor/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/vendor/dotenv-editor/master.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Dotenv-Editor 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | @yield('content') 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /resources/views/vendor/emailTrakingViews/emails/mensaje.blade.php: -------------------------------------------------------------------------------- 1 | @extends('emailTrakingViews::emails/mensaje_layout') 2 | @section('title') 3 | Message from {{config('mail-tracker.name')}} 4 | @endsection 5 | 6 | @section('preheader') 7 | Message from {{config('mail-tracker.name')}}
8 | @endsection 9 | @section('nombre_destinatario') 10 | {{ $data['name'] }} 11 | @endsection 12 | @section('mensaje') 13 |

Static Email Title

14 |

15 | Static Email Content 16 |

17 | {{ $data['message'] }} 18 | @endsection 19 | @section('href_call_to_action') 20 | {{env('APP_URL')}} 21 | @endsection 22 | @section('txt_call_to_action') 23 | Call To Action 24 | @endsection 25 | @section('txt_extra') 26 | This email comes from {{config('mail-tracker.name')}} 27 | @endsection 28 | @section('saludo_final') 29 | Regards 30 | @endsection 31 | -------------------------------------------------------------------------------- /resources/views/vendor/emailTrakingViews/layouts/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mail Tracker 8 | 9 | 10 | 11 | @yield('content') 12 | 13 | -------------------------------------------------------------------------------- /resources/views/vendor/emailTrakingViews/show.blade.php: -------------------------------------------------------------------------------- 1 | {!!$email->content!!} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/emailTrakingViews/smtp_detail.blade.php: -------------------------------------------------------------------------------- 1 | @extends(config('mail-tracker.admin-template.name')) 2 | @section(config('mail-tracker.admin-template.section')) 3 |
4 |
5 |
6 |

Mail Tracker

7 |
8 |
9 |

10 | All Sent Emails 11 |

12 |
13 |
14 |
15 |
16 |

17 | SMTP detail for Email ID {{$details->id}} 18 |

19 | 20 | View Message 21 | 22 |
23 |
24 |
25 |
26 | Recipient: {{$details->recipient}}
27 | Subject: {{$details->subject}}
28 | Sent At: {{$details->created_at->format(config('mail-tracker.date-format'))}}
29 | SMTP Details: {{ $details->smtp_info }} 30 |
31 |
32 |
33 | @endsection 34 | -------------------------------------------------------------------------------- /resources/views/vendor/emailTrakingViews/url_detail.blade.php: -------------------------------------------------------------------------------- 1 | @extends(config('mail-tracker.admin-template.name')) 2 | @section(config('mail-tracker.admin-template.section')) 3 |
4 |
5 |
6 |

Mail Tracker

7 |
8 |
9 |

10 | All Sent Emails 11 |

12 |
13 |
14 |
15 |
16 |

17 | Clicked URLs for Email ID {{$details->first()->email->id}} 18 |

19 | 20 | View Message 21 | 22 |
23 |
24 |
25 |
26 | Recipient: {{$details->first()->email->recipient}}
27 | Subject: {{$details->first()->email->subject}}
28 | Sent At: {{$details->first()->email->created_at->format(config('mail-tracker.date-format'))}} 29 |
30 |
31 |
32 |
33 | 34 | 35 | 36 | 37 | 38 | @foreach($details as $detail) 39 | 40 | 41 | 42 | 43 | 44 | 45 | @endforeach 46 |
UrlClicksFirst Click AtLast Click At
{{$detail->url}}{{$detail->clicks}}{{$detail->created_at->format(config('mail-tracker.date-format'))}}{{$detail->updated_at->format(config('mail-tracker.date-format'))}}
47 |
48 |
49 |
50 | @endsection 51 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/button.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 |
4 | 5 | 6 | 15 | 16 |
7 | 8 | 9 | 12 | 13 |
10 | {{ $slot }} 11 |
14 |
17 |
20 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/footer.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/header.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ $slot }} 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/layout.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 25 | 26 | 27 | 28 | 51 | 52 |
29 | 30 | {{ $header or '' }} 31 | 32 | 33 | 34 | 46 | 47 | 48 | {{ $footer or '' }} 49 |
35 | 36 | 37 | 38 | 43 | 44 |
39 | {{ Illuminate\Mail\Markdown::parse($slot) }} 40 | 41 | {{ $subcopy or '' }} 42 |
45 |
50 |
53 | 54 | 55 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/message.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::layout') 2 | {{-- Header --}} 3 | @slot('header') 4 | @component('mail::header', ['url' => config('app.url')]) 5 | {{ config('app.name') }} 6 | @endcomponent 7 | @endslot 8 | 9 | {{-- Body --}} 10 | {{ $slot }} 11 | 12 | {{-- Subcopy --}} 13 | @isset($subcopy) 14 | @slot('subcopy') 15 | @component('mail::subcopy') 16 | {{ $subcopy }} 17 | @endcomponent 18 | @endslot 19 | @endisset 20 | 21 | {{-- Footer --}} 22 | @slot('footer') 23 | @component('mail::footer') 24 | © {{ date('Y') }} {{ config('app.name') }}. All rights reserved. 25 | @endcomponent 26 | @endslot 27 | @endcomponent 28 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/panel.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 |
4 | 5 | 6 | 9 | 10 |
7 | {{ Illuminate\Mail\Markdown::parse($slot) }} 8 |
11 |
14 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/promotion.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 |
4 | {{ Illuminate\Mail\Markdown::parse($slot) }} 5 |
8 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/promotion/button.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 |
4 | 5 | 6 | 9 | 10 |
7 | {{ $slot }} 8 |
11 |
14 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/subcopy.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 |
4 | {{ Illuminate\Mail\Markdown::parse($slot) }} 5 |
8 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/html/table.blade.php: -------------------------------------------------------------------------------- 1 |
2 | {{ Illuminate\Mail\Markdown::parse($slot) }} 3 |
4 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/button.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }}: {{ $url }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/footer.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/header.blade.php: -------------------------------------------------------------------------------- 1 | [{{ $slot }}]({{ $url }}) 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/layout.blade.php: -------------------------------------------------------------------------------- 1 | {!! strip_tags($header) !!} 2 | 3 | {!! strip_tags($slot) !!} 4 | @isset($subcopy) 5 | 6 | {!! strip_tags($subcopy) !!} 7 | @endisset 8 | 9 | {!! strip_tags($footer) !!} 10 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/message.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::layout') 2 | {{-- Header --}} 3 | @slot('header') 4 | @component('mail::header', ['url' => config('app.url')]) 5 | {{ config('app.name') }} 6 | @endcomponent 7 | @endslot 8 | 9 | {{-- Body --}} 10 | {{ $slot }} 11 | 12 | {{-- Subcopy --}} 13 | @isset($subcopy) 14 | @slot('subcopy') 15 | @component('mail::subcopy') 16 | {{ $subcopy }} 17 | @endcomponent 18 | @endslot 19 | @endisset 20 | 21 | {{-- Footer --}} 22 | @slot('footer') 23 | @component('mail::footer') 24 | © {{ date('Y') }} {{ config('app.name') }}. All rights reserved. 25 | @endcomponent 26 | @endslot 27 | @endcomponent 28 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/panel.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/promotion.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/promotion/button.blade.php: -------------------------------------------------------------------------------- 1 | [{{ $slot }}]({{ $url }}) 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/subcopy.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/mail/markdown/table.blade.php: -------------------------------------------------------------------------------- 1 | {{ $slot }} 2 | -------------------------------------------------------------------------------- /resources/views/vendor/notifications/email.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | {{-- Greeting --}} 3 | @if (! empty($greeting)) 4 | # {{ $greeting }} 5 | @else 6 | @if ($level == 'error') 7 | # Whoops! 8 | @else 9 | # Hello! 10 | @endif 11 | @endif 12 | 13 | {{-- Intro Lines --}} 14 | @foreach ($introLines as $line) 15 | {{ $line }} 16 | 17 | @endforeach 18 | 19 | {{-- Action Button --}} 20 | @isset($actionText) 21 | 33 | @component('mail::button', ['url' => $actionUrl, 'color' => $color]) 34 | {{ $actionText }} 35 | @endcomponent 36 | @endisset 37 | 38 | {{-- Outro Lines --}} 39 | @foreach ($outroLines as $line) 40 | {{ $line }} 41 | 42 | @endforeach 43 | 44 | {{-- Salutation --}} 45 | @if (! empty($salutation)) 46 | {{ $salutation }} 47 | @else 48 | Regards,
{{ config('app.name') }} 49 | @endif 50 | 51 | {{-- Subcopy --}} 52 | @isset($actionText) 53 | @component('mail::subcopy') 54 | If you’re having trouble clicking the "{{ $actionText }}" button, copy and paste the URL below 55 | into your web browser: [{{ $actionUrl }}]({{ $actionUrl }}) 56 | @endcomponent 57 | @endisset 58 | @endcomponent 59 | -------------------------------------------------------------------------------- /resources/views/vendor/pagination/bootstrap-4.blade.php: -------------------------------------------------------------------------------- 1 | @if ($paginator->hasPages()) 2 | 36 | @endif 37 | -------------------------------------------------------------------------------- /resources/views/vendor/pagination/default.blade.php: -------------------------------------------------------------------------------- 1 | @if ($paginator->hasPages()) 2 | 36 | @endif 37 | -------------------------------------------------------------------------------- /resources/views/vendor/pagination/simple-bootstrap-4.blade.php: -------------------------------------------------------------------------------- 1 | @if ($paginator->hasPages()) 2 | 17 | @endif 18 | -------------------------------------------------------------------------------- /resources/views/vendor/pagination/simple-default.blade.php: -------------------------------------------------------------------------------- 1 | @if ($paginator->hasPages()) 2 | 17 | @endif 18 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | user(); 18 | })->middleware('auth:api'); 19 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 16 | }); 17 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 18 | })->describe('Display an inspiring quote'); 19 | -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 7 | */ 8 | $uri = urldecode( 9 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 10 | ); 11 | 12 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 13 | // built-in PHP web server. This provides a convenient way to test a Laravel 14 | // application without having installed a "real" web server software here. 15 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 16 | return false; 17 | } 18 | 19 | require_once __DIR__.'/public/index.php'; 20 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/debugbar/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 17 | 18 | $response->assertStatus(200); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | let mix = require('laravel-mix'); 2 | 3 | /* 4 | |-------------------------------------------------------------------------- 5 | | Mix Asset Management 6 | |-------------------------------------------------------------------------- 7 | | 8 | | Mix provides a clean, fluent API for defining some Webpack build steps 9 | | for your Laravel application. By default, we are compiling the Sass 10 | | file for the application as well as bundling up all the JS files. 11 | | 12 | */ 13 | 14 | mix.js('resources/assets/js/app.js', 'public/js'); 15 | 16 | mix.styles([ 17 | 'resources/assets/css/custom.css', 18 | 'resources/assets/css/app.css', 19 | 'resources/assets/css/chosen.css', 20 | 'resources/assets/css/sweetalert.css' 21 | ], 'public/css/app.css'); 22 | 23 | if (mix.config.inProduction) { 24 | mix.version(); 25 | } --------------------------------------------------------------------------------