Login UI, Database Seeds, Dashboard layouts (#2450)

* Implement CoreUI Interface

* Core UI Navigation wire frame

* UI - Fix sidebar nav - add Invoice Ninja Logo

* Create layout using CoreUI admin template

* Login UI, Database seeds
This commit is contained in:
David Bomba 2018-10-16 22:42:43 +11:00 committed by GitHub
parent f42024f84a
commit 528c99f655
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 2104 additions and 96 deletions

View File

@ -22,4 +22,8 @@ if (! defined('APP_NAME')) {
define('TEST_CLIENTNAME', env('TEST_CLIENTNAME', 'client@example.com'));
define('TEST_PASSWORD', 'password');
define('BANK_LIBRARY_OFX', 1);
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\POPO;
namespace App\DataMapper;
class InvoiceItem
{

View File

@ -32,4 +32,9 @@ class HomeController extends Controller
return view('dashboard.index');
}
public function signup()
{
return 'sign up page';
}
}

243
app/Libraries/OFX.php Normal file
View File

@ -0,0 +1,243 @@
<?php
namespace App\Libraries;
// https://github.com/denvertimothy/OFX
use SimpleXMLElement;
class OFX
{
public $bank;
public $request;
public $response;
public $responseHeader;
public $responseBody;
public function __construct($bank, $request)
{
$this->bank = $bank;
$this->request = $request;
}
public function go()
{
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $this->bank->url);
curl_setopt($c, CURLOPT_POST, 1);
// User-Agent: http://www.ofxhome.com/ofxforum/viewtopic.php?pid=108091#p108091
curl_setopt($c, CURLOPT_HTTPHEADER, ['Content-Type: application/x-ofx', 'User-Agent: httpclient']);
curl_setopt($c, CURLOPT_POSTFIELDS, $this->request);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$this->response = curl_exec($c);
curl_close($c);
$tmp = explode('<OFX>', $this->response);
$this->responseHeader = $tmp[0];
$this->responseBody = '<OFX>'.$tmp[1];
}
public function xml()
{
$xml = $this->responseBody;
$xml = self::closeTags($xml);
$x = new SimpleXMLElement($xml);
return $x;
}
public static function closeTags($x)
{
$x = preg_replace('/\s+/', '', $x);
return preg_replace('/(<([^<\/]+)>)(?!.*?<\/\2>)([^<]+)/', '\1\3</\2>', $x);
}
}
class Finance
{
public $banks;
}
class Bank
{
public $logins; // array of class User
public $finance; // the Finance object that hold this Bank object
public $fid;
public $org;
public $url;
public function __construct($finance, $fid, $url, $org)
{
$this->finance = $finance;
$this->fid = $fid;
$this->url = $url;
$this->org = $org;
}
}
class Login
{
public $accounts;
public $bank;
public $id;
public $pass;
public $ofxVersion;
public $appVersion;
public function __construct($bank, $id, $pass)
{
$this->bank = $bank;
$this->id = $id;
$this->pass = $pass;
}
public function setup()
{
$ofxRequest =
"OFXHEADER:100\n".
"DATA:OFXSGML\n".
"VERSION:" . $this->ofxVersion . "\n".
"SECURITY:NONE\n".
"ENCODING:USASCII\n".
"CHARSET:1252\n".
"COMPRESSION:NONE\n".
"OLDFILEUID:NONE\n".
"NEWFILEUID:NONE\n".
"\n".
"<OFX>\n".
"<SIGNONMSGSRQV1>\n".
"<SONRQ>\n".
"<DTCLIENT>20110412162900.000[-7:MST]\n".
'<USERID>'.$this->id."\n".
'<USERPASS>'.$this->pass."\n".
"<GENUSERKEY>N\n".
"<LANGUAGE>ENG\n".
"<FI>\n".
'<ORG>'.$this->bank->org."\n".
'<FID>'.$this->bank->fid."\n".
"</FI>\n".
"<APPID>QWIN\n".
"<APPVER>" . $this->appVersion . "\n".
"</SONRQ>\n".
"</SIGNONMSGSRQV1>\n".
"<SIGNUPMSGSRQV1>\n".
"<ACCTINFOTRNRQ>\n".
'<TRNUID>'.md5(time().$this->bank->url.$this->id)."\n".
"<ACCTINFORQ>\n".
"<DTACCTUP>19900101\n".
"</ACCTINFORQ>\n".
"</ACCTINFOTRNRQ> \n".
"</SIGNUPMSGSRQV1>\n".
"</OFX>\n";
$o = new OFX($this->bank, $ofxRequest);
$o->go();
$x = $o->xml();
foreach ($x->xpath('/OFX/SIGNUPMSGSRSV1/ACCTINFOTRNRS/ACCTINFORS/ACCTINFO/BANKACCTINFO/BANKACCTFROM') as $a) {
$this->accounts[] = new Account($this, (string) $a->ACCTID, 'BANK', (string) $a->ACCTTYPE, (string) $a->BANKID);
}
foreach ($x->xpath('/OFX/SIGNUPMSGSRSV1/ACCTINFOTRNRS/ACCTINFORS/ACCTINFO/CCACCTINFO/CCACCTFROM') as $a) {
$this->accounts[] = new Account($this, (string) $a->ACCTID, 'CC');
}
}
}
class Account
{
public $login;
public $id;
public $type;
public $subType;
public $bankId;
public $ledgerBalance;
public $availableBalance;
public $response;
public function __construct($login, $id, $type, $subType = null, $bankId = null)
{
$this->login = $login;
$this->id = $id;
$this->type = $type;
$this->subType = $subType;
$this->bankId = $bankId;
}
public function setup($includeTransactions = true)
{
$ofxRequest =
"OFXHEADER:100\n".
"DATA:OFXSGML\n".
"VERSION:" . $this->login->ofxVersion . "\n".
"SECURITY:NONE\n".
"ENCODING:USASCII\n".
"CHARSET:1252\n".
"COMPRESSION:NONE\n".
"OLDFILEUID:NONE\n".
"NEWFILEUID:NONE\n".
"\n".
"<OFX>\n".
"<SIGNONMSGSRQV1>\n".
"<SONRQ>\n".
"<DTCLIENT>20110412162900.000[-7:MST]\n".
'<USERID>'.$this->login->id."\n".
'<USERPASS>'.$this->login->pass."\n".
"<LANGUAGE>ENG\n".
"<FI>\n".
'<ORG>'.$this->login->bank->org."\n".
'<FID>'.$this->login->bank->fid."\n".
"</FI>\n".
"<APPID>QWIN\n".
"<APPVER>" . $this->login->appVersion . "\n".
"</SONRQ>\n".
"</SIGNONMSGSRQV1>\n";
if ($this->type == 'BANK') {
$ofxRequest .=
" <BANKMSGSRQV1>\n".
" <STMTTRNRQ>\n".
' <TRNUID>'.md5(time().$this->login->bank->url.$this->id)."\n".
" <STMTRQ>\n".
" <BANKACCTFROM>\n".
' <BANKID>'.$this->bankId."\n".
' <ACCTID>'.$this->id."\n".
' <ACCTTYPE>'.$this->subType."\n".
" </BANKACCTFROM>\n".
" <INCTRAN>\n".
" <DTSTART>20110301\n".
' <INCLUDE>'.($includeTransactions ? 'Y' : 'N')."\n".
" </INCTRAN>\n".
" </STMTRQ>\n".
" </STMTTRNRQ>\n".
" </BANKMSGSRQV1>\n";
} elseif ($this->type == 'CC') {
$ofxRequest .=
" <CREDITCARDMSGSRQV1>\n".
" <CCSTMTTRNRQ>\n".
' <TRNUID>'.md5(time().$this->login->bank->url.$this->id)."\n".
" <CCSTMTRQ>\n".
" <CCACCTFROM>\n".
' <ACCTID>'.$this->id."\n".
" </CCACCTFROM>\n".
" <INCTRAN>\n".
" <DTSTART>20110320\n".
' <INCLUDE>'.($includeTransactions ? 'Y' : 'N')."\n".
" </INCTRAN>\n".
" </CCSTMTRQ>\n".
" </CCSTMTTRNRQ>\n".
" </CREDITCARDMSGSRQV1>\n";
}
$ofxRequest .=
'</OFX>';
$o = new OFX($this->login->bank, $ofxRequest);
$o->go();
$this->response = $o->response;
$x = $o->xml();
$a = $x->xpath('/OFX/*/*/*/LEDGERBAL/BALAMT');
$this->ledgerBalance = (float) $a[0];
$a = $x->xpath('/OFX/*/*/*/AVAILBAL/BALAMT');
if (isset($a[0])) {
$this->availableBalance = (float) $a[0];
}
}
}

View File

