This commit is contained in:
2019-05-22 03:47:20 +00:00
parent 34ee987b03
commit e65fff3ac0
34 changed files with 1725 additions and 1532 deletions

30
composer.lock generated
View File

@@ -804,16 +804,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v5.8.17", "version": "v5.8.18",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "33c04dd2a431adeeb49926a4f2b20590cc033ca2" "reference": "9f571be04435883dab6f23ecfadb204273b7f527"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/33c04dd2a431adeeb49926a4f2b20590cc033ca2", "url": "https://api.github.com/repos/laravel/framework/zipball/9f571be04435883dab6f23ecfadb204273b7f527",
"reference": "33c04dd2a431adeeb49926a4f2b20590cc033ca2", "reference": "9f571be04435883dab6f23ecfadb204273b7f527",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -947,20 +947,20 @@
"framework", "framework",
"laravel" "laravel"
], ],
"time": "2019-05-14T16:02:41+00:00" "time": "2019-05-21T16:40:34+00:00"
}, },
{ {
"name": "laravel/horizon", "name": "laravel/horizon",
"version": "v3.1.2", "version": "v3.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/horizon.git", "url": "https://github.com/laravel/horizon.git",
"reference": "32313d787a7a7575c1866e8ed12ec944c1513b7f" "reference": "a9204280f72a1c6d3874e0f98b68e354b212311a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/horizon/zipball/32313d787a7a7575c1866e8ed12ec944c1513b7f", "url": "https://api.github.com/repos/laravel/horizon/zipball/a9204280f72a1c6d3874e0f98b68e354b212311a",
"reference": "32313d787a7a7575c1866e8ed12ec944c1513b7f", "reference": "a9204280f72a1c6d3874e0f98b68e354b212311a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1016,7 +1016,7 @@
"laravel", "laravel",
"queue" "queue"
], ],
"time": "2019-04-30T15:20:11+00:00" "time": "2019-05-21T19:58:03+00:00"
}, },
{ {
"name": "laravel/socialite", "name": "laravel/socialite",
@@ -1214,16 +1214,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "1.0.51", "version": "1.0.52",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "755ba7bf3fb9031e6581d091db84d78275874396" "reference": "c5a5097156387970e6f0ccfcdf03f752856f3391"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/755ba7bf3fb9031e6581d091db84d78275874396", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c5a5097156387970e6f0ccfcdf03f752856f3391",
"reference": "755ba7bf3fb9031e6581d091db84d78275874396", "reference": "c5a5097156387970e6f0ccfcdf03f752856f3391",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1294,7 +1294,7 @@
"sftp", "sftp",
"storage" "storage"
], ],
"time": "2019-03-30T13:22:34+00:00" "time": "2019-05-20T20:21:14+00:00"
}, },
{ {
"name": "league/oauth1-client", "name": "league/oauth1-client",

View File

@@ -1113,17 +1113,17 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v5.8.17", "version": "v5.8.18",
"version_normalized": "5.8.17.0", "version_normalized": "5.8.18.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "33c04dd2a431adeeb49926a4f2b20590cc033ca2" "reference": "9f571be04435883dab6f23ecfadb204273b7f527"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/33c04dd2a431adeeb49926a4f2b20590cc033ca2", "url": "https://api.github.com/repos/laravel/framework/zipball/9f571be04435883dab6f23ecfadb204273b7f527",
"reference": "33c04dd2a431adeeb49926a4f2b20590cc033ca2", "reference": "9f571be04435883dab6f23ecfadb204273b7f527",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1226,7 +1226,7 @@
"symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^1.1).", "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^1.1).",
"wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)."
}, },
"time": "2019-05-14T16:02:41+00:00", "time": "2019-05-21T16:40:34+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1262,17 +1262,17 @@
}, },
{ {
"name": "laravel/horizon", "name": "laravel/horizon",
"version": "v3.1.2", "version": "v3.2.1",
"version_normalized": "3.1.2.0", "version_normalized": "3.2.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/horizon.git", "url": "https://github.com/laravel/horizon.git",
"reference": "32313d787a7a7575c1866e8ed12ec944c1513b7f" "reference": "a9204280f72a1c6d3874e0f98b68e354b212311a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/horizon/zipball/32313d787a7a7575c1866e8ed12ec944c1513b7f", "url": "https://api.github.com/repos/laravel/horizon/zipball/a9204280f72a1c6d3874e0f98b68e354b212311a",
"reference": "32313d787a7a7575c1866e8ed12ec944c1513b7f", "reference": "a9204280f72a1c6d3874e0f98b68e354b212311a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1294,7 +1294,7 @@
"orchestra/testbench": "^3.7", "orchestra/testbench": "^3.7",
"phpunit/phpunit": "^7.0" "phpunit/phpunit": "^7.0"
}, },
"time": "2019-04-30T15:20:11+00:00", "time": "2019-05-21T19:58:03+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1533,17 +1533,17 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "1.0.51", "version": "1.0.52",
"version_normalized": "1.0.51.0", "version_normalized": "1.0.52.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "755ba7bf3fb9031e6581d091db84d78275874396" "reference": "c5a5097156387970e6f0ccfcdf03f752856f3391"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/755ba7bf3fb9031e6581d091db84d78275874396", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c5a5097156387970e6f0ccfcdf03f752856f3391",
"reference": "755ba7bf3fb9031e6581d091db84d78275874396", "reference": "c5a5097156387970e6f0ccfcdf03f752856f3391",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1573,7 +1573,7 @@
"spatie/flysystem-dropbox": "Allows you to use Dropbox storage", "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
"srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
}, },
"time": "2019-03-30T13:22:34+00:00", "time": "2019-05-20T20:21:14+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {

