Cachet is now a Laravel 5 app

This commit is contained in:
Joseph Cohen
2015-03-20 18:30:45 -06:00
parent 7cfa158e68
commit b4ac66d727
338 changed files with 4164 additions and 4114 deletions

View File

@@ -0,0 +1,38 @@
@extends('layout.clean')
@section('content')
<div class="login">
<div class="col-xs-12 col-xs-offset-0 col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4 text-center">
<div class="welcome-logo">
<img class="logo" height="50" src="/img/cachet-logo.svg" alt="Cachet">
</div>
<form method="POST" action="/auth/login" accept-charset="UTF-8">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<legend>{{ trans('dashboard.login.welcome') }}</legend>
@if(Session::has('error'))
<p class="text-danger">{{ Session::get('error') }}</p>
@endif
<div class="form-group">
<label class="sr-only">{{ trans('forms.login.email') }}</label>
{!! Form::email('email', Input::old('email'), [
'class' => 'form-control', 'placeholder' => trans('forms.login.email'), 'required' => 'required'
]) !!}
</div>
<div class="form-group">
<label class="sr-only">{{ trans('forms.login.password') }}</label>
{!! Form::password('password', [
'class' => 'form-control', 'placeholder' => trans('forms.login.password'), 'required' => 'required'
]) !!}
</div>
<hr>
<div class="form-group">
<button type="submit" class="btn btn-lg btn-block btn-success">{{ trans('dashboard.login.login') }}</button>
</div>
</fieldset>
</form>
</div>
</div>
@stop

View File

@@ -0,0 +1,31 @@
@extends('layout.clean')
@section('content')
<div class="login">
<div class="col-xs-12 col-xs-offset-0 col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4 text-center">
<div class="welcome-logo">
<img class="logo" height="50" src="{{ url('img/cachet-logo.svg') }}" alt="Cachet">
</div>
{{ Form::open() }}
<fieldset>
<legend>{{ trans('dashboard.login.two-factor') }}</legend>
@if(Session::has('error'))
<p class="text-danger">{{ Session::get('error') }}</p>
@endif
<div class="form-group">
<label class="sr-only">{{ trans('forms.login.2fauth') }}</label>
{{ Form::text('code', null, [
'class' => 'form-control', 'placeholder' => trans('forms.login.2fauth'), 'required' => 'required'
]) }}
</div>
<hr />
<div class="form-group">
<button type="submit" class="btn btn-lg btn-block btn-success">{{ trans('dashboard.login.login') }}</button>
</div>
</fieldset>
{{ Form::close() }}
</div>
</div>
@stop

View File