@ -3,7 +3,7 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Models\Traits;
use App\Models\Traits\AccountTrait;
class Account extends Model
{

28
app/Models/Bank.php Normal file
View File

@ -0,0 +1,28 @@
<?php
namespace App\Models;
use Eloquent;
/**
* Class Bank.
*/
class Bank extends Eloquent
{
/**
* @var bool
*/
public $timestamps = false;
/**
* @param $finance
*
* @return \App\Libraries\Bank
*/
public function getOFXBank($finance)
{
$config = json_decode($this->config);
return new \App\Libraries\Bank($finance, $config->fid, $config->url, $config->org);
}
}

View File

@ -0,0 +1,61 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Crypt;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* Class BankAccount.
*/
class BankAccount extends Model
{
use SoftDeletes;
/**
* @var array
*/
protected $dates = ['deleted_at'];
/**
* @var array
*/
protected $fillable = [
'bank_id',
'app_version',
'ofx_version',
];
/**
* @return mixed
*/
public function getUsername()
{
return Crypt::decrypt($this->username);
}
/**
* @param $config
*/
public function setUsername($value)
{
$this->username = Crypt::encrypt($value);
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function bank()
{
return $this->belongsTo(Bank::class);
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function bank_subaccounts()
{
return $this->hasMany('App\Models\BankSubaccount');
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* Class BankSubaccount.
*/
class BankSubaccount extends Model
{
use SoftDeletes;
/**
* @var array
*/
protected $dates = ['deleted_at'];
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function bank_account()
{
return $this->belongsTo(BankAccount::class);
}
}

View File

@ -6,5 +6,6 @@ use Illuminate\Database\Eloquent\Model;
class Country extends Model
{
//
public $timestamps = false;
}

View File

@ -6,5 +6,6 @@ use Illuminate\Database\Eloquent\Model;
class Currency extends Model
{
//
public $timestamps = false;
}

View File

@ -6,5 +6,6 @@ use Illuminate\Database\Eloquent\Model;
class Language extends Model
{
//
public $timestamps = false;
}

View File

@ -4,7 +4,17 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* Class PaymentLibrary.
*/
class PaymentLibrary extends Model
{
//
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function gateways()
{
return $this->hasMany(Gateway::class, 'payment_library_id');
}
}

View File

@ -6,5 +6,8 @@ use Illuminate\Database\Eloquent\Model;
class Timezone extends Model
{
//
/**
* @var bool
*/
public $timestamps = false;
}

View File

@ -19,10 +19,12 @@
"type": "project",
"require": {
"php": "^7.1.3",
"asgrim/ofxparser": "^1.2",
"fideloper/proxy": "^4.0",
"laravel/framework": "5.7.*",
"laravel/tinker": "^1.0",
"spatie/laravel-html": "^2.19"
"spatie/laravel-html": "^2.19",
"webpatser/laravel-countries": "dev-master#75992ad"
},
"require-dev": {
"beyondcode/laravel-dump-server": "^1.0",
@ -39,7 +41,10 @@
],
"psr-4": {
"App\\": "app/"
}
},
"files": [
"app/Libraries/OFX.php"
]
},
"autoload-dev": {
"psr-4": {

136
composer.lock generated
View File

@ -4,8 +4,64 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "349ead44e9c7f421ba04cc034a5ab71c",
"content-hash": "218e884d0942a0ea04acd7d82b9705e8",
"packages": [
{
"name": "asgrim/ofxparser",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/asgrim/ofxparser.git",
"reference": "8ba143295be666ae2cac05674f7d526d8e0ebed7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/asgrim/ofxparser/zipball/8ba143295be666ae2cac05674f7d526d8e0ebed7",
"reference": "8ba143295be666ae2cac05674f7d526d8e0ebed7",
"shasum": ""
},
"require": {
"php": "~5.6|~7.0"
},
"require-dev": {
"phpunit/phpunit": "~5.5",
"squizlabs/php_codesniffer": "~2.6"
},
"type": "library",
"autoload": {
"psr-0": {
"OfxParser": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Guillaume Bailleul",
"email": "contact@guillaume-bailleul.fr",
"homepage": "http://www.guillaume-bailleul.fr"
},
{
"name": "James Titcumb",
"email": "hello@jamestitcumb.com",
"homepage": "http://www.jamestitcumb.com/"
},
{
"name": "Oliver Lowe",
"email": "mrtriangle@gmail.com"
}
],
"description": "Simple OFX file parser",
"keywords": [
"finance",
"ofx",
"open financial exchange",
"parser"
],
"time": "2016-09-26T11:36:23+00:00"
},
{
"name": "dnoegel/php-xdg-base-dir",
"version": "0.1",
@ -659,16 +715,16 @@
},
{
"name": "league/flysystem",
"version": "1.0.47",
"version": "1.0.48",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c"
"reference": "a6ded5b2f6055e2db97b4b859fdfca2b952b78aa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a11e4a75f256bdacf99d20780ce42d3b8272975c",
"reference": "a11e4a75f256bdacf99d20780ce42d3b8272975c",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a6ded5b2f6055e2db97b4b859fdfca2b952b78aa",
"reference": "a6ded5b2f6055e2db97b4b859fdfca2b952b78aa",
"shasum": ""
},
"require": {
@ -739,7 +795,7 @@
"sftp",
"storage"
],
"time": "2018-09-14T15:30:29+00:00"
"time": "2018-10-15T13:53:10+00:00"
},
{
"name": "monolog/monolog",
@ -2426,6 +2482,58 @@
"environment"
],
"time": "2018-07-29T20:33:41+00:00"
},
{
"name": "webpatser/laravel-countries",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/webpatser/laravel-countries.git",
"reference": "75992ad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webpatser/laravel-countries/zipball/75992ad",
"reference": "75992ad",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"autoload": {
"psr-0": {
"Webpatser\\Countries": "src/"
},
"classmap": [
"src/commands"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christoph Kempen",
"email": "christoph@downsized.nl",
"homepage": "http://downsized.nl/",
"role": "developer"
},
{
"name": "Paul Kievits",
"role": "developer"
}
],
"description": "Laravel Countries is a bundle for Laravel, providing Almost ISO 3166_2, 3166_3, currency, Capital and more for all countries.",
"homepage": "https://github.com/webpatser/laravel-countries",
"keywords": [
"countries",
"iso_3166_2",
"iso_3166_3",
"laravel"
],
"time": "2018-06-27T11:58:05+00:00"
}
],
"packages-dev": [
@ -3198,16 +3306,16 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "6.0.8",
"version": "6.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "848f78b3309780fef7ec8c4666b7ab4e6b09b22f"
"reference": "0685fb6a43aed1b2e09804d1aaf17144c82861f8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/848f78b3309780fef7ec8c4666b7ab4e6b09b22f",
"reference": "848f78b3309780fef7ec8c4666b7ab4e6b09b22f",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0685fb6a43aed1b2e09804d1aaf17144c82861f8",
"reference": "0685fb6a43aed1b2e09804d1aaf17144c82861f8",
"shasum": ""
},
"require": {
@ -3231,7 +3339,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "6.0-dev"
"dev-master": "6.1-dev"
}
},
"autoload": {
@ -3257,7 +3365,7 @@
"testing",
"xunit"
],
"time": "2018-10-04T03:41:23+00:00"
"time": "2018-10-16T05:37:37+00:00"
},
{
"name": "phpunit/php-file-iterator",
@ -4188,7 +4296,9 @@
],
"aliases": [],
"minimum-stability": "dev",
"stability-flags": [],
"stability-flags": {
"webpatser/laravel-countries": 20
},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {

View File

@ -164,6 +164,7 @@ return [
* Dependency Service Providers
*/
Spatie\Html\HtmlServiceProvider::class,
'Webpatser\Countries\CountriesServiceProvider',
/*
* Package Service Providers...
@ -232,6 +233,8 @@ return [
*/
'Html' => Spatie\Html\Facades\Html::class,
'Countries' => 'Webpatser\Countries\CountriesFacade',
],
];

View File

@ -4,5 +4,6 @@ return [
'web_url' => 'https://www.invoiceninja.com',
'app_url' => 'https://app-v5.invoiceninja.com',
'site_url' => '',
];

View File

@ -14,13 +14,18 @@ return [
|
*/
'analytics' => [
'tracking_id' => env('TRACKING_ID'),
],
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
],
'ses' => [
'key' => env('SES_KEY'),
'key' => env('SES_KEY'),
'secret' => env('SES_SECRET'),
'region' => env('SES_REGION', 'us-east-1'),
],
@ -30,9 +35,9 @@ return [
],
'stripe' => [
'model' => App\User::class,
'key' => env('STRIPE_KEY'),
'model' => App\Models\User::class,
'key' => env('STRIPE_KEY'),
'secret' => env('STRIPE_SECRET'),
],
];
];

View File

