Merge pull request #2722 from CachetHQ/vue-components

Vue components
This commit is contained in:
James Brooks
2017-09-15 07:47:21 +01:00
committed by GitHub
27 changed files with 43234 additions and 445 deletions

View File

@@ -34,7 +34,8 @@
},
"private": true,
"dependencies": {
"axios": "^0.16.2",
"axios": "^0.15.2",
"gulp": "^3.9.1",
"vue": "^2.4.2"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

32229
public/dist/js/app.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,i,a){for(var c,u,f,s=0,p=[];s<t.length;s++)u=t[s],o[u]&&p.push(o[u][0]),o[u]=0;for(c in i)Object.prototype.hasOwnProperty.call(i,c)&&(e[c]=i[c]);for(r&&r(t,i,a);p.length;)p.shift()();if(a)for(s=0;s<a.length;s++)f=n(n.s=a[s]);return f};var t={},o={3:0};n.e=function(e){function r(){a.onerror=a.onload=null,clearTimeout(c);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=new Promise(function(n,r){o[e]=[n,r]});o[e][2]=t;var i=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,n.nc&&a.setAttribute("nonce",n.nc),a.src=n.p+"dist/js/"+({0:"/dist/js/app",1:"mix",2:"/dist/js/vendor"}[e]||e)+"."+{0:"55a4b921a0bbdaf794a6",1:"46bdcf356e69eb1117ec",2:"de6049da06819ff051e8"}[e]+".js";var c=setTimeout(r,12e4);return a.onerror=a.onload=r,i.appendChild(a),t},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw e}}([]);

147
public/dist/js/manifest.js vendored Normal file
View File

@@ -0,0 +1,147 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ var parentJsonpFunction = window["webpackJsonp"];
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, resolves = [], result;
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(installedChunks[chunkId])
/******/ resolves.push(installedChunks[chunkId][0]);
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ for(moduleId in moreModules) {
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);
/******/ while(resolves.length)
/******/ resolves.shift()();
/******/ if(executeModules) {
/******/ for(i=0; i < executeModules.length; i++) {
/******/ result = __webpack_require__(__webpack_require__.s = executeModules[i]);
/******/ }
/******/ }
/******/ return result;
/******/ };
/******/
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // objects to store loaded and loading chunks
/******/ var installedChunks = {
/******/ 3: 0
/******/ };
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = function requireEnsure(chunkId) {
/******/ if(installedChunks[chunkId] === 0)
/******/ return Promise.resolve();
/******/
/******/ // a Promise means "currently loading".
/******/ if(installedChunks[chunkId]) {
/******/ return installedChunks[chunkId][2];
/******/ }
/******/
/******/ // setup Promise in chunk cache
/******/ var promise = new Promise(function(resolve, reject) {
/******/ installedChunks[chunkId] = [resolve, reject];
/******/ });
/******/ installedChunks[chunkId][2] = promise;
/******/
/******/ // start chunk loading
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.async = true;
/******/ script.timeout = 120000;
/******/
/******/ if (__webpack_require__.nc) {
/******/ script.setAttribute("nonce", __webpack_require__.nc);
/******/ }
/******/ script.src = __webpack_require__.p + "dist/js/" + ({"0":"/dist/js/app","1":"mix","2":"/dist/js/vendor"}[chunkId]||chunkId) + ".js";
/******/ var timeout = setTimeout(onScriptComplete, 120000);
/******/ script.onerror = script.onload = onScriptComplete;
/******/ function onScriptComplete() {
/******/ // avoid mem leaks in IE.
/******/ script.onerror = script.onload = null;
/******/ clearTimeout(timeout);
/******/ var chunk = installedChunks[chunkId];
/******/ if(chunk !== 0) {
/******/ if(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));
/******/ installedChunks[chunkId] = undefined;
/******/ }
/******/ };
/******/ head.appendChild(script);
/******/
/******/ return promise;
/******/ };
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // on error function for async loading
/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };
/******/ })
/************************************************************************/
/******/ ([]);

File diff suppressed because one or more lines are too long

10135
public/dist/js/vendor.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,9 @@
{
"/dist/js/app.js": "/dist/js/app.f266b3ff7582a248cf69.js",
"/dist/js/app.js": "/dist/js/app.55a4b921a0bbdaf794a6.js",
"/mix.js": "/mix.46bdcf356e69eb1117ec.js",
"/dist/css/dashboard/dashboard.css": "/dist/css/dashboard/dashboard.d62a8b6468ab8c9bca396ab8f6cde506.css",
"/dist/css/app.css": "/dist/css/app.feac6a0c1283b11117bc898e9697488a.css",
"/dist/js/all.js": "/dist/js/all.4083e75c2ea0d0e7c624e3519d24eb35.js"
"/dist/js/all.js": "/dist/js/all.933ef52c701c02556f3b7fa32b0d5f5d.js",
"/dist/js/vendor.js": "/dist/js/vendor.de6049da06819ff051e8.js",
"/dist/js/manifest.js": "/dist/js/manifest.d41d8cd98f00b204e980.js"
}

View File

@@ -1 +1 @@
!function(n){function t(e){if(r[e])return r[e].exports;var o=r[e]={i:e,l:!1,exports:{}};return n[e].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};t.m=n,t.c=r,t.i=function(n){return n},t.d=function(n,r,e){t.o(n,r)||Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:e})},t.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(r,"a",r),r},t.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},t.p="",t(t.s=0)}({0:function(n,t,r){r("qRWl"),r("9GM1"),n.exports=r("xZZD")},"9GM1":function(n,t){},qRWl:function(n,t){},xZZD:function(n,t){}});
webpackJsonp([1],{0:function(n,o,c){c("qRWl"),c("9GM1"),n.exports=c("xZZD")},"9GM1":function(n,o){},qRWl:function(n,o){},xZZD:function(n,o){}},[0]);

34
public/mix.js Normal file
View File

@@ -0,0 +1,34 @@
webpackJsonp([1],{
/***/ 13:
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ 14:
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ 15:
/***/ (function(module, exports) {
/***/ }),
/***/ 49:
/***/ (function(module, exports, __webpack_require__) {
__webpack_require__(15);
__webpack_require__(13);
module.exports = __webpack_require__(14);
/***/ })
},[49]);

