├── .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 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
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 |
15 |
16 |
17 |
{!! trans('campaigns.send.message', ['count' => $subscriptions->count()]) !!}
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 |
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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
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 |
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 |
13 |
14 |
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 |
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 | Url |
35 | Clicks |
36 | First Click At |
37 | Last Click At |
38 | @foreach($details as $detail)
39 |
40 | {{$detail->url}} |
41 | {{$detail->clicks}} |
42 | {{$detail->created_at->format(config('mail-tracker.date-format'))}} |
43 | {{$detail->updated_at->format(config('mail-tracker.date-format'))}} |
44 |
45 | @endforeach
46 |
47 |
48 |
49 |
50 | @endsection
51 |
--------------------------------------------------------------------------------
/resources/views/vendor/mail/html/button.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
14 | |
15 |
16 |
17 | |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/resources/views/vendor/mail/html/footer.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 | |
11 |
12 |
--------------------------------------------------------------------------------
/resources/views/vendor/mail/html/header.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
--------------------------------------------------------------------------------
/resources/views/vendor/mail/html/layout.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
25 |
26 |
27 |
28 |
29 |
30 | {{ $header or '' }}
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | {{ Illuminate\Mail\Markdown::parse($slot) }}
40 |
41 | {{ $subcopy or '' }}
42 | |
43 |
44 |
45 | |
46 |
47 |
48 | {{ $footer or '' }}
49 |
50 | |
51 |
52 |
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 |
4 |
5 |
6 |
7 | {{ Illuminate\Mail\Markdown::parse($slot) }}
8 | |
9 |
10 |
11 | |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/resources/views/vendor/mail/html/promotion.blade.php:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/resources/views/vendor/mail/html/promotion/button.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 | |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/resources/views/vendor/mail/html/subcopy.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ Illuminate\Mail\Markdown::parse($slot) }}
5 | |
6 |
7 |
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 | }
--------------------------------------------------------------------------------