@ -13,6 +13,7 @@ class CreateUsersTable extends Migration
*/
public function up()
{
require_once app_path() . '/Constants.php';
Schema::create('countries', function ($table) {
$table->increments('id');
@ -29,6 +30,10 @@ class CreateUsersTable extends Migration
$table->string('region_code', 3)->default('');
$table->string('sub_region_code', 3)->default('');
$table->boolean('eea')->default(0);
$table->boolean('swap_postal_code')->default(0);
$table->boolean('swap_currency_symbol')->default(false);
$table->string('thousand_separator')->nullable();
$table->string('decimal_separator')->nullable();
});
Schema::create('payment_types', function ($table) {
@ -51,6 +56,8 @@ class CreateUsersTable extends Migration
$table->string('thousand_separator');
$table->string('decimal_separator');
$table->string('code');
$table->boolean('swap_currency_symbol')->default(false);
});
Schema::create('sizes', function ($table) {
@ -409,6 +416,8 @@ class CreateUsersTable extends Migration
$table->unsignedInteger('sort_order')->default(10000);
$table->boolean('recommended')->default(0);
$table->string('site_url', 200)->nullable();
$table->boolean('is_offsite');
$table->boolean('is_secure');
});
DB::table('gateways')->update(['payment_library_id' => 1]);
@ -470,6 +479,49 @@ class CreateUsersTable extends Migration
});
Schema::create('banks', function ($table) {
$table->increments('id');
$table->string('name');
$table->string('remote_id');
$table->integer('bank_library_id')->default(BANK_LIBRARY_OFX);
$table->text('config');
});
Schema::create('bank_accounts', function ($table) {
$table->increments('id');
$table->unsignedInteger('account_id');
$table->unsignedInteger('bank_id');
$table->unsignedInteger('user_id');
$table->string('username');
$table->timestamps();
$table->softDeletes();
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('bank_id')->references('id')->on('banks');
});
Schema::create('bank_subaccounts', function ($table) {
$table->increments('id');
$table->unsignedInteger('account_id');
$table->unsignedInteger('user_id');
$table->unsignedInteger('bank_account_id');
$table->string('account_name');
$table->string('account_number');
$table->timestamps();
$table->softDeletes();
$table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('bank_account_id')->references('id')->on('bank_accounts')->onDelete('cascade');
});
}
/**
@ -480,6 +532,9 @@ class CreateUsersTable extends Migration
public function down()
{
Schema::dropIfExists('bank_subaccounts');
Schema::dropIfExists('bank_accounts');
Schema::dropIfExists('banks');
Schema::dropIfExists('payment_libraries');
Schema::dropIfExists('languages');
Schema::dropIfExists('payments');

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,144 @@
<?php
use App\Models\Timezone;
use Illuminate\Database\Seeder;
class ConstantsSeeder extends Seeder
{
public function run()
{
\App\Models\PaymentLibrary::create(['name' => 'Omnipay']);
/*
d, dd: Numeric date, no leading zero and leading zero, respectively. Eg, 5, 05.
D, DD: Abbreviated and full weekday names, respectively. Eg, Mon, Monday.
m, mm: Numeric month, no leading zero and leading zero, respectively. Eg, 7, 07.
M, MM: Abbreviated and full month names, respectively. Eg, Jan, January
yy, yyyy: 2- and 4-digit years, respectively. Eg, 12, 2012.)
*/
$timezones[] = ['name'=>'Pacific/Midway', 'location', 'location' => '(GMT-11:00) Midway Island', 'utc_offset' => -39600];
$timezones[] = ['name'=>'US/Samoa', 'location' => '(GMT-11:00) Samoa', 'utc_offset' => -39600];
$timezones[] = ['name'=>'US/Hawaii', 'location' => '(GMT-10:00) Hawaii', 'utc_offset' => -36000];
$timezones[] = ['name'=>'US/Alaska', 'location' => '(GMT-09:00) Alaska', 'utc_offset' => -32400];
$timezones[] = ['name'=>'US/Pacific', 'location' => '(GMT-08:00) Pacific Time (US &amp; Canada)', 'utc_offset' => -28800];
$timezones[] = ['name'=>'America/Tijuana', 'location' => '(GMT-08:00) Tijuana', 'utc_offset' => -28800];
$timezones[] = ['name'=>'US/Arizona', 'location' => '(GMT-07:00) Arizona', 'utc_offset' => -25200];
$timezones[] = ['name'=>'US/Mountain', 'location' => '(GMT-07:00) Mountain Time (US &amp; Canada)', 'utc_offset' => -25200];
$timezones[] = ['name'=>'America/Chihuahua', 'location' => '(GMT-07:00) Chihuahua', 'utc_offset' => -25200];
$timezones[] = ['name'=>'America/Mazatlan', 'location' => '(GMT-07:00) Mazatlan', 'utc_offset' => -25200];
$timezones[] = ['name'=>'America/Mexico_City', 'location' => '(GMT-06:00) Mexico City', 'utc_offset' => -21600];
$timezones[] = ['name'=>'America/Monterrey', 'location' => '(GMT-06:00) Monterrey', 'utc_offset' => -21600];
$timezones[] = ['name'=>'Canada/Saskatchewan', 'location' => '(GMT-06:00) Saskatchewan', 'utc_offset' => -21600];
$timezones[] = ['name'=>'US/Central', 'location' => '(GMT-06:00) Central Time (US &amp; Canada)', 'utc_offset' => -21600];
$timezones[] = ['name'=>'US/Eastern', 'location' => '(GMT-05:00) Eastern Time (US &amp; Canada)', 'utc_offset' => -18000];
$timezones[] = ['name'=>'US/East-Indiana', 'location' => '(GMT-05:00) Indiana (East)', 'utc_offset' => -18000];
$timezones[] = ['name'=>'America/Bogota', 'location' => '(GMT-05:00) Bogota', 'utc_offset' => -18000];
$timezones[] = ['name'=>'America/Lima', 'location' => '(GMT-05:00) Lima', 'utc_offset' => -18000];
$timezones[] = ['name'=>'America/Caracas', 'location' => '(GMT-04:00) Caracas', 'utc_offset' => -14400];
$timezones[] = ['name'=>'Canada/Atlantic', 'location' => '(GMT-04:00) Atlantic Time (Canada)', 'utc_offset' => -14400];
$timezones[] = ['name'=>'America/La_Paz', 'location' => '(GMT-04:00) La Paz', 'utc_offset' => -14400];
$timezones[] = ['name'=>'America/Santiago', 'location' => '(GMT-04:00) Santiago', 'utc_offset' => -14400];
$timezones[] = ['name'=>'Canada/Newfoundland', 'location' => '(GMT-03:30) Newfoundland', 'utc_offset' => -12600];
$timezones[] = ['name'=>'America/Buenos_Aires', 'location' => '(GMT-03:00) Buenos Aires', 'utc_offset' => -10800];
$timezones[] = ['name'=>'America/Godthab', 'location' => '(GMT-03:00) Greenland', 'utc_offset' => -10800];
$timezones[] = ['name'=>'Atlantic/Stanley', 'location' => '(GMT-02:00) Stanley', 'utc_offset' => -7200];
$timezones[] = ['name'=>'Atlantic/Azores', 'location' => '(GMT-01:00) Azores', 'utc_offset' => -3600];
$timezones[] = ['name'=>'Atlantic/Cape_Verde', 'location' => '(GMT-01:00) Cape Verde Is.', 'utc_offset' => -3600];
$timezones[] = ['name'=>'Africa/Casablanca', 'location' => '(GMT) Casablanca', 'utc_offset' => 0];
$timezones[] = ['name'=>'Europe/Dublin', 'location' => '(GMT) Dublin', 'utc_offset' => 0];
$timezones[] = ['name'=>'Europe/Lisbon', 'location' => '(GMT) Lisbon', 'utc_offset' => 0];
$timezones[] = ['name'=>'Europe/London', 'location' => '(GMT) London', 'utc_offset' => 0];
$timezones[] = ['name'=>'Africa/Monrovia', 'location' => '(GMT) Monrovia', 'utc_offset' => 0];
$timezones[] = ['name'=>'Europe/Amsterdam', 'location' => '(GMT+01:00) Amsterdam', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Belgrade', 'location' => '(GMT+01:00) Belgrade', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Berlin', 'location' => '(GMT+01:00) Berlin', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Bratislava', 'location' => '(GMT+01:00) Bratislava', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Brussels', 'location' => '(GMT+01:00) Brussels', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Budapest', 'location' => '(GMT+01:00) Budapest', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Copenhagen', 'location' => '(GMT+01:00) Copenhagen', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Ljubljana', 'location' => '(GMT+01:00) Ljubljana', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Madrid', 'location' => '(GMT+01:00) Madrid', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Paris', 'location' => '(GMT+01:00) Paris', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Prague', 'location' => '(GMT+01:00) Prague', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Rome', 'location' => '(GMT+01:00) Rome', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Sarajevo', 'location' => '(GMT+01:00) Sarajevo', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Skopje', 'location' => '(GMT+01:00) Skopje', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Stockholm', 'location' => '(GMT+01:00) Stockholm', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Vienna', 'location' => '(GMT+01:00) Vienna', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Warsaw', 'location' => '(GMT+01:00) Warsaw', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Zagreb', 'location' => '(GMT+01:00) Zagreb', 'utc_offset' => 3600];
$timezones[] = ['name'=>'Europe/Athens', 'location' => '(GMT+02:00) Athens', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Bucharest', 'location' => '(GMT+02:00) Bucharest', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Africa/Cairo', 'location' => '(GMT+02:00) Cairo', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Africa/Harare', 'location' => '(GMT+02:00) Harare', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Helsinki', 'location' => '(GMT+02:00) Helsinki', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Istanbul', 'location' => '(GMT+02:00) Istanbul', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Asia/Jerusalem', 'location' => '(GMT+02:00) Jerusalem', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Kiev', 'location' => '(GMT+02:00) Kyiv', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Minsk', 'location' => '(GMT+02:00) Minsk', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Riga', 'location' => '(GMT+02:00) Riga', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Sofia', 'location' => '(GMT+02:00) Sofia', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Tallinn', 'location' => '(GMT+02:00) Tallinn', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Europe/Vilnius', 'location' => '(GMT+02:00) Vilnius', 'utc_offset' => 7200];
$timezones[] = ['name'=>'Asia/Baghdad', 'location' => '(GMT+03:00) Baghdad', 'utc_offset' => 10800];
$timezones[] = ['name'=>'Asia/Kuwait', 'location' => '(GMT+03:00) Kuwait', 'utc_offset' => 10800];
$timezones[] = ['name'=>'Africa/Nairobi', 'location' => '(GMT+03:00) Nairobi', 'utc_offset' => 10800];
$timezones[] = ['name'=>'Asia/Riyadh', 'location' => '(GMT+03:00) Riyadh', 'utc_offset' => 10800];
$timezones[] = ['name'=>'Asia/Tehran', 'location' => '(GMT+03:30) Tehran', 'utc_offset' => 12600];
$timezones[] = ['name'=>'Europe/Moscow', 'location' => '(GMT+04:00) Moscow', 'utc_offset' => 14400];
$timezones[] = ['name'=>'Asia/Baku', 'location' => '(GMT+04:00) Baku', 'utc_offset' => 14400];
$timezones[] = ['name'=>'Europe/Volgograd', 'location' => '(GMT+04:00) Volgograd', 'utc_offset' => 14400];
$timezones[] = ['name'=>'Asia/Muscat', 'location' => '(GMT+04:00) Muscat', 'utc_offset' => 14400];
$timezones[] = ['name'=>'Asia/Tbilisi', 'location' => '(GMT+04:00) Tbilisi', 'utc_offset' => 14400];
$timezones[] = ['name'=>'Asia/Yerevan', 'location' => '(GMT+04:00) Yerevan', 'utc_offset' => 14400];
$timezones[] = ['name'=>'Asia/Kabul', 'location' => '(GMT+04:30) Kabul', 'utc_offset' => 16200];
$timezones[] = ['name'=>'Asia/Karachi', 'location' => '(GMT+05:00) Karachi', 'utc_offset' => 18000];
$timezones[] = ['name'=>'Asia/Tashkent', 'location' => '(GMT+05:00) Tashkent', 'utc_offset' => 18000];
$timezones[] = ['name'=>'Asia/Kolkata', 'location' => '(GMT+05:30) Kolkata', 'utc_offset' => 19800];
$timezones[] = ['name'=>'Asia/Kathmandu', 'location' => '(GMT+05:45) Kathmandu', 'utc_offset' => 20700];
$timezones[] = ['name'=>'Asia/Yekaterinburg', 'location' => '(GMT+06:00) Ekaterinburg', 'utc_offset' => 21600];
$timezones[] = ['name'=>'Asia/Almaty', 'location' => '(GMT+06:00) Almaty', 'utc_offset' => 21600];
$timezones[] = ['name'=>'Asia/Dhaka', 'location' => '(GMT+06:00) Dhaka', 'utc_offset' => 21600];
$timezones[] = ['name'=>'Asia/Novosibirsk', 'location' => '(GMT+07:00) Novosibirsk', 'utc_offset' => 25200];
$timezones[] = ['name'=>'Asia/Bangkok', 'location' => '(GMT+07:00) Bangkok', 'utc_offset' => 25200];
$timezones[] = ['name'=>'Asia/Ho_Chi_Minh', 'location' => '(GMT+07.00) Ho Chi Minh', 'utc_offset' => 25200];
$timezones[] = ['name'=>'Asia/Jakarta', 'location' => '(GMT+07:00) Jakarta', 'utc_offset' => 25200];
$timezones[] = ['name'=>'Asia/Krasnoyarsk', 'location' => '(GMT+08:00) Krasnoyarsk', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Asia/Chongqing', 'location' => '(GMT+08:00) Chongqing', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Asia/Hong_Kong', 'location' => '(GMT+08:00) Hong Kong', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Asia/Kuala_Lumpur', 'location' => '(GMT+08:00) Kuala Lumpur', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Australia/Perth', 'location' => '(GMT+08:00) Perth', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Asia/Singapore', 'location' => '(GMT+08:00) Singapore', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Asia/Taipei', 'location' => '(GMT+08:00) Taipei', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Asia/Ulaanbaatar', 'location' => '(GMT+08:00) Ulaan Bataar', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Asia/Urumqi', 'location' => '(GMT+08:00) Urumqi', 'utc_offset' => 28800];
$timezones[] = ['name'=>'Asia/Irkutsk', 'location' => '(GMT+09:00) Irkutsk', 'utc_offset' => 32400];
$timezones[] = ['name'=>'Asia/Seoul', 'location' => '(GMT+09:00) Seoul', 'utc_offset' => 32400];
$timezones[] = ['name'=>'Asia/Tokyo', 'location' => '(GMT+09:00) Tokyo', 'utc_offset' => 32400];
$timezones[] = ['name'=>'Australia/Adelaide', 'location' => '(GMT+09:30) Adelaide', 'utc_offset' => 34200];
$timezones[] = ['name'=>'Australia/Darwin', 'location' => '(GMT+09:30) Darwin', 'utc_offset' => 34200];
$timezones[] = ['name'=>'Asia/Yakutsk', 'location' => '(GMT+10:00) Yakutsk', 'utc_offset' => 36000];
$timezones[] = ['name'=>'Australia/Brisbane', 'location' => '(GMT+10:00) Brisbane', 'utc_offset' => 36000];
$timezones[] = ['name'=>'Australia/Canberra', 'location' => '(GMT+10:00) Canberra', 'utc_offset' => 36000];
$timezones[] = ['name'=>'Pacific/Guam', 'location' => '(GMT+10:00) Guam', 'utc_offset' => 36000];
$timezones[] = ['name'=>'Australia/Hobart', 'location' => '(GMT+10:00) Hobart', 'utc_offset' => 36000];
$timezones[] = ['name'=>'Australia/Melbourne', 'location' => '(GMT+10:00) Melbourne', 'utc_offset' => 36000];
$timezones[] = ['name'=>'Pacific/Port_Moresby', 'location' => '(GMT+10:00) Port Moresby', 'utc_offset' => 36000];
$timezones[] = ['name'=>'Australia/Sydney', 'location' => '(GMT+10:00) Sydney', 'utc_offset' => 36000];
$timezones[] = ['name'=>'Asia/Vladivostok', 'location' => '(GMT+11:00) Vladivostok', 'utc_offset' => 39600];
$timezones[] = ['name'=>'Asia/Magadan', 'location' => '(GMT+12:00) Magadan', 'utc_offset' => 43200];
$timezones[] = ['name'=>'Pacific/Auckland', 'location' => '(GMT+12:00) Auckland', 'utc_offset' => 43200];
$timezones[] = ['name'=>'Pacific/Fiji', 'location' => '(GMT+12:00) Fiji', 'utc_offset' => 43200];
foreach ($timezones as $timezone) {
Timezone::create([
'name' => $timezone['name'],
'location' => $timezone['location'],
'utc_offset' => $timezone['utc_offset'],
]);
}
}
}