View File

@@ -417,6 +417,8 @@ class Gate implements GateContract
* *
* @param callable $callback * @param callable $callback
* @return bool * @return bool
*
* @throws \ReflectionException
*/ */
protected function callbackAllowsGuests($callback) protected function callbackAllowsGuests($callback)
{ {
@@ -598,6 +600,8 @@ class Gate implements GateContract
* *
* @param object|string $class * @param object|string $class
* @return mixed * @return mixed
*
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/ */
public function resolvePolicy($class) public function resolvePolicy($class)
{ {

View File

@@ -121,6 +121,7 @@ class AuthMakeCommand extends Command
/** /**
* Get full view path relative to the app's configured view path. * Get full view path relative to the app's configured view path.
* *
* @param string $path
* @return string * @return string
*/ */
protected function getViewPath($path) protected function getViewPath($path)

View File

@@ -14,7 +14,7 @@
<!-- Fonts --> <!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com"> <link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet" type="text/css"> <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles --> <!-- Styles -->
<link href="{{ asset('css/app.css') }}" rel="stylesheet"> <link href="{{ asset('css/app.css') }}" rel="stylesheet">

View File

@@ -186,7 +186,13 @@ class FileStore implements Store
return $this->emptyPayload(); return $this->emptyPayload();
} }
$data = unserialize(substr($contents, 10)); try {
$data = unserialize(substr($contents, 10));
} catch (Exception $e) {
$this->forget($key);
return $this->emptyPayload();
}
// Next, we'll extract the number of seconds that are remaining for a cache // Next, we'll extract the number of seconds that are remaining for a cache
// so that we can properly retain the time for things like the increment // so that we can properly retain the time for things like the increment

View File

@@ -28,7 +28,7 @@ interface Guard
/** /**
* Get the ID for the currently authenticated user. * Get the ID for the currently authenticated user.
* *
* @return int|null * @return int|string|null
*/ */
public function id(); public function id();

View File

@@ -2078,7 +2078,7 @@ class Builder
/** /**
* Execute a query for a single record by ID. * Execute a query for a single record by ID.
* *
* @param int $id * @param int|string $id
* @param array $columns * @param array $columns
* @return mixed|static * @return mixed|static
*/ */

View File

@@ -138,7 +138,11 @@ class FilesystemAdapter implements FilesystemContract, CloudFilesystemContract
{ {
$response = new StreamedResponse; $response = new StreamedResponse;
$disposition = $response->headers->makeDisposition($disposition, $name ?? basename($path)); $filename = $name ?? basename($path);
$disposition = $response->headers->makeDisposition(
$disposition, $filename, Str::ascii($filename)
);
$response->headers->replace($headers + [ $response->headers->replace($headers + [
'Content-Type' => $this->mimeType($path), 'Content-Type' => $this->mimeType($path),

View File

@@ -29,7 +29,7 @@ class Application extends Container implements ApplicationContract, HttpKernelIn
* *
* @var string * @var string
*/ */
const VERSION = '5.8.17'; const VERSION = '5.8.18';
/** /**
* The base path for the Laravel installation. * The base path for the Laravel installation.

View File

@@ -1,459 +1,459 @@
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<title>@yield('title')</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>@yield('title')</title>
<!-- Fonts --> <!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com"> <link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet" type="text/css"> <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles --> <!-- Styles -->
<style> <style>
html { html {
line-height: 1.15; line-height: 1.15;
-ms-text-size-adjust: 100%; -ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
}
body {
margin: 0;
}
header,
nav,
section {
display: block;
}
figcaption,
main {
display: block;
}
a {
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
strong {
font-weight: inherit;
}
strong {
font-weight: bolder;
}
code {
font-family: monospace, monospace;
font-size: 1em;
}
dfn {
font-style: italic;
}
svg:not(:root) {
overflow: hidden;
}
button,
input {
font-family: sans-serif;
font-size: 100%;
line-height: 1.15;
margin: 0;
}
button,
input {
overflow: visible;
}
button {
text-transform: none;
}
button,
html [type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
legend {
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: inherit;
display: table;
max-width: 100%;
padding: 0;
white-space: normal;
}
[type="checkbox"],
[type="radio"] {
-webkit-box-sizing: border-box;
box-sizing: border-box;
padding: 0;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
menu {
display: block;
}
canvas {
display: inline-block;
}
template {
display: none;
}
[hidden] {
display: none;
}
html {
-webkit-box-sizing: border-box;
box-sizing: border-box;
font-family: sans-serif;
}
*,
*::before,
*::after {
-webkit-box-sizing: inherit;
box-sizing: inherit;
}
p {
margin: 0;
}
button {
background: transparent;
padding: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
*,
*::before,
*::after {
border-width: 0;
border-style: solid;
border-color: #dae1e7;
}
button,
[type="button"],
[type="reset"],
[type="submit"] {
border-radius: 0;
}
button,
input {
font-family: inherit;
}
input::-webkit-input-placeholder {
color: inherit;
opacity: .5;
}
input:-ms-input-placeholder {
color: inherit;
opacity: .5;
}
input::-ms-input-placeholder {
color: inherit;
opacity: .5;
}
input::placeholder {
color: inherit;
opacity: .5;
}
button,
[role=button] {
cursor: pointer;
}
.bg-transparent {
background-color: transparent;
}
.bg-white {
background-color: #fff;
}
.bg-teal-light {
background-color: #64d5ca;
}
.bg-blue-dark {
background-color: #2779bd;
}
.bg-indigo-light {
background-color: #7886d7;
}
.bg-purple-light {
background-color: #a779e9;
}
.bg-no-repeat {
background-repeat: no-repeat;
}
.bg-cover {
background-size: cover;
}
.border-grey-light {
border-color: #dae1e7;
}
.hover\:border-grey:hover {
border-color: #b8c2cc;
}
.rounded-lg {
border-radius: .5rem;
}
.border-2 {
border-width: 2px;
}
.hidden {
display: none;
}
.flex {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.items-center {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
.justify-center {
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
}
.font-sans {
font-family: Nunito, sans-serif;
}
.font-light {
font-weight: 300;
}
.font-bold {
font-weight: 700;
}
.font-black {
font-weight: 900;
}
.h-1 {
height: .25rem;
}
.leading-normal {
line-height: 1.5;
}
.m-8 {
margin: 2rem;
}
.my-3 {
margin-top: .75rem;
margin-bottom: .75rem;
}
.mb-8 {
margin-bottom: 2rem;
}
.max-w-sm {
max-width: 30rem;
}
.min-h-screen {
min-height: 100vh;
}
.py-3 {
padding-top: .75rem;
padding-bottom: .75rem;
}
.px-6 {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
.pb-full {
padding-bottom: 100%;
}
.absolute {
position: absolute;
}
.relative {
position: relative;
}
.pin {
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.text-black {
color: #22292f;
}
.text-grey-darkest {
color: #3d4852;
}
.text-grey-darker {
color: #606f7b;
}
.text-2xl {
font-size: 1.5rem;
}
.text-5xl {
font-size: 3rem;
}
.uppercase {
text-transform: uppercase;
}
.antialiased {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.tracking-wide {
letter-spacing: .05em;
}
.w-16 {
width: 4rem;
}
.w-full {
width: 100%;
}
@media (min-width: 768px) {
.md\:bg-left {
background-position: left;
} }
.md\:bg-right { body {
background-position: right; margin: 0;
} }
.md\:flex { header,
nav,
section {
display: block;
}
figcaption,
main {
display: block;
}
a {
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
strong {
font-weight: inherit;
}
strong {
font-weight: bolder;
}
code {
font-family: monospace, monospace;
font-size: 1em;
}
dfn {
font-style: italic;
}
svg:not(:root) {
overflow: hidden;
}
button,
input {
font-family: sans-serif;
font-size: 100%;
line-height: 1.15;
margin: 0;
}
button,
input {
overflow: visible;
}
button {
text-transform: none;
}
button,
html [type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
legend {
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: inherit;
display: table;
max-width: 100%;
padding: 0;
white-space: normal;
}
[type="checkbox"],
[type="radio"] {
-webkit-box-sizing: border-box;
box-sizing: border-box;
padding: 0;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
menu {
display: block;
}
canvas {
display: inline-block;
}
template {
display: none;
}
[hidden] {
display: none;
}
html {
-webkit-box-sizing: border-box;
box-sizing: border-box;
font-family: sans-serif;
}
*,
*::before,
*::after {
-webkit-box-sizing: inherit;
box-sizing: inherit;
}
p {
margin: 0;
}
button {
background: transparent;
padding: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
*,
*::before,
*::after {
border-width: 0;
border-style: solid;
border-color: #dae1e7;
}
button,
[type="button"],
[type="reset"],
[type="submit"] {
border-radius: 0;
}
button,
input {
font-family: inherit;
}
input::-webkit-input-placeholder {
color: inherit;
opacity: .5;
}
input:-ms-input-placeholder {
color: inherit;
opacity: .5;
}
input::-ms-input-placeholder {
color: inherit;
opacity: .5;
}
input::placeholder {
color: inherit;
opacity: .5;
}
button,
[role=button] {
cursor: pointer;
}
.bg-transparent {
background-color: transparent;
}
.bg-white {
background-color: #fff;
}
.bg-teal-light {
background-color: #64d5ca;
}
.bg-blue-dark {
background-color: #2779bd;
}
.bg-indigo-light {
background-color: #7886d7;
}
.bg-purple-light {
background-color: #a779e9;
}
.bg-no-repeat {
background-repeat: no-repeat;
}
.bg-cover {
background-size: cover;
}
.border-grey-light {
border-color: #dae1e7;
}
.hover\:border-grey:hover {
border-color: #b8c2cc;
}
.rounded-lg {
border-radius: .5rem;
}
.border-2 {
border-width: 2px;
}
.hidden {
display: none;
}
.flex {
display: -webkit-box; display: -webkit-box;
display: -ms-flexbox; display: -ms-flexbox;
display: flex; display: flex;
} }
.md\:my-6 { .items-center {
margin-top: 1.5rem; -webkit-box-align: center;
margin-bottom: 1.5rem; -ms-flex-align: center;
align-items: center;
} }
.md\:min-h-screen { .justify-center {
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
}
.font-sans {
font-family: Nunito, sans-serif;
}
.font-light {
font-weight: 300;
}
.font-bold {
font-weight: 700;
}
.font-black {
font-weight: 900;
}
.h-1 {
height: .25rem;
}
.leading-normal {
line-height: 1.5;
}
.m-8 {
margin: 2rem;
}
.my-3 {
margin-top: .75rem;
margin-bottom: .75rem;
}
.mb-8 {
margin-bottom: 2rem;
}
.max-w-sm {
max-width: 30rem;
}
.min-h-screen {
min-height: 100vh; min-height: 100vh;
} }
.md\:pb-0 { .py-3 {
padding-bottom: 0; padding-top: .75rem;
padding-bottom: .75rem;
} }
.md\:text-3xl { .px-6 {
font-size: 1.875rem; padding-left: 1.5rem;
padding-right: 1.5rem;
} }
.md\:text-15xl { .pb-full {
font-size: 9rem; padding-bottom: 100%;
} }
.md\:w-1\/2 { .absolute {
width: 50%; position: absolute;
} }
}
@media (min-width: 992px) { .relative {
.lg\:bg-center { position: relative;
background-position: center; }
.pin {
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.text-black {
color: #22292f;
}
.text-grey-darkest {
color: #3d4852;
}
.text-grey-darker {
color: #606f7b;
}
.text-2xl {
font-size: 1.5rem;
}
.text-5xl {
font-size: 3rem;
}
.uppercase {
text-transform: uppercase;
}
.antialiased {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.tracking-wide {
letter-spacing: .05em;
}
.w-16 {
width: 4rem;
}
.w-full {
width: 100%;
}
@media (min-width: 768px) {
.md\:bg-left {
background-position: left;
}
.md\:bg-right {
background-position: right;
}
.md\:flex {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.md\:my-6 {
margin-top: 1.5rem;
margin-bottom: 1.5rem;
}
.md\:min-h-screen {
min-height: 100vh;
}
.md\:pb-0 {
padding-bottom: 0;
}
.md\:text-3xl {
font-size: 1.875rem;
}
.md\:text-15xl {
font-size: 9rem;
}
.md\:w-1\/2 {
width: 50%;
}
}
@media (min-width: 992px) {
.lg\:bg-center {
background-position: center;
}
} }
}
</style> </style>
</head> </head>
<body class="antialiased font-sans"> <body class="antialiased font-sans">

View File

@@ -8,7 +8,7 @@
<!-- Fonts --> <!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com"> <link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet" type="text/css"> <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">
<!-- Styles --> <!-- Styles -->
<style> <style>

View File

@@ -445,8 +445,8 @@ class LogManager implements LoggerInterface
/** /**
* System is unusable. * System is unusable.
* *
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -461,8 +461,8 @@ class LogManager implements LoggerInterface
* Example: Entire website down, database unavailable, etc. This should * Example: Entire website down, database unavailable, etc. This should
* trigger the SMS alerts and wake you up. * trigger the SMS alerts and wake you up.
* *
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -476,8 +476,8 @@ class LogManager implements LoggerInterface
* *
* Example: Application component unavailable, unexpected exception. * Example: Application component unavailable, unexpected exception.
* *
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -490,8 +490,8 @@ class LogManager implements LoggerInterface
* Runtime errors that do not require immediate action but should typically * Runtime errors that do not require immediate action but should typically
* be logged and monitored. * be logged and monitored.
* *
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -506,8 +506,8 @@ class LogManager implements LoggerInterface
* Example: Use of deprecated APIs, poor use of an API, undesirable things * Example: Use of deprecated APIs, poor use of an API, undesirable things
* that are not necessarily wrong. * that are not necessarily wrong.
* *
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -519,8 +519,8 @@ class LogManager implements LoggerInterface
/** /**
* Normal but significant events. * Normal but significant events.
* *
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -534,8 +534,8 @@ class LogManager implements LoggerInterface
* *
* Example: User logs in, SQL logs. * Example: User logs in, SQL logs.
* *
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -547,8 +547,8 @@ class LogManager implements LoggerInterface
/** /**
* Detailed debug information. * Detailed debug information.
* *
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -560,9 +560,9 @@ class LogManager implements LoggerInterface
/** /**
* Logs with an arbitrary level. * Logs with an arbitrary level.
* *
* @param mixed $level * @param mixed $level
* @param string $message * @param string $message
* @param array $context * @param array $context
* *
* @return void * @return void
*/ */
@@ -575,7 +575,7 @@ class LogManager implements LoggerInterface
* Dynamically call the default driver instance. * Dynamically call the default driver instance.
* *
* @param string $method * @param string $method
* @param array $parameters * @param array $parameters
* @return mixed * @return mixed
*/ */
public function __call($method, $parameters) public function __call($method, $parameters)

View File

@@ -137,6 +137,8 @@ class MailChannel
if (! is_null($message->priority)) { if (! is_null($message->priority)) {
$mailMessage->setPriority($message->priority); $mailMessage->setPriority($message->priority);
} }
$this->runCallbacks($mailMessage, $message);
} }
/** /**
@@ -225,4 +227,20 @@ class MailChannel
$mailMessage->attachData($attachment['data'], $attachment['name'], $attachment['options']); $mailMessage->attachData($attachment['data'], $attachment['name'], $attachment['options']);
} }
} }
/**
* Run the callbacks for the message.
*
* @param \Illuminate\Mail\Message $mailMessage
* @param \Illuminate\Notifications\Messages\MailMessage $message
* @return $this
*/
protected function runCallbacks($mailMessage, $message)
{
foreach ($message->callbacks as $callback) {
$callback($mailMessage->getSwiftMessage());
}
return $this;
}
} }

View File

@@ -80,6 +80,13 @@ class MailMessage extends SimpleMessage implements Renderable
*/ */
public $priority; public $priority;
/**
* The callbacks for the message.
*
* @var array
*/
public $callbacks = [];
/** /**
* Set the view for the mail message. * Set the view for the mail message.
* *
@@ -286,4 +293,17 @@ class MailMessage extends SimpleMessage implements Renderable
->make(Markdown::class) ->make(Markdown::class)
->render($this->markdown, $this->data()); ->render($this->markdown, $this->data());
} }
/**
* Register a callback to be called with the Swift message instance.
*
* @param callable $callback
* @return $this
*/
public function withSwiftMessage($callback)
{
$this->callbacks[] = $callback;
return $this;
}
} }

View File

@@ -127,7 +127,7 @@ class BusFake implements Dispatcher
*/ */
public function pipeThrough(array $pipes) public function pipeThrough(array $pipes)
{ {
// return $this;
} }
/** /**

View File

@@ -331,6 +331,6 @@ class MailFake implements Mailer, MailQueue
*/ */
public function failures() public function failures()
{ {
// return [];
} }
} }