@@ -0,0 +1,70 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icons ion-outlet"></i> {{ trans('dashboard.components.components') }}
</span>
&gt; <small>{{ trans('dashboard.components.add.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<form name="CreateComponentForm" class="form-vertical" role="form" action="/dashboard/components/add" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="component-name">{{ trans('forms.components.name') }}</label>
<input type="text" class="form-control" name="component[name]" id="component-name" required>
</div>
<div class="form-group">
<label for="component-status">{{ trans('forms.components.status') }}</label>
<select name="component[status]" class="form-control">
@foreach(trans('cachet.components.status') as $statusID => $status)
<option value="{{ $statusID }}">{{ $status }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label>{{ trans('forms.components.description') }}</label>
<textarea name="component[description]" class="form-control" rows="5"></textarea>
</div>
<input type="hidden" name="component[group_id]" value="0">
@if($groups->count() > 0)
<div class="form-group">
<label>{{ trans('forms.components.group') }}</label>
<select name="component[group_id]" class="form-control">
<option selected></option>
@foreach($groups as $group)
<option value="{{ $group->id }}">{{ $group->name }}</option>
@endforeach
</select>
</div>
@endif
<hr>
<div class="form-group">
<label>{{ trans('forms.components.link') }}</label>
<input type="text" name="component[link]" class="form-control">
</div>
<div class="form-group">
<label>{{ trans('forms.components.tags') }}</label>
<input name="component[tags]" class="form-control">
<span class="help-block">{{ trans('forms.components.tags-help') }}</span>
</div>
</fieldset>
<input type="hidden" name="component[order]" value="0">
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.create') }}</button>
<a class="btn btn-default" href="{{ route('dashboard.components') }}">{{ trans('forms.cancel') }}</a>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,71 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icons ion-outlet"></i> {{ trans('dashboard.components.components') }}
</span>
&gt; <small>{{ trans('dashboard.components.edit.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<form name="EditComponentForm" class="form-vertical" role="form" action="/dashboard/components/{{ $component->id }}/edit" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="incident-name">{{ trans('forms.components.name') }}</label>
<input type="text" class="form-control" name="component[name]" id="component-name" required value="{{ $component->name }}">
</div>
<div class="form-group">
<label for="component-status">{{ trans('forms.components.status') }}</label>
<select name="component[status]" class="form-control">
@foreach(trans('cachet.components.status') as $statusID => $status)
<option value="{{ $statusID }}" {{ $statusID === $component->status ? "selected" : "" }}>{{ $status }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label>{{ trans('forms.components.description') }}</label>
<textarea name="component[description]" class="form-control" rows="5">{{ $component->description }}</textarea>
</div>
<input type="hidden" name="component[group_id]" value="0">
@if($groups->count() > 0)
<div class="form-group">
<label>{{ trans('forms.components.group') }}</label>
<select name="component[group_id]" class="form-control">
<option {{ $component->group_id === null ? 'selected' : null }}></option>
@foreach($groups as $group)
<option value="{{ $group->id }}" {{ $component->group_id === $group->id ? 'selected' : null }}>{{ $group->name }}</option>
@endforeach
</select>
</div>
@endif
<hr>
<div class="form-group">
<label>{{ trans('forms.components.link') }}</label>
<input type="text" name="component[link]" class="form-control" value="{{ $component->link }}">
</div>
<div class="form-group">
<label>{{ trans('forms.components.tags') }}</label>
<input name="component[tags]" class="form-control" value="{{ $component->tagsList }}">
<span class="help-block">{{ trans('forms.components.tags-help') }}</span>
</div>
</fieldset>
<input type="hidden" name="component[user_id]" value="{{ $component->agent_id || $loggedUser->id }}">
<input type="hidden" name="component[order]" value="{{ $component->order or 0 }}">
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.save') }}</button>
<a class="btn btn-default" href="{{ route('dashboard.components') }}">{{ trans('forms.cancel') }}</a>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,34 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icons ion-ios-keypad"></i> {{ trans_choice('dashboard.components.groups.groups', 2) }}
</span>
&gt; <small>{{ trans('dashboard.components.groups.add.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<form name="CreateComponentGroupForm" class="form-vertical" role="form" action="/dashboard/components/groups/add" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="incident-name">{{ trans('forms.components.groups.name') }}</label>
<input type="text" class="form-control" name="group[name]" id="group-name" required>
</div>
</fieldset>
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.add') }}</button>
<a class="btn btn-default" href="{{ route('dashboard.components.groups') }}">{{ trans('forms.cancel') }}</a>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,34 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icons ion-ios-keypad"></i> {{ trans_choice('dashboard.components.groups.groups', 2) }}
</span>
&gt; <small>{{ trans('dashboard.components.groups.edit.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<form name="EditComponentGroupForm" class="form-vertical" role="form" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="incident-name">{{ trans('forms.components.groups.name') }}</label>
<input type="text" class="form-control" name="group[name]" id="group-name" value="{{ $group->name }}" required>
</div>
</fieldset>
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.save') }}</button>
<a class="btn btn-default" href="{{ route('dashboard.components.groups') }}">{{ trans('forms.cancel') }}</a>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,37 @@
@extends('layout.dashboard')
@section('content')
<div class="content-panel">
@if(isset($subMenu))
@include('partials.dashboard.sub-sidebar')
@endif
<div class="content-wrapper">
<div class="header sub-header">
<span class="uppercase">
<i class="icons ion-ios-keypad"></i> {{ trans_choice('dashboard.components.groups.groups', 2) }}
</span>
<a class="btn btn-sm btn-success pull-right" href="{{ route('dashboard.components.groups.add') }}">
{{ trans('dashboard.components.groups.add.title') }}
</a>
<div class="clearfix"></div>
</div>
<div class="row">
<div class="col-sm-12 striped-list">
@forelse($groups as $group)
<div class="row striped-list-item">
<div class="col-xs-6">
<strong>{{ $group->name }}</strong> <span class="label label-info">{{ $group->components->count() }}</span>
</div>
<div class="col-xs-6 text-right">
<a href="{{ route('dashboard.components.groups.edit', [$group->id]) }}" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/components/groups/{{ $group->id }}/delete" class="btn btn-danger confirm-action" data-method="DELETE">{{ trans('forms.delete') }}</a>
</div>
</div>
@empty
<div class="list-group-item text-danger">{{ trans('dashboard.components.add.message') }}</div>
@endforelse
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,51 @@
@extends('layout.dashboard')
@section('content')
<div class="content-panel">
@if(isset($subMenu))
@include('partials.dashboard.sub-sidebar')
@endif
<div class="content-wrapper">
<div class="header sub-header">
<span class="uppercase">
<i class="icons ion-outlet"></i> {{ trans('dashboard.components.components') }}
</span>
<a class="btn btn-sm btn-success pull-right" href="{{ route('dashboard.components.add') }}">
{{ trans('dashboard.components.add.title') }}
</a>
<div class="clearfix"></div>
</div>
<div class="row">
<form name="componentList">
<div class="col-sm-12 striped-list" id="component-list">
@forelse($components as $component)
<div class="row striped-list-item">
<div class="col-xs-6">
<h4>
@if($components->count() > 1)
<span class="drag-handle"><i class="ion-drag"></i></span>
@endif
{{ $component->name }} <small>{{ $component->humanStatus }}</small>
</h4>
@if($component->group)
<p><small>{{ trans('dashboard.components.listed_group', ['name' => $component->group->name]) }}</small></p>
@endif
@if($component->description)
<p>{{ $component->description }}</p>
@endif
</div>
<div class="col-xs-6 text-right">
<a href="/dashboard/components/{{ $component->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/components/{{ $component->id }}/delete" class="btn btn-danger confirm-action" data-method="DELETE">{{ trans('forms.delete') }}</a>
</div>
<input type="hidden" rel="order" name="component[{{ $component->id }}]" value="{{ $component->order }}">
</div>
@empty
<div class="list-group-item text-danger">{{ trans('dashboard.components.add.message') }}</div>
@endforelse
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,102 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-android-alert"></i> {{ trans('dashboard.incidents.incidents') }}
</span>
&gt; <small>{{ trans('dashboard.incidents.add.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
@include('partials.dashboard.errors')
<form class="form-vertical" name="IncidentForm" role="form" method="POST" autocomplete="off">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
@if($incidentTemplates->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($incidentTemplates 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="incident[name]" id="incident-name" required value="{{ Input::old('incident.name') }}">
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.status') }}</label><br>
<label class="radio-inline">
<input type="radio" name="incident[status]" value="1">
<i class="icon ion-flag"></i>
{{ trans('cachet.incidents.status')[1] }}
</label>
<label class="radio-inline">
<input type="radio" name="incident[status]" value="2">
<i class="icon ion-alert-circled"></i>
{{ trans('cachet.incidents.status')[2] }}
</label>
<label class="radio-inline">
<input type="radio" name="incident[status]" value="3">
<i class="icon ion-eye"></i>
{{ trans('cachet.incidents.status')[3] }}
</label>
<label class="radio-inline">
<input type="radio" name="incident[status]" value="4">
<i class="icon ion-checkmark"></i>
{{ trans('cachet.incidents.status')[4] }}
</label>
</div>
@if($components->count() > 0)
<div class="form-group">
<label>{{ trans('forms.incidents.component') }}</label>
<select name='incident[component_id]' class='form-control'>
<option value='0' selected></option>
@foreach($components 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="well">
<div class="radio-items">
@foreach(trans('cachet.components.status') as $statusID => $status)
<div class="radio-inline">
<label>
<input type="radio" name="incident[component_status]" value="{{ $statusID }}" >
{{ $status }}
</label>
</div>
@endforeach
</div>
</div>
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.message') }}</label>
<div class='markdown-control'>
<textarea name="incident[message]" class="form-control" rows="5" required>{{ Input::old('incident.message') }}</textarea>
</div>
</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="{{ route('dashboard.incidents') }}">{{ trans('forms.cancel') }}</a>
</div>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,93 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-android-alert"></i> {{ trans('dashboard.incidents.incidents') }}
</span>
&gt; <small>{{ trans('dashboard.incidents.edit.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
@include('partials.dashboard.errors')
<form class="form-vertical" name="IncidentForm" role="form" method="POST" autocomplete="off">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.name') }}</label>
<input type="text" class="form-control" name="incident[name]" id="incident-name" required value="{{$incident->name}}">
</div>
<div class="form-group">
<label for="incident-name">{{ trans('forms.incidents.status') }}</label><br>
<label class="radio-inline">
<input type="radio" name="incident[status]" value="1" {{ ($incident->status == 1) ? "checked=checked" : "" }}>
<i class="icon ion-flag"></i>
{{ trans('cachet.incidents.status')[1] }}
</label>
<label class="radio-inline">
<input type="radio" name="incident[status]" value="2" {{ ($incident->status == 2) ? "checked=checked" : "" }}>
<i class="icon ion-alert-circled"></i>
{{ trans('cachet.incidents.status')[2] }}
</label>
<label class="radio-inline">
<input type="radio" name="incident[status]" value="3" {{ ($incident->status == 3) ? "checked=checked" : "" }}>
<i class="icon ion-eye"></i>
{{ trans('cachet.incidents.status')[3] }}
</label>
<label class="radio-inline">
<input type="radio" name="incident[status]" value="4" {{ ($incident->status == 4) ? "checked=checked" : "" }}>
<i class="icon ion-checkmark"></i>
{{ trans('cachet.incidents.status')[4] }}
</label>
</div>
@if($components->count() > 0)
<div class='form-group'>
<label>{{ trans('forms.incidents.component') }}</label>
<select name='incident[component_id]' class='form-control'>
<option value='0' {{ $incident->id === 0 ? "selected" : null }}></option>
@foreach($components as $component)
<option value='{{ $component->id }}' {{ $incident->component_id === $component->id ? "selected" : null }}>{{ $component->name }}</option>
@endforeach
</select>
<span class='help-block'>{{ trans('forms.optional') }}</span>
</div>
<div class="form-group {{ $incident->component_id === 0 ? 'hidden' : null }}" id='component-status'>
<div class="well">
<div class="radio-items">
@foreach(trans('cachet.components.status') as $statusID => $status)
<div class="radio-inline">
<label>
<input type="radio" name="incident[component_status]" value="{{ $statusID }}" {{ $incident->component_id > 0 && $incident->component->status === $statusID ? 'checked' : null }}>
{{ $status }}
</label>
</div>
@endforeach
</div>
</div>
</div>
@endif
<div class="form-group">
<label>{{ trans('forms.incidents.message') }}</label>
<div class='markdown-control'>
<textarea name="incident[message]" class="form-control" rows="5" required>{{ $incident->message }}</textarea>
</div>
</div>
</fieldset>
<input type="hidden" name="incident[id]" value={{$incident->id}}>
<div class="form-group">
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.update') }}</button>
<a class="btn btn-default" href="{{ route('dashboard.incidents') }}">{{ trans('forms.cancel') }}</a>
</div>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,43 @@
@extends('layout.dashboard')
@section('content')
<div class="content-panel">
@if(isset($subMenu))
@include('partials.dashboard.sub-sidebar')
@endif
<div class="content-wrapper">
<div class="header sub-header">
<span class="uppercase">
<i class="icon ion-android-alert"></i> {{ trans('dashboard.incidents.incidents') }}
</span>
<a class="btn btn-sm btn-success pull-right" href="{{ route('dashboard.incidents.add') }}">
{{ trans('dashboard.incidents.add.title') }}
</a>
<div class="clearfix"></div>
</div>
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<p class="lead">{{ trans_choice('dashboard.incidents.logged', $incidents->count(), ['count' => $incidents->count()]) }}</p>
<div class="striped-list">
@foreach($incidents as $incident)
<div class="row striped-list-item">
<div class="col-xs-6">
<i class="{{ $incident->icon }}"></i> <strong>{{ $incident->name }}</strong>
@if($incident->message)
<p><small>{{ Str::words($incident->message, 5) }}</small></p>
@endif
</div>
<div class="col-xs-6 text-right">
<a href="/dashboard/incidents/{{ $incident->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/incidents/{{ $incident->id }}/delete" class="btn btn-danger confirm-action" data-method='DELETE'>{{ trans('forms.delete') }}</a>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,39 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-plus"></i> {{ trans('dashboard.incidents.templates.title') }}
</span>
&gt; <small>{{ trans('dashboard.incidents.templates.add.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
@include('partials.dashboard.errors')
<form class="form-vertical" name="IncidentForm" role="form" method="POST" autocomplete="off">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="template-name">{{ trans('forms.incidents.templates.name') }}</label>
<input type="text" class="form-control" name="template[name]" id="template-name" required>
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.templates.template') }}</label>
<div class='markdown-control'>
<textarea name="template[template]" class="form-control" rows="5" required></textarea>
</div>
</div>
</fieldset>
<div class="form-group">
<button type="submit" class="btn btn-success">{{ trans('forms.create') }}</button>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,48 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-document"></i> {{ trans('dashboard.incidents.templates.title') }}
</span>
&gt; <small>{{ trans('dashboard.incidents.templates.edit.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
@if($updatedTemplate = Session::get('updatedTemplate'))
<div class="alert alert-{{ $updatedTemplate->isValid() ? 'success' : 'danger' }}">
@if($updatedTemplate->isValid())
{{ sprintf("<strong>%s</strong> %s", trans('dashboard.notifications.awesome'), trans('dashboard.incidents.templates.edit.success')) }}
@else
{{ sprintf("<strong>%s</strong> %s", trans('dashboard.notifications.whoops'), trans('dashboard.incidents.templates.edit.failure').' '.$updatedTemplate->getErrors()) }}
@endif
</div>
@endif
<form class='form-vertical' name='IncidentTemplateForm' role='form' method='POST'>
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="template-name">{{ trans('forms.incidents.templates.name') }}</label>
<input type="text" class="form-control" name="template[name]" id="template-name" required value="{{ $template->name }}">
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.templates.template') }}</label>
<div class='markdown-control'>
<textarea name="template[template]" class="form-control" rows="5" required>{{ $template->template }}</textarea>
</div>
</div>
</fieldset>
<div class="form-group">
<button type="submit" class="btn btn-success">{{ trans('forms.update') }}</button>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,35 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-document-text"></i> {{ trans('dashboard.incidents.templates.title') }}
</span>
<a class="btn btn-sm btn-success pull-right" href="{{ route('dashboard.templates.add') }}">
{{ trans('dashboard.incidents.templates.add.title') }}
</a>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
<div class="striped-list">
@foreach($incidentTemplates as $template)
<div class="row striped-list-item">
<div class="col-xs-6">
<strong>{{ $template->name }}</strong>
<p><small>{{ $template->template }}</small></p>
</div>
<div class="col-xs-6 text-right">
<a href="/dashboard/templates/{{ $template->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/templates/{{ $template->id }}/delete" class="btn btn-danger confirm-action" data-method='DELETE'>{{ trans('forms.delete') }}</a>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,55 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-speedometer"></i> {{ trans('dashboard.dashboard') }}
</span>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
<h4 class="sub-header">{{ trans('dashboard.components.component_statuses') }}</h4>
<div class="panel panel-default">
<div class="list-group">
@forelse($components as $component)
<div class="list-group-item">
<form class='component-inline form-vertical' data-messenger="{{trans('dashboard.components.edit.success')}}">
<div class="row striped-list-item">
<div class="col-lg-4 col-sm-12">
<h4>{{ $component->name }}</h4>
</div>
<div class="col-lg-8 col-sm-12 radio-items componet-inline-update">
@foreach(trans('cachet.components.status') as $statusID => $status)
<div class="radio-inline">
<label>
<input type="radio" name="status" value="{{ $statusID }}" {{ (int) $component->status === $statusID ? 'checked' : null }}>
{{ $status }}
</label>
</div>
@endforeach
</div>
</div>
<input type="hidden" name="component_id" value="{{ $component->id }}">
</form>
</div>
@empty
<div class="list-group-item text-danger">{{ trans('dashboard.components.add.message') }}</div>
@endforelse
</div>
</div>
</div>
</div>
</div>
@if(Session::get('setup.done'))
@include('partials.dashboard.welcome-modal')
<script>
$(function() {
$('#welcome-modal').modal('show');
});
</script>
@endif
@stop

View File

@@ -0,0 +1,61 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-stats-bars"></i> {{ trans('dashboard.metrics.metrics') }}
</span>
> <small>{{ trans('dashboard.metrics.add.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
@include('partials.dashboard.errors')
<form class='form-vertical' name='MetricsForm' role='form' method='POST'>
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="metric-name">{{ trans('forms.metrics.name') }}</label>
<input type="text" class="form-control" name="metric[name]" id="metric-name" required value="{{ Input::old('metric.name') }}">
</div>
<div class="form-group">
<label for="metric-suffix">{{ trans('forms.metrics.suffix') }}</label>
<input type="text" class="form-control" name="metric[suffix]" id="metric-suffix" required value="{{ Input::old('metric.suffix') }}">
</div>
<div class="form-group">
<label>{{ trans('forms.metrics.description') }}</label>
<div class='markdown-control'>
<textarea name="metric[description]" class="form-control" rows="5">{{ Input::old('metric.description') }}</textarea>
</div>
</div>
<div class="form-group">
<label>{{ trans('forms.metrics.calc_type') }}</label>
<select name="metric[calc_type]" class="form-control" required>
<option value="0" selected>{{ trans('forms.metrics.type_sum') }}</option>
<option value="1">{{ trans('forms.metrics.type_avg') }}</option>
</select>
</div>
<div class="form-group">
<label for="metric-default_value">{{ trans('forms.metrics.default-value') }}</label>
<input type="number" class="form-control" name="metric[default_value]" id="metric-default_value" value="{{ Input::old('metric.default_value') }}">
</div>
<div class="form-group">
<label>{{ trans('forms.metrics.display-chart') }}</label>
<input type="hidden" value="0" name="metric[display_chart]">
<input type="checkbox" value="1" name="metric[display_chart]" class="form-control" checked>
</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="{{ route('dashboard.metrics') }}">{{ trans('forms.cancel') }}</a>
</div>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,64 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon icon ion-android-alert"></i> {{ trans('dashboard.metrics.metrics') }}
</span>
> <small>{{ trans('dashboard.metrics.edit.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
@include('partials.dashboard.errors')
<form class='form-vertical' name='MetricsForm' role='form' method='POST'>
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label for="metric-name">{{ trans('forms.metrics.name') }}</label>
<input type="text" class="form-control" name="metric[name]" id="metric-name" required value={{ $metric->name }}>
</div>
<div class="form-group">
<label for="metric-suffix">{{ trans('forms.metrics.suffix') }}</label>
<input type="text" class="form-control" name="metric[suffix]" id="metric-suffix" required value="{{ $metric->suffix }}">
</div>
<div class="form-group">
<label>{{ trans('forms.metrics.description') }}</label>
<div class='markdown-control'>
<textarea name="metric[description]" class="form-control" rows="5">{{ $metric->description }}</textarea>
</div>
</div>
<div class="form-group">
<label>{{ trans('forms.metrics.calc_type') }}</label>
<select name="metric[calc_type]" class="form-control" required>
<option value="0" {{ $metric->calc_type === 0 ? "selected" : null }}>{{ trans('forms.metrics.type_sum') }}</option>
<option value="1" {{ $metric->calc_type === 1 ? "selected" : null }}>{{ trans('forms.metrics.type_avg') }}</option>
</select>
</div>
<div class="form-group">
<label for="metric-default_value">{{ trans('forms.metrics.default-value') }}</label>
<input type="number" class="form-control" name="metric[default_value]" id="metric-default_value" value="{{ $metric->default_value }}">
</div>
<div class="form-group">
<label>{{ trans('forms.metrics.display-chart') }}</label>
<input type="hidden" value="0" name="metric[display_chart]">
<input type="checkbox" value="1" name="metric[display_chart]" class="form-control" {{ $metric->display_chart ? 'checked' : null }}>
</div>
</fieldset>
<input type="hidden" name="metric[id]" value={{$metric->id}}>
<div class='form-group'>
<div class='btn-group'>
<button type="submit" class="btn btn-success">{{ trans('forms.update') }}</button>
<a class="btn btn-default" href="{{ route('dashboard.metrics') }}">{{ trans('forms.cancel') }}</a>
</div>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,39 @@
@extends('layout.dashboard')
@section('content')
<div class="header fixed">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-stats-bars"></i> {{ trans('dashboard.metrics.metrics') }}
</span>
<a class="btn btn-sm btn-success pull-right" href="{{ route('dashboard.metrics.add') }}">
{{ trans('dashboard.metrics.add.title') }}
</a>
<div class="clearfix"></div>
</div>
<div class="content-wrapper header-fixed">
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<div class="striped-list">
@foreach($metrics as $metric)
<div class="row striped-list-item">
<div class="col-md-6">
<i class="{{ $metric->icon }}"></i> <strong>{{ $metric->name }}</strong>
@if($metric->description)
<p><small>{{ Str::words($metric->description, 5) }}</small></p>
@endif
</div>
<div class="col-md-6 text-right">
<a href="/dashboard/metrics/{{ $metric->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/metrics/{{ $metric->id }}/delete" class="btn btn-danger confirm-action" data-method='DELETE'>{{ trans('forms.delete') }}</a>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,15 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<i class="ion ion-email"></i> {{ trans('dashboard.notifications.notifications') }}
</div>
<div class="row">
<div class="col-sm-12">
<h3>{{ trans('dashboard.notifications.notifications') }}</h3>
</div>
</div>
@stop

View File

@@ -0,0 +1,57 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-android-calendar"></i> {{ trans('dashboard.schedule.schedule') }}
</span>
&gt; <small>{{ trans('dashboard.schedule.add.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
@include('partials.dashboard.errors')
<form class='form-vertical' name='ScheduleForm' role='form' method='POST' autocomplete="off">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
@if($incidentTemplates->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($incidentTemplates 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="incident[name]" id="incident-name" required value="{{ Input::old('incident.name') }}">
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.message') }}</label>
<div class='markdown-control'>
<textarea name="incident[message]" class="form-control" rows="5" required>{{ Input::old('incident.message') }}</textarea>
</div>
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.scheduled_at') }}</label>
<input type="text" name="incident[scheduled_at]" class="form-control" rel="datepicker" required>
</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="{{ route('dashboard.schedule') }}">{{ trans('forms.cancel') }}</a>
</div>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,57 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-android-calendar"></i> {{ trans('dashboard.schedule.schedule') }}
</span>
&gt; <small>{{ trans('dashboard.schedule.edit.title') }}</small>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-md-12">
@include('partials.dashboard.errors')
<form class='form-vertical' name='ScheduleForm' role='form' method='POST' autocomplete="off">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
@if($incidentTemplates->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($incidentTemplates 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="incident[name]" id="incident-name" required value="{{ $schedule->name }}">
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.message') }}</label>
<div class='markdown-control'>
<textarea name="incident[message]" class="form-control" rows="5" required>{{ $schedule->message }}</textarea>
</div>
</div>
<div class="form-group">
<label>{{ trans('forms.incidents.scheduled_at') }}</label>
<input type="text" name="incident[scheduled_at]" class="form-control" rel="datepicker" value="{{ $schedule->scheduled_at_datetimepicker }}" required>
</div>
</fieldset>
<div class="form-group">
<div class="btn-group">
<button type="submit" class="btn btn-success">{{ trans('forms.save') }}</button>
<a class="btn btn-default" href="{{ route('dashboard.schedule') }}">{{ trans('forms.cancel') }}</a>
</div>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,44 @@
@extends('layout.dashboard')
@section('content')
<div class="content-panel">
@if(isset($subMenu))
@include('partials.dashboard.sub-sidebar')
@endif
<div class="content-wrapper">
<div class="header sub-header">
<span class="uppercase">
<i class="icon ion-android-calendar"></i> {{ trans('dashboard.schedule.schedule') }}
</span>
<a class="btn btn-sm btn-success pull-right" href="{{ route('dashboard.schedule.add') }}">
{{ trans('dashboard.schedule.add.title') }}
</a>
<div class="clearfix"></div>
</div>
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<div class="striped-list">
@foreach($schedule as $incident)
<div class="row striped-list-item">
<div class="col-xs-6">
<strong>{{ $incident->name }}</strong>
<br>
{{ trans('dashboard.schedule.scheduled_at', ['timestamp' => $incident->scheduled_at_iso]) }}
@if($incident->message)
<p><small>{{ Str::words($incident->message, 5) }}</small></p>
@endif
</div>
<div class="col-xs-6 text-right">
<a href="/dashboard/schedule/{{ $incident->id }}/edit" class="btn btn-default">{{ trans('forms.edit') }}</a>
<a href="/dashboard/schedule/{{ $incident->id }}/delete" class="btn btn-danger confirm-action" data-method='DELETE'>{{ trans('forms.delete') }}</a>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,166 @@
@extends('layout.dashboard')
@section('content')
<div class="content-panel">
@if(isset($subMenu))
@include('partials.dashboard.sub-sidebar')
@endif
<div class="content-wrapper">
<div class="header sub-header" id="application-setup">
<span class="uppercase">
{{ trans('dashboard.settings.app-setup.app-setup') }}
</span>
</div>
<div class="row">
<div class="col-sm-12">
<form id="settings-form" name="SettingsForm" class="form-vertical" role="form" action="/dashboard/settings" method="POST" enctype="multipart/form-data">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
@include('partials.dashboard.errors')
<fieldset>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.site-name') }}</label>
<input type="text" class="form-control" name="app_name" value="{{ Setting::get('app_name') }}" required>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.site-url') }}</label>
<input type="text" class="form-control" name="app_domain" value="{{ Setting::get('app_domain') }}" required>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.about-this-page') }}</label>
<div class='markdown-control'>
<textarea name="app_about" class="form-control" rows="4">{{ Setting::get('app_about') }}</textarea>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.google-analytics') }}</label>
<input type="text" name="app_analytics" class="form-control" value="{{ Setting::get('app_analytics') }}" placeholder="UA-12345-12">
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.site-timezone') }}</label>
<select name="app_timezone" class="form-control" required>
<option value="">Select Timezone</option>
@foreach($timezones as $region => $list)
<optgroup label="{{ $region }}">
@foreach($list as $timezone => $name)
<option value="{{ $timezone }}" @if(Setting::get('app_timezone') == $timezone) selected @endif>
{{ $name }}
</option>
@endforeach
</optgroup>
@endforeach
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>
{{ trans('forms.settings.app-setup.date-format') }}
<a href="http://php.net/manual/en/function.date.php" target="_blank"><i class="icon ion-help-circled"></i></a>
</label>
<input type="text" class="form-control" name="date_format" value="{{ Setting::get('date_format') ?: 'jS F Y' }}">
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.site-locale') }}</label>
<select name="app_locale" class="form-control" required>
<option value="">Select Language</option>
@foreach($langs as $lang => $name)
<option value="{{ $lang }}" @if(Setting::get('app_locale') == $lang) selected @endif>
{{ $name }}
</option>
@endforeach
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.days-of-incidents') }}</label>
<input type="number" min="1" max="100" name="app_incident_days" class="form-control" value="{{ Setting::get('app_incident_days') ?: 7 }}">
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.display-graphs') }}</label>
<input type="hidden" value="0" name="display_graphs">
<input type="checkbox" value="1" name="display_graphs" class="form-control" {{ Setting::get('display_graphs') ? 'checked' : null }}>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('setup.show_support') }}</label>
<input type="hidden" value="0" name="show_support">
<input type="checkbox" value="1" name="show_support" class="form-control" {{ Setting::get('show_support') ? 'checked' : null }}>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('setup.allow_tracking') }}</label>
<input type="hidden" value="0" name="app_track">
<input type="checkbox" value="1" name="app_track" class="form-control" {{ Setting::get('app_track') ? 'checked' : null }}>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.app-setup.banner') }}</label>
@if($banner = Setting::get('app_banner'))
<div id="banner-view" class="well">
<img src="data:{{ Setting::get('app_banner_type') }};base64,{{ $banner }}" style="max-width: 100%">
<br><br>
<button id="remove-banner" class="btn btn-danger">{{ trans('forms.remove') }}</button>
</div>
@endif
<input type="file" name="app_banner" class="form-control">
<span class="help-block">{{ trans('forms.settings.app-setup.banner-help') }}</span>
</div>
</div>
</div>
</fieldset>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<button type="submit" class="btn btn-success">{{ trans('forms.save') }}</button>
</div>
</div>
</div>
<input type="hidden" name="remove_banner" value="">
</form>
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,61 @@
@extends('layout.dashboard')
@section('content')
<div class="content-panel">
@if(isset($subMenu))
@include('partials.dashboard.sub-sidebar')
@endif
<div class="content-wrapper">
<div class="header sub-header" id="security">
<span class="uppercase">
{{ trans('dashboard.settings.security.security') }}
</span>
</div>
<div class="row">
<div class="col-sm-12">
<form name="SettingsForm" class="form-vertical" role="form" action="/dashboard/settings" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
@include('partials.dashboard.errors')
<fieldset>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.security.allowed-domains') }}</label>
<textarea class="form-control" name="allowed_domains" rows="5" placeholder="http://cachet.io, http://cachet.herokuapp.com">{{ Setting::get('allowed_domains') }}</textarea>
<div class="help-block">
{{ trans('forms.settings.security.allowed-domains-help') }}
</div>
</div>
</div>
</div>
</fieldset>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<button type="submit" class="btn btn-success">{{ trans('forms.save') }}</button>
</div>
</div>
</div>
@if(! $unsecureUsers->isEmpty())
<hr>
<div class="panel panel-danger">
<div class="panel-heading">{{ trans('dashboard.settings.security.two-factor') }}</div>
<div class="list-group">
@foreach($unsecureUsers as $user)
<div class="list-group-item">
<strong>{{ $user->username }}</strong>
<span class="label label-danger pull-right"><i class="ion-ios-unlocked"></i></span>
</div>
@endforeach
</div>
</div>
@endif
</form>
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,42 @@
@extends('layout.dashboard')
@section('content')
<div class="content-panel">
@if(isset($subMenu))
@include('partials.dashboard.sub-sidebar')
@endif
<div class="content-wrapper">
<div class="header sub-header" id="stylesheet">
<span class="uppercase">
{{ trans('dashboard.settings.stylesheet.stylesheet') }}
</span>
</div>
<div class="row">
<div class="col-sm-12">
<form name="SettingsForm" class="form-vertical" role="form" action="/dashboard/settings" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
@include('partials.dashboard.errors')
<fieldset>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label>{{ trans('forms.settings.stylesheet.custom-css') }}</label>
<textarea class="form-control" name="stylesheet" rows="10">{{ Setting::get('stylesheet') }}</textarea>
</div>
</div>
</div>
</fieldset>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<button type="submit" class="btn btn-success">{{ trans('forms.save') }}</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,70 @@
@extends('layout.dashboard')
@section('content')
<div class="content-panel">
@if(isset($subMenu))
@include('partials.dashboard.sub-sidebar')
@endif
<div class="content-wrapper">
<div class="header sub-header" id="theme">
<span class="uppercase">
{{ trans('dashboard.settings.theme.theme') }}
</span>
</div>
<div class="row">
<div class="col-sm-12">
<form name="SettingsForm" class="form-vertical" role="form" action="/dashboard/settings" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
@include('partials.dashboard.errors')
<fieldset>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label>{{ trans('forms.settings.theme.background-color') }}</label>
<input type="text" class="form-control color-code" name="style.background_color" value="{{ Setting::get('style_background_color') }}">
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label>{{ trans('forms.settings.theme.text-color') }}</label>
<input type="text" class="form-control color-code" name="style.text_color" value="{{ Setting::get('style_text_color') }}">
</div>
</div>
</div>
{{--
<div class="row">
<div class="col-xs-4">
<div class="form-group">
<label>Success Warning Color</label>
<input type="text" class="form-control color-code" name="style.success_warning_color" value="{{ Setting::get('style_success_warning_color') }}">
</div>
</div>
<div class="col-xs-4">
<div class="form-group">
<label>Error Warning Color</label>
<input type="text" class="form-control color-code" name="style.error_warning_color" value="{{ Setting::get('style_error_warning_color') }}">
</div>
</div>
<div class="col-xs-4">
<div class="form-group">
<label>Info Warning Color</label>
<input type="text" class="form-control color-code" name="style.style_info_warning_color" value="{{ Setting::get('style_info_warning_color') }}">
</div>
</div>
</div>
--}}
</fieldset>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<button type="submit" class="btn btn-success">{{ trans('forms.save') }}</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,40 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon ion-person"></i> {{ trans('dashboard.team.team') }}
</span>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<form name="UserForm" class="form-vertical" role="form" action="/dashboard/team/add" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label>{{ trans('forms.user.username') }}</label>
<input type="text" class="form-control" name="username" value="{{ Input::old('username') }}" required>
</div>
<div class="form-group">
<label>{{ trans('forms.user.email') }}</label>
<input type="email" class="form-control" name="email" value="{{ Input::old('email') }}" required>
</div>
<div class="form-group">
<label>{{ trans('forms.user.password') }}</label>
<input type="password" class="form-control" name="password" value="">
</div>
</fieldset>
<div class="form-group">
<button type="submit" class="btn btn-success">{{ trans('forms.add') }}</button>
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,43 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="ion ion-person"></i> {{ trans('dashboard.team.member') }}
</span>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<form name="UserForm" class="form-vertical" role="form" action="/dashboard/team/{{ $user->id }}" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset>
<div class="form-group">
<label>{{ trans('forms.user.username') }}</label>
<input type="text" class="form-control" name="username" value="{{ $user->username }}" required>
</div>
<div class="form-group">
<label>{{ trans('forms.user.email') }}</label>
<input type="email" class="form-control" name="email" value="{{ $user->email }}" required>
</div>
<div class="form-group">
<label>{{ trans('forms.user.password') }}</label>
<input type="password" class="form-control" name="password" value="" {{ !$loggedUser->isAdmin ? "disabled": "" }}>
</div>
</fieldset>
<div class="form-group">
<button type="submit" class="btn btn-success">{{ trans('forms.update') }}</button>
@if($loggedUser->isAdmin)
<a class="btn btn-danger" href="/dashboard/user/{{ $user->id }}/api/regen">{{ trans('cachet.api.revoke') }}</a>
@endif
</div>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,37 @@
@extends('layout.dashboard')
@section('content')
<div class="header fixed">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="icon icon ion-android-alert"></i> {{ trans('dashboard.team.team') }}
</span>
@if($loggedUser->isAdmin)
<a class="btn btn-sm btn-success pull-right" href="{{ route('dashboard.team.add') }}">
{{ trans('dashboard.team.add.title') }}
</a>
@endif
<div class="clearfix"></div>
</div>
<div class="content-wrapper header-fixed">
<div class="row">
<div class="col-sm-12">
<p class="lead">{{ trans('dashboard.team.description') }}</p>
<div class="user-grid">
@foreach($teamMembers as $member)
<div class="user col-sm-3 col-xs-6">
<a href="@if($loggedUser->id == $member->id) {{ url('dashboard/user') }} @else /dashboard/team/{{ $member->id }} @endif">
<img src="{{ $member->gravatar }}">
</a>
<div class="name">{{ $member->username }}</div>
<div class="email">{{ $member->email }}</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,67 @@
@extends('layout.dashboard')
@section('content')
<div class="header">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<span class="uppercase">
<i class="ion ion-person"></i> {{ trans('dashboard.team.profile') }}
</span>
</div>
<div class="content-wrapper">
<div class="row">
<div class="col-sm-12">
@include('partials.dashboard.errors')
<form name="UserForm" class="form-vertical" role="form" action="/dashboard/user" method="POST">
<fieldset>
<div class="form-group">
<label>{{ trans('forms.user.username') }}</label>
<input type="text" class="form-control" name="username" value="{{ $loggedUser->username }}" required>
</div>
<div class="form-group">
<label>{{ trans('forms.user.email') }}</label>
<input type="email" class="form-control" name="email" value="{{ $loggedUser->email }}" required>
</div>
<div class="form-group">
<label>{{ trans('forms.user.password') }}</label>
<input type="password" class="form-control" name="password" value="">
</div>
<hr>
<div class="form-group">
<label>{{ trans('forms.user.api-token') }}</label>
<div class="input-group">
<input type="text" class="form-control" name="api_key" disabled value="{{ $loggedUser->api_key }}">
<a href="/dashboard/user/{{ $loggedUser->id }}/api/regen" class="input-group-addon btn btn-danger">{{ trans('cachet.api.regenerate') }}</a>
</div>
<span class="help-block">{{ trans('forms.user.api-token-help') }}</span>
</div>
<hr>
<div class="form-group">
<label class="checkbox-inline">
<input type="hidden" name="google2fa" value="0">
<input type='checkbox' name="google2fa" value="1" {{ $loggedUser->hasTwoFactor ? "checked" : "" }}>
{{ trans('forms.setup.enable_google2fa') }}
</label>
</div>
@if($loggedUser->hasTwoFactor)
<div class="form-group">
<?php
$google2fa_url = PragmaRX\Google2FA\Vendor\Laravel\Facade::getQRCodeGoogleUrl(
'CachetHQ',
$loggedUser->email,
$loggedUser->google_2fa_secret
);
?>
<img src="{{ $google2fa_url }}" class="img-responsive">
<span class='help-block'>{{ trans('forms.user.2fa.help') }}</span>
</div>
@endif
</fieldset>
<button type="submit" class="btn btn-success">{{ trans('forms.update') }}</button>
</form>
</div>
</div>
</div>
@stop

View File

@@ -0,0 +1,5 @@
@extends('layout.emails')
@section('content')
Welcome to CachetHQ.
@stop

View File

@@ -0,0 +1,19 @@
@extends('layout.error')
@section('content')
<div class="middle-box text-center">
<div>
<img class="logo" height="65" src="{{ url('img/cachet-logo.svg') }}" alt="Cachet">
</div>
<h1>{{ trans('errors.unauthorized.code') }}</h1>
<h3>{{ trans('errors.unauthorized.title') }}</h3>
<div class="error-desc">
<p>{{ trans('errors.unauthorized.message') }}</p>
<br>
<p>
<a href="/" class="btn btn-default btn-lg">{{ trans('errors.unauthorized.link') }}</a>
</p>
</div>
</div>
@stop

View File

@@ -0,0 +1,19 @@
@extends('layout.error')
@section('content')
<div class="middle-box text-center">
<div>
<img class="logo" height="65" src="{{ url('img/cachet-logo.svg') }}" alt="Cachet">
</div>
<h1>{{ trans('errors.not-found.code') }}</h1>
<h3>{{ trans('errors.not-found.title') }}</h3>
<div class="error-desc">
<p>{{ trans('errors.not-found.message') }}</p>
<br>
<p>
<a href="/" class="btn btn-default btn-lg">{{ trans('errors.not-found.link') }}</a>
</p>
</div>
</div>
@stop

View File

@@ -0,0 +1,58 @@
@extends('layout.master')
@section('content')
@if($bannerImage = Setting::get('app_banner'))
<div class="row app-banner">
<div class="col-md-12 text-center">
<?php $bannerType = Setting::get('app_banner_type') ?>
@if($appUrl = Setting::get('app_domain'))
<a href="{{ $appUrl }}"><img src="data:{{ $bannerType }};base64, {{ $bannerImage}}" class="banner-image img-responsive"></a>
@else
<img src="data:{{ $bannerType }};base64, {{ $bannerImage}}" class="banner-image img-responsive">
@endif
</div>
</div>
@endif
<div class="alert alert-{{ $systemStatus }}">{{ $systemMessage }}</div>
@if($aboutApp)
<div class="about-app">
<h1>{{ trans('cachet.about_this_site') }}</h1>
<p>{{ $aboutApp }}</p>
</div>
@endif
@include('partials.components')
@if($displayMetrics && Setting::get('display_graphs'))
@include('partials.metrics')
@endif
@if(!$scheduledMaintenance->isEmpty())
@include('partials.schedule')
@endif
<h1>{{ trans('cachet.incidents.past') }}</h1>
@foreach($allIncidents as $incidents)
@include('partials.incidents', $incidents)
@endforeach
<hr>
<nav>
<ul class="pager">
<li class="previous">
<a href="{{ route('status-page') }}?start_date={{ $previousDate }}">
<span aria-hidden="true">&larr;</span> {{ trans('cachet.incidents.previous_week') }}
</a>
</li>
@if($canPageForward)
<li class="next">
<a href="{{ route('status-page') }}?start_date={{ $nextDate }}">
{{ trans('cachet.incidents.next_week') }} <span aria-hidden="true">&rarr;</span>
</a>
</li>
@endif
</ul>
</nav>
@stop

View File

@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
@include('partials.dashboard.head')
<body class="dashboard">
<div class="content">
@yield('content')
</div>
</body>
</html>

View File

@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html>
@include('partials.dashboard.head')
<body class="dashboard">
<div class="wrapper">
@include('partials.dashboard.sidebar')
<div class="page-content">
@yield('content')
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,175 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"> <!-- utf-8 works for most cases -->
<meta name="viewport" content="width=device-width"> <!-- Forcing initial-scale shouldn't be necessary -->
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- Use the latest (edge) version of IE rendering engine -->
<title>CachetHQ</title> <!-- the <title> tag shows on email notifications on Android 4.4. -->
<style type="text/css">
/* ensure that clients don't add any padding or spaces around the email design and allow us to style emails for the entire width of the preview pane */
body,
#bodyTable {
height:100% !important;
width:100% !important;
margin:0;
padding:0;
}
/* Ensures Webkit- and Windows-based clients don't automatically resize the email text. */
body,
table,
td,
p,
a,
li,
blockquote {
-ms-text-size-adjust:100%;
-webkit-text-size-adjust:100%;
}
/* Forces Yahoo! to display emails at full width */
.thread-item.expanded .thread-body .body,
.msg-body {
width: 100% !important;
display: block !important;
}
/* Forces Hotmail to display emails at full width */
.ReadMsgBody,
.ExternalClass {
width: 100%;
background-color: #F0F3F4;
}
/* Forces Hotmail to display normal line spacing. */
.ExternalClass,
.ExternalClass p,
.ExternalClass span,
.ExternalClass font,
.ExternalClass td,
.ExternalClass div {
line-height:100%;
}
/* Resolves webkit padding issue. */
table {
border-spacing:0;
}
/* Resolves the Outlook 2007, 2010, and Gmail td padding issue, and removes spacing around tables that Outlook adds. */
table,
td {
border-collapse:collapse;
mso-table-lspace:0pt;
mso-table-rspace:0pt;
}
/* Corrects the way Internet Explorer renders resized images in emails. */
img {
-ms-interpolation-mode: bicubic;
}
/* Ensures images don't have borders or text-decorations applied to them by default. */
img,
a img {
border:0;
outline:none;
text-decoration:none;
}
/* Styles Yahoo's auto-sensing link color and border */
.yshortcuts a {
border-bottom: none !important;
}
/* Styles the tel URL scheme */
a[href^=tel],
.mobile_link,
.mobile_link a {
color:#222222 !important;
text-decoration: underline !Important;
}
/* Apple Mail doesn't support max-width, so we use media queries to constrain the email container width. */
@media only screen and (min-width: 601px) {
.email-container {
width: 600px !important;
}
}
</style>
</head>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" bgcolor="#F0F3F4" style="margin:0; padding:0; -webkit-text-size-adjust:none; -ms-text-size-adjust:none;">
<table cellpadding="0" cellspacing="0" border="0" height="100%" width="100%" bgcolor="#F0F3F4" id="bodyTable" style="border-collapse: collapse;table-layout: fixed;margin:0 auto;">
<tr>
<td>
<!-- Hidden Preheader Text : BEGIN -->
<div style="display:none; visibility:hidden; opacity:0; color:transparent; height:0; width:0;line-height:0; overflow:hidden;mso-hide: all;">
Visually hidden preheader text.
</div>
<!-- Hidden Preheader Text : END -->
<!-- Outlook and Lotus Notes don't support max-width but are always on desktop, so we can enforce a wide, fixed width view. -->
<!-- Beginning of Outlook-specific wrapper : BEGIN -->
<!--[if (gte mso 9)|(IE)]>
<table width="600" align="center" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<![endif]-->
<!-- Beginning of Outlook-specific wrapper : END -->
<!-- Email wrapper : BEGIN -->
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="center" style="max-width: 600px;margin: auto;" class="email-container">
<tr>
<td>
<table border="0" width="100%" cellpadding="0" cellspacing="0" bgcolor="#ffffff">
<tr>
<td bgcolor="#F0F3F4" style="padding: 40px; font-family: sans-serif; font-size: 20px; line-height: 27px; color: #666666; text-align: center;">
<img src="{{ $message->embed('img/cachet-logo.svg') }}" width="300" alt="CachetHQ">
</td>
</tr>
<tr>
<td>
<!-- 2 x 2 grid : BEGIN -->
<table border="0" width="100%" cellpadding="0" cellspacing="0" align="center">
<tr>
<td valign="top" width="50%" style="padding: 40px 20px; font-family: sans-serif; font-size: 18px; line-height: 24px; color: #666666;">
@yield('content')
</td>
</tr>
</table>
<!-- 2 x 2 grid : END -->
</td>
</tr>
<!-- Full Width, Fluid Column : END -->
</table>
</td>
</tr>
<!-- Footer : BEGIN -->
<tr>
<td style="text-align: center;padding: 40px 0;font-family: sans-serif; font-size: 12px; line-height: 18px;color: #888888;">
If you no longer wish to receive these emails, you can <unsubscribe style="color: #444444; padding: 0;text-decoration: underline">unsubscribe</unsubscribe>.<br>
Company Name &bull; 123 Fake Street, SpringField, Oregon 97477 US &bull; <span class="mobile_link">(123) 456-7890</span><br><br>
</td>
</tr>
<!-- Footer : END -->
</table>
<!-- Email wrapper : END -->
<!-- End of Outlook-specific wrapper : BEGIN -->
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
<!-- End of Outlook-specific wrapper : END -->
</td>
</tr>
</table>
</body>
</html>

View File

@@ -0,0 +1,44 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="alternate" type="application/atom+xml" href="/atom" title="{{ isset($pageTitle) ?: Setting::get('app_name') }} Status - Atom Feed">
<link rel="alternate" type="application/rss+xml" href="/rss" title="{{ isset($pageTitle) ?: Setting::get('app_name') }} Status - RSS Feed">
<link rel="icon" type="image/png" href="/favicon.ico">
<link rel="shortcut icon" href="/favicon.png" type="image/x-icon">
<!-- Mobile friendliness -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- Mobile IE allows us to activate ClearType technology for smoothing fonts for easy reading -->
<meta http-equiv="cleartype" content="on">
<title>{{ isset($pageTitle) ?: Setting::get('app_name') }} Status</title>
<link href="//fonts.googleapis.com/css?family=Open+Sans:300,400,700" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="{{ elixir('dist/css/all.css') }}">
@include('partials.stylesheet')
@if($stylesheet = Setting::get('stylesheet'))
<style type="text/css">
{{ $stylesheet }}
</style>
@endif
@include('partials.crowdin')
<script src="{{ elixir('dist/js/all.js') }}"></script>
</head>
<body class="error-page">
<div class="container">
@yield('content')
</div>
</body>
</html>

View File

@@ -0,0 +1,61 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="env" content="{{ app('env') }}">
<meta name="token" content="{{ csrf_token() }}">
<link rel="alternate" type="application/atom+xml" href="/atom" title="{{ $pageTitle ?: Setting::get('app_name') }} Status - Atom Feed">
<link rel="alternate" type="application/rss+xml" href="/rss" title="{{ $pageTitle ?: Setting::get('app_name') }} Status - RSS Feed">
<!-- Mobile friendliness -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- Mobile IE allows us to activate ClearType technology for smoothing fonts for easy reading -->
<meta http-equiv="cleartype" content="on">
<link rel="icon" type="image/png" href="{{ url('img/favicon.ico') }}">
<link rel="shortcut icon" href="{{ url('img/favicon.png') }}" type="image/x-icon">
<link rel="apple-touch-icon" href="{{ url('img/apple-touch-icon.png') }}">
<link rel="apple-touch-icon" sizes="57x57" href="{{ url('img/apple-touch-icon-57x57.png') }}">
<link rel="apple-touch-icon" sizes="72x72" href="{{ url('img/apple-touch-icon-72x72.png') }}">
<link rel="apple-touch-icon" sizes="114x114" href="{{ url('img/apple-touch-icon-114x114.png') }}">
<link rel="apple-touch-icon" sizes="120x120" href="{{ url('img/apple-touch-icon-120x120.png') }}">
<link rel="apple-touch-icon" sizes="144x144" href="{{ url('img/apple-touch-icon-144x144.png') }}">
<link rel="apple-touch-icon" sizes="152x152" href="{{ url('img/apple-touch-icon-152x152.png') }}">
<title>{{ $pageTitle ?: Setting::get('app_name') }} Status</title>
<link href="//fonts.googleapis.com/css?family=Open+Sans:300,400,700" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="{{ elixir('dist/css/all.css') }}">
@include('partials.stylesheet')
@include('partials.crowdin')
@if($stylesheet = Setting::get('stylesheet'))
<style type="text/css">
{{ $stylesheet }}
</style>
@endif
<script type="text/javascript">
var Global = {};
Global.locale = '{{ Setting::get('app_locale') }}';
</script>
<script src="{{ elixir('dist/js/all.js') }}"></script>
</head>
<body class="status-page">
<div class="container">
@yield('content')
</div>
@include('partials.footer')
</body>
</html>

View File

@@ -0,0 +1,10 @@
@if($googleId = Setting::get('app_analytics'))
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '{{ $googleId }}', '{{ $_SERVER['SERVER_NAME'] }}');
ga('send', 'pageview');
</script>
@endif

View File

@@ -0,0 +1,15 @@
<li class="list-group-item {{ $component->group_id ? "sub-component" : "component" }}">
@if($component->link)
<a href="{{ $component->link }}" target="_blank">{{ $component->name }}</a>
@else
{{ $component->name }}
@endif
@if($component->description)
<i class="ion-ios-help-outline help-icon" data-toggle="tooltip" data-title="{{ $component->description }}"></i>
@endif
<div class="pull-right">
<small class="text-component-{{ $component->status }}">{{ $component->humanStatus }}</small>
</div>
</li>

View File

@@ -0,0 +1,22 @@
<ul class="list-group components">
@if($componentGroups->count() > 0)
@foreach($componentGroups as $componentGroup)
@if($componentGroup->components->count() > 0)
<li class="list-group-item group-name"><strong>{{ $componentGroup->name }}</strong></li>
@foreach($componentGroup->components as $component)
@include('partials.component', compact($component))
@endforeach
@endif
@endforeach
@if($ungroupedComponents->count() > 0)
<li class="list-group-item break"></li>
@endif
@endif
@if($ungroupedComponents->count() > 0)
@foreach($ungroupedComponents as $component)
@include('partials.component', compact($component))
@endforeach
@endif
</ul>

View File

@@ -0,0 +1,7 @@
@if(Setting::get('app_locale') === 'en-UD')
<script type="text/javascript">
var _jipt = [];
_jipt.push(['project', 'cachet']);
</script>
<script type="text/javascript" src="//cdn.crowdin.com/jipt/jipt.js"></script>
@endif

View File

@@ -0,0 +1,15 @@
<div class="alerts">
<div class="alert alert-{{ $level }} alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span></button>
@if(isset($title)) <h5>{!! $title !!}</h5> @endif
@if(is_array($message))
<ul class="list-unstyled">
@foreach ($message as $msg)
<li>{!! $msg !!}</li>
@endforeach
</ul>
@else
{!! $message !!}
@endif
</div>
</div>

View File

@@ -0,0 +1,15 @@
@if ($errors->any())
@include('partials.dashboard._error', ['level' => 'danger', 'title' => Session::get('title'), 'message' => $errors->all(':message')])
@endif
@if ($message = Session::get('success'))
@include('partials.dashboard._error', ['level' => 'success', 'title' => Session::get('title'), 'message' => $message])
@endif
@if ($message = Session::get('warning'))
@include('partials.dashboard._error', ['level' => 'warning', 'title' => Session::get('title'), 'message' => $message])
@endif
@if ($message = Session::get('info'))
@include('partials.dashboard._error', ['level' => 'info', 'title' => Session::get('title'), 'message' => $message])
@endif

View File

@@ -0,0 +1,34 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="env" content="{{ app('env') }}">
<meta name="token" content="{{ csrf_token() }}">
<link rel="icon" type="image/png" href="/img/favicon.ico">
<link rel="shortcut icon" href="/img/favicon.png" type="image/x-icon">
<link rel="apple-touch-icon" href="/img/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="57x57" href="/img/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="72x72" href="/img/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="114x114" href="/img/apple-touch-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/img/apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/img/apple-touch-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/img/apple-touch-icon-152x152.png">
<title>{{ isset($pageTitle) ? $pageTitle : Setting::get('app_name') }} | Cachet</title>
<link href="//fonts.googleapis.com/css?family=Open+Sans:300,400,700" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="{{ elixir('dist/css/all.css') }}">
@include('partials.crowdin')
<script type="text/javascript">
var Global = {};
Global.locale = '{{ Setting::get('app_locale') }}';
</script>
<script src="{{ elixir('dist/js/all.js') }}"></script>
</head>

View File

@@ -0,0 +1,99 @@
@if($loggedUser)
<div class="sidebar">
<div class="sidebar-inner">
<div class="profile">
<div class="dropdown">
<a class="dropdown-toggle" href="#" id="profile-dropdown" data-toggle="dropdown" aria-expanded="true">
<span class="avatar"><img src="{{ $loggedUser->gravatar }}"></span> <span class="username">{{ $loggedUser->username }}</span>
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu" aria-labelledby="profile-dropdown">
<li role="presentation">
<a role="menuitem" tabindex="-1" href="{{ url('dashboard/user') }}">{{ trans('dashboard.team.profile') }}</a>
</li>
<li role="presentation">
<a role="menuitem" tabindex="-1" href="{{ route('logout') }}">{{ trans('dashboard.logout') }}</a>
</li>
</ul>
</div>
</div>
<div class="clearfix"></div>
<div class="quick-add-incident">
<a class="btn btn-block btn-default uppercase" href="{{ route('dashboard.incidents.add') }}">
<i class="icon ion-android-checkmark-circle visible-sm"></i>
<span class="hidden-sm">{{ trans('dashboard.incidents.add.title') }}</span>
</a>
</div>
<ul>
<li {{ set_active('dashboard') }}>
<a href="{{ route('dashboard') }}">
<i class="icon ion-speedometer"></i>
<span>{{ trans('dashboard.dashboard') }}</span>
</a>
</li>
<li {{ set_active('dashboard/incidents*') }} {{ set_active('dashboard/schedule*') }}>
<a href="{{ route('dashboard.incidents') }}">
<i class="icon ion-android-alert"></i>
<span>{{ trans('dashboard.incidents.incidents') }}</span>
<span class="label label-info">{{ $incidentCount }}</span>
</a>
</li>
<li {{ set_active('dashboard/templates*') }}>
<a href="{{ route('dashboard.templates') }}">
<i class="icons ion-document-text"></i>
<span>{{ trans('dashboard.incidents.incident-templates') }}</span>
</a>
</li>
<li {{ set_active('dashboard/components*') }}>
<a href="{{ route('dashboard.components') }}">
<i class="icons ion-outlet"></i>
<span>{{ trans('dashboard.components.components') }}</span>
<span class="label label-info">{{ $componentCount }}</span>
</a>
</li>
<li {{ set_active('dashboard/team*') }}>
<a href="{{ route('dashboard.team') }}">
<i class="icons ion-ios-people"></i>
<span>{{ trans('dashboard.team.team') }}</span>
</a>
</li>
<li {{ set_active('dashboard/metrics*') }}>
<a href="{{ route('dashboard.metrics') }}">
<i class="icon ion-stats-bars"></i>
<span>{{ trans('dashboard.metrics.metrics') }}</span>
</a>
</li>
{{-- <li {{ set_active('dashboard/notifications') }}>
<a href="{{ route('dashboard.notifications') }}">
<i class="ion ion-email"></i> {{ trans('cachet.dashboard.notifications') }}
</a>
</li> --}}
<li {{ set_active('dashboard/settings*') }}>
<a href="{{ route('dashboard.settings.setup') }}">
<i class="icon ion-gear-a"></i>
<span>
{{ trans('dashboard.settings.settings') }}
</span>
</a>
</li>
</ul>
<div class="bottom-menu-sidebar">
<div class="text-center">
<img width="166" src="/img/cachet-sidebar-logo.png" alt="Cachet">
</div>
<br>
<ul>
<li data-toggle="tooltip" data-placement="top" title="{{ trans('dashboard.help') }}">
<a href="https://docs.cachethq.io" target="_blank"><i class="icon ion-help"></i></a>
</li>
<li data-toggle="tooltip" data-placement="top" title="{{ trans('dashboard.status_page') }}">
<a href="{{ route('status-page') }}"><i class="icon ion-monitor"></i></a>
</li>
<li data-toggle="tooltip" data-placement="top" title="{{ trans('dashboard.logout') }}">
<a href="{{ route('logout') }}"><i class="icon ion-log-out"></i></a>
</li>
</ul>
</div>
</div>
</div>
@endif

View File

@@ -0,0 +1,11 @@
<div class="sub-sidebar">
<div class="sidebar-toggler visible-xs">
<i class="icon ion-navicon"></i>
</div>
<h3>{{ $subTitle }}</h3>
<ul class="menu">
@foreach($subMenu as $key => $item)
<li><a href="{{ $item['url'] }}" class="{{ $item['active'] ? 'active' : null }}"><i class="{{ $item['icon'] }}"></i> {{ $item['title'] }}</a></li>
@endforeach
</ul>
</div>

View File

@@ -0,0 +1,67 @@
<!-- First time welcome Modal -->
<div class="modal fade" id="welcome-modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
<header>
{{ trans('dashboard.welcome.welcome') }}
</header>
<p>
{{ trans('dashboard.welcome.message') }}
</p>
<div class="get-started">
<div class="row">
<div class="col-md-4 animated fadeInDown">
<a href="{{ route('dashboard.components.add') }}">
<i class="icon ion-outlet"></i>
{{ trans('dashboard.welcome.steps.component') }}
</a>
</div>
<div class="col-md-4 animated fadeInDown two">
<a href="{{ route('dashboard.incidents.add') }}">
<i class="icon ion-android-alert"></i>
{{ trans('dashboard.welcome.steps.incident') }}
</a>
</div>
<div class="col-md-4 animated fadeInDown three">
<a href="{{ route('dashboard.settings.theme') }}">
<i class="icon ion-ios-paper-outline"></i>
{{ trans('dashboard.welcome.steps.customize') }}
</a>
</div>
</div>
<div class="row">
<div class="col-md-4 animated fadeInDown">
<a href="{{ route('dashboard.team.add') }}">
<i class="icons ion-ios-people"></i>
{{ trans('dashboard.welcome.steps.team') }}
</a>
</div>
<div class="col-md-4 animated fadeInDown two">
<a href="{{ route('dashboard.user') }}">
<i class="icon ion-code-working"></i>
{{ trans('dashboard.welcome.steps.api') }}
</a>
</div>
<div class="col-md-4 animated fadeInDown three">
<a href="{{ route('dashboard.user') }}">
<i class="icon ion-unlocked"></i>
{{ trans('dashboard.welcome.steps.two-factor') }}
</a>
</div>
</div>
</div>
<a href="#" data-dismiss="modal" class="btn btn-success go-dashboard">
{{ trans('dashboard.welcome.close') }}
<i class="fa fa-angle-double-right"></i>
</a>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<footer class="footer">
@if(Setting::get('show_support'))
<p>{{ trans('cachet.powered_by', ['app' => Setting::get('app_name')]) }}</p>
@endif
<p><a href="/rss"><i class="ion-social-rss"></i> {{ trans('cachet.rss-feed') }}</a>&nbsp;-&nbsp;<a href="/atom"><i class="ion-social-rss"></i> {{ trans('cachet.atom-feed') }}</a></p>
<p>
<a href="{{ route('dashboard') }}">{{ trans('dashboard.dashboard') }}</a>
@if($loggedUser)
&ndash;
<a href="{{ route('logout') }}">{{ trans('dashboard.logout') }}</a>
@endif
</p>
</footer>
@include("partials.analytics")

View File

@@ -0,0 +1,37 @@
<h4>{{ $date }}</h4>
<div class="timeline">
<div class="content-wrapper">
@forelse($incidents as $incidentID => $incident)
<div class="moment {{ $incidentID === 0 ? 'first' : null }}">
<div class="row event clearfix">
<div class="col-sm-1">
<div class="status-icon status-{{ $incident->status }}" data-toggle="tooltip" title="{{ $incident->humanStatus }}" data-placement="left">
<i class="{{ $incident->icon }}"></i>
</div>
</div>
<div class="col-xs-10 col-xs-offset-2 col-sm-11 col-sm-offset-0">
<div class="panel panel-message">
<div class="panel-heading">
<strong>{{ $incident->name }}</strong>{{ $incident->isScheduled ? trans("cachet.incidents.scheduled_at", ["timestamp" => $incident->scheduled_at->diffForHumans()]) : null }}
<br>
<small class="date">
<abbr class="timeago" data-toggle="tooltip" data-placement="right" title="{{ $incident->created_at_formatted }}" data-timeago="{{ $incident->created_at_iso }}">
</abbr>
</small>
</div>
<div class="panel-body">
<p>{!! $incident->formattedMessage !!}</p>
</div>
</div>
</div>
</div>
</div>
@empty
<div class="panel panel-message">
<div class="panel-body">
<p>{{ trans('cachet.incidents.none') }}</p>
</div>
</div>
@endforelse
</div>
</div>

View File

@@ -0,0 +1,68 @@
@if($metrics->count() > 0)
<ul class="list-group metrics">
@foreach($metrics as $metric)
<?php
$points = range(0, 10);
foreach($points as $hour) {
$points[$hour] = $metric->getValues($hour);
}
$points = array_reverse($points);
?>
<li class="list-group-item metric">
<div class="row">
<div class="col-xs-10">
<h4>
{{ $metric->name }}
@if($metric->description)
<i class="ion ion-ios-help-outline" data-toggle="tooltip" data-title="{{ $metric->description }}"></i>
@endif
</h4>
</div>
<div class="col-xs-2 text-right">
<small>{{ trans('cachet.metrics.filter.hourly') }}</small>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-12">
<div>
<canvas id="metric-{{ $metric->id }}" height="150" width="600"></canvas>
</div>
</div>
</div>
<script>
(function () {
var hourList = [], date = new Date();
for (var i = 10; i >= 1; i--) {
hourList.push(moment(date).subtract(i, 'hours').seconds(0).format('HH:ss'));
}
hourList.push(moment(date).seconds(0).format('HH:ss'));
var data = {
showTooltips: false,
labels: hourList,
datasets: [{
fillColor: "rgba(220,220,220,0.2)",
strokeColor: "rgba(220,220,220,1)",
pointColor: "rgba(220,220,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: [{{ implode(',', $points) }}]
}]
};
var ctx = document.getElementById("metric-{{ $metric->id }}").getContext("2d");
new Chart(ctx).Line(data, {
scaleShowVerticalLines: true,
pointDot: false,
responsive: true
});
}());
</script>
</li>
@endforeach
</ul>
@endif

View File

@@ -0,0 +1,19 @@
<h1>{{ trans('cachet.incidents.scheduled') }}</h1>
<div class="timeline">
@foreach($scheduledMaintenance as $schedule)
<div class="panel panel-message">
<div class="panel-heading">
<strong>{{ $schedule->name }}</strong>
<br>
<small class="date">
<abbr class="timeago" data-toggle="tooltip" data-placement="right" title="{{ $schedule->scheduled_at_formatted }}" data-timeago="{{ $schedule->scheduled_at_iso }}">
</abbr>
</small>
</div>
<div class="panel-body">
<p>{{ $schedule->formattedMessage }}</p>
</div>
</div>
@endforeach
</div>

View File

@@ -0,0 +1,10 @@
<style type="text/css">
body.status-page {
@if($styleBackgroundColor = Setting::get('style_background_color'))
background-color: {{ $styleBackgroundColor }};
@endif
@if($styleTextColor = Setting::get('style_text_color'))
color: {{ $styleTextColor }};
@endif
}
</style>

View File

@@ -0,0 +1,144 @@
@extends('layout.clean')
@section('content')
<div class="setup-page">
<div class="text-center">
<img class="logo" height="50" src="{{ url('img/cachet-logo.svg') }}" alt="Cachet">
<h4>{{ trans('setup.title') }}</h4>
<br>
</div>
<div class="col-xs-12 col-xs-offset-0 col-sm-8 col-sm-offset-2">
<div class="steps">
<div class="step active">
{{ trans('setup.status_page_setup') }}
<span></span>
</div>
<div class="step">
{{ trans("setup.admin_account") }}
<span></span>
</div>
<div class="step">
{{ trans("setup.complete_setup") }}
<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 show">
<fieldset>
<div class="form-group">
<label class="sr-only">{{ trans('forms.site_name') }}</label>
<input type="text" name="settings[app_name]" class="form-control" placeholder="{{ trans('forms.setup.site_name') }}" value="{{ Input::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 class="sr-only">{{ trans('forms.site_domain') }}</label>
<input type="text" name="settings[app_domain]" class="form-control" placeholder="{{ trans('forms.setup.site_domain') }}" value="{{ Input::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 class="sr-only">{{ trans('forms.site_timezone') }}</label>
<select name="settings[app_timezone]" class="form-control" required>
<option value="">Select Timezone</option>
@foreach($timezones as $region => $list)
<optgroup label="{{ $region }}">
@foreach($list as $timezone => $name)
<option value="{{ $timezone }}" @if(Input::old('settins.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 class="sr-only">{{ trans('forms.site_locale') }}</label>
<select name="settings[app_locale]" class="form-control" required>
<option value="">Select Language</option>
@foreach($langs as $lang => $name)
<option value="{{ $lang }}" @if(Input::old('settins.app_locale') == $timezone) selected @endif>
{{ $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>
<div class="form-group">
<label>
<input type="checkbox" name="settings[app_track]" value="1" checked >
{{ trans("setup.allow_tracking") }}
</label>
</div>
<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>
</fieldset>
</div>
<div class="step block-2 hidden">
<fieldset>
<div class="form-group">
<label class="sr-only">{{ trans("forms.username") }}</label>
<input type="text" name="user[username]" class="form-control" placeholder="{{ trans('forms.setup.username') }}" value="{{ Input::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 class="sr-only">{{ trans("forms.email") }}</label>
<input type="text" name="user[email]" class="form-control" placeholder="{{ trans('forms.setup.email') }}" value="{{ Input::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 class="sr-only">{{ trans("forms.password") }}</label>
<input type="password" name="user[password]" class="form-control" placeholder="{{ trans('forms.setup.password') }}" value="{{ Input::old('user.password', '') }}" required >
@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" >
<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("setup.complete_setup") }}
</span>
</div>
</div>
<div class="step block-3 hidden">
<div class="setup-success">
<i class="ion-checkmark-circled"></i>
<h3>
{{ trans("setup.completed") }}
</h3>
<a href="{{ route('dashboard') }}" class="btn btn-default">
<span>{{ trans("setup.finish_setup") }}</span>
</a>
</div>
</div>
</form>
</div>
</div>
@stop