View File

@ -0,0 +1,193 @@
<?php
use App\Models\Country;
use Illuminate\Database\Seeder;
class CountriesSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Eloquent::unguard();
$countries = Countries::getList();
foreach ($countries as $countryId => $country) {
if ($record = Country::whereCountryCode($country['country-code'])->first()) {
$record->name = $country['name'];
$record->full_name = ((isset($country['full_name'])) ? $country['full_name'] : null);
$record->save();
} else {
\Illuminate\Support\Facades\DB::table('countries')->insert([
'id' => $countryId,
'capital' => ((isset($country['capital'])) ? $country['capital'] : null),
'citizenship' => ((isset($country['citizenship'])) ? $country['citizenship'] : null),
'country_code' => $country['country-code'],
'currency' => ((isset($country['currency'])) ? $country['currency'] : null),
'currency_code' => ((isset($country['currency_code'])) ? $country['currency_code'] : null),
'currency_sub_unit' => ((isset($country['currency_sub_unit'])) ? $country['currency_sub_unit'] : null),
'full_name' => ((isset($country['full_name'])) ? $country['full_name'] : null),
'iso_3166_2' => $country['iso_3166_2'],
'iso_3166_3' => $country['iso_3166_3'],
'name' => $country['name'],
'region_code' => $country['region-code'],
'sub_region_code' => $country['sub-region-code'],
'eea' => (bool) $country['eea'],
]);
}
}
// Source: http://www.bitboost.com/ref/international-address-formats.html
// Source: https://en.wikipedia.org/wiki/Linguistic_issues_concerning_the_euro
$countries = [
'AR' => [
'swap_postal_code' => true,
],
'AT' => [ // Austria
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'BE' => [
'swap_postal_code' => true,
],
'BG' => [ // Belgium
'swap_currency_symbol' => true,
],
'CA' => [
'thousand_separator' => ',',
'decimal_separator' => '.',
],
'CH' => [
'swap_postal_code' => true,
],
'CZ' => [ // Czech Republic
'swap_currency_symbol' => true,
],
'DE' => [ // Germany
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'DK' => [
'swap_postal_code' => true,
],
'EE' => [ // Estonia
'swap_currency_symbol' => true,
'thousand_separator' => ' ',
],
'ES' => [ // Spain
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'FI' => [ // Finland
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'FR' => [ // France
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'GR' => [ // Greece
'swap_currency_symbol' => true,
],
'HR' => [ // Croatia
'swap_currency_symbol' => true,
],
'HU' => [ // Hungary
'swap_currency_symbol' => true,
],
'GL' => [
'swap_postal_code' => true,
],
'IE' => [ // Ireland
'thousand_separator' => ',',
'decimal_separator' => '.',
],
'IL' => [
'swap_postal_code' => true,
],
'IS' => [ // Iceland
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'IT' => [ // Italy
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'JP' => [ // Japan
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'LT' => [ // Lithuania
'swap_currency_symbol' => true,
],
'LU' => [
'swap_postal_code' => true,
],
'MT' => [
'thousand_separator' => ',',
'decimal_separator' => '.',
],
'MY' => [
'swap_postal_code' => true,
],
'MX' => [
'swap_postal_code' => true,
],
'NL' => [
'swap_postal_code' => true,
],
'PL' => [ // Poland
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'PT' => [ // Portugal
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'RO' => [ // Romania
'swap_currency_symbol' => true,
],
'SE' => [ // Sweden
'swap_postal_code' => true,
'swap_currency_symbol' => true,
],
'SI' => [ // Slovenia
'swap_currency_symbol' => true,
],
'SK' => [ // Slovakia
'swap_currency_symbol' => true,
],
'US' => [
'thousand_separator' => ',',
'decimal_separator' => '.',
],
'SR' => [ // Suriname
'swap_currency_symbol' => true,
],
'UY' => [
'swap_postal_code' => true,
],
];
foreach ($countries as $code => $data) {
$country = Country::where('iso_3166_2', '=', $code)->first();
if (isset($data['swap_postal_code'])) {
$country->swap_postal_code = true;
}
if (isset($data['swap_currency_symbol'])) {
$country->swap_currency_symbol = true;
}
if (isset($data['thousand_separator'])) {
$country->thousand_separator = $data['thousand_separator'];
}
if (isset($data['decimal_separator'])) {
$country->decimal_separator = $data['decimal_separator'];
}
$country->save();
}
}
}

View File

@ -0,0 +1,112 @@
<?php
use App\Models\Currency;
use Illuminate\Database\Seeder;
class CurrenciesSeeder extends Seeder
{
public function run()
{
Eloquent::unguard();
// http://www.localeplanet.com/icu/currency.html
$currencies = [
['name' => 'US Dollar', 'code' => 'USD', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'British Pound', 'code' => 'GBP', 'symbol' => '£', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Euro', 'code' => 'EUR', 'symbol' => '€', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'South African Rand', 'code' => 'ZAR', 'symbol' => 'R', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Danish Krone', 'code' => 'DKK', 'symbol' => 'kr', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ',', 'swap_currency_symbol' => true],
['name' => 'Israeli Shekel', 'code' => 'ILS', 'symbol' => 'NIS ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Swedish Krona', 'code' => 'SEK', 'symbol' => 'kr', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ',', 'swap_currency_symbol' => true],
['name' => 'Kenyan Shilling', 'code' => 'KES', 'symbol' => 'KSh ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Canadian Dollar', 'code' => 'CAD', 'symbol' => 'C$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Philippine Peso', 'code' => 'PHP', 'symbol' => 'P ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Indian Rupee', 'code' => 'INR', 'symbol' => 'Rs. ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Australian Dollar', 'code' => 'AUD', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Singapore Dollar', 'code' => 'SGD', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Norske Kroner', 'code' => 'NOK', 'symbol' => 'kr', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ',', 'swap_currency_symbol' => true],
['name' => 'New Zealand Dollar', 'code' => 'NZD', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Vietnamese Dong', 'code' => 'VND', 'symbol' => '', 'precision' => '0', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Swiss Franc', 'code' => 'CHF', 'symbol' => '', 'precision' => '2', 'thousand_separator' => '\'', 'decimal_separator' => '.'],
['name' => 'Guatemalan Quetzal', 'code' => 'GTQ', 'symbol' => 'Q', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Malaysian Ringgit', 'code' => 'MYR', 'symbol' => 'RM', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Brazilian Real', 'code' => 'BRL', 'symbol' => 'R$', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Thai Baht', 'code' => 'THB', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Nigerian Naira', 'code' => 'NGN', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Argentine Peso', 'code' => 'ARS', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Bangladeshi Taka', 'code' => 'BDT', 'symbol' => 'Tk', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'United Arab Emirates Dirham', 'code' => 'AED', 'symbol' => 'DH ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Hong Kong Dollar', 'code' => 'HKD', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Indonesian Rupiah', 'code' => 'IDR', 'symbol' => 'Rp', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Mexican Peso', 'code' => 'MXN', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Egyptian Pound', 'code' => 'EGP', 'symbol' => 'E£', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Colombian Peso', 'code' => 'COP', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'West African Franc', 'code' => 'XOF', 'symbol' => 'CFA ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Chinese Renminbi', 'code' => 'CNY', 'symbol' => 'RMB ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Rwandan Franc', 'code' => 'RWF', 'symbol' => 'RF ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Tanzanian Shilling', 'code' => 'TZS', 'symbol' => 'TSh ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Netherlands Antillean Guilder', 'code' => 'ANG', 'symbol' => '', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Trinidad and Tobago Dollar', 'code' => 'TTD', 'symbol' => 'TT$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'East Caribbean Dollar', 'code' => 'XCD', 'symbol' => 'EC$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Ghanaian Cedi', 'code' => 'GHS', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Bulgarian Lev', 'code' => 'BGN', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => '.'],
['name' => 'Aruban Florin', 'code' => 'AWG', 'symbol' => 'Afl. ', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => '.'],
['name' => 'Turkish Lira', 'code' => 'TRY', 'symbol' => 'TL ', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Romanian New Leu', 'code' => 'RON', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Croatian Kuna', 'code' => 'HRK', 'symbol' => 'kn', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Saudi Riyal', 'code' => 'SAR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Japanese Yen', 'code' => 'JPY', 'symbol' => '¥', 'precision' => '0', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Maldivian Rufiyaa', 'code' => 'MVR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Costa Rican Colón', 'code' => 'CRC', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Pakistani Rupee', 'code' => 'PKR', 'symbol' => 'Rs ', 'precision' => '0', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Polish Zloty', 'code' => 'PLN', 'symbol' => 'zł', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => ',', 'swap_currency_symbol' => true],
['name' => 'Sri Lankan Rupee', 'code' => 'LKR', 'symbol' => 'LKR', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.', 'swap_currency_symbol' => true],
['name' => 'Czech Koruna', 'code' => 'CZK', 'symbol' => 'Kč', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => ',', 'swap_currency_symbol' => true],
['name' => 'Uruguayan Peso', 'code' => 'UYU', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Namibian Dollar', 'code' => 'NAD', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Tunisian Dinar', 'code' => 'TND', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Russian Ruble', 'code' => 'RUB', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Mozambican Metical', 'code' => 'MZN', 'symbol' => 'MT', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ',', 'swap_currency_symbol' => true],
['name' => 'Omani Rial', 'code' => 'OMR', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Ukrainian Hryvnia', 'code' => 'UAH', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Macanese Pataca', 'code' => 'MOP', 'symbol' => 'MOP$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Taiwan New Dollar', 'code' => 'TWD', 'symbol' => 'NT$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Dominican Peso', 'code' => 'DOP', 'symbol' => 'RD$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Chilean Peso', 'code' => 'CLP', 'symbol' => '$', 'precision' => '0', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Icelandic Króna', 'code' => 'ISK', 'symbol' => 'kr', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ',', 'swap_currency_symbol' => true],
['name' => 'Papua New Guinean Kina', 'code' => 'PGK', 'symbol' => 'K', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Jordanian Dinar', 'code' => 'JOD', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Myanmar Kyat', 'code' => 'MMK', 'symbol' => 'K', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Peruvian Sol', 'code' => 'PEN', 'symbol' => 'S/ ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Botswana Pula', 'code' => 'BWP', 'symbol' => 'P', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Hungarian Forint', 'code' => 'HUF', 'symbol' => 'Ft', 'precision' => '0', 'thousand_separator' => '.', 'decimal_separator' => ',', 'swap_currency_symbol' => true],
['name' => 'Ugandan Shilling', 'code' => 'UGX', 'symbol' => 'USh ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Barbadian Dollar', 'code' => 'BBD', 'symbol' => '$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Brunei Dollar', 'code' => 'BND', 'symbol' => 'B$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Georgian Lari', 'code' => 'GEL', 'symbol' => '', 'precision' => '2', 'thousand_separator' => ' ', 'decimal_separator' => ','],
['name' => 'Qatari Riyal', 'code' => 'QAR', 'symbol' => 'QR', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Honduran Lempira', 'code' => 'HNL', 'symbol' => 'L', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Surinamese Dollar', 'code' => 'SRD', 'symbol' => 'SRD', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'Bahraini Dinar', 'code' => 'BHD', 'symbol' => 'BD ', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['name' => 'Venezuelan Bolivars', 'code' => 'VES', 'symbol' => 'Bs.', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
['name' => 'South Korean Won', 'code' => 'KRW', 'symbol' => 'W ', 'precision' => '2', 'thousand_separator' => '.', 'decimal_separator' => ','],
];
foreach ($currencies as $currency) {
$record = Currency::whereCode($currency['code'])->first();
if ($record) {
$record->name = $currency['name'];
$record->symbol = $currency['symbol'];
$record->precision = $currency['precision'];
$record->thousand_separator = $currency['thousand_separator'];
$record->decimal_separator = $currency['decimal_separator'];
if (isset($currency['swap_currency_symbol'])) {
$record->swap_currency_symbol = $currency['swap_currency_symbol'];
}
$record->save();
} else {
Currency::create($currency);
}
}
}
}

View File

@ -1,16 +1,32 @@
<?php
use App\Models\Timezone;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
* Run the database seeds.
*
* @return void
*/
public function run()
{
// $this->call(UsersTableSeeder::class);
$this->command->info('Running DatabaseSeeder');
if (Timezone::count()) {
$this->command->info('Skipping: already run');
return;
}
Eloquent::unguard();
$this->call('ConstantsSeeder');
$this->call('PaymentLibrariesSeeder');
$this->call('BanksSeeder');
$this->call('CurrenciesSeeder');
$this->call('LanguageSeeder');
$this->call('CountriesSeeder');
}
}

View File

@ -0,0 +1,58 @@
<?php
use App\Models\Language;
use Illuminate\Database\Seeder;
class LanguageSeeder extends Seeder
{
public function run()
{
Eloquent::unguard();
// https://github.com/caouecs/Laravel-lang
// https://www.loc.gov/standards/iso639-2/php/code_list.php
$languages = [
['name' => 'English', 'locale' => 'en'],
['name' => 'Italian', 'locale' => 'it'],
['name' => 'German', 'locale' => 'de'],
['name' => 'French', 'locale' => 'fr'],
['name' => 'Portuguese - Brazilian', 'locale' => 'pt_BR'],
['name' => 'Dutch', 'locale' => 'nl'],
['name' => 'Spanish', 'locale' => 'es'],
['name' => 'Norwegian', 'locale' => 'nb_NO'],
['name' => 'Danish', 'locale' => 'da'],
['name' => 'Japanese', 'locale' => 'ja'],
['name' => 'Swedish', 'locale' => 'sv'],
['name' => 'Spanish - Spain', 'locale' => 'es_ES'],
['name' => 'French - Canada', 'locale' => 'fr_CA'],
['name' => 'Lithuanian', 'locale' => 'lt'],
['name' => 'Polish', 'locale' => 'pl'],
['name' => 'Czech', 'locale' => 'cs'],
['name' => 'Croatian', 'locale' => 'hr'],
['name' => 'Albanian', 'locale' => 'sq'],
['name' => 'Greek', 'locale' => 'el'],
['name' => 'English - United Kingdom', 'locale' => 'en_GB'],
['name' => 'Portuguese - Portugal', 'locale' => 'pt_PT'],
['name' => 'Slovenian', 'locale' => 'sl'],
['name' => 'Finnish', 'locale' => 'fi'],
['name' => 'Romanian', 'locale' => 'ro'],
['name' => 'Turkish - Turkey', 'locale' => 'tr_TR'],
['name' => 'Thai', 'locale' => 'th'],
['name' => 'Macedonian', 'locale' => 'mk_MK'],
['name' => 'Chinese - Taiwan', 'locale' => 'zh_TW'],
];
foreach ($languages as $language) {
$record = Language::whereLocale($language['locale'])->first();
if ($record) {
$record->name = $language['name'];
$record->save();
} else {
Language::create($language);
}
}
Eloquent::reguard();
}
}

View File

@ -0,0 +1,84 @@
<?php
use App\Models\Gateway;
use Illuminate\Database\Seeder;
class PaymentLibrariesSeeder extends Seeder
{
public function run()
{
Eloquent::unguard();
$gateways = [
['name' => 'Authorize.Net AIM', 'provider' => 'AuthorizeNet_AIM', 'sort_order' => 5],
['name' => 'CardSave', 'provider' => 'CardSave'],
['name' => 'Eway Rapid', 'provider' => 'Eway_RapidShared', 'is_offsite' => true],
['name' => 'FirstData Connect', 'provider' => 'FirstData_Connect'],
['name' => 'Migs ThreeParty', 'provider' => 'Migs_ThreeParty'],
['name' => 'Migs TwoParty', 'provider' => 'Migs_TwoParty'],
['name' => 'Mollie', 'provider' => 'Mollie', 'is_offsite' => true, 'sort_order' => 8],
['name' => 'MultiSafepay', 'provider' => 'MultiSafepay'],
['name' => 'Netaxept', 'provider' => 'Netaxept'],
['name' => 'NetBanx', 'provider' => 'NetBanx'],
['name' => 'PayFast', 'provider' => 'PayFast', 'is_offsite' => true],
['name' => 'Payflow Pro', 'provider' => 'Payflow_Pro'],
['name' => 'PaymentExpress PxPay', 'provider' => 'PaymentExpress_PxPay'],
['name' => 'PaymentExpress PxPost', 'provider' => 'PaymentExpress_PxPost'],
['name' => 'PayPal Express', 'provider' => 'PayPal_Express', 'is_offsite' => true, 'sort_order' => 4],
['name' => 'PayPal Pro', 'provider' => 'PayPal_Pro'],
['name' => 'Pin', 'provider' => 'Pin'],
['name' => 'SagePay Direct', 'provider' => 'SagePay_Direct'],
['name' => 'SecurePay DirectPost', 'provider' => 'SecurePay_DirectPost'],
['name' => 'Stripe', 'provider' => 'Stripe', 'sort_order' => 1],
['name' => 'TargetPay Direct eBanking', 'provider' => 'TargetPay_Directebanking'],
['name' => 'TargetPay Ideal', 'provider' => 'TargetPay_Ideal'],
['name' => 'TargetPay Mr Cash', 'provider' => 'TargetPay_Mrcash'],
['name' => 'TwoCheckout', 'provider' => 'TwoCheckout', 'is_offsite' => true],
['name' => 'WorldPay', 'provider' => 'WorldPay'],
['name' => 'moolah', 'provider' => 'AuthorizeNet_AIM'],
['name' => 'Alipay', 'provider' => 'Alipay_Express'],
['name' => 'Buckaroo', 'provider' => 'Buckaroo_CreditCard'],
['name' => 'Coinbase', 'provider' => 'Coinbase', 'is_offsite' => true],
['name' => 'DataCash', 'provider' => 'DataCash'],
['name' => 'Pacnet', 'provider' => 'Pacnet'],
['name' => 'Realex', 'provider' => 'Realex_Remote'],
['name' => 'Sisow', 'provider' => 'Sisow'],
['name' => 'Skrill', 'provider' => 'Skrill', 'is_offsite' => true],
['name' => 'BitPay', 'provider' => 'BitPay', 'is_offsite' => true, 'sort_order' => 7],
['name' => 'AGMS', 'provider' => 'Agms'],
['name' => 'Barclays', 'provider' => 'BarclaysEpdq\Essential'],
['name' => 'Cardgate', 'provider' => 'Cardgate'],
['name' => 'Checkout.com', 'provider' => 'CheckoutCom'],
['name' => 'Creditcall', 'provider' => 'Creditcall'],
['name' => 'Cybersource', 'provider' => 'Cybersource'],
['name' => 'ecoPayz', 'provider' => 'Ecopayz'],
['name' => 'Fasapay', 'provider' => 'Fasapay'],
['name' => 'Komoju', 'provider' => 'Komoju'],
['name' => 'Paysafecard', 'provider' => 'Paysafecard'],
['name' => 'Paytrace', 'provider' => 'Paytrace_CreditCard'],
['name' => 'Secure Trading', 'provider' => 'SecureTrading'],
['name' => 'SecPay', 'provider' => 'SecPay'],
['name' => 'WePay', 'provider' => 'WePay', 'is_offsite' => false, 'sort_order' => 3],
['name' => 'Braintree', 'provider' => 'Braintree', 'sort_order' => 3],
['name' => 'Custom', 'provider' => 'Custom1', 'is_offsite' => true, 'sort_order' => 20],
['name' => 'FirstData Payeezy', 'provider' => 'FirstData_Payeezy'],
['name' => 'GoCardless', 'provider' => 'GoCardlessV2\Redirect', 'sort_order' => 9, 'is_offsite' => true],
['name' => 'PagSeguro', 'provider' => 'PagSeguro'],
['name' => 'PAYMILL', 'provider' => 'Paymill'],
['name' => 'Custom', 'provider' => 'Custom2', 'is_offsite' => true, 'sort_order' => 21],
['name' => 'Custom', 'provider' => 'Custom3', 'is_offsite' => true, 'sort_order' => 22],
];
foreach ($gateways as $gateway) {
$record = Gateway::whereName($gateway['name'])
->whereProvider($gateway['provider'])
->first();
if ($record) {
$record->fill($gateway);
$record->save();
} else {
Gateway::create($gateway);
}
}
}
}

View File

@ -33,7 +33,6 @@ class UsersTableSeeder extends Seeder
'first_name' => $faker->firstName,
'last_name' => $faker->lastName,
'email' => TEST_USERNAME,
'account_id' => $account->id,
'password' => Hash::make(TEST_PASSWORD),
'registered' => true,
'confirmed' => true,

View File

@ -10,13 +10,23 @@
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"@coreui/coreui": "^2.0.12",
"@coreui/coreui-plugin-chartjs-custom-tooltips": "1.2.0",
"@coreui/icons": "^0.3.0",
"axios": "^0.18",
"bootstrap": "^4.0.0",
"chart.js": "^2.7.2",
"cross-env": "^5.1",
"flag-icon-css": "3.2.0",
"font-awesome": "^4.7",
"jquery": "^3.2",
"laravel-mix": "^2.0",
"lodash": "^4.17.5",
"pace-progress": "1.0.2",
"perfect-scrollbar": "1.4.0",
"popper.js": "^1.12",
"simple-line-icons": "2.4.1",
"vue": "^2.5.7"
}
},
"dependencies": {}
}

4
public/css/app.css vendored

File diff suppressed because one or more lines are too long

21
public/css/ninja.css vendored Normal file

File diff suppressed because one or more lines are too long

BIN
public/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

2
public/js/app.js vendored

File diff suppressed because one or more lines are too long

13
public/js/ninja.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,71 +1,75 @@
@extends('layouts.app')
@extends('layouts.master')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Login') }}</div>
@section('body')
<body class="app flex-row align-items-center">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card-group">
<div class="card p-4">
<div class="card-body">
<form method="POST" action="{{ route('login') }}">
@csrf
<h1>@lang('texts.account_login')</h1>
<p class="text-muted"></p>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">
<i class="icon-user"></i>
</span>
</div>
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" placeholder="@lang('texts.email')" required autofocus>
<div class="card-body">
<form method="POST" action="{{ route('login') }}">
@csrf
<div class="form-group row">
<label for="email" class="col-sm-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required autofocus>
@if ($errors->has('email'))
<span class="invalid-feedback" role="alert">
@if ($errors->has('email'))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
@endif
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
</div>
<div class="input-group mb-4">
<div class="input-group-prepend">
<span class="input-group-text">
<i class="icon-lock"></i>
</span>
</div>
<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" placeholder="@lang('texts.password')" required>
<div class="col-md-6">
<input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" required>
@if ($errors->has('password'))
<span class="invalid-feedback" role="alert">
@if ($errors->has('password'))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group row">
<div class="col-md-6 offset-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
<label class="form-check-label" for="remember">
{{ __('Remember Me') }}
</label>
@endif
</div>
<div class="row">
<div class="col-6">
<button class="btn btn-primary px-4" type="submit">@lang('texts.login')</button>
</div>
<div class="col-6 text-right">
<a class="btn btn-link" href="{{ route('password.request') }}">
@lang('texts.forgot_password')
</a>
</div>
</div>
</form>
</div>
</div>
<div class="card text-white bg-primary py-5 d-md-down-none" style="width:44%">
<div class="card-body text-center">
<div>
<h2>@lang('texts.sign_up_now')</h2>
<p>@lang('texts.not_a_member_yet')</p>
<a class="btn btn-primary active mt-3" href="{{route('signup') }}">@lang('texts.login_create_an_account')</a>
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Login') }}
</button>
<a class="btn btn-link" href="{{ route('password.request') }}">
{{ __('Forgot Your Password?') }}
</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
</body>
</html>

View File

@ -0,0 +1,286 @@
<aside class="aside-menu">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a class="nav-link active" data-toggle="tab" href="#timeline" role="tab">
<i class="icon-list"></i>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#messages" role="tab">
<i class="icon-speech"></i>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#settings" role="tab">
<i class="icon-settings"></i>
</a>
</li>
</ul>
<!-- Tab panes-->
<div class="tab-content">
<div class="tab-pane active" id="timeline" role="tabpanel">
<div class="list-group list-group-accent">
<div class="list-group-item list-group-item-accent-secondary bg-light text-center font-weight-bold text-muted text-uppercase small">Today</div>
<div class="list-group-item list-group-item-accent-warning list-group-item-divider">
<div class="avatar float-right">
<img class="img-avatar" src="img/avatars/7.jpg" alt="admin@bootstrapmaster.com">
</div>
<div>Meeting with
<strong>Lucas</strong>
</div>
<small class="text-muted mr-3">
<i class="icon-calendar"></i>  1 - 3pm</small>
<small class="text-muted">
<i class="icon-location-pin"></i>  Palo Alto, CA</small>
</div>
<div class="list-group-item list-group-item-accent-info">
<div class="avatar float-right">
<img class="img-avatar" src="img/avatars/4.jpg" alt="admin@bootstrapmaster.com">
</div>
<div>Skype with
<strong>Megan</strong>
</div>
<small class="text-muted mr-3">
<i class="icon-calendar"></i>  4 - 5pm</small>
<small class="text-muted">
<i class="icon-social-skype"></i>  On-line</small>
</div>
<div class="list-group-item list-group-item-accent-secondary bg-light text-center font-weight-bold text-muted text-uppercase small">Tomorrow</div>
<div class="list-group-item list-group-item-accent-danger list-group-item-divider">
<div>New UI Project -
<strong>deadline</strong>
</div>
<small class="text-muted mr-3">
<i class="icon-calendar"></i>  10 - 11pm</small>
<small class="text-muted">
<i class="icon-home"></i>  creativeLabs HQ</small>
<div class="avatars-stack mt-2">
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/2.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/3.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/4.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/5.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/6.jpg" alt="admin@bootstrapmaster.com">
</div>
</div>
</div>
<div class="list-group-item list-group-item-accent-success list-group-item-divider">
<div>
<strong>#10 Startups.Garden</strong> Meetup</div>
<small class="text-muted mr-3">
<i class="icon-calendar"></i>  1 - 3pm</small>
<small class="text-muted">
<i class="icon-location-pin"></i>  Palo Alto, CA</small>
</div>
<div class="list-group-item list-group-item-accent-primary list-group-item-divider">
<div>
<strong>Team meeting</strong>
</div>
<small class="text-muted mr-3">
<i class="icon-calendar"></i>  4 - 6pm</small>
<small class="text-muted">
<i class="icon-home"></i>  creativeLabs HQ</small>
<div class="avatars-stack mt-2">
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/2.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/3.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/4.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/5.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/6.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/7.jpg" alt="admin@bootstrapmaster.com">
</div>
<div class="avatar avatar-xs">
<img class="img-avatar" src="img/avatars/8.jpg" alt="admin@bootstrapmaster.com">
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane p-3" id="messages" role="tabpanel">
<div class="message">
<div class="py-3 pb-5 mr-3 float-left">
<div class="avatar">
<img class="img-avatar" src="img/avatars/7.jpg" alt="admin@bootstrapmaster.com">
<span class="avatar-status badge-success"></span>
</div>
</div>
<div>
<small class="text-muted">Lukasz Holeczek</small>
<small class="text-muted float-right mt-1">1:52 PM</small>
</div>
<div class="text-truncate font-weight-bold">Lorem ipsum dolor sit amet</div>
<small class="text-muted">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt...</small>
</div>
<hr>
<div class="message">
<div class="py-3 pb-5 mr-3 float-left">
<div class="avatar">
<img class="img-avatar" src="img/avatars/7.jpg" alt="admin@bootstrapmaster.com">
<span class="avatar-status badge-success"></span>
</div>
</div>
<div>
<small class="text-muted">Lukasz Holeczek</small>
<small class="text-muted float-right mt-1">1:52 PM</small>
</div>
<div class="text-truncate font-weight-bold">Lorem ipsum dolor sit amet</div>
<small class="text-muted">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt...</small>
</div>
<hr>
<div class="message">
<div class="py-3 pb-5 mr-3 float-left">
<div class="avatar">
<img class="img-avatar" src="img/avatars/7.jpg" alt="admin@bootstrapmaster.com">
<span class="avatar-status badge-success"></span>
</div>
</div>
<div>
<small class="text-muted">Lukasz Holeczek</small>
<small class="text-muted float-right mt-1">1:52 PM</small>
</div>
<div class="text-truncate font-weight-bold">Lorem ipsum dolor sit amet</div>
<small class="text-muted">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt...</small>
</div>
<hr>
<div class="message">
<div class="py-3 pb-5 mr-3 float-left">
<div class="avatar">
<img class="img-avatar" src="img/avatars/7.jpg" alt="admin@bootstrapmaster.com">
<span class="avatar-status badge-success"></span>
</div>
</div>
<div>
<small class="text-muted">Lukasz Holeczek</small>
<small class="text-muted float-right mt-1">1:52 PM</small>
</div>
<div class="text-truncate font-weight-bold">Lorem ipsum dolor sit amet</div>
<small class="text-muted">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt...</small>
</div>
<hr>
<div class="message">
<div class="py-3 pb-5 mr-3 float-left">
<div class="avatar">
<img class="img-avatar" src="img/avatars/7.jpg" alt="admin@bootstrapmaster.com">
<span class="avatar-status badge-success"></span>
</div>
</div>
<div>
<small class="text-muted">Lukasz Holeczek</small>
<small class="text-muted float-right mt-1">1:52 PM</small>
</div>
<div class="text-truncate font-weight-bold">Lorem ipsum dolor sit amet</div>
<small class="text-muted">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt...</small>
</div>
</div>
<div class="tab-pane p-3" id="settings" role="tabpanel">
<h6>Settings</h6>
<div class="aside-options">
<div class="clearfix mt-4">
<small>
<b>Option 1</b>
</small>
<label class="switch switch-label switch-pill switch-success switch-sm float-right">
<input class="switch-input" type="checkbox" checked="">
<span class="switch-slider" data-checked="On" data-unchecked="Off"></span>
</label>
</div>
<div>
<small class="text-muted">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</small>
</div>
</div>
<div class="aside-options">
<div class="clearfix mt-3">
<small>
<b>Option 2</b>
</small>
<label class="switch switch-label switch-pill switch-success switch-sm float-right">
<input class="switch-input" type="checkbox">
<span class="switch-slider" data-checked="On" data-unchecked="Off"></span>
</label>
</div>
<div>
<small class="text-muted">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</small>
</div>
</div>
<div class="aside-options">
<div class="clearfix mt-3">
<small>
<b>Option 3</b>
</small>
<label class="switch switch-label switch-pill switch-success switch-sm float-right">
<input class="switch-input" type="checkbox">
<span class="switch-slider" data-checked="On" data-unchecked="Off"></span>
</label>
</div>
</div>
<div class="aside-options">
<div class="clearfix mt-3">
<small>
<b>Option 4</b>
</small>
<label class="switch switch-label switch-pill switch-success switch-sm float-right">
<input class="switch-input" type="checkbox" checked="">
<span class="switch-slider" data-checked="On" data-unchecked="Off"></span>
</label>
</div>
</div>
<hr>
<h6>System Utilization</h6>
<div class="text-uppercase mb-1 mt-4">
<small>
<b>CPU Usage</b>
</small>
</div>
<div class="progress progress-xs">
<div class="progress-bar bg-info" role="progressbar" style="width: 25%" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<small class="text-muted">348 Processes. 1/4 Cores.</small>
<div class="text-uppercase mb-1 mt-2">
<small>
<b>Memory Usage</b>
</small>
</div>
<div class="progress progress-xs">
<div class="progress-bar bg-warning" role="progressbar" style="width: 70%" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<small class="text-muted">11444GB/16384MB</small>
<div class="text-uppercase mb-1 mt-2">
<small>
<b>SSD 1 Usage</b>
</small>
</div>
<div class="progress progress-xs">
<div class="progress-bar bg-danger" role="progressbar" style="width: 95%" aria-valuenow="95" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<small class="text-muted">243GB/256GB</small>
<div class="text-uppercase mb-1 mt-2">
<small>
<b>SSD 2 Usage</b>
</small>
</div>
<div class="progress progress-xs">
<div class="progress-bar bg-success" role="progressbar" style="width: 10%" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<small class="text-muted">25GB/256GB</small>
</div>
</div>
</aside>
</div>

View File

@ -1,3 +1,47 @@
@extends('layouts.app')
@extends('layouts.master')
@section('header')
@include('header')
@endsection
@section('sidebar')
@include('sidebar')
@endsection
@section('body')
<main class="main">
<!-- Breadcrumb-->
<ol class="breadcrumb">
<li class="breadcrumb-item">Home</li>
<li class="breadcrumb-item">
<a href="#">Admin</a>
</li>
<li class="breadcrumb-item active">Dashboard</li>
<!-- Breadcrumb Menu-->
<li class="breadcrumb-menu d-md-down-none">
<div class="btn-group" role="group" aria-label="Button group">
<a class="btn" href="#">
<i class="icon-speech"></i>
</a>
<a class="btn" href="./">
<i class="icon-graph"></i>  Dashboard</a>
<a class="btn" href="#">
<i class="icon-settings"></i>  Settings</a>
</div>
</li>
</ol>
<div class="container-fluid">
</div>
</main>
@include('dashboard.aside')
@endsection
@section('footer')
@include('footer')
@endsection
<h1>Dashboard</h1>

View File

@ -0,0 +1,12 @@
<footer class="app-footer">
<div>
<a href="https://coreui.io">CoreUI</a>
<span>&copy; 2018 creativeLabs.</span>
</div>
<div class="ml-auto">
<span>Powered by</span>
<a href="https://coreui.io">CoreUI</a>
</div>
</footer>
</body>

View File

@ -0,0 +1,95 @@
<body class="app header-fixed sidebar-fixed aside-menu-fixed sidebar-lg-show">
<header class="app-header navbar">
<button class="navbar-toggler sidebar-toggler d-lg-none mr-auto" type="button" data-toggle="sidebar-show">
<span class="navbar-toggler-icon"></span>
</button>
<a class="navbar-brand" href="#">
<img class="navbar-brand-full" src="images/logo.png" width="50" height="50" alt="Invoice Ninja Logo">
<img class="navbar-brand-minimized" src="images/logo.png" width="30" height="30" alt="Invoice Ninja Logo">
</a>
<button class="sidebar-minimizer brand-minimizer" type="button">
<span class="navbar-toggler-icon"></span>
</button>
<ul class="nav navbar-nav d-md-down-none">
<li class="nav-item px-3">
<a class="nav-link" href="#">Dashboard</a>
</li>
<li class="nav-item px-3">
<a class="nav-link" href="#">Users</a>
</li>
<li class="nav-item px-3">
<a class="nav-link" href="#">Settings</a>
</li>
</ul>
<ul class="nav navbar-nav ml-auto">
<li class="nav-item d-md-down-none">
<a class="nav-link" href="#">
<i class="fa fa-user"></i>
<span class="badge badge-pill badge-danger">5</span>
</a>
</li>
<li class="nav-item d-md-down-none">
<a class="nav-link" href="#">
<i class="icon-list"></i>
</a>
</li>
<li class="nav-item d-md-down-none">
<a class="nav-link" href="#">
<i class="icon-location-pin"></i>
</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
<img class="img-avatar" src="img/avatars/6.jpg" alt="admin@bootstrapmaster.com">
</a>
<div class="dropdown-menu dropdown-menu-right">
<div class="dropdown-header text-center">
<strong>Account</strong>
</div>
<a class="dropdown-item" href="#">
<i class="fa fa-bell-o"></i> Updates
<span class="badge badge-info">42</span>
</a>
<a class="dropdown-item" href="#">
<i class="fa fa-envelope-o"></i> Messages
<span class="badge badge-success">42</span>
</a>
<a class="dropdown-item" href="#">
<i class="fa fa-tasks"></i> Tasks
<span class="badge badge-danger">42</span>
</a>
<a class="dropdown-item" href="#">
<i class="fa fa-comments"></i> Comments
<span class="badge badge-warning">42</span>
</a>
<div class="dropdown-header text-center">
<strong>Settings</strong>
</div>
<a class="dropdown-item" href="#">
<i class="fa fa-user"></i> Profile</a>
<a class="dropdown-item" href="#">
<i class="fa fa-wrench"></i> Settings</a>
<a class="dropdown-item" href="#">
<i class="fa fa-usd"></i> Payments
<span class="badge badge-secondary">42</span>
</a>
<a class="dropdown-item" href="#">
<i class="fa fa-file"></i> Projects
<span class="badge badge-primary">42</span>
</a>
<div class="divider"></div>
<a class="dropdown-item" href="#">
<i class="fa fa-shield"></i> Lock Account</a>
<a class="dropdown-item" href="#">
<i class="fa fa-lock"></i> Logout</a>
</div>
</li>
</ul>
<button class="navbar-toggler aside-menu-toggler d-md-down-none" type="button" data-toggle="aside-menu-lg-show">
<span class="navbar-toggler-icon"></span>
</button>
<button class="navbar-toggler aside-menu-toggler d-lg-none" type="button" data-toggle="aside-menu-show">
<span class="navbar-toggler-icon"></span>
</button>
</header>
<div class="app-body">

View File

@ -1 +1,14 @@
@extends('layouts.app')
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<h1>Unprotected Route</h1>
</body>
</html>

View File

@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<!-- Source: https://github.com/invoiceninja/invoiceninja -->
<!-- Error: {{ session('error') }} -->
@if (config('services.analytics.tracking_id'))
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-122229484-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{ config('services.analytics.tracking_id') }}', { 'anonymize_ip': true });
function trackEvent(category, action) {
ga('send', 'event', category, action, this.src);
}
</script>
@else
<script>
function gtag(){}
</script>
@endif
<meta charset="utf-8">
<title>@yield('meta_title') | {{ config('app.name') }}</title>
<meta name="description" content="@yield('meta_description')"/>
<link href="{{ asset('favicon.png') }}" rel="shortcut icon" type="image/png">
<!--
TODO Setup social sharing info
<meta property="og:site_name" content="Invoice Ninja"/>
<meta property="og:url" content="{{ config('ninja.site_url') }}"/>
<meta property="og:title" content="Invoice Ninja"/>
<meta property="og:image" content="{{ config('ninja.site_url') }}/images/logo.png"/>
<meta property="og:description" content="Create. Send. Get Paid."/>
--/>
<!-- http://realfavicongenerator.net -->
<!--
TODO Setup favicon
<link rel="apple-touch-icon" sizes="180x180" href="{{ url('apple-touch-icon.png') }}">
<link rel="icon" type="image/png" href="{{ url('favicon-32x32.png') }}" sizes="32x32">
<link rel="icon" type="image/png" href="{{ url('favicon-16x16.png') }}" sizes="16x16">
<link rel="manifest" href="{{ url('manifest.json') }}">
<link rel="mask-icon" href="{{ url('safari-pinned-tab.svg') }}" color="#3bc65c">
<link rel="shortcut icon" href="{{ url('favicon.ico') }}">
<meta name="apple-mobile-web-app-title" content="Invoice Ninja">
<meta name="application-name" content="Invoice Ninja">
<meta name="theme-color" content="#ffffff">
-->
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta name="keyword" content="Bootstrap,Admin,Template,Open,Source,jQuery,CSS,HTML,RWD,Dashboard">
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="https://unpkg.com/@coreui/icons/css/coreui-icons.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/simple-line-icons/2.4.1/css/simple-line-icons.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<link rel="canonical" href="{{ config('ninja.app_url') }}/{{ request()->path() }}"/>
<link rel="stylesheet" href="{{ mix('/css/ninja.css') }}">
<script src=" {{ mix('/js/ninja.js') }}"></script>
@yield('head')
</head>
@yield('header')
@yield('sidebar')
@yield('body')
@yield('footer')
</html>

View File

@ -0,0 +1,203 @@
<div class="sidebar">
<nav class="sidebar-nav">
<ul class="nav">
<li class="nav-item">
<a class="nav-link" href="index.html">
<i class="nav-icon icon-speedometer"></i> Dashboard
<span class="badge badge-primary">NEW</span>
</a>
</li>
<li class="nav-title">Theme</li>
<li class="nav-item">
<a class="nav-link" href="colors.html">
<i class="nav-icon icon-drop"></i> Colors</a>
</li>
<li class="nav-item">
<a class="nav-link" href="typography.html">
<i class="nav-icon icon-pencil"></i> Typography</a>
</li>
<li class="nav-title">Components</li>
<li class="nav-item nav-dropdown">
<a class="nav-link nav-dropdown-toggle" href="#">
<i class="nav-icon icon-puzzle"></i> Base</a>
<ul class="nav-dropdown-items">
<li class="nav-item">
<a class="nav-link" href="base/breadcrumb.html">
<i class="nav-icon icon-puzzle"></i> Breadcrumb</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/cards.html">
<i class="nav-icon icon-puzzle"></i> Cards</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/carousel.html">
<i class="nav-icon icon-puzzle"></i> Carousel</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/collapse.html">
<i class="nav-icon icon-puzzle"></i> Collapse</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/forms.html">
<i class="nav-icon icon-puzzle"></i> Forms</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/jumbotron.html">
<i class="nav-icon icon-puzzle"></i> Jumbotron</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/list-group.html">
<i class="nav-icon icon-puzzle"></i> List group</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/navs.html">
<i class="nav-icon icon-puzzle"></i> Navs</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/pagination.html">
<i class="nav-icon icon-puzzle"></i> Pagination</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/popovers.html">
<i class="nav-icon icon-puzzle"></i> Popovers</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/progress.html">
<i class="nav-icon icon-puzzle"></i> Progress</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/scrollspy.html">
<i class="nav-icon icon-puzzle"></i> Scrollspy</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/switches.html">
<i class="nav-icon icon-puzzle"></i> Switches</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/tables.html">
<i class="nav-icon icon-puzzle"></i> Tables</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/tabs.html">
<i class="nav-icon icon-puzzle"></i> Tabs</a>
</li>
<li class="nav-item">
<a class="nav-link" href="base/tooltips.html">
<i class="nav-icon icon-puzzle"></i> Tooltips</a>
</li>
</ul>
</li>
<li class="nav-item nav-dropdown">
<a class="nav-link nav-dropdown-toggle" href="#">
<i class="nav-icon icon-cursor"></i> Buttons</a>
<ul class="nav-dropdown-items">
<li class="nav-item">
<a class="nav-link" href="buttons/buttons.html">
<i class="nav-icon icon-cursor"></i> Buttons</a>
</li>
<li class="nav-item">
<a class="nav-link" href="buttons/button-group.html">
<i class="nav-icon icon-cursor"></i> Buttons Group</a>
</li>
<li class="nav-item">
<a class="nav-link" href="buttons/dropdowns.html">
<i class="nav-icon icon-cursor"></i> Dropdowns</a>
</li>
<li class="nav-item">
<a class="nav-link" href="buttons/brand-buttons.html">
<i class="nav-icon icon-cursor"></i> Brand Buttons</a>
</li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="charts.html">
<i class="nav-icon icon-pie-chart"></i> Charts</a>
</li>
<li class="nav-item nav-dropdown">
<a class="nav-link nav-dropdown-toggle" href="#">
<i class="nav-icon icon-star"></i> Icons</a>
<ul class="nav-dropdown-items">
<li class="nav-item">
<a class="nav-link" href="icons/coreui-icons.html">
<i class="nav-icon icon-star"></i> CoreUI Icons
<span class="badge badge-success">NEW</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="icons/flags.html">
<i class="nav-icon icon-star"></i> Flags</a>
</li>
<li class="nav-item">
<a class="nav-link" href="icons/font-awesome.html">
<i class="nav-icon icon-star"></i> Font Awesome
<span class="badge badge-secondary">4.7</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="icons/simple-line-icons.html">
<i class="nav-icon icon-star"></i> Simple Line Icons</a>
</li>
</ul>
</li>
<li class="nav-item nav-dropdown">
<a class="nav-link nav-dropdown-toggle" href="#">
<i class="nav-icon icon-bell"></i> Notifications</a>
<ul class="nav-dropdown-items">
<li class="nav-item">
<a class="nav-link" href="notifications/alerts.html">
<i class="nav-icon icon-bell"></i> Alerts</a>
</li>
<li class="nav-item">
<a class="nav-link" href="notifications/badge.html">
<i class="nav-icon icon-bell"></i> Badge</a>
</li>
<li class="nav-item">
<a class="nav-link" href="notifications/modals.html">
<i class="nav-icon icon-bell"></i> Modals</a>
</li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="widgets.html">
<i class="nav-icon icon-calculator"></i> Widgets
<span class="badge badge-primary">NEW</span>
</a>
</li>
<li class="divider"></li>
<li class="nav-title">Extras</li>
<li class="nav-item nav-dropdown">
<a class="nav-link nav-dropdown-toggle" href="#">
<i class="nav-icon icon-star"></i> Pages</a>
<ul class="nav-dropdown-items">
<li class="nav-item">
<a class="nav-link" href="login.html" target="_top">
<i class="nav-icon icon-star"></i> Login</a>
</li>
<li class="nav-item">
<a class="nav-link" href="register.html" target="_top">
<i class="nav-icon icon-star"></i> Register</a>
</li>
<li class="nav-item">
<a class="nav-link" href="404.html" target="_top">
<i class="nav-icon icon-star"></i> Error 404</a>
</li>
<li class="nav-item">
<a class="nav-link" href="500.html" target="_top">
<i class="nav-icon icon-star"></i> Error 500</a>
</li>
</ul>
</li>
<li class="nav-item mt-auto">
<a class="nav-link nav-link-success" href="https://coreui.io" target="_top">
<i class="nav-icon icon-cloud-download"></i> Download CoreUI</a>
</li>
<li class="nav-item">
<a class="nav-link nav-link-danger" href="https://coreui.io/pro/" target="_top">
<i class="nav-icon icon-layers"></i> Try CoreUI
<strong>PRO</strong>
</a>
</li>
</ul>
</nav>
<button class="sidebar-minimizer brand-minimizer" type="button"></button>
</div>

View File

@ -26,7 +26,11 @@ Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('passw
/*
Open Routes
*/
Route::get('/', 'HomeController@index')->name('default');
//Route::get('/', 'HomeController@index')->name('default');
Route::redirect('/', '/login', 301);
Route::get('/signup', 'HomeController@signup')->name('signup');
Route::get('/contact/login', 'Auth\ContactLoginController@showLoginForm')->name('contact.login');
Route::post('/contact/login', 'Auth\ContactLoginController@login')->name('contact.login.submit');

20
webpack.mix.js vendored
View File

@ -11,5 +11,21 @@ const mix = require('laravel-mix');
|
*/
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css');
mix.js('resources/js/app.js', 'public/js/vendor');
mix.scripts([
'node_modules/@coreui/coreui/dist/js/coreui.js',
'node_modules/bootstrap/dist/js/bootstrap.js',
'public/js/vendor/app.js'
], 'public/js/ninja.js');
mix.styles([
'node_modules/@coreui/coreui/dist/css/coreui.css',
'node_modules/@coreui/icons/css/coreui-icons.css',
'node_modules/font-awesome/css/font-awesome.css'
], 'public/css/ninja.css');
mix.copyDirectory('node_modules/font-awesome/fonts', 'public/fonts');
mix.version();