View File

@@ -13,12 +13,39 @@ require('./bootstrap');
window.Vue = require('vue');
/**
* Next, we will create a fresh Vue application instance and attach it to
* the page. Then, you may begin adding components to this application
* or customize the JavaScript scaffolding to fit your unique needs.
*/
window.axios = require('axios');
const app = new Vue({
el: '#app'
});
window.axios.defaults.headers.common = {
'X-CSRF-Token': window.Global.csrfToken,
'X-Requested-With': 'XMLHttpRequest'
};
((win, doc) => {
/**
* Next, we will create a fresh Vue application instance and attach it to
* the page. Then, you may begin adding components to this application
* or customize the JavaScript scaffolding to fit your unique needs.
*/
new Vue({
el: '#app',
data () {
return {
// TODO: Fill this with the active user.
user: null,
messages: [
//
],
system: {
updateAvailable: false,
}
}
},
components: {
'setup': require('./components/Setup.js'),
'dashboard': require('./components/dashboard/Dashboard.js'),
'report-incident': require('./components/dashboard/ReportIncident.js'),
'invite-team': require('./components/dashboard/InviteTeam.js'),
}
})
})()

View File

@@ -3,7 +3,7 @@ $(function () {
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
var token;
if (! options.crossDomain) {
token = $('meta[name="token"]').attr('content');
token = window.Global.csrfToken;
if (token) {
jqXHR.setRequestHeader('X-CSRF-Token', token);
}
@@ -232,7 +232,7 @@ $(function () {
});
// Incident management
$('select[name=template]').on('change', function () {
/*$('select[name=template]').on('change', function () {
var $this = $(this).find('option:selected'),
slug = $this.val();
@@ -254,7 +254,7 @@ $(function () {
}
});
}
});
});*/
// Banner removal JS
$('#remove-banner').on('click', function (){

View File

@@ -0,0 +1,49 @@
module.exports = {
props: [],
data () {
return {
env: {
cache_driver: null,
queue_driver: null,
session_driver: null,
mail_driver: null,
},
mail: {
host: null,
from: {
email: null,
name: 'status@cachethq.io',
},
username: null,
password: null,
requiresHost: true,
requiresUsername: true,
requiresPassword: true,
},
system: {
name: null,
domain: null,
timezone: null,
language: null
}
}
},
watch: {
'env.mail_driver' (driver) {
if (driver === 'log' || driver === 'mail') {
this.mail.requiresHost = false
this.mail.requiresUsername = false
this.mail.requiresPassword = false
} else if (driver === 'ses' || driver === 'mandrill') {
this.mail.requiresHost = false
this.mail.requiresUsername = true
this.mail.requiresPassword = true
} else {
this.mail.requiresHost = true
this.mail.requiresUsername = true
this.mail.requiresPassword = true
}
}
}
}

View File

@@ -0,0 +1,16 @@
module.exports = {
props: ['welcome-user'],
mounted () {
if (this.welcomeUser) {
$('#welcome-modal').modal('show');
}
},
methods: {
fetchIncidentTimeline () {
//
},
fetchSubscriberTimeline () {
//
}
}
}

View File

@@ -0,0 +1,29 @@
module.exports = {
data () {
return {
canRemove: true,
emails: [
{ email: '' },
{ email: '' },
{ email: '' },
{ email: '' },
{ email: '' },
]
}
},
methods: {
add () {
this.emails.push("")
},
remove (key) {
if (this.canRemove) {
this.$delete(this.emails, key)
}
},
},
watch: {
'emails' (val) {
this.canRemove = val.length > 1
}
}
}

View File

@@ -0,0 +1,43 @@
module.exports = {
data () {
return {
template: null,
name: '',
status: null,
visible: 1,
sticky: 0,
message: '',
when: null,
notify: false,
component: {
id: null,
status: null
}
}
},
methods: {
getTemplate (template) {
axios.get('/dashboard/api/incidents/templates', {
params: {
slug: template
}
}).then(response => {
this.name = response.data.name
this.message = response.data.template
}).catch(response => {
(new Cachet.Notifier()).notify('There was an error finding that template.');
})
}
},
watch: {
'template' (template) {
this.getTemplate(template)
},
'component.id' (id) {
// If we unselect a component then reset the status.
if (id === '') {
this.component.status = null
}
}
}
}

View File

@@ -215,7 +215,7 @@ return [
],
'team' => [
'description' => 'Invite your team members by entering their email addresses here.',
'email' => 'Email #:id',
'email' => 'Your Team Members Email Address',
],
],

View File

@@ -14,122 +14,124 @@
<div class="row">
<div class="col-md-12">
@include('dashboard.partials.errors')
<form class="form-vertical" name="IncidentForm" role="form" method="POST" autocomplete="off">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
@if($incident_templates->count() > 0)
<div class="form-group">
<label for="incident-template">{{ trans('forms.incidents.templates.template') }}</label>
<select class="form-control" name="template">
<option selected></option>
@foreach($incident_templates as $tpl)
<option value="{{ $tpl->slug }}">{{ $tpl->name }}</option>
@endforeach
</select>
</div>
@endif
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.name') }}</label>
<input type="text" class="form-control" name="name" id="incident-name" required value="{{ Binput::old('name') }}" placeholder="{{ trans('forms.incidents.name') }}">
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.status') }}</label><br>
<label class="radio-inline">
<input type="radio" name="status" value="1">
<i class="ion ion-flag"></i>
{{ trans('cachet.incidents.status')[1] }}
</label>
<label class="radio-inline">
<input type="radio" name="status" value="2">
<i class="ion ion-alert-circled"></i>
{{ trans('cachet.incidents.status')[2] }}
</label>
<label class="radio-inline">
<input type="radio" name="status" value="3">
<i class="ion ion-eye"></i>
{{ trans('cachet.incidents.status')[3] }}
</label>
<label class="radio-inline">
<input type="radio" name="status" value="4">
<i class="ion ion-checkmark"></i>
{{ trans('cachet.incidents.status')[4] }}
</label>
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.visibility') }}</label>
<select name="visible" class="form-control">
<option value="1" selected>{{ trans('forms.incidents.public') }}</option>
<option value="0">{{ trans('forms.incidents.logged_in_only') }}</option>
</select>
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.stick_status') }}</label>
<select name="stickied" class="form-control">
<option value="1">{{ trans('forms.incidents.stickied') }}</option>
<option value="0" selected>{{ trans('forms.incidents.not_stickied') }}</option>
</select>
</div>
@if(!$components_in_groups->isEmpty() || !$components_out_groups->isEmpty())
<div class="form-group">
<label>{{ trans('forms.incidents.component') }}</label>
<select name="component_id" class="form-control">
<option value="" selected></option>
@foreach($components_in_groups as $group)
<optgroup label="{{ $group->name }}">
@foreach($group->components as $component)
<report-incident inline-template>
<form class="form-vertical" name="IncidentForm" role="form" method="POST" autocomplete="off">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
@if($incident_templates->count() > 0)
<div class="form-group">
<label for="incident-template">{{ trans('forms.incidents.templates.template') }}</label>
<select class="form-control" name="template" v-model="template">
<option selected></option>
@foreach($incident_templates as $tpl)
<option value="{{ $tpl->slug }}">{{ $tpl->name }}</option>
@endforeach
</select>
</div>
@endif
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.name') }}</label>
<input type="text" class="form-control" name="name" id="incident-name" required value="{{ Binput::old('name') }}" placeholder="{{ trans('forms.incidents.name') }}" v-model="name">
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.status') }}</label><br>
<label class="radio-inline">
<input type="radio" name="status" value="1" v-model="status">
<i class="ion ion-flag"></i>
{{ trans('cachet.incidents.status')[1] }}
</label>
<label class="radio-inline">
<input type="radio" name="status" value="2" v-model="status">
<i class="ion ion-alert-circled"></i>
{{ trans('cachet.incidents.status')[2] }}
</label>
<label class="radio-inline">
<input type="radio" name="status" value="3" v-model="status">
<i class="ion ion-eye"></i>
{{ trans('cachet.incidents.status')[3] }}
</label>
<label class="radio-inline">
<input type="radio" name="status" value="4" v-model="status">
<i class="ion ion-checkmark"></i>
{{ trans('cachet.incidents.status')[4] }}
</label>
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.visibility') }}</label>
<select name="visible" class="form-control" v-model="visible">
<option value="1" selected>{{ trans('forms.incidents.public') }}</option>
<option value="0">{{ trans('forms.incidents.logged_in_only') }}</option>
</select>
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.stick_status') }}</label>
<select name="stickied" class="form-control" v-model="sticky">
<option value="1">{{ trans('forms.incidents.stickied') }}</option>
<option value="0" selected>{{ trans('forms.incidents.not_stickied') }}</option>
</select>
</div>
@if(!$components_in_groups->isEmpty() || !$components_out_groups->isEmpty())
<div class="form-group">
<label>{{ trans('forms.incidents.component') }}</label>
<select name="component_id" class="form-control" v-model="component.id">
<option value="" selected></option>
@foreach($components_in_groups as $group)
<optgroup label="{{ $group->name }}">
@foreach($group->components as $component)
<option value="{{ $component->id }}">{{ $component->name }}</option>
@endforeach
</optgroup>
@endforeach
@foreach($components_out_groups as $component)
<option value="{{ $component->id }}">{{ $component->name }}</option>
@endforeach
</optgroup>
@endforeach
@foreach($components_out_groups as $component)
<option value="{{ $component->id }}">{{ $component->name }}</option>
@endforeach
</select>
<span class='help-block'>{{ trans('forms.optional') }}</span>
</div>
@endif
<div class="form-group hidden" id="component-status">
<div class="panel panel-default">
<div class="panel-body">
<div class="radio-items">
@foreach(trans('cachet.components.status') as $statusID => $status)
<div class="radio-inline">
<label>
<input type="radio" name="component_status" value="{{ $statusID }}">
{{ $status }}
</label>
</select>
<span class='help-block'>{{ trans('forms.optional') }}</span>
</div>
@endif
<div class="form-group hidden" id="component-status" v-if="component.id">
<div class="panel panel-default">
<div class="panel-body">
<div class="radio-items">
@foreach(trans('cachet.components.status') as $statusID => $status)
<div class="radio-inline">
<label>
<input type="radio" name="component_status" value="{{ $statusID }}" v-model="component.status">
{{ $status }}
</label>
</div>
@endforeach
</div>
@endforeach
</div>
</div>
</div>
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.message') }}</label>
<div class="markdown-control">
<textarea name="message" class="form-control autosize" rows="5" required v-model="message">{{ Binput::old('message') }}</textarea>
</div>
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.occurred_at') }}</label> <small class="text-muted">{{ trans('forms.optional') }}</small>
<input type="text" name="occurred_at" class="form-control" rel="datepicker-custom" data-date-format="YYYY-MM-DD HH:mm" placeholder="{{ trans('forms.optional') }}">
</div>
<input type="hidden" name="notify" value="0">
<div class="checkbox">
<label>
<input type="checkbox" name="notify" value="1" checked="{{ Binput::old('notify', 'checked') }}">
{{ trans('forms.incidents.notify_subscribers') }}
</label>
</div>
</fieldset>
<div class="form-group">
<label>{{ trans('forms.incidents.message') }}</label>
<div class="markdown-control">
<textarea name="message" class="form-control autosize" rows="5" required>{{ Binput::old('message') }}</textarea>
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.add') }}</button>
<a class="btn btn-default" href="{{ cachet_route('dashboard.incidents') }}">{{ trans('forms.cancel') }}</a>
</div>
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.occurred_at') }}</label> <small class="text-muted">{{ trans('forms.optional') }}</small>
<input type="text" name="occurred_at" class="form-control" rel="datepicker-custom" data-date-format="YYYY-MM-DD HH:mm" placeholder="{{ trans('forms.optional') }}">
</div>
<input type="hidden" name="notify" value="0">
<div class="checkbox">
<label>
<input type="checkbox" name="notify" value="1" checked="{{ Binput::old('notify', 'checked') }}">
{{ trans('forms.incidents.notify_subscribers') }}
</label>
</div>
</fieldset>
<div class="form-group">
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.add') }}</button>
<a class="btn btn-default" href="{{ cachet_route('dashboard.incidents') }}">{{ trans('forms.cancel') }}</a>
</div>
</div>
</form>
</form>
</report-incident>
</div>
</div>
</div>

View File

@@ -1,92 +1,95 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="ion ion-navicon"></i>
</div>
<span class="uppercase">
<i class="ion ion-speedometer"></i> {{ trans('dashboard.dashboard') }}
</span>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
<div class="alert alert-info hidden" id="update-alert">{!! trans('cachet.system.update') !!}</div>
<dashboard inline-template :welcome-user="{{ $welcome_user ? 'true' : 'false' }}">
<div>
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="ion ion-navicon"></i>
</div>
<span class="uppercase">
<i class="ion ion-speedometer"></i> {{ trans('dashboard.dashboard') }}
</span>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="section-components no-select">
@if(!$component_groups->isEmpty() || !$ungrouped_components->isEmpty())
@include('dashboard.partials.components')
@else
<ul class="list-group components">
<li class="list-group-item">
<a href="{{ cachet_route('dashboard.components.create') }}">{{ trans('dashboard.components.add.message') }}</a>
</li>
</ul>
@endif
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-lg-6">
<div class="stats-widget">
<div class="stats-top">
<span class="stats-value"><a href="{{ cachet_route('dashboard.incidents') }}">{{ $incidents->reduce(function($carry, $incident) { return $carry + count($incident); }) }}</a></span>
<span class="stats-label">{{ trans('dashboard.incidents.incidents') }}</span>
</div>
<div class="stats-chart">
<div class="sparkline" data-type="line" data-resize="true" data-height="80" data-width="100%" data-line-width="2" data-min-spot-color="#e65100" data-max-spot-color="#ffb300" data-line-color="#3498db" data-spot-color="#00838f" data-fill-color="#3498db" data-highlight-line-color="#00acc1" data-highlight-spot-color="#ff8a65" data-spot-radius="false" data-data="[{{ $incidents->map(function ($incident) { return count($incident); } )->implode(',') }}]"></div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
<div class="alert alert-info hidden" id="update-alert">{!! trans('cachet.system.update') !!}</div>
</div>
</div>
</div>
<div class="col-sm-12 col-lg-6">
<div class="stats-widget">
<div class="stats-top">
<span class="stats-value"><a href="{{ cachet_route('dashboard.subscribers') }}">{{ $subscribers->reduce(function($carry, $subscribers) { return $carry + count($subscribers); }) }}</a></span>
<span class="stats-label">{{ trans('dashboard.subscribers.subscribers') }}</span>
</div>
<div class="stats-chart">
<div class="sparkline" data-type="line" data-resize="true" data-height="80" data-width="100%" data-line-width="2" data-min-spot-color="#e65100" data-max-spot-color="#ffb300" data-line-color="#3498db" data-spot-color="#00838f" data-fill-color="#3498db" data-highlight-line-color="#00acc1" data-highlight-spot-color="#ff8a65" data-spot-radius="false" data-data="[{{ $subscribers->map(function ($subscriber) { return count($subscriber); } )->implode(',') }}]"></div>
</div>
<div class="row">
<div class="col-md-12">
<div class="section-components no-select">
@if(!$component_groups->isEmpty() || !$ungrouped_components->isEmpty())
@include('dashboard.partials.components')
@else
<ul class="list-group components">
<li class="list-group-item">
<a href="{{ cachet_route('dashboard.components.create') }}">{{ trans('dashboard.components.add.message') }}</a>
</li>
</ul>
@endif
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-lg-6">
<div class="stats-widget">
<div class="stats-top">
<span class="stats-value">{{ trans('dashboard.widgets.support') }}</span>
<span class="stats-label">{!! trans('dashboard.widgets.support_subtitle') !!}</span>
<div class="row">
<div class="col-sm-12 col-lg-6">
<div class="stats-widget">
<div class="stats-top">
<span class="stats-value"><a href="{{ cachet_route('dashboard.incidents') }}">{{ $incidents->reduce(function($carry, $incident) { return $carry + count($incident); }) }}</a></span>
<span class="stats-label">{{ trans('dashboard.incidents.incidents') }}</span>
</div>
<div class="stats-chart">
<div class="sparkline" data-type="line" data-resize="true" data-height="80" data-width="100%" data-line-width="2" data-min-spot-color="#e65100" data-max-spot-color="#ffb300" data-line-color="#3498db" data-spot-color="#00838f" data-fill-color="#3498db" data-highlight-line-color="#00acc1" data-highlight-spot-color="#ff8a65" data-spot-radius="false" data-data="[{{ $incidents->map(function ($incident) { return count($incident); } )->implode(',') }}]"></div>
</div>
</div>
</div>
</div>
</div>
@if($entries)
<div class="col-sm-12 col-lg-6">
<div class="stats-widget">
<div class='stats-top'>
<span class='stats-value'>{{ trans('dashboard.widgets.news') }}</span>
<span class='stats-label'>{{ trans('dashboard.widgets.news_subtitle') }}</span>
</div>
<div class='stats-body'>
<div class="list-group">
@foreach($entries as $entry)
<a class="list-group-item" href="{{ $entry->link }}" target="_blank">{{ $entry->title }}, <small>{{ $entry->pubDate }}</small> <span class="badge"><i class="ion-android-open"></i></span></a>
@endforeach
<div class="col-sm-12 col-lg-6">
<div class="stats-widget">
<div class="stats-top">
<span class="stats-value"><a href="{{ cachet_route('dashboard.subscribers') }}">{{ $subscribers->reduce(function($carry, $subscribers) { return $carry + count($subscribers); }) }}</a></span>
<span class="stats-label">{{ trans('dashboard.subscribers.subscribers') }}</span>
</div>
<div class="stats-chart">
<div class="sparkline" data-type="line" data-resize="true" data-height="80" data-width="100%" data-line-width="2" data-min-spot-color="#e65100" data-max-spot-color="#ffb300" data-line-color="#3498db" data-spot-color="#00838f" data-fill-color="#3498db" data-highlight-line-color="#00acc1" data-highlight-spot-color="#ff8a65" data-spot-radius="false" data-data="[{{ $subscribers->map(function ($subscriber) { return count($subscriber); } )->implode(',') }}]"></div>
</div>
</div>
</div>
</div>
</div>
@endif
</div>
</div>
@includeWhen($welcome_user, 'dashboard.partials.welcome-modal')
<div class="row">
<div class="col-sm-12 col-lg-6">
<div class="stats-widget">
<div class="stats-top">
<span class="stats-value">{{ trans('dashboard.widgets.support') }}</span>
<span class="stats-label">{!! trans('dashboard.widgets.support_subtitle') !!}</span>
</div>
</div>
</div>
@if($entries)
<div class="col-sm-12 col-lg-6">
<div class="stats-widget">
<div class='stats-top'>
<span class='stats-value'>{{ trans('dashboard.widgets.news') }}</span>
<span class='stats-label'>{{ trans('dashboard.widgets.news_subtitle') }}</span>
</div>
<div class='stats-body'>
<div class="list-group">
@foreach($entries as $entry)
<a class="list-group-item" href="{{ $entry->link }}" target="_blank">{{ $entry->title }}, <small>{{ $entry->pubDate }}</small> <span class="badge"><i class="ion-android-open"></i></span></a>
@endforeach
</div>
</div>
</div>
</div>
@endif
</div>
</div>
@includeWhen($welcome_user, 'dashboard.partials.welcome-modal')
</div>
</dashboard>
@stop

View File

@@ -64,9 +64,3 @@
</div>
</div>
</div>
<script>
(function() {
$('#welcome-modal').modal('show');
}());
</script>

View File

@@ -10,38 +10,36 @@
</span>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
@include('dashboard.partials.errors')
<form name="UserForm" class="form-vertical" role="form" action="{{ cachet_route('dashboard.team.invite', [], 'post') }}" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label>{{ trans('forms.user.team.description') }}</label>
<input type="email" class="form-control" name="emails[]" value="{{ Binput::old('emails')[0] }}" placeholder="{{ trans('forms.user.team.email', ['id' => 1]) }}" required>
</div>
<div class="form-group">
<input type="email" class="form-control" name="emails[]" value="{{ Binput::old('emails')[1] }}" placeholder="{{ trans('forms.user.team.email', ['id' => 2]) }}">
</div>
<div class="form-group">
<input type="email" class="form-control" name="emails[]" value="{{ Binput::old('emails')[2] }}" placeholder="{{ trans('forms.user.team.email', ['id' => 3]) }}">
</div>
<div class="form-group">
<input type="email" class="form-control" name="emails[]" value="{{ Binput::old('emails')[3] }}" placeholder="{{ trans('forms.user.team.email', ['id' => 4]) }}">
</div>
<div class="form-group">
<input type="email" class="form-control" name="emails[]" value="{{ Binput::old('emails')[4] }}" placeholder="{{ trans('forms.user.team.email', ['id' => 5]) }}">
</div>
</fieldset>
<invite-team inline-template>
<div class="row">
<div class="col-sm-12">
@include('dashboard.partials.errors')
<form name="UserForm" class="form-vertical" role="form" action="{{ cachet_route('dashboard.team.invite', [], 'post') }}" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label>{{ trans('forms.user.team.description') }}</label>
</div>
<div class="form-group" v-for="(email, index) in emails">
<div :class="{ 'input-group': canRemove }">
<input type="email" class="form-control" name="emails[]" placeholder="{{ trans('forms.user.team.email') }}" v-model="email.email">
<span class="input-group-btn" v-if="canRemove">
<button type="button" @click="remove(index)" class="btn btn-danger">Remove</button>
</span>
</div>
</div>
</fieldset>
<div class="form-group">
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.invite') }}</button>
<a class="btn btn-default" href="{{ cachet_route('dashboard.team') }}">{{ trans('forms.cancel') }}</a>
<div class="form-group">
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.invite') }}</button>
<a class="btn btn-default" href="{{ cachet_route('dashboard.team') }}">{{ trans('forms.cancel') }}</a>
<button type="button" @click="add" class="btn btn-primary">Add</button>
</div>
</div>
</div>
</form>
</form>
</div>
</div>
</div>
</invite-team>
</div>
@stop

View File

@@ -23,7 +23,7 @@
<title>{{ $page_title or $site_title }}</title>
@if($enable_external_dependencies)
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700&subset={{ $font_subset }}" rel="stylesheet" type="text/css">
{{-- <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700&subset={{ $font_subset }}" rel="stylesheet" type="text/css"> --}}
@endif
<link rel="stylesheet" href="{{ mix('dist/css/dashboard/dashboard.css') }}">
@yield('css')
@@ -34,12 +34,16 @@
var Global = {};
Global.locale = '{{ $app_locale }}';
</script>
<script src="{{ mix('dist/js/all.js') }}"></script>
<script src="{{ mix('dist/js/manifest.js') }}"></script>
<script src="{{ mix('dist/js/vendor.js') }}"></script>
</head>
<body class="@yield('bodyClass')">
<div class="content">
<div class="content" id="app">
@yield('content')
</div>
</body>
@yield('js')
<script src="{{ mix('dist/js/all.js') }}"></script>
</html>

View File

@@ -22,6 +22,12 @@
<title>{{ $page_title or $site_title }}</title>
<script>
window.Global = {}
Global.locale = '{{ $app_locale }}';
Global.csrfToken = '{{ csrf_token() }}';
</script>
@if($enable_external_dependencies)
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700&subset={{ $font_subset }}" rel="stylesheet" type="text/css">
@endif
@@ -30,15 +36,12 @@
@include('partials.crowdin')
<script type="text/javascript">
var Global = {};
Global.locale = '{{ $app_locale }}';
</script>
<script src="{{ mix('dist/js/all.js') }}"></script>
<script src="{{ mix('dist/js/manifest.js') }}"></script>
<script src="{{ mix('dist/js/vendor.js') }}"></script>
</head>
<body class="dashboard">
<div class="wrapper">
<div class="wrapper" id="app">
@include('dashboard.partials.sidebar')
<div class="page-content">
@if(!$is_writeable)
@@ -56,6 +59,7 @@
@yield('content')
</div>
</div>
@yield('js')
</body>
@yield('js')
<script src="{{ mix('dist/js/all.js') }}"></script>
</html>

View File

@@ -76,17 +76,19 @@
Global.locale = '{{ $app_locale }}';
</script>
<script src="{{ mix('dist/js/all.js') }}"></script>
<script src="{{ mix('dist/js/manifest.js') }}"></script>
<script src="{{ mix('dist/js/vendor.js') }}"></script>
</head>
<body class="status-page @yield('bodyClass')">
@yield('outer-content')
@include('partials.banner')
<div class="container">
<div class="container" id="app">
@yield('content')
</div>
@yield('bottom-content')
</body>
<script src="{{ mix('dist/js/all.js') }}"></script>
</html>

View File

@@ -26,213 +26,217 @@
<span></span>
</div>
</div>
<div class="clearfix"></div>
<form class="form-horizontal" name="SetupForm" method="POST" id="setup-form" role="form">
<div class="step block-1">
<fieldset>
<div class="form-group">
<div class="row">
<div class="col-xs-4">
<label>{{ trans('forms.setup.cache_driver') }}</label>
<select name="env[cache_driver]" class="form-control" required>
<option disabled>{{ trans('forms.setup.cache_driver') }}</option>
@foreach($cache_drivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Binput::old('env.cache_driver', $cache_config['driver']) == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.cache_driver'))
<span class="text-danger">{{ $errors->first('env.cache_driver') }}</span>
@endif
</div>
<div class="col-xs-4">
<label>{{ trans('forms.setup.queue_driver') }}</label>
<select name="env[queue_driver]" class="form-control" required>
<option disabled>{{ trans('forms.setup.queue_driver') }}</option>
@foreach($queue_drivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Binput::old('env.queue_driver', $queue_config['driver']) == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.queue_driver'))
<span class="text-danger">{{ $errors->first('env.queue_driver') }}</span>
@endif
</div>
<div class="col-xs-4">
<label>{{ trans('forms.setup.session_driver') }}</label>
<select name="env[session_driver]" class="form-control" required>
<option disabled>{{ trans('forms.setup.session_driver') }}</option>
@foreach($cache_drivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Binput::old('env.session_driver', $session_config['driver']) == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.session_driver'))
<span class="text-danger">{{ $errors->first('env.session_driver') }}</span>
@endif
<setup inline-template>
<form class="form-horizontal" name="SetupForm" method="POST" id="setup-form" role="form">
<div class="step block-1">
<fieldset>
<div class="form-group">
<div class="row">
<div class="col-xs-4">
<label>{{ trans('forms.setup.cache_driver') }}</label>
<select name="env[cache_driver]" class="form-control" required v-model="env.cache_driver">
<option disabled>{{ trans('forms.setup.cache_driver') }}</option>
@foreach($cache_drivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Binput::old('env.cache_driver', $cache_config['driver']) == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.cache_driver'))
<span class="text-danger">{{ $errors->first('env.cache_driver') }}</span>
@endif
</div>
<div class="col-xs-4">
<label>{{ trans('forms.setup.queue_driver') }}</label>
<select name="env[queue_driver]" class="form-control" required v-model="env.queue_driver">
<option disabled>{{ trans('forms.setup.queue_driver') }}</option>
@foreach($queue_drivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Binput::old('env.queue_driver', $queue_config['driver']) == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.queue_driver'))
<span class="text-danger">{{ $errors->first('env.queue_driver') }}</span>
@endif
</div>
<div class="col-xs-4">
<label>{{ trans('forms.setup.session_driver') }}</label>
<select name="env[session_driver]" class="form-control" required v-model="env.session_driver">
<option disabled>{{ trans('forms.setup.session_driver') }}</option>
@foreach($cache_drivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Binput::old('env.session_driver', $session_config['driver']) == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.session_driver'))
<span class="text-danger">{{ $errors->first('env.session_driver') }}</span>
@endif
</div>
</div>
</div>
</div>
<hr>
<div class="form-group">
<label>{{ trans('forms.setup.mail_driver') }}</label>
<select name="env[mail_driver]" class="form-control" required>
<option disabled>{{ trans('forms.setup.mail_driver') }}</option>
@foreach($mail_drivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Binput::old('env.mail_driver', $mail_config['driver']) == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.mail_driver'))
<span class="text-danger">{{ $errors->first('env.mail_driver') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.mail_host') }} (optional)</label>
<input type="text" class="form-control" name="env[mail_host]" value="{{ Binput::old('env.mail_host', $mail_config['host']) }}" placeholder="{{ trans('forms.setup.mail_host') }}">
@if($errors->has('env.mail_host'))
<span class="text-danger">{{ $errors->first('env.mail_host') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.mail_address') }}</label>
<input type="text" class="form-control" name="env[mail_address]" value="{{ Binput::old('env.mail_address', $mail_config['from']['address']) }}" placeholder="notifications@alt-three.com">
@if($errors->has('env.mail_address'))
<span class="text-danger">{{ $errors->first('env.mail_address') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.mail_username') }}</label>
<input type="text" class="form-control" name="env[mail_username]" value="{{ Binput::old('env.mail_username', $mail_config['username']) }}" placeholder="{{ trans('forms.setup.mail_username') }}">
@if($errors->has('env.mail_username'))
<span class="text-danger">{{ $errors->first('env.mail_username') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.mail_password') }}</label>
<input type="password" class="form-control" name="env[mail_password]" value="{{ Binput::old('env.mail_password', $mail_config['password']) }}" autocomplete="off" placeholder="{{ trans('forms.setup.mail_password') }}">
@if($errors->has('env.mail_password'))
<span class="text-danger">{{ $errors->first('env.mail_password') }}</span>
@endif
</div>
</fieldset>
<hr>
<div class="form-group text-center">
<span class="wizard-next btn btn-success" data-current-block="1" data-next-block="2" data-loading-text="<i class='icon ion-load-c'></i>">
{{ trans('pagination.next') }}
</span>
</div>
</div>
<div class="step block-2 hidden">
<fieldset>
<div class="form-group">
<label>{{ trans('forms.setup.site_name') }}</label>
<input type="text" name="settings[app_name]" class="form-control" placeholder="{{ trans('forms.setup.site_name') }}" value="{{ Binput::old('settings.app_name', '') }}" required>
@if($errors->has('settings.app_name'))
<span class="text-danger">{{ $errors->first('settings.app_name') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.site_domain') }}</label>
<input type="text" name="settings[app_domain]" class="form-control" placeholder="{{ trans('forms.setup.site_domain') }}" value="{{ Binput::old('settings.app_domain', url('/')) }}" required>
@if($errors->has('settings.app_domain'))
<span class="text-danger">{{ $errors->first('settings.app_domain') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.site_timezone') }}</label>
<select name="settings[app_timezone]" class="form-control" required>
<option value="">{{ trans('forms.general.timezone') }}</option>
@foreach($timezones as $region => $list)
<optgroup label="{{ $region }}">
@foreach($list as $timezone => $name)
<option value="{{ $timezone }}" @if(Binput::old('settings.app_timezone') == $timezone) selected @endif>
{{ $name }}
</option>
@endforeach
</optgroup>
@endforeach
</select>
@if($errors->has('settings.app_timezone'))
<span class="text-danger">{{ $errors->first('settings.app_timezone') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.site_locale') }}</label>
<select name="settings[app_locale]" class="form-control" required>
<option value="">Select Language</option>
@foreach($langs as $key => $lang)
<option value="{{ $key }}" @if(Binput::old('settings.app_locale') == $key || $user_language == $key) selected @endif>
{{ $lang['name'] }}
</option>
@endforeach
</select>
@if($errors->has('settings.app_locale'))
<span class="text-danger">{{ $errors->first('settings.app_locale') }}</span>
@endif
</div>
<div class="form-group">
<label>
<input type="checkbox" name="settings[show_support]" value="1" checked>
{{ trans("setup.show_support") }}
</label>
</div>
<hr>
<div class="form-group">
<label>{{ trans('forms.setup.mail_driver') }}</label>
<select name="env[mail_driver]" class="form-control" required v-model="env.mail_driver">
<option disabled>{{ trans('forms.setup.mail_driver') }}</option>
@foreach($mail_drivers as $driver => $driverName)
<option value="{{ $driver }}" {{ Binput::old('env.mail_driver', $mail_config['driver']) == $driver ? "selected" : null }}>{{ $driverName }}</option>
@endforeach
</select>
@if($errors->has('env.mail_driver'))
<span class="text-danger">{{ $errors->first('env.mail_driver') }}</span>
@endif
</div>
<div class="form-group" v-if="mail.requiresHost">
<label>{{ trans('forms.setup.mail_host') }} (optional)</label>
<input type="text" class="form-control" name="env[mail_host]" value="{{ Binput::old('env.mail_host', $mail_config['host']) }}" placeholder="{{ trans('forms.setup.mail_host') }}">
@if($errors->has('env.mail_host'))
<span class="text-danger">{{ $errors->first('env.mail_host') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.mail_address') }}</label>
<input type="text" class="form-control" name="env[mail_address]" value="{{ Binput::old('env.mail_address', $mail_config['from']['address']) }}" placeholder="notifications@alt-three.com">
@if($errors->has('env.mail_address'))
<span class="text-danger">{{ $errors->first('env.mail_address') }}</span>
@endif
</div>
<div class="form-group" v-if="mail.requiresUsername">
<label>{{ trans('forms.setup.mail_username') }}</label>
<input type="text" class="form-control" name="env[mail_username]" value="{{ Binput::old('env.mail_username', $mail_config['username']) }}" placeholder="{{ trans('forms.setup.mail_username') }}">
@if($errors->has('env.mail_username'))
<span class="text-danger">{{ $errors->first('env.mail_username') }}</span>
@endif
</div>
<div class="form-group" v-if="mail.requiresPassword">
<label>{{ trans('forms.setup.mail_password') }}</label>
<input type="password" class="form-control" name="env[mail_password]" value="{{ Binput::old('env.mail_password', $mail_config['password']) }}" autocomplete="off" placeholder="{{ trans('forms.setup.mail_password') }}">
@if($errors->has('env.mail_password'))
<span class="text-danger">{{ $errors->first('env.mail_password') }}</span>
@endif
</div>
</fieldset>
<hr>
<div class="form-group text-center">
<span class="wizard-next btn btn-info" data-current-block="2" data-next-block="1">
{{ trans('pagination.previous') }}
</span>
<span class="wizard-next btn btn-success" data-current-block="2" data-next-block="3" data-loading-text="<i class='icon ion-load-c'></i>">
<span class="wizard-next btn btn-success" data-current-block="1" data-next-block="2" data-loading-text="<i class='icon ion-load-c'></i>">
{{ trans('pagination.next') }}
</span>
</div>
</fieldset>
</div>
<div class="step block-3 hidden">
<fieldset>
<div class="form-group">
<label>{{ trans("forms.setup.username") }}</label>
<input type="text" name="user[username]" class="form-control" placeholder="{{ trans('forms.setup.username') }}" value="{{ Binput::old('user.username', '') }}" required>
@if($errors->has('user.username'))
<span class="text-danger">{{ $errors->first('user.username') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans("forms.setup.email") }}</label>
<input type="text" name="user[email]" class="form-control" placeholder="{{ trans('forms.setup.email') }}" value="{{ Binput::old('user.email', '') }}" required>
@if($errors->has('user.email'))
<span class="text-danger">{{ $errors->first('user.email') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans("forms.setup.password") }}</label>
<input type="password" name="user[password]" class="form-control password-strength" placeholder="{{ trans('forms.setup.password') }}" value="{{ Binput::old('user.password', '') }}" required>
<div class="strengthify-wrapper"></div>
@if($errors->has('user.password'))
<span class="text-danger">{{ $errors->first('user.password') }}</span>
@endif
</div>
</fieldset>
<hr >
<div class="form-group text-center">
<input type="hidden" name="settings[app_incident_days]" value="7" >
<input type="hidden" name="settings[app_refresh_rate]" value="0" >
<span class="wizard-next btn btn-info" data-current-block="3" data-next-block="2">
{{ trans('pagination.previous') }}
</span>
<span class="wizard-next btn btn-success" data-current-block="3" data-next-block="4" data-loading-text="<i class='icon ion-load-c'></i>">
{{ trans("setup.complete_setup") }}
</span>
</div>
</div>
<div class="step block-4 hidden">
<div class="setup-success">
<i class="ion ion-checkmark-circled"></i>
<h3>
{{ trans("setup.completed") }}
</h3>
<a href="{{ cachet_route('dashboard') }}" class="btn btn-default">
<span>{{ trans("setup.finish_setup") }}</span>
</a>
<div class="step block-2 hidden">
<fieldset>
<div class="form-group">
<label>{{ trans('forms.setup.site_name') }}</label>
<input type="text" name="settings[app_name]" class="form-control" placeholder="{{ trans('forms.setup.site_name') }}" value="{{ Binput::old('settings.app_name', '') }}" required>
@if($errors->has('settings.app_name'))
<span class="text-danger">{{ $errors->first('settings.app_name') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.site_domain') }}</label>
<input type="text" name="settings[app_domain]" class="form-control" placeholder="{{ trans('forms.setup.site_domain') }}" value="{{ Binput::old('settings.app_domain', url('/')) }}" required>
@if($errors->has('settings.app_domain'))
<span class="text-danger">{{ $errors->first('settings.app_domain') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.site_timezone') }}</label>
<select name="settings[app_timezone]" class="form-control" required>
<option value="">{{ trans('forms.general.timezone') }}</option>
@foreach($timezones as $region => $list)
<optgroup label="{{ $region }}">
@foreach($list as $timezone => $name)
<option value="{{ $timezone }}" @if(Binput::old('settings.app_timezone') == $timezone) selected @endif>
{{ $name }}
</option>
@endforeach
</optgroup>
@endforeach
</select>
@if($errors->has('settings.app_timezone'))
<span class="text-danger">{{ $errors->first('settings.app_timezone') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans('forms.setup.site_locale') }}</label>
<select name="settings[app_locale]" class="form-control" required>
<option value="">Select Language</option>
@foreach($langs as $key => $lang)
<option value="{{ $key }}" @if(Binput::old('settings.app_locale') == $key || $user_language == $key) selected @endif>
{{ $lang['name'] }}
</option>
@endforeach
</select>
@if($errors->has('settings.app_locale'))
<span class="text-danger">{{ $errors->first('settings.app_locale') }}</span>
@endif
</div>
<div class="form-group">
<label>
<input type="checkbox" name="settings[show_support]" value="1" checked>
{{ trans("setup.show_support") }}
</label>
</div>
<hr>
<div class="form-group text-center">
<span class="wizard-next btn btn-info" data-current-block="2" data-next-block="1">
{{ trans('pagination.previous') }}
</span>
<span class="wizard-next btn btn-success" data-current-block="2" data-next-block="3" data-loading-text="<i class='icon ion-load-c'></i>">
{{ trans('pagination.next') }}
</span>
</div>
</fieldset>
</div>
</div>
</form>
<div class="step block-3 hidden">
<fieldset>
<div class="form-group">
<label>{{ trans("forms.setup.username") }}</label>
<input type="text" name="user[username]" class="form-control" placeholder="{{ trans('forms.setup.username') }}" value="{{ Binput::old('user.username', '') }}" required>
@if($errors->has('user.username'))
<span class="text-danger">{{ $errors->first('user.username') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans("forms.setup.email") }}</label>
<input type="text" name="user[email]" class="form-control" placeholder="{{ trans('forms.setup.email') }}" value="{{ Binput::old('user.email', '') }}" required>
@if($errors->has('user.email'))
<span class="text-danger">{{ $errors->first('user.email') }}</span>
@endif
</div>
<div class="form-group">
<label>{{ trans("forms.setup.password") }}</label>
<input type="password" name="user[password]" class="form-control password-strength" placeholder="{{ trans('forms.setup.password') }}" value="{{ Binput::old('user.password', '') }}" required>
<div class="strengthify-wrapper"></div>
@if($errors->has('user.password'))
<span class="text-danger">{{ $errors->first('user.password') }}</span>
@endif
</div>
</fieldset>
<hr >
<div class="form-group text-center">
<input type="hidden" name="settings[app_incident_days]" value="7" >
<input type="hidden" name="settings[app_refresh_rate]" value="0" >
<span class="wizard-next btn btn-info" data-current-block="3" data-next-block="2">
{{ trans('pagination.previous') }}
</span>
<span class="wizard-next btn btn-success" data-current-block="3" data-next-block="4" data-loading-text="<i class='icon ion-load-c'></i>">
{{ trans("setup.complete_setup") }}
</span>
</div>
</div>
<div class="step block-4 hidden">
<div class="setup-success">
<i class="ion ion-checkmark-circled"></i>
<h3>
{{ trans("setup.completed") }}
</h3>
<a href="{{ cachet_route('dashboard') }}" class="btn btn-default">
<span>{{ trans("setup.finish_setup") }}</span>
</a>
</div>
</div>
</form>
</setup>
</div>
</div>
@stop

View File

@@ -26,7 +26,7 @@ mix
.options({
processCssUrls: false
})
.js('resources/assets/js/app.js', 'public/dist/js')
.js('resources/assets/js/app.js', 'public/dist/js').extract(['vue'])
.scripts([
'public/dist/js/app.js',
'node_modules/es5-shim/es5-shim.js',