View File

@@ -66,6 +66,7 @@ class Factory implements FactoryContract
'blade.php' => 'blade', 'blade.php' => 'blade',
'php' => 'php', 'php' => 'php',
'css' => 'file', 'css' => 'file',
'html' => 'file',
]; ];
/** /**

View File

@@ -40,7 +40,7 @@ class FileViewFinder implements ViewFinderInterface
* *
* @var array * @var array
*/ */
protected $extensions = ['blade.php', 'php', 'css']; protected $extensions = ['blade.php', 'php', 'css', 'html'];
/** /**
* Create a new file view loader instance. * Create a new file view loader instance.

File diff suppressed because it is too large Load Diff

View File

@@ -12,16 +12,16 @@
"devDependencies": { "devDependencies": {
"axios": "^0.18", "axios": "^0.18",
"bootstrap": "^4.0.0", "bootstrap": "^4.0.0",
"chart.js": "^2.5.0",
"cross-env": "^5.1", "cross-env": "^5.1",
"highlight.js": "^9.12.0", "highlight.js": "^9.12.0",
"jquery": "^3.2", "jquery": "^3.4.1",
"chart.js": "^2.5.0", "laravel-mix": "^4.0.15",
"laravel-mix": "^4.0.7",
"lodash": "^4.17.4", "lodash": "^4.17.4",
"phpunserialize": "1.*",
"md5": "^2.2.1", "md5": "^2.2.1",
"moment": "^2.10.6", "moment": "^2.10.6",
"moment-timezone": "^0.5.21", "moment-timezone": "^0.5.21",
"phpunserialize": "1.*",
"popper.js": "^1.12", "popper.js": "^1.12",
"resolve-url-loader": "^2.3.1", "resolve-url-loader": "^2.3.1",
"sass": "^1.15.2", "sass": "^1.15.2",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{ {
"/app.js": "/app.js?id=216ac977397857c5c8db", "/app.js": "/app.js?id=b4b7fcb45d3a4c28de8c",
"/app.css": "/app.css?id=cefed9132a927b70fdd6", "/app.css": "/app.css?id=d586fd661303e476cc02",
"/app-dark.css": "/app-dark.css?id=596688837e7ffbb58e37" "/app-dark.css": "/app-dark.css?id=46f75a6edf4ba03e5586"
} }

View File

@@ -19,8 +19,6 @@ Vue.use(VueRouter);
window.Popper = require('popper.js').default; window.Popper = require('popper.js').default;
moment.tz.setDefault(Horizon.timezone);
Vue.prototype.$http = axios.create(); Vue.prototype.$http = axios.create();
const router = new VueRouter({ const router = new VueRouter({

View File

@@ -300,6 +300,8 @@
<tr> <tr>
<th>Supervisor</th> <th>Supervisor</th>
<th>Processes</th> <th>Processes</th>
<th>CPU Threads</th>
<th>Memory</th>
<th>Queues</th> <th>Queues</th>
<th class="text-right">Balancing</th> <th class="text-right">Balancing</th>
</tr> </tr>
@@ -309,6 +311,8 @@
<tr v-for="supervisor in worker.supervisors"> <tr v-for="supervisor in worker.supervisors">
<td>{{ superVisorDisplayName(supervisor.name, worker.name) }}</td> <td>{{ superVisorDisplayName(supervisor.name, worker.name) }}</td>
<td>{{ countProcesses(supervisor.processes) }}</td> <td>{{ countProcesses(supervisor.processes) }}</td>
<td>{{ supervisor.cpu }}</td>
<td>{{ supervisor.mem }}%</td>
<td>{{ supervisor.options.queue.replace(/,/g, ', ') }}</td> <td>{{ supervisor.options.queue.replace(/,/g, ', ') }}</td>
<td class="text-right"> <td class="text-right">
({{ supervisor.options.balance.charAt(0).toUpperCase() + supervisor.options.balance.slice(1) }}) ({{ supervisor.options.balance.charAt(0).toUpperCase() + supervisor.options.balance.slice(1) }})

View File

@@ -126,7 +126,6 @@ class Horizon
{ {
return [ return [
'path' => config('horizon.path'), 'path' => config('horizon.path'),
'timezone' => config('app.timezone'),
]; ];
} }

View File

@@ -82,7 +82,7 @@ class FailedJobsController extends Controller
protected function paginateByTag(Request $request, $tag) protected function paginateByTag(Request $request, $tag)
{ {
$jobIds = $this->tags->paginate( $jobIds = $this->tags->paginate(
'failed:'.$tag, $request->query('starting_at', -1) + 1, 50 'failed:'.$tag, ($request->query('starting_at') ?: -1) + 1, 50
); );
$startingAt = $request->query('starting_at', 0); $startingAt = $request->query('starting_at', 0);

View File

@@ -71,7 +71,7 @@ class RedisSupervisorRepository implements SupervisorRepository
{ {
$records = $this->connection()->pipeline(function ($pipe) use ($names) { $records = $this->connection()->pipeline(function ($pipe) use ($names) {
foreach ($names as $name) { foreach ($names as $name) {
$pipe->hmget('supervisor:'.$name, ['name', 'master', 'pid', 'status', 'processes', 'options']); $pipe->hmget('supervisor:'.$name, ['name', 'master', 'pid', 'status', 'processes', 'options', 'cpu', 'mem']);
} }
}); });
@@ -85,6 +85,8 @@ class RedisSupervisorRepository implements SupervisorRepository
'status' => $record[3], 'status' => $record[3],
'processes' => json_decode($record[4], true), 'processes' => json_decode($record[4], true),
'options' => json_decode($record[5], true), 'options' => json_decode($record[5], true),
'cpu' => $record[6],
'mem' => $record[7],
]; ];
})->filter()->all(); })->filter()->all();
} }
@@ -114,6 +116,7 @@ class RedisSupervisorRepository implements SupervisorRepository
})->toJson(); })->toJson();
$this->connection()->pipeline(function ($pipe) use ($supervisor, $processes) { $this->connection()->pipeline(function ($pipe) use ($supervisor, $processes) {
$workerStats = $supervisor->workerStats();
$pipe->hmset( $pipe->hmset(
'supervisor:'.$supervisor->name, [ 'supervisor:'.$supervisor->name, [
'name' => $supervisor->name, 'name' => $supervisor->name,
@@ -122,6 +125,8 @@ class RedisSupervisorRepository implements SupervisorRepository
'status' => $supervisor->working ? 'running' : 'paused', 'status' => $supervisor->working ? 'running' : 'paused',
'processes' => $processes, 'processes' => $processes,
'options' => $supervisor->options->toJson(), 'options' => $supervisor->options->toJson(),
'cpu' => number_format($workerStats->sum('cpu'), 2),
'mem' => round($workerStats->sum('mem')),
] ]
); );

View File

@@ -406,6 +406,16 @@ class Supervisor implements Pausable, Restartable, Terminable
return $this->processPools->sum->totalProcessCount(); return $this->processPools->sum->totalProcessCount();
} }
/**
* Get CPU and memory usage for the active workers by asking the OS.
*
* @return \Illuminate\Support\Collection
*/
public function workerStats()
{
return app(SystemProcessCounter::class)->getWorkerStats($this->name);
}
/** /**
* Get the total active process count by asking the OS. * Get the total active process count by asking the OS.
* *

View File

@@ -13,6 +13,27 @@ class SystemProcessCounter
*/ */
public static $command = 'horizon:work'; public static $command = 'horizon:work';
/**
* Get CPU and memory usage for each Horizon workers for a given supervisor.
*
* @param string $name
* @return \Illuminate\Support\Collection
*/
public function getWorkerStats($name)
{
$process = Process::fromShellCommandline('exec ps axo %cpu,%mem,command | grep '.static::$command.' | grep "supervisor='.$name.'" | grep -v "exec ps axo"', null, ['COLUMNS' => '2000']);
$process->run();
$rows = explode("\n", $process->getOutput());
return collect($rows)->filter()->map(function ($rows) {
$row = collect(explode(' ', $rows))->filter()->take(2);
return ['cpu' => $row->first() / 100, 'mem' => $row->last()];
});
}
/** /**
* Get the number of Horizon workers for a given supervisor. * Get the number of Horizon workers for a given supervisor.
* *
@@ -21,10 +42,6 @@ class SystemProcessCounter
*/ */
public function get($name) public function get($name)
{ {
$process = Process::fromShellCommandline('exec ps aux | grep '.static::$command, null, ['COLUMNS' => '2000']); return $this->getWorkerStats($name)->count();
$process->run();
return substr_count($process->getOutput(), 'supervisor='.$name);
} }
} }

View File

@@ -220,7 +220,7 @@ class Local extends AbstractAdapter
public function read($path) public function read($path)
{ {
$location = $this->applyPathPrefix($path); $location = $this->applyPathPrefix($path);
$contents = file_get_contents($location); $contents = @file_get_contents($location);
if ($contents === false) { if ($contents === false) {
return false; return false;

View File

@@ -13,7 +13,7 @@ class MimeType
protected static $extensionToMimeTypeMap = [ protected static $extensionToMimeTypeMap = [
'hqx' => 'application/mac-binhex40', 'hqx' => 'application/mac-binhex40',
'cpt' => 'application/mac-compactpro', 'cpt' => 'application/mac-compactpro',
'csv' => 'text/x-comma-separated-values', 'csv' => 'text/csv',
'bin' => 'application/octet-stream', 'bin' => 'application/octet-stream',
'dms' => 'application/octet-stream', 'dms' => 'application/octet-stream',
'lha' => 'application/octet-stream', 'lha' => 'application/octet-stream',