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

256
resources/assets/js/app.js Normal file
View File

@@ -0,0 +1,256 @@
$(function() {
// Ajax Setup
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
var token;
if (! options.crossDomain) {
token = $('meta[name="token"]').attr('content');
if (token) {
return jqXHR.setRequestHeader('X-CSRF-Token', token);
}
}
});
$.ajaxSetup({
statusCode: {
401: function () {
window.location.href = '/';
},
403: function () {
window.location.href = '/';
}
}
});
// Prevent double form submission
$('form').submit(function() {
var $form = $(this);
$form.find(':submit').prop('disabled', true);
});
// Mock the DELETE form requests.
$('[data-method]').not(".disabled").append(function() {
var methodForm = "\n";
methodForm += "<form action='" + $(this).attr('href') + "' method='POST' style='display:none'>\n";
methodForm += " <input type='hidden' name='_method' value='" + $(this).attr('data-method') + "'>\n";
if ($(this).attr('data-token')) {
methodForm += "<input type='hidden' name='_token' value='" + $(this).attr('data-token') + "'>\n";
}
methodForm += "</form>\n";
return methodForm;
})
.removeAttr('href')
.attr('onclick', ' if ($(this).hasClass(\'confirm-action\')) { if(confirm("Are you sure you want to do this?")) { $(this).find("form").submit(); } } else { $(this).find("form").submit(); }');
// Messenger config
Messenger.options = {
extraClasses: 'messenger-fixed messenger-on-top',
theme: 'air'
};
// App setup
window.CachetHQ = {};
moment.locale(Global.locale);
$('abbr.timeago').each(function () {
var $el = $(this);
$el
.livestamp($el.data('timeago'))
.tooltip();
});
window.CachetHQ.Notifier = function () {
this.notify = function (message, type, options) {
type = (typeof type === 'undefined' || type === 'error') ? 'error' : type;
var defaultOptions = {
message: message,
type: type,
showCloseButton: true
};
options = _.extend(defaultOptions, options);
Messenger().post(options);
};
};
$(".sidebar-toggler").click(function(e) {
e.preventDefault();
$(".wrapper").toggleClass("toggled");
});
$('.color-code').minicolors({
control: 'hue',
defaultValue: $(this).val() || '',
inline: false,
letterCase: 'lowercase',
opacity: false,
position: 'bottom left',
theme: 'bootstrap'
});
$('[data-toggle="tooltip"]').tooltip();
$('button.close').on('click', function() {
$(this).parents('div.alert').addClass('hide');
});
$('form[name=IncidentForm] select[name=incident\\[component_id\\]]').on('change', function() {
var $option = $(this).find('option:selected');
var $componentStatus = $('#component-status');
if ($option.val() !== '') {
if ($componentStatus.hasClass('hidden')) {
$componentStatus.removeClass('hidden');
} else {
$componentStatus.addClass('hidden');
}
}
});
// Date picker.
$('input[rel=datepicker]').datetimepicker({
format: "DD/MM/YYYY HH:mm",
minDate: new Date(), // Don't allow dates before today.
sideBySide: true,
icons: {
time: 'ion-clock',
date: 'ion-android-calendar',
up: 'ion-ios-arrow-up',
down: 'ion-ios-arrow-down',
previous: 'ion-ios-arrow-left',
next: 'ion-ios-arrow-right',
today: 'ion-android-home',
clear: 'ion-trash-a',
}
});
// Sortable components.
var componentList = document.getElementById("component-list");
if (componentList) {
new Sortable(componentList, {
group: "omega",
handle: ".drag-handle",
onUpdate: function() {
// Loop each component, setting the order input to the new order.
var $components = $('#component-list .striped-list-item');
$.each($components, function(id) {
// Order should start from 1 now.
$(this).find('input[rel=order]').val(id + 1);
});
// Now POST the form to the internal API.
$.ajax({
async: true,
url: '/dashboard/api/components/order',
type: 'POST',
data: $('form[name=componentList]').serializeObject(),
success: function() {
(new CachetHQ.Notifier()).notify('Components updated.', 'success');
}
});
}
});
}
// Toggle inline component statuses.
$('form.component-inline').on('click', 'input[type=radio]', function() {
var $form = $(this).parents('form');
var formData = $form.serializeObject();
$.ajax({
async: true,
url: '/dashboard/api/components/' + formData.component_id,
type: 'POST',
data: formData,
success: function(component) {
(new CachetHQ.Notifier()).notify($form.data('messenger'), 'success');
},
error: function(a, b, c) {
(new CachetHQ.Notifier()).notify('Something went wrong updating the component.');
}
});
});
// Incident management
$('select[name=template]').on('change', function() {
var $this = $(this).find('option:selected'),
slug = $this.val();
// Only fetch the template if we've picked one.
if (slug) {
$.ajax({
async: true,
dataType: 'json',
data: {
slug: slug
},
url: '/dashboard/api/incidents/templates',
success: function(tpl) {
var $form = $('form[role=form]');
$form.find('input[name=incident\\[name\\]]').val(tpl.name);
$form.find('textarea[name=incident\\[message\\]]').val(tpl.template);
},
error: function() {
(new CachetHQ.Notifier()).notify('There was an error finding that template.');
}
});
}
});
// Banner removal JS
$('#remove-banner').click(function(){
$('#banner-view').remove();
$('input[name=remove_banner]').val('1');
});
// Setup wizard
$('.wizard-next').on('click', function () {
var $form = $('#setup-form'),
$btn = $(this),
current = $btn.data('currentBlock'),
next = $btn.data('nextBlock');
$btn.button('loading');
// Only validate going forward. If current group is invalid, do not go further
if (next > current) {
var url = '/setup/step' + current;
$.post(url, $form.serializeObject())
.done(function(response) {
goToStep(current, next);
})
.fail(function(response) {
var errors = _.toArray(response.responseJSON.errors);
_.each(errors, function(error) {
(new CachetHQ.Notifier()).notify(error);
});
})
.always(function() {
$btn.button('reset');
});
return false;
} else {
goToStep(current, next);
$btn.button('reset');
}
});
function goToStep(current, next) {
// validation was ok. We can go on next step.
$('.block-' + current)
.removeClass('show')
.addClass('hidden');
$('.block-' + next)
.removeClass('hidden')
.addClass('show');
$('.steps .step')
.removeClass("active")
.filter(":lt(" + (next) + ")")
.addClass("active");
}
});

View File

@@ -0,0 +1,24 @@
body.error-page {
background-color: #f3f3f4;
.middle-box {
height: 400px;
width: 400px;
position: absolute;
top: 50%;
left: 50%;
margin-top: -250px;
margin-left: -200px;
z-index: 100;
h1 {
font-size: 9em;
}
}
h3 {
&.font-bold {
font-weight: 600;
}
}
}

View File

@@ -0,0 +1,3 @@
.uppercase {
text-transform: uppercase;
}

View File

@@ -0,0 +1,41 @@
// Theme colours.
$cachet-base-light: #fff;
$cachet-base-medium: #f0f3f4;
$cachet-base-dark: #333;
$cachet-primary: #7ED321;
$cachet-secondary: #6DB81C;
$cachet-link: #7ed321;
$cachet-link-hover: #01579b;
$cachet-gray-light: #e8e8e8;
$cachet-gray: #999;
$cachet-gray-darker: #666;
$cachet-icons: #5e5e5e;
// Statuses
$cachet-green: $cachet-primary;
$cachet-dark-green: darken($cachet-green, 10%);
$cachet-blue: #3498db;
$cachet-dark-blue: darken($cachet-blue, 10%);
$cachet-red: #ff6f6f;
$cachet-dark-red: darken($cachet-red, 10%);
$cachet-teal: #0dccc0;
$cachet-dark-teal: darken($cachet-teal, 10%);
$cachet-yellow: #F7CA18;
$cachet-dark-yellow: darken($cachet-yellow, 10%);
$cachet-pink: #b23f73;
$cachet-dark-pink: darken($cachet-pink, 10%);
$cachet-grey: #ecf0f1;
$cachet-dark-grey: darken($cachet-grey, 10%);
$cachet-orange: #FF8800;
$dark-orange: darken($cachet-orange, 10%);

View File

@@ -0,0 +1,323 @@
body.status-page {
font-family: 'Open Sans', 'Helevetic Neue', Arial, sans-serif;
background-color: #F0F3F4;
color: #333333;
font-size: 1.4em;
font-weight: $base-font-weight;
-webkit-font-smoothing: antialiased;
hr {
margin-top: 10px;
margin-bottom: 10px;
}
h1, h2, h3, h4, h5 {
margin-bottom: 20px;
}
.tooltip {
.tooltip-inner {
padding: 8px 12px;
font-size: 14px;
}
}
.help-icon {
cursor: help;
}
.text-success, .text-component-1 {
color: $cachet_green;
}
.text-info, .text-component-2 {
color: $cachet_blue;
}
.text-alert, .text-component-3 {
color: $cachet_yellow;
}
.text-danger, .text-component-4 {
color: $cachet_red;
}
.container {
max-width: 960px;
margin-bottom: 40px;
margin-top: 20px;
}
.page-header {
margin-top: 10px;
}
.app-banner {
margin-bottom: 30px;
}
.about-app {
margin-top: 40px;
margin-bottom: 40px;
p {
font-size: 1.2em;
}
}
.alert {
border-radius: 0;
font-size: 1.2em;
&.alert-success {
background-color: $cachet_green;
border-color: $cachet_dark-green;
color: white;
}
&.alert-info {
background: $cachet_blue;
border-color: $cachet_dark-blue;
color: #FFF;
}
&.alert-danger {
background: $cachet_red;
border-color: $cachet_dark-red;
color: #FFF;
}
}
.timeline {
.content-wrapper {
margin-top: 40px;
margin-bottom: 40px;
}
h3 {
margin-top: 30px;
margin-bottom: 40px;
font-size: 22px;
small {
margin-left: 15px;
}
}
.panel {
.panel-body {
h1 {
margin-top: 0;
margin-bottom: 4px;
font-size: 2em;
}
h2 {
margin-top: 0;
margin-bottom: 4px;
font-size: 1.8em;
}
h3 {
margin-top: 0;
margin-bottom: 4px;
font-size: 1.6em;
}
h4 {
margin-top: 0;
margin-bottom: 4px;
font-size: 1.4em;
}
h5 {
margin-top: 0;
margin-bottom: 4px;
font-size: 1.2em;
}
p {
margin: 0;
}
}
}
.moment {
width: 100%;
padding-bottom: 10px;
position: relative;
&.first {
&:before {
height: 130%;
top: -20px;
}
&:after {
content: '';
position: absolute;
left: 23px;
top: -20px;
width: 7px;
height: 7px;
background: $cachet_gray_light;
border-radius: 50%;
}
}
&:before {
content: '';
position: absolute;
left: 26px;
top: 5px;
width: 2px;
height: 100%;
background: #7266BA;
}
.status-icon {
background: #fff;
width: 35px;
height: 35px;
border-radius: 50%;
border: 1px solid #e8e8e8;
position: absolute;
left: 25px;
top: 14px;
.icon {
position: absolute;
top: 7px;
left: 11px;
&.ion-alert {
left: 15px;
}
}
&.status-0 {
color: $cachet_pink;
}
&.status-1 {
color: $cachet_orange;
}
&.status-2 {
color: $cachet_yellow;
}
&.status-3 {
color: $cachet_blue;
}
&.status-4 {
color: $cachet_green;
}
}
&.last:before {
background: #fff;
}
.panel {
margin: 0;
border-radius: 2px;
&.panel-message {
border: 1px solid #e8e8e8;
.date {
color: darken(#c7c7c7, 20%);
}
&:before {
position: absolute;
top: 16px;
left: 1px;
display: inline-block;
border-top: 15px solid transparent;
border-left: 0 solid #e8e8e8;
border-right: 15px solid #e8e8e8;
border-bottom: 15px solid transparent;
content: " ";
}
&:after {
position: absolute;
top: 17px;
left: 2px;
display: inline-block;
border-top: 14px solid transparent;
border-left: 0 solid #fff;
border-right: 14px solid #fff;
border-bottom: 14px solid transparent;
content: " ";
}
}
.panel-body {
border-top: 1px solid #eee;
p {
margin: 0;
font-size: 1em;
// font-weight: normal;
}
}
}
}
}
@media (max-width: 767px) {
.timeline .moment .content {
width: 100%;
}
}
.list-group {
margin-bottom: 20px;
padding-left: 0;
border-radius: 0;
.list-group-item {
border-radius: 0;
background-color: #ffffff;
border: 1px solid $cachet_gray_light;
font-size: 1.1em;
padding: 15px 15px;
a {
font-weight: 400;
}
h4 {
margin: 0;
font-weight: 400;
max-width: 90%;
}
p, time {
margin-bottom: 0;
line-height: 1.3em;
}
&.group-name {
font-size: 1.2em;
background-color: $cachet_gray_light;
padding: {
top: 0.6em;
bottom: 0.6em;
}
}
&.sub-component {
&:before {
@extend .ion;
content: $ionicon-var-ios-plus-outline;
margin-right: 10px;
}
}
&.break {
padding: 1px;
background-color: $cachet_gray_light;
}
}
&.components {
margin-bottom: 30px;
p {
margin-bottom: 10px;
}
.badge {
color: transparent;
}
}
}
footer.footer {
padding-top: 40px;
padding-bottom: 40px;
color: #777;
text-align: center;
border-top: 1px solid $cachet_gray_light;
background-color: lighten($cachet_gray_light, 5%);
}
}

View File

@@ -0,0 +1,41 @@
@import "palette";
$ionicons-font-path: "../../../fonts" !default;
@import "./bower_components/ionicons/scss/ionicons";
@import "modules/bootstrap";
html, body {
height: 100%;
}
@import "helpers";
// Module overrides
@import "modules/tabs";
@import "modules/forms";
@import "modules/well";
// Styles for partials
@import "partials/base";
@import "partials/wrapper";
@import "partials/navbar";
@import "partials/sidebar";
@import "partials/content";
@import "partials/modals";
// Styles for specific page
@import "pages/login";
@import "pages/setup";
@import "pages/dashboard";
// Styles for plugins
@import "plugins/messenger";
@import "plugins/animate";
@import "plugins/bootstrap-datetimepicker/bootstrap-datetimepicker";
// Status Page will need to override certain styles.
@import "status-page";
// Error pages can have their own overrides.
@import "errors";

View File

@@ -0,0 +1,52 @@
// Bootstrap variable overrides and custom variables
@import "variables";
// Core variables and mixins
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/variables";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins";
// Reset and dependencies
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/normalize";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/print";
// Core CSS
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/scaffolding";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/type";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/code";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/grid";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/tables";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/forms";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/buttons";
// Components
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/component-animations";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/dropdowns";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/button-groups";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/input-groups";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/navs";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/navbar";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/breadcrumbs";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/pagination";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/pager";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/labels";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/badges";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/jumbotron";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/thumbnails";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/alerts";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/progress-bars";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/media";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/list-group";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/panels";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/responsive-embed";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/wells";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/close";
// Components w/ JavaScript
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/modals";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/tooltip";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/popovers";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/carousel";
// Utility classes
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/utilities";
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/responsive-utilities";

View File

@@ -0,0 +1,55 @@
label {
font-size: 14px;
}
textarea {
resize: none;
overflow: auto;
}
.markdown-control {
position: relative;
&:before {
position:absolute;
display:block;
right:0%;
bottom:0%;
width:40px;
height:40px;
font-size: 2em;
font-family: "Ionicons";
content: "\f4e6";
}
}
.form-control {
display: block;
width: 100%;
height: 34px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
@include box-shadow(none !important);
@include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
&:focus {
border-color: #66afe9;
}
}
.component-inline {
@media (max-width: $screen-xs-max) {
.radio-items {
text-align: left;
.radio-inline {
margin-left: 0;
width: 100%;
}
}
}
}

View File

@@ -0,0 +1,27 @@
div[role=tabpanel] {
ul.nav-tabs {
border-bottom: 1px solid #d5d8d7;
li {
a {
font-weight: 400;
display: inline-block;
padding: 10px 25px;
border-radius: 0;
font-size: 0.9em;
letter-spacing: 0.01em;
}
}
}
.tab-content {
border: {
left: 1px solid #d5d8d7;
bottom: 1px solid #d5d8d7;
right: 1px solid #d5d8d7;
}
background-color: white;
.tab-pane {
padding: 10px;
}
}
}

View File

@@ -0,0 +1,39 @@
// Brand colours.
$brand-primary: darken(#428bca, 6.5%) !default;
$brand-success: $cachet-primary !default;
$brand-info: $cachet-blue !default;
$brand-warning: $cachet-orange !default;
$brand-danger: $cachet-red !default;
// Default border radius
$border-radius-base: 2px !default;
$border-radius-large: 4px !default;
$border-radius-small: 1px !default;
//** Tooltip background color
$tooltip-bg: #333 !default;
$tooltip-opacity: .9 !default;
$base-background-color: #f1f1f1;
$base-font-family: "Lato", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
$base-font-weight: 400;
$base-letter-spacing: 0.08em;
$base-font-size: 15px;
$base-line-height: 1.42857143;
$base-link-color: #ffffff;
$base-link-hover-color: #e9e9e9;
$header-background-color: lighten(#00695C, 10%);
$header-border-color: 1px solid darken($header-background-color, 10%);
$sidebar-transition-speed: .2s;
$sidebar-background-color: #F0F3F4;
$sidebar-border-color: 1px solid rgba(255, 255, 255, .1);
$sidebar-border-shadow: inset 0px -2px 3px rgba(0,0,0,0.25);
$sidebar-text-size: 0.9em;
$sidebar-text-color: #333;
$sidebar-text-active-color: #333;
$sidebar-normal-width: 230px;
$sidebar-phone-width: 75%;
$sidebar-active-color: #00695C;

View File

@@ -0,0 +1,3 @@
.well {
border-radius: 0;
}

View File

@@ -0,0 +1,8 @@
.componet-inline-update {
@extend .text-right;
padding-top: 8px;
label {
display: initial;
font-weight: normal;
}
}

View File

@@ -0,0 +1,18 @@
.login {
padding-top: 90px;
}
.login .logo {
display: block;
margin: 0 auto 30px;
}
.login legend {
border: 0;
padding: 0;
width: 100%;
font-size: 24px;
font-weight: 500;
text-align: center;
margin: 0 0 30px 0;
}

View File

@@ -0,0 +1,66 @@
.setup-page {
padding-top: 60px;
.logo {
display: block;
margin: 0 auto 30px;
}
.steps {
@extend .row;
margin: 0 auto;
border-radius: 2px 2px 0 0;
margin-bottom: 20px;
.step {
@extend .col-xs-4;
padding: 20px 0;
text-align: center;
position: relative;
font-size: 13px;
&:not(:last-child):after {
content: '';
position: absolute;
bottom: 31px;
left: 55%;
display: block;
height: 1px;
background: #94A1B8;
width: 100%;
}
span {
width: 23px;
height: 23px;
display: block;
position: relative;
margin: 0 auto;
margin-top: 13px;
border-radius: 25px;
background: $cachet-base-medium;
border: 1px solid #94A1B8;
-webkit-transition: all 0.2s linear;
-moz-transition: all 0.2s linear;
-ms-transition: all 0.2s linear;
-o-transition: all 0.2s linear;
transition: all 0.2s linear;
}
&.active {
span {
background: $cachet-primary;
}
}
}
}
.setup-success {
text-align: center;
i {
font-size: 47px;
}
h3 {
margin-top: 25px;
font-size: 21px;
color: #556579;
}
.btn {
margin-top: 40px;
}
}
}

View File

@@ -0,0 +1,60 @@
body.dashboard {
font-family: $base-font-family;
font-weight: $base-font-weight;
font-size: $base-font-size;
letter-spacing: $base-letter-spacing;
display: table;
width: 100%;
height: 100%;
table-layout: fixed;
line-height: $base-line-height;
-webkit-font-smoothing: antialiased;
.wrapper {
padding-left: 0;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
}
.wrapper.toggled {
padding-left: $sidebar-normal-width;;
}
.wrapper.toggled .sidebar {
width: $sidebar-normal-width;;
}
.wrapper.toggled .page-content {
position: absolute;
margin-right: -$sidebar-normal-width;;
}
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
.wrapper {
padding-left: 80px;
}
}
@media (min-width: $screen-sm-max) {
.wrapper {
padding-left: $sidebar-normal-width;
}
.wrapper.toggled {
padding-left: 0;
}
.wrapper.toggled .page-content {
position: relative;
margin-right: 0;
}
}
.alerts {
.alert h5 {
margin-top: 5px;
}
}
}

View File

@@ -0,0 +1,112 @@
body.dashboard {
.page-content {
width: 100%;
.content-wrapper {
padding-top: 20px;
padding-left: 40px;
padding-right: 40px;
&.header-fixed {
margin-top: 60px;
}
}
.header {
position: relative;
top: 0;
left: 0;
color: #333;
background-color: #fff;
padding: 22px 40px;
width: 100%;
height: 70px;
font-size: 1.2em;
border-bottom: 1px solid #eee;
z-index: 99;
&.sub-header {
padding: 8px 2px;
height: 50px;
}
&.fixed {
position: fixed;
padding-left: 270px;
}
input, button, .btn {
position: relative;
top: -4px;
}
input {
width: 20%;
}
+ .row {
margin-top: 23px;
}
h3 {
color: #444;
margin-top: 0;
text-transform: uppercase;
}
}
.sub-header {
font-weight: 300;
text-transform: uppercase;
a {
text-transform: none;
}
}
.striped-list {
.striped-list-item {
border-bottom: 1px solid #f0f0f0;
padding: 8px 0;
}
}
.user-grid {
.user {
img {
border-radius: 5px;
margin-bottom: 15px;
border: 0;
}
.name {
font-weight: 600;
}
.email {
color: #444;
margin-top: 4px;
}
}
}
}
// Header media queries
@media (max-width: $screen-xs-max) {
.page-content {
.content-wrapper {
padding-left: 20px;
padding-right: 20px;
}
.header {
padding-left: 20px;
padding-right: 20px;
&.fixed {
padding-left: 20px;
padding-right: 20px;
}
}
}
}
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
.page-content {
.header.fixed {
padding-left: 120px;
}
}
}
}

View File

@@ -0,0 +1,64 @@
#welcome-modal {
.modal-dialog {
margin-top: 65px;
}
.modal-content {
.modal-header {
border-bottom: 0;
}
.modal-body {
padding-bottom: 50px;
header {
text-align: center;
font-weight: 600;
font-size: 22px;
color: #444;
margin-bottom: 23px;
}
p {
font-size: 13px;
color: #555;
margin: 0 auto;
width: 80%;
text-align: center;
line-height: 20px;
}
.go-dashboard {
text-align: center;
display: block;
margin-top: 10px;
}
.get-started {
margin-top: 40px;
.col-md-4 {
text-align: center;
padding-bottom: 50px;
a {
i {
font-size: 38px;
color: $cachet-secondary;
display: block;
}
color: $cachet-gray-darker;
display: block;
margin-top: 12px;
font-size: 13px;
&:hover {
text-decoration: none;
color: $cachet-gray;
}
}
}
}
}
}
}

View File

@@ -0,0 +1,48 @@
body.dashboard {
.navbar {
z-index: 999;
border-radius: 0px;
border: none;
border-bottom: $header-border-color;
background: $header-background-color;
margin: 0;
a, a:active, a:visited {
color: $base-link-color;
&:hover {
color: $base-link-hover-color;
}
}
.navbar-toggle {
margin-top: 15px;
background: transparent;
border-color: transparent;
&.collapsed span {
background-color: $base-link-color;
}
}
.navbar-collapse {
background: $header-background-color;
}
a.navbar-brand {
padding: 34px 21px;
line-height: 0em;
font-size: 1.1em;
letter-spacing: 0.04em;
font-weight: 600;
text-transform: uppercase;
@media #{$screen-sm-max} {
span {
padding-right: 10px;
&:before {
font-family: FontAwesome;
content: "\f060";
}
}
}
}
.nav li a {
height: 68px;
line-height: 35px;
}
}
}

View File

@@ -0,0 +1,278 @@
body.dashboard {
.sidebar {
position: fixed;
left: $sidebar-normal-width;
width: 0;
height: 100%;
margin-left: -$sidebar-normal-width;
overflow-y: auto;
background: $sidebar-background-color;
@include box-shadow($sidebar-border-shadow);
z-index: 1000;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
.sidebar-inner {
position: absolute;
top: 0;
width: $sidebar-normal-width;
margin: 0;
padding: 0;
list-style: none;
.profile {
padding: 20px 10px;
margin-bottom: 0;
.dropdown-toggle {
text-decoration: none;
}
.dropdown-menu {
top: 108%;
}
.avatar {
width: 60px;
margin-right: 10px;
img {
border-radius: 50%;
width: 50px;
}
}
.profile {
&.username {
word-break: break-all;
color: $sidebar-text-color;
}
}
}
.quick-add-incident {
@extend .text-center;
padding: 10px;
}
ul {
clear: both;
margin: 0;
padding: 0;
list-style: none;
li {
font-size: $sidebar-text-size;
&:last-child {
border-bottom: $sidebar-border-color;
}
&.active {
background: lighten($sidebar-background-color, 2%);
a {
padding-top: 14px;
padding-bottom: 14px;
border-top: 1px solid #BED3EA;
border-bottom: 1px solid #BED3EA;
color: $sidebar-text-active-color;
}
}
a {
display: block;
padding: 15px;
color: $sidebar-text-color;
i {
font-size: 18px;
min-width: 17px;
text-align: center;
position: relative;
top: 1px;
}
&:hover {
text-decoration: none;
}
span {
&.label {
float: right;
margin: 6px 0;
&.label-info {
background-color: $cachet-primary;
}
}
}
}
&.sub-nav-item {
a {
padding-left: 40px;
}
}
}
}
}
.bottom-menu-sidebar {
position: fixed;
bottom: 0;
width: 230px;
z-index: 999;
ul > li {
float: left;
display: block;
width: 33.333%;
border-right: 1px solid #ddd;
border-top: 1px solid #ddd;
a {
display: block;
position: relative;
text-align: center;
padding: 6px 0;
background: #fff;
}
}
}
}
// Sidebar media queries
@media (min-width: $screen-xs-max) {
.sidebar {
width: $sidebar-normal-width;
}
.wrapper.toggled .sidebar {
width: 0;
}
}
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
.sidebar {
width: 80px;
left: 150px;
margin-left: -150px;
.sidebar-inner {
width: 80px;
.profile .avatar img {
width: 40px;
}
.profile .username-wrapper {
@extend .hidden-sm;
}
.quick-add-incident {
.btn {
padding: 3px 6px;
}
i {
@extend .visible-sm;
font-size: 20px;
}
span {
@extend .hidden-sm;
}
}
& > ul > li > a {
text-align: center;
& > i {
font-size: 25px;
}
& > span {
@extend .hidden-sm;
}
}
}
.bottom-menu-sidebar {
@extend .hidden-sm;
}
}
}
.sidebar-toggler {
float: left;
padding: 10px;
position: relative;
top: -15px;
left: -5px;
margin-right: 10px;
cursor: pointer;
i {
font-size: 25px;
}
}
.sub-sidebar {
left: 0;
top: 0;
bottom: 0;
position: fixed;
margin-left: 228px;
width: 22%;
background: #fcfcfc;
border-right: 1px solid #E8ECF1;
h3 {
margin: 0;
text-align: center;
font-size: 19px;
padding: 30px 0;
}
ul.menu {
list-style-type: none;
padding: 0;
margin: 0;
li {
a {
color: #666;
display: block;
padding: 13px 30px;
font-size: 15px;
transition: all 0.2s linear;
text-decoration: none;
&.active {
color: $cachet-secondary;
}
&:hover {
color: $cachet-secondary;
}
}
}
}
.sidebar-toggler {
position: absolute;
top: 3px;
left: 20px;
font-size: 36px;
cursor: pointer;
}
+ .content-wrapper {
top: 0;
position: relative;
margin-left: 26%;
padding-right: 40px !important;
}
}
// Sub-sidebar media queries
@media (max-width: $screen-xs-max) {
.sub-sidebar {
position: relative;
margin-left: 0;
width: 100%;
+ .content-wrapper {
margin-left: 0;
padding-left: 40px !important;
width: 100%;
}
}
}
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
.sub-sidebar {
margin-left: 80px;
width: 25%;
+ .content-wrapper {
padding-left: 45px !important;
}
}
}
}

View File

@@ -0,0 +1,8 @@
body.dashboard {
.wrapper {
width: 100%;
display: table;
height: 100%;
table-layout: fixed;
}
}

View File

@@ -0,0 +1,13 @@
@import "./bower_components/animate-sass/animate";
body {
-webkit-backface-visibility: hidden; // Addresses a small issue in webkit: http://bit.ly/NEdoDq
}
.animated {
@include animate-prefixer(animation-duration, $base-duration);
@include animate-prefixer(animation-fill-mode, both);
&.hinge {
@include animate-prefixer(animation-duration, $base-duration * 2);
}
}

View File

@@ -0,0 +1,459 @@
ul.messenger {
margin: 0;
padding: 0;
}
ul.messenger > li {
list-style: none;
margin: 0;
padding: 0;
}
ul.messenger.messenger-empty {
display: none;
}
ul.messenger .messenger-message {
overflow: hidden;
*zoom: 1;
}
ul.messenger .messenger-message.messenger-hidden {
display: none;
}
ul.messenger .messenger-message .messenger-phrase, ul.messenger .messenger-message .messenger-actions a {
padding-right: 5px;
}
ul.messenger .messenger-message .messenger-actions {
float: right;
}
ul.messenger .messenger-message .messenger-actions a {
cursor: pointer;
text-decoration: underline;
}
ul.messenger .messenger-message ul, ul.messenger .messenger-message ol {
margin: 10px 18px 0;
}
ul.messenger.messenger-fixed {
position: fixed;
z-index: 10000;
}
ul.messenger.messenger-fixed .messenger-message {
min-width: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
ul.messenger.messenger-fixed .message .messenger-actions {
float: left;
}
ul.messenger.messenger-fixed.messenger-on-top {
top: 20px;
}
ul.messenger.messenger-fixed.messenger-on-bottom {
bottom: 20px;
}
ul.messenger.messenger-fixed.messenger-on-top, ul.messenger.messenger-fixed.messenger-on-bottom {
left: 50%;
width: 600px;
margin-left: -300px;
}
@media (max-width: 960px) {
ul.messenger.messenger-fixed.messenger-on-top, ul.messenger.messenger-fixed.messenger-on-bottom {
left: 10%;
width: 80%;
margin-left: 0px;
}
}
ul.messenger.messenger-fixed.messenger-on-top.messenger-on-right, ul.messenger.messenger-fixed.messenger-on-bottom.messenger-on-right {
right: 20px;
left: auto;
}
ul.messenger.messenger-fixed.messenger-on-top.messenger-on-left, ul.messenger.messenger-fixed.messenger-on-bottom.messenger-on-left {
left: 20px;
margin-left: 0px;
}
ul.messenger.messenger-fixed.messenger-on-right, ul.messenger.messenger-fixed.messenger-on-left {
width: 350px;
}
ul.messenger.messenger-fixed.messenger-on-right .messenger-actions, ul.messenger.messenger-fixed.messenger-on-left .messenger-actions {
float: left;
}
ul.messenger .messenger-spinner {
display: none;
}
@-webkit-keyframes ui-spinner-rotate-right {
0% {
-webkit-transform: rotate(0deg);
}
25% {
-webkit-transform: rotate(180deg);
}
50% {
-webkit-transform: rotate(180deg);
}
75% {
-webkit-transform: rotate(360deg);
}
100% {
-webkit-transform: rotate(360deg);
}
}
@-webkit-keyframes ui-spinner-rotate-left {
0% {
-webkit-transform: rotate(0deg);
}
25% {
-webkit-transform: rotate(0deg);
}
50% {
-webkit-transform: rotate(180deg);
}
75% {
-webkit-transform: rotate(180deg);
}
100% {
-webkit-transform: rotate(360deg);
}
}
@-moz-keyframes ui-spinner-rotate-right {
0% {
-moz-transform: rotate(0deg);
}
25% {
-moz-transform: rotate(180deg);
}
50% {
-moz-transform: rotate(180deg);
}
75% {
-moz-transform: rotate(360deg);
}
100% {
-moz-transform: rotate(360deg);
}
}
@-moz-keyframes ui-spinner-rotate-left {
0% {
-moz-transform: rotate(0deg);
}
25% {
-moz-transform: rotate(0deg);
}
50% {
-moz-transform: rotate(180deg);
}
75% {
-moz-transform: rotate(180deg);
}
100% {
-moz-transform: rotate(360deg);
}
}
@keyframes ui-spinner-rotate-right {
0% {
transform: rotate(0deg);
}
25% {
transform: rotate(180deg);
}
50% {
transform: rotate(180deg);
}
75% {
transform: rotate(360deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes ui-spinner-rotate-left {
0% {
transform: rotate(0deg);
}
25% {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
75% {
transform: rotate(180deg);
}
100% {
transform: rotate(360deg);
}
}
.messenger-spinner {
position: relative;
border-radius: 100%;
}
ul.messenger.messenger-spinner-active .messenger-spinner .messenger-spinner {
display: block;
}
.messenger-spinner .messenger-spinner-side {
width: 50%;
height: 100%;
overflow: hidden;
position: absolute;
}
.messenger-spinner .messenger-spinner-side .messenger-spinner-fill {
border-radius: 999px;
position: absolute;
width: 100%;
height: 100%;
-webkit-animation-iteration-count: infinite;
-moz-animation-iteration-count: infinite;
-ms-animation-iteration-count: infinite;
-o-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-webkit-animation-timing-function: linear;
-moz-animation-timing-function: linear;
-ms-animation-timing-function: linear;
-o-animation-timing-function: linear;
animation-timing-function: linear;
}
.messenger-spinner .messenger-spinner-side-left {
left: 0;
}
.messenger-spinner .messenger-spinner-side-left .messenger-spinner-fill {
left: 100%;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
-webkit-animation-name: ui-spinner-rotate-left;
-moz-animation-name: ui-spinner-rotate-left;
-ms-animation-name: ui-spinner-rotate-left;
-o-animation-name: ui-spinner-rotate-left;
animation-name: ui-spinner-rotate-left;
-webkit-transform-origin: 0 50%;
-moz-transform-origin: 0 50%;
-ms-transform-origin: 0 50%;
-o-transform-origin: 0 50%;
transform-origin: 0 50%;
}
.messenger-spinner .messenger-spinner-side-right {
left: 50%;
}
.messenger-spinner .messenger-spinner-side-right .messenger-spinner-fill {
left: -100%;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
-webkit-animation-name: ui-spinner-rotate-right;
-moz-animation-name: ui-spinner-rotate-right;
-ms-animation-name: ui-spinner-rotate-right;
-o-animation-name: ui-spinner-rotate-right;
animation-name: ui-spinner-rotate-right;
-webkit-transform-origin: 100% 50%;
-moz-transform-origin: 100% 50%;
-ms-transform-origin: 100% 50%;
-o-transform-origin: 100% 50%;
transform-origin: 100% 50%;
}
ul.messenger-theme-air {
-moz-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
user-select: none;
font-family: "Raleway", sans-serif;
}
ul.messenger-theme-air .messenger-message {
-webkit-transition: background-color 0.4s;
-moz-transition: background-color 0.4s;
-o-transition: background-color 0.4s;
transition: background-color 0.4s;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-ms-border-radius: 5px;
-o-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: inset 0 0 0 1px white, inset 0 2px white, 0 0 0 1px rgba(0, 0, 0, 0.1), 0 1px rgba(0, 0, 0, 0.2);
-moz-box-shadow: inset 0 0 0 1px white, inset 0 2px white, 0 0 0 1px rgba(0, 0, 0, 0.1), 0 1px rgba(0, 0, 0, 0.2);
box-shadow: inset 0 0 0 1px white, inset 0 2px white, 0 0 0 1px rgba(0, 0, 0, 0.1), 0 1px rgba(0, 0, 0, 0.2);
border: 0px;
background-color: white;
position: relative;
margin-bottom: 1em;
font-size: 13px;
color: #666666;
font-weight: 500;
padding: 10px 30px 11px 46px;
}
ul.messenger-theme-air .messenger-message:hover {
background-color: white;
}
ul.messenger-theme-air .messenger-message .messenger-close {
position: absolute;
top: 0px;
right: 0px;
color: #888888;
opacity: 1;
font-weight: bold;
display: block;
font-size: 20px;
line-height: 20px;
padding: 8px 10px 7px 7px;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
ul.messenger-theme-air .messenger-message .messenger-close:hover {
color: #444444;
}
ul.messenger-theme-air .messenger-message .messenger-close:active {
color: #222222;
}
ul.messenger-theme-air .messenger-message .messenger-actions {
float: none;
margin-top: 10px;
}
ul.messenger-theme-air .messenger-message .messenger-actions a {
-webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1), inset 0px 1px rgba(255, 255, 255, 0.05);
-moz-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1), inset 0px 1px rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1), inset 0px 1px rgba(255, 255, 255, 0.05);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
-ms-border-radius: 4px;
-o-border-radius: 4px;
border-radius: 4px;
text-decoration: none;
display: inline-block;
padding: 10px;
color: #888888;
margin-right: 10px;
padding: 3px 10px 5px;
text-transform: capitalize;
}
ul.messenger-theme-air .messenger-message .messenger-actions a:hover {
-webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1), inset 0px 1px rgba(255, 255, 255, 0.15);
-moz-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1), inset 0px 1px rgba(255, 255, 255, 0.15);
box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.1), inset 0px 1px rgba(255, 255, 255, 0.15);
color: #444444;
}
ul.messenger-theme-air .messenger-message .messenger-actions a:active {
-webkit-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.18), inset 0px 1px rgba(0, 0, 0, 0.05);
-moz-box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.18), inset 0px 1px rgba(0, 0, 0, 0.05);
box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.18), inset 0px 1px rgba(0, 0, 0, 0.05);
background: rgba(0, 0, 0, 0.04);
color: #444444;
}
ul.messenger-theme-air .messenger-message .messenger-actions .messenger-phrase {
display: none;
}
ul.messenger-theme-air .messenger-message .messenger-message-inner:before {
-webkit-box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.3);
-moz-box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.3);
box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.3);
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
-ms-border-radius: 50%;
-o-border-radius: 50%;
border-radius: 50%;
position: absolute;
left: 17px;
display: block;
content: " ";
top: 50%;
margin-top: -8px;
height: 13px;
width: 13px;
z-index: 20;
}
ul.messenger-theme-air .messenger-message.alert-success .messenger-message-inner:before {
background-color: #5fca4a;
}
ul.messenger-theme-air .messenger-message.alert-error.messenger-retry-soon .messenger-spinner {
width: 24px;
height: 24px;
background: transparent;
}
ul.messenger-theme-air .messenger-message.alert-error.messenger-retry-soon .messenger-spinner .messenger-spinner-side .messenger-spinner-fill {
background: #dd6a45;
-webkit-animation-duration: 20s;
-moz-animation-duration: 20s;
-ms-animation-duration: 20s;
-o-animation-duration: 20s;
animation-duration: 20s;
opacity: 1;
}
ul.messenger-theme-air .messenger-message.alert-error.messenger-retry-soon .messenger-spinner:after {
content: "";
background: white;
position: absolute;
width: 19px;
height: 19px;
border-radius: 50%;
top: 2px;
left: 2px;
display: block;
}
ul.messenger-theme-air .messenger-message.alert-error.messenger-retry-later .messenger-spinner {
width: 24px;
height: 24px;
background: transparent;
}
ul.messenger-theme-air .messenger-message.alert-error.messenger-retry-later .messenger-spinner .messenger-spinner-side .messenger-spinner-fill {
background: #dd6a45;
-webkit-animation-duration: 600s;
-moz-animation-duration: 600s;
-ms-animation-duration: 600s;
-o-animation-duration: 600s;
animation-duration: 600s;
opacity: 1;
}
ul.messenger-theme-air .messenger-message.alert-error.messenger-retry-later .messenger-spinner:after {
content: "";
background: white;
position: absolute;
width: 19px;
height: 19px;
border-radius: 50%;
top: 2px;
left: 2px;
display: block;
}
ul.messenger-theme-air .messenger-message.alert-error .messenger-message-inner:before {
background-color: #dd6a45;
}
ul.messenger-theme-air .messenger-message.alert-info .messenger-message-inner:before {
background-color: #61c4b8;
}
ul.messenger-theme-air .messenger-spinner {
display: block;
position: absolute;
left: 12px;
top: 50%;
margin-top: -13px;
z-index: 999;
height: 24px;
width: 24px;
z-index: 10;
}

View File

@@ -0,0 +1,301 @@
// Import boostrap variables including default color palette and fonts
@import "./bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_variables";
.bootstrap-datetimepicker-widget {
top: 0;
left: 0;
width: 250px;
padding: 4px;
margin-top: 1px;
z-index: 99999 !important;
border-radius: $border-radius-base;
&.timepicker-sbs {
width: 600px;
}
&.bottom {
&:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: rgba(0,0,0,.2);
position: absolute;
top: -7px;
left: 7px;
}
&:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid white;
position: absolute;
top: -6px;
left: 8px;
}
}
&.top {
&:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-top: 7px solid #ccc;
border-top-color: rgba(0,0,0,.2);
position: absolute;
bottom: -7px;
left: 6px;
}
&:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid white;
position: absolute;
bottom: -6px;
left: 7px;
}
}
& .dow {
width: 14.2857%;
}
&.pull-right {
&:before {
left: auto;
right: 6px;
}
&:after {
left: auto;
right: 7px;
}
}
>ul {
list-style-type: none;
margin: 0;
}
a[data-action] {
padding: 6px 0;
}
a[data-action]:active {
box-shadow: none;
}
.timepicker-hour, .timepicker-minute, .timepicker-second {
width: 54px;
font-weight: bold;
font-size: 1.2em;
margin: 0;
}
button[data-action] {
padding: 6px;
}
table[data-hour-format="12"] .separator {
width: 4px;
padding: 0;
margin: 0;
}
.datepicker > div {
display: none;
}
.picker-switch {
text-align: center;
}
table {
width: 100%;
margin: 0;
}
td,
th {
text-align: center;
border-radius: $border-radius-base;
}
td {
height: 54px;
line-height: 54px;
width: 54px;
&.cw {
font-size: 10px;
height: 20px;
line-height: 20px;
color: $gray-light;
}
&.day {
height: 20px;
line-height: 20px;
width: 20px;
}
&.day:hover,
&.hour:hover,
&.minute:hover,
&.second:hover {
background: $gray-lighter;
cursor: pointer;
}
&.old,
&.new {
color: $gray-light;
}
&.today {
position: relative;
&:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-bottom: 7px solid $btn-primary-bg;
border-top-color: rgba(0, 0, 0, 0.2);
position: absolute;
bottom: 4px;
right: 4px;
}
}
&.active,
&.active:hover {
background-color: $btn-primary-bg;
color: $btn-primary-color;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
}
&.active.today:before {
border-bottom-color: #fff;
}
&.disabled,
&.disabled:hover {
background: none;
color: $gray-light;
cursor: not-allowed;
}
span {
display: inline-block;
width: 54px;
height: 54px;
line-height: 54px;
margin: 2px 1.5px;
cursor: pointer;
border-radius: $border-radius-base;
&:hover {
background: $gray-lighter;
}
&.active {
background-color: $btn-primary-bg;
color: $btn-primary-color;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
}
&.old {
color: $gray-light;
}
&.disabled,
&.disabled:hover {
background: none;
color: $gray-light;
cursor: not-allowed;
}
}
}
th {
height: 20px;
line-height: 20px;
width: 20px;
&.picker-switch {
width: 145px;
}
&.next,
&.prev {
font-size: $font-size-base * 1.5;
}
&.disabled,
&.disabled:hover {
background: none;
color: $gray-light;
cursor: not-allowed;
}
}
thead tr:first-child th {
cursor: pointer;
&:hover {
background: $gray-lighter;
}
}
}
.input-group {
&.date {
.input-group-addon span {
display: block;
cursor: pointer;
width: 16px;
height: 16px;
}
}
}
.bootstrap-datetimepicker-widget.left-oriented {
&:before {
left: auto;
right: 6px;
}
&:after {
left: auto;
right: 7px;
}
}
.bootstrap-datetimepicker-widget ul.list-unstyled li div.timepicker div.timepicker-picker table.table-condensed tbody > tr > td {
padding: 0px !important;
}
@media screen and (max-width: 767px) {
.bootstrap-datetimepicker-widget.timepicker-sbs {
width: 283px;
}
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}

View File

@@ -0,0 +1,47 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => 'Funktionsfähig',
2 => 'Performance Probleme',
3 => 'Teilweise Ausfall',
4 => 'größerer Ausfall',
],
],
// Incidents
'incidents' => [
'none' => 'keine Vorfälle.',
'past' => 'vergangene Vorfälle',
'previous_week' => 'letzte Woche',
'next_week' => 'nächste Woche',
'none' => 'keine Vorfälle',
'status' => [
1 => 'Untersuchung läuft',
2 => 'Problem identifiziert',
3 => 'Problem unter Beobachtung',
4 => 'Problem behoben',
],
],
// Service Status
'service' => [
'good' => 'Alle Systeme laufen.',
'bad' => 'Bei einigen System sind Fehler aufgetreten.',
],
'api' => [
'regenerate' => 'API-Schlüssel generieren',
'revoke' => 'API-Schlüssel löschen',
],
// Other
'powered_by' => ':app Status-Seite via <a href="https://cachethq.io">Cachet</a>.',
'about_this_site' => 'Über diese Seite',
'rss-feed' => 'RSS Feed',
'atom-feed' => 'Atom Feed',
'feed' => 'Status Feed',
];

View File

@@ -0,0 +1,156 @@
<?php
return [
'dashboard' => 'Dashboard',
// Incidents
'incidents' => [
'incidents' => 'Vorfälle',
'logged' => '{0} Es gibt keine Vorfälle, gute Arbeit.|Sie haben ein Vorfall eingetragen.|Es gibt <strong>:count</strong> Vorfälle.',
'incident-create-template' => 'Template anlegen',
'add' => [
'title' => 'Vorfall hinzufügen',
'success' => 'Vorfall hinzugefügt.',
'failure' => 'Es ist ein Fehler bei dem Erstellen eines Vorfälles aufgetreten.',
],
'edit' => [
'title' => 'Vorfall aktualisieren',
'success' => 'Vorfall aktualisiert.',
'failure' => 'Es ist ein Fehler bei der Aktualisierung des Vorfälles aufgetreten.',
],
// Incident templates
'templates' => [
'add' => [
'title' => 'Vorfall-Template anlegen',
'success' => 'Template angelegt.',
'failure' => 'Es ist ein Fehler bei der Erstellung eines Templates aufgetreten.',
],
],
],
// Components
'components' => [
'components' => 'Komponente|Komponenten',
'component_statuses' => 'Komponenten-Statuus', # this is not a typo (statuus=plural)
'add' => [
'title' => 'Komponente hinzufügen',
'message' => 'Sie sollten eine Komponente hinzufügen.',
'success' => 'Komponente hinzugefügt.',
'failure' => 'Es ist ein Fehler bei der Erstellung der Komponente aufgetreten.',
],
'edit' => [
'title' => 'Komponente aktualisieren',
'success' => 'Komponente aktualisiert.',
'failure' => 'Es ist ein Fehler bei der Aktualisierung der Komponente aufgetreten.',
],
// Component groups
'groups' => [
'groups' => 'Komponenten-Gruppe|Komponenten-Gruppen',
'add' => [
'title' => 'Komponenten-Gruppe hinzufügen',
'success' => 'Komponenten-Gruppe hinzugefügt.',
'failure' => 'Es ist ein Fehler bei der Erstellung einer Komponenten-Gruppe aufgetreten.',
],
'edit' => [
'title' => 'Edit a component group',
'success' => 'Component group updated.',
'failure' => 'Something went wrong with the component group.',
],
],
],
// Metrics
'metrics' => [
'metrics' => 'Metrics',
'add' => [
'title' => 'Einen Metrik-Punkt anlegen',
'success' => 'Metrik-Punkt angelegt.',
'failure' => 'Es ist ein Fehler bei der Erstellung eines Metrik-Punktes aufgetreten.',
],
'edit' => [
'title' => 'Edit a metric',
'success' => 'Metric updated.',
'failure' => 'Something went wrong with the metric.',
],
],
// Team
'team' => [
'team' => 'Team',
'member' => 'Mitglied',
'profile' => 'Profil',
'description' => 'Team-Mitgleider können Komponenten und Vorfälle hinzufügen und modifizieren.',
'add' => [
'title' => 'Team-Mitglied hinzufügen',
'success' => 'Team-Mitglied hinzugefügt.',
'failure' => 'Es ist ein Fehler bei der Erstellung eines neuen Team-Mitglieds aufgetreten.',
],
'edit' => [
'title' => 'Profil aktualisieren',
'success' => 'Profile aktualisiert.',
'failure' => 'Es ist ein Fehler bei der Aktualisierung des Profils aufgetreten.',
],
],
// Settings
'settings' => [
'settings' => 'Einstellungen',
'app-setup' => [
'app-setup' => 'Setup',
'images-only' => 'Es dürfen nur Bild-Dateien hochgeladen werden.',
'too-big' => 'Die Datei die Sie hochgeladen haben ist zu groß. Die Datei muss kleiner als :size sein.',
],
'security' => [
'security' => 'Sicherheit',
],
'stylesheet' => [
'stylesheet' => 'Stylesheet',
],
'theme' => [
'theme' => 'Theme',
],
'edit' => [
'success' => 'Einstellungen gespeichert.',
'failure' => 'Einstellungen konnten nicht gespeichert werden.',
],
],
// Login
'login' => [
'login' => 'Login',
'logged_in' => 'Sie sind angemeldet.',
'welcome' => 'Willkommen zurück!',
'two-factor' => 'Bitte geben Sie den Wert Ihres Authentifikations-Tokens ein.',
],
// Sidebar footer
'help' => 'Hilfe',
'status_page' => 'Status-Seite',
'logout' => 'Logout',
// Notifications
'notifications' => [
'notifications' => 'Benachrichtigungen',
'awesome' => 'Großartig.',
'whoops' => 'Oops.',
],
// Welcome modal
'welcome' => [
'welcome' => 'Welcome to Cachet',
'message' => 'Your status page is almost ready! You might want to configure these extra settings',
'close' => 'Just go straight to my dashboard',
'steps' => [
'component' => 'Create components',
'incident' => 'Create incidents',
'customize' => 'Customize your Cachet Status Page.',
'team' => 'Add users to your team.',
'api' => 'Generate API token.',
'two-factor' => 'Enable Two Factor Authetication.',
],
],
];

View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => 'Die Seite konnte nicht gefunden werden!',
'message' => 'Entschuldigung, aber die Seite konnte nicht gefunden werden. Überprüfen Sie die URL und versuchen Sie es erneut.',
'link' => 'Zurück zur Startseite',
],
'unauthorized' => [
'code' => '401',
'title' => 'Unauthorized',
'message' => 'Sorry, you need admin privileges to see this page.',
'link' => 'Return to homepage',
],
];

123
resources/lang/de/forms.php Normal file
View File

@@ -0,0 +1,123 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => 'E-Mail-Adresse',
'username' => 'Username',
'password' => 'Passwort',
'site_name' => 'Name der Seite',
'site_domain' => 'Domain der Seite',
'site_timezone' => 'Wählen Sie Ihre Zeitzone',
'site_locale' => 'Wählen Sie Ihre Sprache',
'enable_google2fa' => 'Aktivieren Sie Google Two Factor Authentication',
],
// Login form fields
'login' => [
'email' => 'Email',
'password' => 'Passwort',
'2fauth' => 'Authentifikations-Code',
'invalid' => 'Falsche E-Mail-Adresse oder falsches Passwort',
'invalid-token' => 'Token nicht korrekt',
],
// Incidents form fields
'incidents' => [
'name' => 'Name',
'status' => 'Status',
'message' => 'Nachricht',
'message-help' => 'Sie können auch Markdown benutzen.',
'templates' => [
'name' => 'Name',
'template' => 'Template',
],
],
// Components form fields
'components' => [
'name' => 'Name',
'status' => 'Status',
'group' => 'Gruppe',
'description' => 'Beschreibung',
'link' => 'Link',
'tags' => 'Tags',
'tags-help' => 'Bitte als Komma-separierte Liste angeben.',
'groups' => [
'name' => 'Name',
],
],
// Metric form fields
'metrics' => [
'name' => 'Name',
'suffix' => 'Suffix',
'description' => 'Description',
'description-help' => 'You may also use Markdown.',
'display-chart' => 'Display chart on status page?',
'calc_type' => 'Calculation of metrics',
'type_sum' => 'Sum',
'type_avg' => 'Average',
'points' => [
'value' => 'Value',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => 'Name der Seite',
'site-url' => 'URL der Seite',
'site-timezone' => 'Wählen Sie Ihre Zeitzone',
'site-locale' => 'Wählen Sie Ihre Sprache',
'date-format' => 'Datumsformat',
'display-graphs' => 'Display graphs on status page?',
'about-this-page' => 'Über diese Seite',
'days-of-incidents' => 'Wie viele (vergangene) Tage sollen angezeigt werden?',
'banner' => 'Banner-Bild',
'banner-help' => "Wählen Sie möglichst ein Bild mit 930 px Breite.",
'google-analytics' => "Google Analytics Code",
],
'security' => [
'allowed-domains' => 'Erlaubte Domains',
'allowed-domains-help' => 'Komma-Separiert. Die Domain die oben gesetzt ist, ist per Default erlaubt.',
],
'stylesheet' => [
'custom-css' => 'Eigenes Stylesheet',
],
'theme' => [
'background-color' => 'Hintergrund-Farbe',
'text-color' => 'Text-Farbe',
],
],
'user' => [
'username' => 'Username',
'email' => 'E-Mail-Adresse',
'password' => 'Passwort',
'api-key' => 'API-Schlüssel',
'api-key-help' => 'Eine Regenerierung Ihres API-Schlüssels verhindert den Zugriff für alle vorhandenen Anwendungen.',
'2fa' => [
'help' => 'Zwei-Faktor-Authentifikation erhöht die Sicherheit Ihres Accounts. Sie müssen <a href="https://support.google.com/accounts/answer/1066447?hl=en">Google Authenticator</a>, <a href="https://fedorahosted.org/freeotp/" alt="OpenSource-Alternative">FreeOTP</a> oder andere OTP-Programme installieren. Wenn sie sich anschließend anmelden müssen Sie den in der App angezeigten Code eingeben.',
],
],
// Buttons
'add' => 'Hinzufügen',
'save' => 'Speichern',
'update' => 'Aktualsieren',
'create' => 'Erstellen',
'edit' => 'Editieren',
'delete' => 'Löschen',
'submit' => 'Speichern',
'cancel' => 'Abbrechen',
'remove' => 'Entfernen',
// Other
'optional' => '* Optional',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Vorherige',
'next' => 'Nächste &raquo;',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'Passwörter müssen mindestens <em>6</em> Zeichen lang sein; beide Eingaben müssen übereinstimmen.',
'user' => 'Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden.',
'token' => 'Dieser Passwort-Reset-Token ist nicht valide.',
'sent' => 'E-Mail zum Rücksetzen des Passworts verschickt!',
'reset' => 'Passwort wurde zurückgesetzt!',
];

View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => 'Setup',
'title' => 'Setup Cachet',
'service_details' => 'Service Details',
'status_page_setup' => 'Setup der Status-Seite',
'show_support' => 'Möchten Sie Cachet unterstützen? <small>Dies zeigt einen kleinen Text und Link im Footer an.</small>',
'admin_account' => 'Administrator-Account',
'complete_setup' => 'Setup abschließen',
'completed' => 'Cachet wurde erfolgreich eingerichtet!',
'finish_setup' => 'Zum Dashboard',
'allow_tracking' => 'Allow anonymous usage tracking?',
];

View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
"accepted" => "<em>:attribute</em> muss akzeptiert werden.",
"active_url" => "<em>:attribute</em> ist keine valide URL.",
"after" => "<em>:attribute</em> muss nach :date liegen.",
"alpha" => "<em>:attribute</em> darf nur Buchstaben enthalten.",
"alpha_dash" => "<em>:attribute</em> darf nur Nummern, Buchstaben und Slashes enthalten.",
"alpha_num" => "<em>:attribute</em> darf nur Nummern und Buchstaben enthalten.",
"array" => "<em>:attribute</em> muss ein Array sein.",
"before" => "<em>:attribute</em> muss vor :date liegen.",
"between" => [
"numeric" => "<em>:attribute</em> muss zwichen :min und :max liegen.",
"file" => "<em>:attribute</em> muss zwischen :min und :max kilobyte liegen.",
"string" => "<em>:attribute</em> muss zwischen :min und :max Zeichen lang sein.",
"array" => "<em>:attribute</em> muss zwischen :min und :max Werte enthalten.",
],
"boolean" => "<em>:attribute</em> Feld muss 'true' oder 'false' sein.",
"confirmed" => "Die Bestätigung/Wiederholung von <em>:attribute</em> stimmt nicht überein.",
"date" => "<em>:attribute</em> ist kein valides Datum.",
"date_format" => "<em>:attribute</em> passt nicht zu folgendem Format :format.",
"different" => "<em>:attribute</em> und :other müssen sich unterscheiden.",
"digits" => "<em>:attribute</em> muss :digits Zeichen lang sein.",
"digits_between" => "<em>:attribute</em> muss zwischen :min und :max Zeichen lang sein.",
"email" => "<em>:attribute</em> muss eine valide E-Mail-Adresse sein.",
"exists" => "Das gewählte <em>:attribute</em> ist nicht korrekt.",
"image" => "<em>:attribute</em> muss ein Bild sein.",
"in" => "Das ausgewählte <em>:attribute</em> ist nicht korrekt.",
"integer" => "<em>:attribute</em> muss eine Zahl sein.",
"ip" => "<em>:attribute</em> muss eine valide IP sein.", # IPv4?
"max" => [
"numeric" => "<em>:attribute</em> darf nicht größer als :max sein.",
"file" => "<em>:attribute</em> darf nicht größer als :max kilobyte sein.",
"string" => "<em>:attribute</em> darf nicht mehr als :max Zeichen lang sein.",
"array" => "<em>:attribute</em> darf nicht mehr als :max Werte enthalten.",
],
"mimes" => "<em>:attribute</em> muss eine Datei vom Typ :values sein.",
"min" => [
"numeric" => "<em>:attribute</em> muss mindestens :min sein.",
"file" => "<em>:attribute</em> muss mindestens :min kilobyte groß sein.",
"string" => "<em>:attribute</em> muss mindestens :min Zeichen lang sein.",
"array" => "<em>:attribute</em> muss mindestens :min Werte enthalten.",
],
"not_in" => "Das ausgewählte <em>:attribute</em> ist nicht korrekt.",
"numeric" => "<em>:attribute</em> muss eine Nummer sein.",
"regex" => "Das Format von <em>:attribute</em> ist nicht korrekt.",
"required" => "<em>:attribute</em> wird benötigt.",
"required_if" => "<em>:attribute</em> wird benötigt wenn :other den Wert :value hat.",
"required_with" => "<em>:attribute</em> ist erforderlich wenn :values vorhanden ist.",
"required_with_all" => "<em>:attribute</em> ist erforderlich wenn :values vorhanden ist.",
"required_without" => "<em>:attribute</em> ist erforderlich wenn :values nicht vorhanden ist.",
"required_without_all" => "<em>:attribute</em> ist erforderlich wenn keines der Werte :values vorhanden sind.",
"same" => "<em>:attribute</em> und :other müssen übereinstimmen.",
"size" => [
"numeric" => "<em>:attribute</em> muss :size sein.",
"file" => "<em>:attribute</em> muss :size kilobyte groß sein.",
"string" => "<em>:attribute</em> muss :size Zeichen lang sein.",
"array" => "<em>:attribute</em> muss :size Werte enthalten.",
],
"unique" => "<em>:attribute</em> wurde beirets gewählt.",
"url" => "Das Format von <em>:attribute</em> ist nicht korrekt.",
"timezone" => "<em>:attribute</em> muss eine valide Zeitzone sein.",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

59
resources/lang/en-UD/cachet.php Executable file
View File

@@ -0,0 +1,59 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => 'crwdns265:0crwdne265:0',
2 => 'crwdns293:0crwdne293:0',
3 => 'crwdns294:0crwdne294:0',
4 => 'crwdns295:0crwdne295:0',
],
],
// Incidents
'incidents' => [
'none' => 'crwdns430:0crwdne430:0',
'past' => 'crwdns296:0crwdne296:0',
'previous_week' => 'crwdns297:0crwdne297:0',
'next_week' => 'crwdns298:0crwdne298:0',
'none' => 'crwdns430:0crwdne430:0',
'scheduled' => 'crwdns438:0crwdne438:0',
'scheduled_at' => 'crwdns439:0crwdne439:0',
'status' => [
0 => 'crwdns440:0crwdne440:0', // TODO: Hopefully remove this.
1 => 'crwdns299:0crwdne299:0',
2 => 'crwdns300:0crwdne300:0',
3 => 'crwdns301:0crwdne301:0',
4 => 'crwdns302:0crwdne302:0',
],
],
// Service Status
'service' => [
'good' => 'crwdns9:0crwdne9:0',
'bad' => 'crwdns303:0crwdne303:0',
],
'api' => [
'regenerate' => 'crwdns271:0crwdne271:0',
'revoke' => 'crwdns304:0crwdne304:0',
],
// Metrics
'metrics' => [
'filter' => [
'hourly' => 'crwdns441:0crwdne441:0',
'daily' => 'crwdns442:0crwdne442:0',
'monthly' => 'crwdns443:0crwdne443:0',
],
],
// Other
'powered_by' => 'crwdns11:0crwdne11:0',
'about_this_site' => 'crwdns150:0crwdne150:0',
'rss-feed' => 'crwdns273:0crwdne273:0',
'atom-feed' => 'crwdns274:0crwdne274:0',
'feed' => 'crwdns275:0crwdne275:0',
];

View File

@@ -0,0 +1,184 @@
<?php
return [
'dashboard' => 'crwdns152:0crwdne152:0',
// Incidents
'incidents' => [
'title' => 'crwdns444:0crwdne444:0',
'incidents' => 'crwdns153:0crwdne153:0',
'logged' => 'crwdns305:0{0}crwdne305:0',
'incident-create-template' => 'crwdns306:0crwdne306:0',
'incident-templates' => 'crwdns307:0crwdne307:0',
'add' => [
'title' => 'crwdns308:0crwdne308:0',
'success' => 'crwdns309:0crwdne309:0',
'failure' => 'crwdns310:0crwdne310:0',
],
'edit' => [
'title' => 'crwdns311:0crwdne311:0',
'success' => 'crwdns312:0crwdne312:0',
'failure' => 'crwdns313:0crwdne313:0',
],
// Incident templates
'templates' => [
'title' => 'crwdns314:0crwdne314:0',
'add' => [
'title' => 'crwdns315:0crwdne315:0',
'success' => 'crwdns316:0crwdne316:0',
'failure' => 'crwdns317:0crwdne317:0',
],
'edit' => [
'title' => 'crwdns318:0crwdne318:0',
'success' => 'crwdns319:0crwdne319:0',
'failure' => 'crwdns320:0crwdne320:0',
],
],
],
// Incident Maintenance
'schedule' => [
'schedule' => 'crwdns445:0crwdne445:0',
'scheduled_at' => 'crwdns446:0crwdne446:0',
'add' => [
'title' => 'crwdns447:0crwdne447:0',
'success' => 'crwdns448:0crwdne448:0',
'failure' => 'crwdns449:0crwdne449:0',
],
'edit' => [
'title' => 'crwdns450:0crwdne450:0',
'success' => 'crwdns451:0crwdne451:0',
'failure' => 'crwdns452:0crwdne452:0',
],
'delete' => [
'success' => 'crwdns453:0crwdne453:0',
'failure' => 'crwdns454:0crwdne454:0',
],
],
// Components
'components' => [
'components' => 'crwdns431:0crwdne431:0',
'component_statuses' => 'crwdns321:0crwdne321:0',
'add' => [
'title' => 'crwdns322:0crwdne322:0',
'message' => 'crwdns323:0crwdne323:0',
'success' => 'crwdns324:0crwdne324:0',
'failure' => 'crwdns325:0crwdne325:0',
],
'edit' => [
'title' => 'crwdns326:0crwdne326:0',
'success' => 'crwdns327:0crwdne327:0',
'failure' => 'crwdns328:0crwdne328:0',
],
// Component groups
'groups' => [
'groups' => 'crwdns329:0crwdne329:0',
'add' => [
'title' => 'crwdns330:0crwdne330:0',
'success' => 'crwdns331:0crwdne331:0',
'failure' => 'crwdns332:0crwdne332:0',
],
'edit' => [
'title' => 'crwdns455:0crwdne455:0',
'success' => 'crwdns456:0crwdne456:0',
'failure' => 'crwdns457:0crwdne457:0',
],
],
],
// Metrics
'metrics' => [
'metrics' => 'crwdns178:0crwdne178:0',
'add' => [
'title' => 'crwdns458:0crwdne458:0',
'success' => 'crwdns459:0crwdne459:0',
'failure' => 'crwdns460:0crwdne460:0',
],
'edit' => [
'title' => 'crwdns461:0crwdne461:0',
'success' => 'crwdns462:0crwdne462:0',
'failure' => 'crwdns463:0crwdne463:0',
],
],
// Team
'team' => [
'team' => 'crwdns182:0crwdne182:0',
'member' => 'crwdns336:0crwdne336:0',
'profile' => 'crwdns337:0crwdne337:0',
'description' => 'crwdns338:0crwdne338:0',
'add' => [
'title' => 'crwdns339:0crwdne339:0',
'success' => 'crwdns340:0crwdne340:0',
'failure' => 'crwdns341:0crwdne341:0',
],
'edit' => [
'title' => 'crwdns342:0crwdne342:0',
'success' => 'crwdns343:0crwdne343:0',
'failure' => 'crwdns344:0crwdne344:0',
],
],
// Settings
'settings' => [
'settings' => 'crwdns192:0crwdne192:0',
'app-setup' => [
'app-setup' => 'crwdns345:0crwdne345:0',
'images-only' => 'crwdns346:0crwdne346:0',
'too-big' => 'crwdns347:0crwdne347:0',
],
'security' => [
'security' => 'crwdns348:0crwdne348:0',
],
'stylesheet' => [
'stylesheet' => 'crwdns349:0crwdne349:0',
],
'theme' => [
'theme' => 'crwdns350:0crwdne350:0',
],
'edit' => [
'success' => 'crwdns351:0crwdne351:0',
'failure' => 'crwdns352:0crwdne352:0',
],
],
// Login
'login' => [
'login' => 'crwdns199:0crwdne199:0',
'logged_in' => 'crwdns353:0crwdne353:0',
'welcome' => 'crwdns354:0crwdne354:0',
'two-factor' => 'crwdns355:0crwdne355:0',
],
// Sidebar footer
'help' => 'crwdns202:0crwdne202:0',
'status_page' => 'crwdns203:0crwdne203:0',
'logout' => 'crwdns204:0crwdne204:0',
// Notifications
'notifications' => [
'notifications' => 'crwdns205:0crwdne205:0',
'awesome' => 'crwdns356:0crwdne356:0',
'whoops' => 'crwdns357:0crwdne357:0',
],
// Welcome modal
'welcome' => [
'welcome' => 'crwdns358:0crwdne358:0',
'message' => 'crwdns359:0crwdne359:0',
'close' => 'crwdns360:0crwdne360:0',
'steps' => [
'component' => 'crwdns361:0crwdne361:0',
'incident' => 'crwdns362:0crwdne362:0',
'customize' => 'crwdns432:0crwdne432:0',
'team' => 'crwdns433:0crwdne433:0',
'api' => 'crwdns434:0crwdne434:0',
'two-factor' => 'crwdns435:0crwdne435:0',
],
],
];

16
resources/lang/en-UD/errors.php Executable file
View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => 'crwdns208:0crwdne208:0',
'title' => 'crwdns367:0crwdne367:0',
'message' => 'crwdns368:0crwdne368:0',
'link' => 'crwdns369:0crwdne369:0',
],
'unauthorized' => [
'code' => 'crwdns370:0crwdne370:0',
'title' => 'crwdns371:0crwdne371:0',
'message' => 'crwdns372:0crwdne372:0',
'link' => 'crwdns373:0crwdne373:0',
],
];

123
resources/lang/en-UD/forms.php Executable file
View File

@@ -0,0 +1,123 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => 'crwdns212:0crwdne212:0',
'username' => 'crwdns374:0crwdne374:0',
'password' => 'crwdns375:0crwdne375:0',
'site_name' => 'crwdns376:0crwdne376:0',
'site_domain' => 'crwdns377:0crwdne377:0',
'site_timezone' => 'crwdns378:0crwdne378:0',
'site_locale' => 'crwdns379:0crwdne379:0',
'enable_google2fa' => 'crwdns380:0crwdne380:0',
],
// Login form fields
'login' => [
'email' => 'crwdns217:0crwdne217:0',
'password' => 'crwdns381:0crwdne381:0',
'2fauth' => 'crwdns382:0crwdne382:0',
'invalid' => 'crwdns383:0crwdne383:0',
'invalid-token' => 'crwdns384:0crwdne384:0',
],
// Incidents form fields
'incidents' => [
'name' => 'crwdns219:0crwdne219:0',
'status' => 'crwdns385:0crwdne385:0',
'component' => 'crwdns386:0crwdne386:0',
'message' => 'crwdns387:0crwdne387:0',
'message-help' => 'crwdns388:0crwdne388:0',
'scheduled_at' => 'crwdns464:0crwdne464:0',
'templates' => [
'name' => 'crwdns389:0crwdne389:0',
'template' => 'crwdns390:0crwdne390:0',
],
],
// Components form fields
'components' => [
'name' => 'crwdns225:0crwdne225:0',
'status' => 'crwdns391:0crwdne391:0',
'group' => 'crwdns392:0crwdne392:0',
'description' => 'crwdns393:0crwdne393:0',
'link' => 'crwdns394:0crwdne394:0',
'tags' => 'crwdns395:0crwdne395:0',
'tags-help' => 'crwdns396:0crwdne396:0',
'groups' => [
'name' => 'crwdns397:0crwdne397:0',
],
],
// Metric form fields
'metrics' => [
'name' => 'crwdns465:0crwdne465:0',
'suffix' => 'crwdns466:0crwdne466:0',
'description' => 'crwdns467:0crwdne467:0',
'description-help' => 'crwdns468:0crwdne468:0',
'display-chart' => 'crwdns469:0crwdne469:0',
'default-value' => 'crwdns470:0crwdne470:0',
'points' => [
'value' => 'crwdns471:0crwdne471:0',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => 'crwdns233:0crwdne233:0',
'site-url' => 'crwdns398:0crwdne398:0',
'site-timezone' => 'crwdns399:0crwdne399:0',
'site-locale' => 'crwdns400:0crwdne400:0',
'date-format' => 'crwdns401:0crwdne401:0',
'display-graphs' => 'crwdns472:0crwdne472:0',
'about-this-page' => 'crwdns402:0crwdne402:0',
'days-of-incidents' => 'crwdns403:0crwdne403:0',
'banner' => 'crwdns404:0crwdne404:0',
'banner-help' => "crwdns405:0crwdne405:0",
'google-analytics' => "crwdns406:0crwdne406:0",
],
'security' => [
'allowed-domains' => 'crwdns407:0crwdne407:0',
'allowed-domains-help' => 'crwdns408:0crwdne408:0',
],
'stylesheet' => [
'custom-css' => 'crwdns409:0crwdne409:0',
],
'theme' => [
'background-color' => 'crwdns410:0crwdne410:0',
'text-color' => 'crwdns411:0crwdne411:0',
],
],
'user' => [
'username' => 'crwdns244:0crwdne244:0',
'email' => 'crwdns412:0crwdne412:0',
'password' => 'crwdns413:0crwdne413:0',
'api-token' => 'crwdns414:0crwdne414:0',
'api-token-help' => 'crwdns436:0crwdne436:0',
'2fa' => [
'help' => 'crwdns416:0crwdne416:0',
],
],
// Buttons
'add' => 'crwdns249:0crwdne249:0',
'save' => 'crwdns250:0crwdne250:0',
'update' => 'crwdns251:0crwdne251:0',
'create' => 'crwdns252:0crwdne252:0',
'edit' => 'crwdns253:0crwdne253:0',
'delete' => 'crwdns254:0crwdne254:0',
'submit' => 'crwdns255:0crwdne255:0',
'cancel' => 'crwdns256:0crwdne256:0',
'remove' => 'crwdns257:0crwdne257:0',
// Other
'optional' => 'crwdns417:0crwdne417:0',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => 'crwdns89:0crwdne89:0',
'next' => 'crwdns90:0crwdne90:0',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'crwdns91:0crwdne91:0',
'user' => 'crwdns92:0crwdne92:0',
'token' => 'crwdns93:0crwdne93:0',
'sent' => 'crwdns94:0crwdne94:0',
'reset' => 'crwdns95:0crwdne95:0',
];

14
resources/lang/en-UD/setup.php Executable file
View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => 'crwdns258:0crwdne258:0',
'title' => 'crwdns259:0crwdne259:0',
'service_details' => 'crwdns260:0crwdne260:0',
'status_page_setup' => 'crwdns261:0crwdne261:0',
'show_support' => 'crwdns262:0crwdne262:0',
'admin_account' => 'crwdns263:0crwdne263:0',
'complete_setup' => 'crwdns264:0crwdne264:0',
'completed' => 'crwdns291:0crwdne291:0',
'finish_setup' => 'crwdns292:0crwdne292:0',
'allow_tracking' => 'crwdns437:0crwdne437:0',
];

View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
"accepted" => "crwdns96:0crwdne96:0",
"active_url" => "crwdns97:0crwdne97:0",
"after" => "crwdns98:0crwdne98:0",
"alpha" => "crwdns99:0crwdne99:0",
"alpha_dash" => "crwdns100:0crwdne100:0",
"alpha_num" => "crwdns101:0crwdne101:0",
"array" => "crwdns102:0crwdne102:0",
"before" => "crwdns103:0crwdne103:0",
"between" => [
"numeric" => "crwdns104:0crwdne104:0",
"file" => "crwdns418:0crwdne418:0",
"string" => "crwdns419:0crwdne419:0",
"array" => "crwdns420:0crwdne420:0",
],
"boolean" => "crwdns108:0crwdne108:0",
"confirmed" => "crwdns109:0crwdne109:0",
"date" => "crwdns110:0crwdne110:0",
"date_format" => "crwdns111:0crwdne111:0",
"different" => "crwdns112:0crwdne112:0",
"digits" => "crwdns113:0crwdne113:0",
"digits_between" => "crwdns114:0crwdne114:0",
"email" => "crwdns115:0crwdne115:0",
"exists" => "crwdns116:0crwdne116:0",
"image" => "crwdns117:0crwdne117:0",
"in" => "crwdns118:0crwdne118:0",
"integer" => "crwdns119:0crwdne119:0",
"ip" => "crwdns120:0crwdne120:0",
"max" => [
"numeric" => "crwdns121:0crwdne121:0",
"file" => "crwdns421:0crwdne421:0",
"string" => "crwdns422:0crwdne422:0",
"array" => "crwdns423:0crwdne423:0",
],
"mimes" => "crwdns125:0crwdne125:0",
"min" => [
"numeric" => "crwdns126:0crwdne126:0",
"file" => "crwdns424:0crwdne424:0",
"string" => "crwdns425:0crwdne425:0",
"array" => "crwdns426:0crwdne426:0",
],
"not_in" => "crwdns130:0crwdne130:0",
"numeric" => "crwdns131:0crwdne131:0",
"regex" => "crwdns132:0crwdne132:0",
"required" => "crwdns133:0crwdne133:0",
"required_if" => "crwdns134:0crwdne134:0",
"required_with" => "crwdns135:0crwdne135:0",
"required_with_all" => "crwdns136:0crwdne136:0",
"required_without" => "crwdns137:0crwdne137:0",
"required_without_all" => "crwdns138:0crwdne138:0",
"same" => "crwdns139:0crwdne139:0",
"size" => [
"numeric" => "crwdns140:0crwdne140:0",
"file" => "crwdns427:0crwdne427:0",
"string" => "crwdns428:0crwdne428:0",
"array" => "crwdns429:0crwdne429:0",
],
"unique" => "crwdns144:0crwdne144:0",
"url" => "crwdns145:0crwdne145:0",
"timezone" => "crwdns146:0crwdne146:0",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'crwdns147:0crwdne147:0',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View File

@@ -0,0 +1,59 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => 'Operational',
2 => 'Performance Issues',
3 => 'Partial Outage',
4 => 'Major Outage',
],
],
// Incidents
'incidents' => [
'none' => 'No incidents reported.',
'past' => 'Past incidents',
'previous_week' => 'Previous week',
'next_week' => 'Next week',
'none' => 'Nothing to report',
'scheduled' => 'Scheduled Maintenance',
'scheduled_at' => ', scheduled :timestamp',
'status' => [
0 => 'Scheduled', // TODO: Hopefully remove this.
1 => 'Investigating',
2 => 'Identified',
3 => 'Watching',
4 => 'Fixed',
],
],
// Service Status
'service' => [
'good' => 'All systems are functional.',
'bad' => 'Some systems are experiencing issues.',
],
'api' => [
'regenerate' => 'Regenerate API Key',
'revoke' => 'Revoke API Key',
],
// Metrics
'metrics' => [
'filter' => [
'hourly' => 'Hourly',
'daily' => 'Daily',
'monthly' => 'Monthly',
],
],
// Other
'powered_by' => ':app Status Page is powered by <a href="https://cachethq.io">Cachet</a>.',
'about_this_site' => 'About this site',
'rss-feed' => 'RSS Feed',
'atom-feed' => 'Atom Feed',
'feed' => 'Status Feed',
];

View File

@@ -0,0 +1,186 @@
<?php
return [
'dashboard' => 'Dashboard',
// Incidents
'incidents' => [
'title' => 'Incidents &amp; Schedule',
'incidents' => 'Incidents',
'logged' => '{0} There are no incidents, good work.|You have logged one incident.|You have reported <strong>:count</strong> incidents.',
'incident-create-template' => 'Create Template',
'incident-templates' => 'Incident Templates',
'add' => [
'title' => 'Add an incident',
'success' => 'Incident added.',
'failure' => 'Something went wrong with the incident.',
],
'edit' => [
'title' => 'Edit an incident',
'success' => 'Incident updated.',
'failure' => 'Something went wrong with the incident.',
],
// Incident templates
'templates' => [
'title' => 'Incident Templates',
'add' => [
'title' => 'Create an incident template',
'success' => 'Template created.',
'failure' => 'Something went wrong with the incident template.',
],
'edit' => [
'title' => 'Edit template',
'success' => 'Template has been updated!',
'failure' => 'Something went wrong updating the incident template',
],
],
],
// Incident Maintenance
'schedule' => [
'schedule' => 'Scheduled Maintenance',
'scheduled_at' => 'Scheduled at :timestamp',
'add' => [
'title' => 'Add Scheduled Maintenance',
'success' => 'Schedule added.',
'failure' => 'Something went wrong adding the schedule.',
],
'edit' => [
'title' => 'Edit Scheduled Maintenance',
'success' => 'Schedule has been updated!',
'failure' => 'Something went wrong editing the schedule.',
],
'delete' => [
'success' => 'The schedule has been deleted and will not show on your status page.',
'failure' => 'The schedule could not be deleted. Please try again.',
],
],
// Components
'components' => [
'components' => 'Components',
'component_statuses' => 'Component Statuses',
'listed_group' => 'Grouped under :name',
'add' => [
'title' => 'Add a component',
'message' => 'You should add a component.',
'success' => 'Component created.',
'failure' => 'Something went wrong with the component.',
],
'edit' => [
'title' => 'Edit a component',
'success' => 'Component updated.',
'failure' => 'Something went wrong with the component.',
],
// Component groups
'groups' => [
'groups' => 'Component group|Component groups',
'add' => [
'title' => 'Add a component group',
'success' => 'Component group added.',
'failure' => 'Something went wrong with the component group.',
],
'edit' => [
'title' => 'Edit a component group',
'success' => 'Component group updated.',
'failure' => 'Something went wrong with the component group.',
],
],
],
// Metrics
'metrics' => [
'metrics' => 'Metrics',
'add' => [
'title' => 'Create a metric',
'success' => 'Metric created.',
'failure' => 'Something went wrong with the metric.',
],
'edit' => [
'title' => 'Edit a metric',
'success' => 'Metric updated.',
'failure' => 'Something went wrong with the metric.',
],
],
// Team
'team' => [
'team' => 'Team',
'member' => 'Member',
'profile' => 'Profile',
'description' => 'Team Members will be able to add, modify &amp; edit components and incidents.',
'add' => [
'title' => 'Add a new team member',
'success' => 'Team member added.',
'failure' => 'Something went wrong with the component.',
],
'edit' => [
'title' => 'Update profile',
'success' => 'Profile updated.',
'failure' => 'Something went wrong when updating.',
],
],
// Settings
'settings' => [
'settings' => 'Settings',
'app-setup' => [
'app-setup' => 'Application Setup',
'images-only' => 'Only images may be uploaded.',
'too-big' => 'The file you uploaded is too big. Upload an image smaller than :size',
],
'security' => [
'security' => 'Security',
'two-factor' => 'Users without two-factor authentication',
],
'stylesheet' => [
'stylesheet' => 'Stylesheet',
],
'theme' => [
'theme' => 'Theme',
],
'edit' => [
'success' => 'Settings saved.',
'failure' => 'Settings could not be saved.',
],
],
// Login
'login' => [
'login' => 'Login',
'logged_in' => 'You\'re logged in.',
'welcome' => 'Welcome Back!',
'two-factor' => 'Please enter your token.',
],
// Sidebar footer
'help' => 'Help',
'status_page' => 'Status Page',
'logout' => 'Logout',
// Notifications
'notifications' => [
'notifications' => 'Notifications',
'awesome' => 'Awesome.',
'whoops' => 'Whoops.',
],
// Welcome modal
'welcome' => [
'welcome' => 'Welcome to Cachet',
'message' => 'Your status page is almost ready! You might want to configure these extra settings',
'close' => 'Just go straight to my dashboard',
'steps' => [
'component' => 'Create components',
'incident' => 'Create incidents',
'customize' => 'Customize',
'team' => 'Add users',
'api' => 'Generate API token',
'two-factor' => 'Two Factor Authetication',
],
],
];

View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => 'That page went missing!',
'message' => 'Sorry, but the page you are looking for has not been found. Check the URL for errors and try again.',
'link' => 'Return to homepage',
],
'unauthorized' => [
'code' => '401',
'title' => 'Unauthorized',
'message' => 'Sorry, you need admin privileges to see this page.',
'link' => 'Return to homepage',
],
];

126
resources/lang/en/forms.php Normal file
View File

@@ -0,0 +1,126 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => 'Email',
'username' => 'Username',
'password' => 'Password',
'site_name' => 'Site Name',
'site_domain' => 'Site Domain',
'site_timezone' => 'Select your timezone',
'site_locale' => 'Select your language',
'enable_google2fa' => 'Enable Google Two Factor Authentication',
],
// Login form fields
'login' => [
'email' => 'Email',
'password' => 'Password',
'2fauth' => 'Authentication Code',
'invalid' => 'Invalid email or password',
'invalid-token' => 'Invalid token',
],
// Incidents form fields
'incidents' => [
'name' => 'Name',
'status' => 'Status',
'component' => 'Component',
'message' => 'Message',
'message-help' => 'You may also use Markdown.',
'scheduled_at' => 'When to schedule the maintenance for?',
'templates' => [
'name' => 'Name',
'template' => 'Template',
],
],
// Components form fields
'components' => [
'name' => 'Name',
'status' => 'Status',
'group' => 'Group',
'description' => 'Description',
'link' => 'Link',
'tags' => 'Tags',
'tags-help' => 'Comma separated.',
'groups' => [
'name' => 'Name',
],
],
// Metric form fields
'metrics' => [
'name' => 'Name',
'suffix' => 'Suffix',
'description' => 'Description',
'description-help' => 'You may also use Markdown.',
'display-chart' => 'Display chart on status page?',
'default-value' => 'Default value',
'calc_type' => 'Calculation of metrics',
'type_sum' => 'Sum',
'type_avg' => 'Average',
'points' => [
'value' => 'Value',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => 'Site Name',
'site-url' => 'Site URL',
'site-timezone' => 'Site Timezone',
'site-locale' => 'Site Language',
'date-format' => 'Date Format',
'display-graphs' => 'Display graphs on status page?',
'about-this-page' => 'About this page',
'days-of-incidents' => 'How many days of incidents to show?',
'banner' => 'Banner Image',
'banner-help' => "It's recommended that you upload files no bigger than 930px wide .",
'google-analytics' => "Google Analytics code",
],
'security' => [
'allowed-domains' => 'Allowed domains',
'allowed-domains-help' => 'Comma separated. The domain set above is automatically allowed by default.',
],
'stylesheet' => [
'custom-css' => 'Custom Stylesheet',
],
'theme' => [
'background-color' => 'Background Color',
'text-color' => 'Text Color',
],
],
'user' => [
'username' => 'Username',
'email' => 'Email',
'password' => 'Password',
'api-token' => 'API Token',
'api-token-help' => 'Regenerating your API token will prevent existing applications from accessing Cachet.',
'2fa' => [
'help' => 'Enabling two factor authentication increases security of your account. You will need to download <a href="https://support.google.com/accounts/answer/1066447?hl=en">Google Authenticator</a> or a similar app on to your mobile device. When you login you will be asked to provide a token generated by the app.',
],
],
// Buttons
'add' => 'Add',
'save' => 'Save',
'update' => 'Update',
'create' => 'Create',
'edit' => 'Edit',
'delete' => 'Delete',
'submit' => 'Submit',
'cancel' => 'Cancel',
'remove' => 'Remove',
// Other
'optional' => '* Optional',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Previous',
'next' => 'Next &raquo;',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'Passwords must be at least six characters and match the confirmation.',
'user' => 'We can\'t find a user with that e-mail address.',
'token' => 'This password reset token is invalid.',
'sent' => 'Password reminder sent!',
'reset' => 'Password has been reset!',
];

View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => 'Setup',
'title' => 'Setup Cachet',
'service_details' => 'Service Details',
'status_page_setup' => 'Status Page Setup',
'show_support' => 'Show support for Cachet? <small>Places a link in the footer linking to Cachet.</small>',
'admin_account' => 'Administrator Account',
'complete_setup' => 'Complete Setup',
'completed' => 'Cachet has been configured successfully!',
'finish_setup' => 'Go to dashboard',
'allow_tracking' => 'Allow anonymous usage tracking?',
];

View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
"accepted" => "The :attribute must be accepted.",
"active_url" => "The :attribute is not a valid URL.",
"after" => "The :attribute must be a date after :date.",
"alpha" => "The :attribute may only contain letters.",
"alpha_dash" => "The :attribute may only contain letters, numbers, and dashes.",
"alpha_num" => "The :attribute may only contain letters and numbers.",
"array" => "The :attribute must be an array.",
"before" => "The :attribute must be a date before :date.",
"between" => [
"numeric" => "The :attribute must be between :min and :max.",
"file" => "The :attribute must be between :min and :max kilobytes.",
"string" => "The :attribute must be between :min and :max characters.",
"array" => "The :attribute must have between :min and :max items.",
],
"boolean" => "The :attribute field must be true or false.",
"confirmed" => "The :attribute confirmation does not match.",
"date" => "The :attribute is not a valid date.",
"date_format" => "The :attribute does not match the format :format.",
"different" => "The :attribute and :other must be different.",
"digits" => "The :attribute must be :digits digits.",
"digits_between" => "The :attribute must be between :min and :max digits.",
"email" => "The :attribute must be a valid email address.",
"exists" => "The selected :attribute is invalid.",
"image" => "The :attribute must be an image.",
"in" => "The selected :attribute is invalid.",
"integer" => "The :attribute must be an integer.",
"ip" => "The :attribute must be a valid IP address.",
"max" => [
"numeric" => "The :attribute may not be greater than :max.",
"file" => "The :attribute may not be greater than :max kilobytes.",
"string" => "The :attribute may not be greater than :max characters.",
"array" => "The :attribute may not have more than :max items.",
],
"mimes" => "The :attribute must be a file of type: :values.",
"min" => [
"numeric" => "The :attribute must be at least :min.",
"file" => "The :attribute must be at least :min kilobytes.",
"string" => "The :attribute must be at least :min characters.",
"array" => "The :attribute must have at least :min items.",
],
"not_in" => "The selected :attribute is invalid.",
"numeric" => "The :attribute must be a number.",
"regex" => "The :attribute format is invalid.",
"required" => "The :attribute field is required.",
"required_if" => "The :attribute field is required when :other is :value.",
"required_with" => "The :attribute field is required when :values is present.",
"required_with_all" => "The :attribute field is required when :values is present.",
"required_without" => "The :attribute field is required when :values is not present.",
"required_without_all" => "The :attribute field is required when none of :values are present.",
"same" => "The :attribute and :other must match.",
"size" => [
"numeric" => "The :attribute must be :size.",
"file" => "The :attribute must be :size kilobytes.",
"string" => "The :attribute must be :size characters.",
"array" => "The :attribute must contain :size items.",
],
"unique" => "The :attribute has already been taken.",
"url" => "The :attribute format is invalid.",
"timezone" => "The :attribute must be a valid zone.",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View File

@@ -0,0 +1,47 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => 'Operacional',
2 => 'Problemas de rendimiento',
3 => 'Interrupción parcial',
4 => 'Interrupción mayor',
],
],
// Incidents
'incidents' => [
'none' => 'No hay ninguna incidencia reportada.',
'past' => 'Incidentes anteriores',
'previous_week' => 'Semana anterior',
'next_week' => 'Siguiente semana',
'none' => 'No hay ninguna incidencia reportada.',
'status' => [
1 => 'Investigando',
2 => 'Identificado',
3 => 'Observando',
4 => 'Corregido',
],
],
// Service Status
'service' => [
'good' => 'Todos los sistemas funcionando.',
'bad' => 'Algunos sistemas están experimentando problemas.',
],
'api' => [
'regenerate' => 'Regenerar API Key',
'revoke' => 'Revocar API Key',
],
// Other
'powered_by' => ':app La página de estado es alimentada por <a href="https://cachethq.github.io">Cachet</a>.',
'about_this_site' => 'Acerca de este sitio',
'rss-feed' => 'Feed RSS',
'atom-feed' => 'Atom Feed',
'feed' => 'Estado del Feed',
];

View File

@@ -0,0 +1,158 @@
<?php
return [
'dashboard' => 'Panel de Control',
// Incidents
'incidents' => [
'incidents' => 'Incidentes',
'logged' => '{0} No hay incidencias, ¡buen trabajo!|Has registrado una incidencia.|Has reportado <strong>:count</strong> incidencias.',
'incident-create-template' => 'Crear plantilla',
'incident-templates' => 'Plantillas de incidente',
'add' => [
'title' => 'Agregar un incidente',
'success' => 'Incidente agregado.',
'failure' => 'Algo salió mal con el incidente.',
],
'edit' => [
'title' => 'Editar un incidente',
'success' => 'Incidente actualizado.',
'failure' => 'Algo salió mal con el incidente.',
],
// Incident templates
'templates' => [
'title' => 'Plantillas de incidente',
'add' => [
'title' => 'Crear una plantilla de incidente',
'success' => 'Plantilla creada.',
'failure' => 'Algo salió mal con la plantilla de incidente.',
],
'edit' => [
'title' => 'Editar plantilla',
'success' => '¡Se ha actualizado la plantilla!',
'failure' => 'Algo salió mal actualizar la plantilla de incidente',
],
],
],
// Components
'components' => [
'components' => 'Componentes',
'component_statuses' => 'Estatus de los componentes',
'add' => [
'title' => 'Agregar un componente',
'message' => 'Deberías agregar un componente.',
'success' => 'Componente creado.',
'failure' => 'Algo salió mal con el componente.',
],
'edit' => [
'title' => 'Editar un componente',
'success' => 'Componente actualizado.',
'failure' => 'Algo salió mal con el componente.',
],
// Component groups
'groups' => [
'groups' => 'Grupo de componente|Grupos de componente',
'add' => [
'title' => 'Agregar un grupo',
'success' => 'Grupo componente agregado.',
'failure' => 'Algo salió mal con el grupo del componente.',
],
'edit' => [
'title' => 'Edit a component group',
'success' => 'Component group updated.',
'failure' => 'Something went wrong with the component group.',
],
],
],
// Metrics
'metrics' => [
'metrics' => 'Métricas',
'add' => [
'title' => 'Crear una métrica',
'success' => 'Métrica creada.',
'failure' => 'Algo salió mal con la métrica.',
],
],
// Team
'team' => [
'team' => 'Equipo',
'member' => 'Miembro',
'profile' => 'Perfil',
'description' => 'Los miembros del equipo será capaces de añadir, modificar y editar componentes e incidentes.',
'add' => [
'title' => 'Agregar miembro de equipo',
'success' => 'Miembro del equipo agregado.',
'failure' => 'Algo salió mal con el componente.',
],
'edit' => [
'title' => 'Actualizar perfil',
'success' => 'Perfil actualizado.',
'failure' => 'Algo salió mal al actualizar.',
],
],
// Settings
'settings' => [
'settings' => 'Ajustes',
'app-setup' => [
'app-setup' => 'Configuración',
'images-only' => 'Sólo puedes subir imágenes.',
'too-big' => 'El archivo subido es demasiado grande. Sube una imagen con tamaño menor a: tamaño',
],
'security' => [
'security' => 'Seguridad',
],
'stylesheet' => [
'stylesheet' => 'Hoja de estilo',
],
'theme' => [
'theme' => 'Tema',
],
'edit' => [
'success' => 'Configuración guardada.',
'failure' => 'La configuración no ha podido ser guardada.',
],
],
// Login
'login' => [
'login' => 'Iniciar Sesión',
'logged_in' => 'Estás conectado.',
'welcome' => '¡Bienvenido!',
'two-factor' => 'Por favor ingresa tu token.',
],
// Sidebar footer
'help' => 'Ayuda',
'status_page' => 'Página de estado',
'logout' => 'Salir',
// Notifications
'notifications' => [
'notifications' => 'Notificaciones',
'awesome' => 'Excelente.',
'whoops' => 'Whoops.',
],
// Welcome modal
'welcome' => [
'welcome' => 'Bienvenido a Cachet',
'message' => 'La página de estado está casi lista! Tal vez quieras configurar estos ajustes adicionales',
'close' => 'Ir directo al Panel de Control',
'steps' => [
'component' => 'Crear componentes',
'incident' => 'Crear incidentes',
'customize' => 'Personaliza tu página de estado Cachet.',
'team' => 'Agregar usuarios a tu equipo.',
'api' => 'Generar token API.',
'two-factor' => 'Habilitar autenticación de dos pasos.',
],
],
];

View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => '¡Esta página se perdió!',
'message' => 'Lo sentimos, no se ha encontrado la página que estás buscando. Comprueba que la dirección URL no contenga errores y vuelve a intentarlo.',
'link' => 'Regresar a la página de inicio',
],
'unauthorized' => [
'code' => '401',
'title' => 'No autorizado',
'message' => 'Lo sentimos, necesitas privilegios de administrador para ver esta página.',
'link' => 'Regresar a la página de inicio',
],
];

124
resources/lang/es/forms.php Normal file
View File

@@ -0,0 +1,124 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => 'Correo electrónico',
'username' => 'Nombre de usario',
'password' => 'Contraseña',
'site_name' => 'Nombre del sitio',
'site_domain' => 'Dominio de sitio',
'site_timezone' => 'Selecciona tu zona horaria',
'site_locale' => 'Selecciona tu idioma',
'enable_google2fa' => 'Habilitar la verificación en dos pasos de Google',
],
// Login form fields
'login' => [
'email' => 'Correo electrónico',
'password' => 'Contraseña',
'2fauth' => 'Código de Autenticación',
'invalid' => 'Dirección de correo o contraseña incorrectos',
'invalid-token' => 'Token inválido',
],
// Incidents form fields
'incidents' => [
'name' => 'Nombre',
'status' => 'Estado',
'component' => 'Componente',
'message' => 'Mensaje',
'message-help' => 'También puedes usar Markdown.',
'templates' => [
'name' => 'Nombre',
'template' => 'Plantilla',
],
],
// Components form fields
'components' => [
'name' => 'Nombre',
'status' => 'Estatus',
'group' => 'Grupo',
'description' => 'Descripción',
'link' => 'Enlace',
'tags' => 'Etiquetas',
'tags-help' => 'Separado por comas.',
'groups' => [
'name' => 'Nombre',
],
],
// Metric form fields
'metrics' => [
'name' => 'Nombre',
'suffix' => 'Sufijo',
'description' => 'Descripción',
'description-help' => 'Puedes usar también Markdown.',
'display-chart' => '¿Vizualizar gráfica en la página de estado?',
'calc_type' => 'Calculation of metrics',
'type_sum' => 'Sum',
'type_avg' => 'Average',
'points' => [
'value' => 'Valor',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => 'Nombre del sitio',
'site-url' => 'URL del sitio',
'site-timezone' => 'Zona horaria del sitio',
'site-locale' => 'Idioma del sitio',
'date-format' => 'Formato de la fecha',
'display-graphs' => '¿Visualizar gráficas en la página de estado?',
'about-this-page' => 'Sobre esta página',
'days-of-incidents' => '¿Cuántos días de incidentes mostrar?',
'banner' => 'Imagen de inicio',
'banner-help' => "Se recomienda subir una imagen no más grande de 930px de ancho .",
'google-analytics' => "Código de Google Analytics",
],
'security' => [
'allowed-domains' => 'Dominios permitidos',
'allowed-domains-help' => 'Separados por coma. El dominio establecido en la configuración del sitio formará automáticamente parte de los dominios permitidos.',
],
'stylesheet' => [
'custom-css' => 'Hoja de estilo personalizada',
],
'theme' => [
'background-color' => 'Color de fondo',
'text-color' => 'Color de Texto',
],
],
'user' => [
'username' => 'Nombre de usario',
'email' => 'Correo electrónico',
'password' => 'Contraseña',
'api-token' => 'API Token',
'api-token-help' => 'Al regenerar su API key revocara todas las aplicaciones existentes.',
'2fa' => [
'help' => 'Habilitar autenticación de dos pasos aumenta la seguridad de tu cuenta. Necesitarás descargar <a href="https://support.google.com/accounts/answer/1066447?hl=en"> Google Authenticator</a> o una aplicación similar a su dispositivo móvil. Al iniciar sesión, te pedirá proporcionar un token generado por la aplicación.',
],
],
// Buttons
'add' => 'Agregar',
'save' => 'Guardar',
'update' => 'Actualizar',
'create' => 'Crear',
'edit' => 'Editar',
'delete' => 'Eliminar',
'submit' => 'Enviar',
'cancel' => 'Cancelar',
'remove' => 'Remover',
// Other
'optional' => '* Opcional',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Anterior',
'next' => 'Siguiente &raquo;',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'Las contraseñas deben tener al menos seis caracteres y coincidir con la confirmación.',
'user' => 'No podemos encontrar un usuario con esa dirección de correo electrónico.',
'token' => 'El token para resetear el password no es válido.',
'sent' => '!Recordatorio de contraseña enviado!',
'reset' => '!La contraseña ha sido restablecida!',
];

View File

@@ -0,0 +1,13 @@
<?php
return [
'setup' => 'Configurar',
'title' => 'Configurar Cachet',
'service_details' => 'Detalles del servicio',
'status_page_setup' => 'Configuración de la página de estado',
'show_support' => '¿Mostrar tu apoyo a Cachet? <small>Colocara un enlace en el footer vinculando a Cachet.</small>',
'admin_account' => 'Cuenta de administrador',
'complete_setup' => 'Completar configuración',
'completed' => '¡Cachet se ha configurado correctamente!',
'finish_setup' => 'Ir a Panel de control',
];

View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
"accepted" => "El :attribute debe ser aceptado.",
"active_url" => "El :attribute no es un enlace válido.",
"after" => "El :attribute debe ser una fecha después de :date.",
"alpha" => "El :attribute sólo puede contener letras.",
"alpha_dash" => "El :attribute sólo puede contener letras, números y guiones.",
"alpha_num" => "El :attribute sólo puede contener letras y números.",
"array" => "El :attribute debe ser una matriz.",
"before" => "El :attribute debe ser una fecha antes de :date.",
"between" => [
"numeric" => "El :attribute debe ser entre :min y :max.",
"file" => "El :attribute debe ser entre :min y :max kilobytes.",
"string" => "El :attribute debe tener entre :min y :max caracteres.",
"array" => "El :attribute debe tener entre :min y :max objetos.",
],
"boolean" => "El campo del :attribute debe ser verdadero o falso.",
"confirmed" => "La confirmación del :attribute no coincide.",
"date" => "El :attribute no es una fecha válida.",
"date_format" => "El :attribute no cumple el formato :format.",
"different" => ":attribute y :other deben ser diferentes.",
"digits" => "El :attribute debe tener :digits dígitos.",
"digits_between" => "El :attribute debe tener entre: min y :max dígitos.",
"email" => "El :attribute debe ser una dirección de email válida.",
"exists" => "El :attribute seleccionado es inválido.",
"image" => "El :attribute debe ser una imagen.",
"in" => "El :attribute seleccionado es inválido.",
"integer" => "El :attribute debe ser un número entero.",
"ip" => "El :attribute debe ser una dirección IP válida.",
"max" => [
"numeric" => "El :attribute no puede tener más de :max.",
"file" => "El :attribute no puede tener más de :max kilobytes.",
"string" => "El :attribute no puede tener más de :max caracteres.",
"array" => "El :attribute no puede tener más de :max objetos.",
],
"mimes" => "El :attribute debe ser un archivo de tipo: :values.",
"min" => [
"numeric" => "El :attribute debe tener al menos :min.",
"file" => "El :attribute debe tener al menos :min kilobytes.",
"string" => "El :attribute debe tener al menos :min characters.",
"array" => "El :attribute debe tener al menos :min objetos.",
],
"not_in" => "El :attribute seleccionado es inválido.",
"numeric" => "El :attribute sebe ser un número.",
"regex" => "El formato del :attribute es inválido.",
"required" => "El campo del :attribute es requerido.",
"required_if" => "El campo del :attribute se requiere cuando :other es :value.",
"required_with" => "El campo del :attribute se requiere cuando :values es presente.",
"required_with_all" => "El campo del :attribute se requiere cuando :values es presente.",
"required_without" => "El campo del :attribute se requiere cuando :values no es presente.",
"required_without_all" => "El campo del :attribute se requiere cuando ninguno de los :values son presentes.",
"same" => "Los :attribute y :other deben coincidir.",
"size" => [
"numeric" => "El :attribute debe ser :size.",
"file" => "El :attribute debe ser :size kilobytes.",
"string" => "El :attribute debe tener :size caracteres.",
"array" => "El :attribute debe contener :size objetos.",
],
"unique" => "El :attribute ya ha sido usado.",
"url" => "El formato :attribute es inválido.",
"timezone" => "El :attribute debe ser una zona válida.",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'mensaje-personalizado',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View File

@@ -0,0 +1,47 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => 'Opérationnel',
2 => 'Problème de performances',
3 => 'Panne partielle',
4 => 'Panne majeure',
],
],
// Incidents
'incidents' => [
'none' => 'Aucun incident reporté.',
'past' => 'Incidents précédents',
'previous_week' => 'Semaine précédente',
'next_week' => 'Semaine suivante',
'none' => 'Rien à reporter',
'status' => [
1 => 'Enquête en cours',
2 => 'Identifié',
3 => 'Analyse en cours',
4 => 'Corrigé',
],
],
// Service Status
'service' => [
'good' => 'Tous les services sont fonctionnels.',
'bad' => 'Certains services rencontrent des problèmes.',
],
'api' => [
'regenerate' => 'Regénérer une clé d\'API',
'revoke' => 'Révoquer cette clé d\'API',
],
// Other
'powered_by' => ':app Status Page est propulsé par <a href="https://cachethq.github.io">Cachet</a>.',
'about_this_site' => 'À propos de ce site',
'rss-feed' => 'Flux RSS',
'atom-feed' => 'Flux Atom',
'feed' => 'Flux des services',
];

View File

@@ -0,0 +1,162 @@
<?php
return [
'dashboard' => 'Tableau de bord',
// Incidents
'incidents' => [
'incidents' => 'Incidents',
'logged' => '{0} Il n\'y a aucun incident, bien joué !|Vous avez reporté un incident.|Vous avez reporté <strong>:count</strong> incidents.',
'incident-create-template' => 'Créer un modèle',
'incident-templates' => 'Modèles d\'incident',
'add' => [
'title' => 'Ajouter un incident',
'success' => 'Incident ajouté.',
'failure' => 'Il s\'est passé quelque chose avec cet incident.',
],
'edit' => [
'title' => 'Éditer un incident',
'success' => 'Incident mis-à-jour.',
'failure' => 'Il s\'est passé quelque chose avec cet incident.',
],
// Incident templates
'templates' => [
'add' => [
'title' => 'Créer un modèle d\'incident',
'success' => 'Modèle créé.',
'failure' => 'Il s\'est passé quelque chose avec ce modèle d\'incident.',
],
'edit' => [
'title' => 'Modifier un modèle',
'success' => 'Modèle mis à jour.',
'failure' => 'Une erreur s\'est produite lors de la mise à jour du modèle.',
],
],
],
// Components
'components' => [
'components' => 'Composant|Composants',
'component_statuses' => 'Statut des composants',
'add' => [
'title' => 'Créer un composant',
'message' => 'Commencez par ajouter un composant.',
'success' => 'Composant créé.',
'failure' => 'Il s\'est passé quelque chose avec ce composant.',
],
'edit' => [
'title' => 'Éditer un composant',
'success' => 'Composant mis-à-jour.',
'failure' => 'Il s\'est passé quelque chose avec ce composant.',
],
// Component groups
'groups' => [
'groups' => 'Groupe de composants|Groupes de composants',
'add' => [
'title' => 'Ajouter un group de composants',
'success' => 'Groupe de composants ajouté.',
'failure' => 'Il s\'est passé quelque chose avec ce composantgroupe de composants.',
],
'edit' => [
'title' => 'Edit a component group',
'success' => 'Component group updated.',
'failure' => 'Something went wrong with the component group.',
],
],
],
// Metrics
'metrics' => [
'metrics' => 'Point de mesure',
'add' => [
'title' => 'Créer un point de mesure',
'success' => 'Point de mesure créé.',
'failure' => 'Il s\'est passé quelque chose avec ce point de mesure.',
],
'edit' => [
'title' => 'Edit a metric',
'success' => 'Metric updated.',
'failure' => 'Something went wrong with the metric.',
],
],
// Team
'team' => [
'team' => 'Équipe',
'member' => 'Membre',
'profile' => 'Profil',
'description' => 'Les membres de l\'équipe pourrons ajouter, modifier &amp; éditer les composants et incidents.',
'add' => [
'title' => 'Ajouter un membre à l\'équipe',
'success' => 'Membre ajouté.',
'failure' => 'Il s\'est passé quelque chose avec ce membre.',
],
'edit' => [
'title' => 'Mettre à jour le profil',
'success' => 'Profil mis-à-jour.',
'failure' => 'Il s\'est passé quelque chose en mettant à jour le profil.',
],
],
// Settings
'settings' => [
'settings' => 'Réglages',
'app-setup' => [
'app-setup' => 'Configuration',
'images-only' => 'Only images may be uploaded.',
'too-big' => 'The file you uploaded is too big. Upload an image smaller than :size',
],
'security' => [
'security' => 'Sécurité',
],
'stylesheet' => [
'stylesheet' => 'Feuille de style',
],
'theme' => [
'theme' => 'Thème',
],
'edit' => [
'success' => 'Réglages sauvegardés.',
'failure' => 'Les réglages n\'ont pas pu être sauvegardés.',
],
],
// Login
'login' => [
'login' => 'Connexion',
'logged_in' => "Vous êtes connecté.",
'welcome' => 'Re-bonjour !',
'two-factor' => 'Please enter your token.',
],
// Sidebar footer
'help' => 'Aide',
'status_page' => 'Statut des services',
'logout' => 'Déconnexion',
// Notifications
'notifications' => [
'notifications' => 'Notifications',
'awesome' => 'Cool.',
'whoops' => 'Oups.',
],
// Welcome modal
'welcome' => [
'welcome' => 'Welcome to Cachet',
'message' => 'Your status page is almost ready! You might want to configure these extra settings',
'close' => 'Just go straight to my dashboard',
'steps' => [
'component' => 'Create components',
'incident' => 'Create incidents',
'customize' => 'Customize your Cachet Status Page.',
'team' => 'Add users to your team.',
'api' => 'Generate API token.',
'two-factor' => 'Enable Two Factor Authetication.',
],
],
];

View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => 'Cette page est manquante !',
'message' => 'Désolé, mais la page que vous recherchez est introuvable. Vérifier l\'URL et essayez à nouveau.',
'link' => 'Retour à l\'accueil',
],
'unauthorized' => [
'code' => '401',
'title' => 'Unauthorized',
'message' => 'Sorry, you need admin privileges to see this page.',
'link' => 'Return to homepage',
],
];

123
resources/lang/fr/forms.php Normal file
View File

@@ -0,0 +1,123 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => 'Adresse email',
'username' => 'Identifiant',
'password' => 'Mot de passe',
'site_name' => 'Nom du site',
'site_domain' => 'Domaine du site',
'site_timezone' => 'Sélectionnez votre fuseau horaire',
'site_locale' => 'Sélectionnez votre langue',
'enable_google2fa' => 'Enable Google Two Factor Authentication',
],
// Login form fields
'login' => [
'email' => 'Adresse email',
'password' => 'Mot de passe',
'2fauth' => 'Authentication Code',
'invalid' => 'Invalid email or password',
'invalid-token' => 'Invalid token',
],
// Incidents form fields
'incidents' => [
'name' => 'Nom',
'status' => 'Statut',
'message' => 'Message',
'message-help' => 'Vous pouvez aussi utiliser du Markdown.',
'templates' => [
'name' => 'Nom',
'template' => 'Modèle',
],
],
// Components form fields
'components' => [
'name' => 'Nom',
'status' => 'Statut',
'group' => 'Groupe',
'description' => 'Description',
'link' => 'Lien',
'tags' => 'Tags',
'tags-help' => 'Séparé par une virgule.',
'groups' => [
'name' => 'Nom',
],
],
// Metric form fields
'metrics' => [
'name' => 'Name',
'suffix' => 'Suffix',
'description' => 'Description',
'description-help' => 'You may also use Markdown.',
'display-chart' => 'Display chart on status page?',
'calc_type' => 'Calculation of metrics',
'type_sum' => 'Sum',
'type_avg' => 'Average',
'points' => [
'value' => 'Value',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => 'Nom du site',
'site-url' => 'URL du site',
'site-timezone' => 'Fuseau horaire du site',
'site-locale' => 'Langue du site',
'date-format' => 'Format de date',
'display-graphs' => 'Display graphs on status page?',
'about-this-page' => 'À propos de cette page',
'days-of-incidents' => 'Nombre de jours à afficher ?',
'banner' => 'Bannière',
'banner-help' => "Il est recommandé de télécharger des fichiers de moins de 930 pixels de large.",
'google-analytics' => "Google Analytics code",
],
'security' => [
'allowed-domains' => 'Domaines autorisés. <small class="help-block"></small>',
'allowed-domains-help' => 'Séparés par une virgule. Les domaines enregistrés ci-dessus seront automatiquement autorisés par défaut.',
],
'stylesheet' => [
'custom-css' => 'Feuille de style personnalisée',
],
'theme' => [
'background-color' => 'Couleur d\'arrière plan',
'text-color' => 'Couleur du texte',
],
],
'user' => [
'username' => 'Identifiant',
'email' => 'Adresse email',
'password' => 'Mot de passe',
'api-token' => 'Jeton API',
'api-token-help' => 'Regénérer votre jeton API révoquera toutes les applications existantes.',
'2fa' => [
'help' => 'Enabling two factor authentication increases security of your account. You will need to download <a href="https://support.google.com/accounts/answer/1066447?hl=en">Google Authenticator</a> or a similar app on to your mobile device. When you login you will be asked to provide a token generated by the app.',
],
],
// Buttons
'add' => 'Ajouter',
'save' => 'Sauvegarder',
'update' => 'Mettre à jour',
'create' => 'Créer',
'edit' => 'Éditer',
'delete' => 'Effacer',
'submit' => 'Envoyer',
'cancel' => 'Annuler',
'remove' => 'Supprimer',
// Other
'optional' => '* Optional',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Précédent',
'next' => 'Suivant &raquo;',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'Les mots de passe doivent contenir 6 caractères minimum et être identique à la confirmation.',
'user' => 'Nous ne trouvons aucun utilisateur avec cette adresse email.',
'token' => 'Ce jeton de réinitialisation de mot de passe est invalide.',
'sent' => 'Rappel de mot de passe envoyé !',
'reset' => 'Votre mot de passe à été réinitialisé !',
];

View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => 'Installation',
'title' => 'Installer Cachet',
'service_details' => 'Details du service',
'status_page_setup' => 'Installation de la page de statut',
'show_support' => 'Montrer votre soutien envers Cachet ? <small>Affiche un lien vers Cachet en bas de page.</small>',
'admin_account' => 'Compte administrateur',
'complete_setup' => 'Terminer l\'installation',
'completed' => 'Cachet a été configuré avec succès !',
'finish_setup' => 'Aller au tableau de bord',
'allow_tracking' => 'Allow anonymous usage tracking?',
];

View File

@@ -0,0 +1,104 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
"accepted" => "Le champ :attribute doit être accepté.",
"active_url" => "Le champ :attribute n'est pas une URL valide.",
"after" => "Le champ :attribute doit être une date postérieure à :date.",
"alpha" => "Le champ :attribute ne peut contenir que des lettres.",
"alpha_dash" => "Le champ :attribute ne peut contenir que des lettres, chiffres et tirets.",
"alpha_num" => "Le champ :attribute ne peut contenir que des lettres ou des chiffres.",
"array" => "Le champ :attribute doit être un tableau.",
"before" => "Le champ :attribute doit être une date antérieure à :date.",
"between" => [
"numeric" => "Le champ :attribute doit être entre :min et :max.",
"file" => "Le champ :attribute doit être entre :min et :max kilobytes.",
"string" => "Le champ :attribute doit contenir entre :min et :max caractères.",
"array" => "Le champ :attribute doit avoir entre :min et :max objets.",
],
"confirmed" => "Le champ :attribute confirmation ne correspond pas.",
"date" => "Le champ :attribute n'est pas une date valide.",
"date_format" => "Le champ :attribute ne correspond pas au format :format.",
"different" => "Le champ :attribute et :other doivent être différents.",
"digits" => "Le champ :attribute doit être composé de :digits chiffres.",
"digits_between" => "Le champ :attribute doit être composé de :min jusqu'à :max chiffres.",
"email" => "Le champ :attribute doit être une adresse email valide.",
"exists" => "Le champ selected :attribute est invalide.",
"image" => "Le champ :attribute doit être une image.",
"in" => "Le champ selected :attribute est invalide.",
"integer" => "Le champ :attribute doit être un entier.",
"ip" => "Le champ :attribute doit être une adresse IP valide.",
"max" => [
"numeric" => "Le champ :attribute ne doit pas être supérieure à :max.",
"file" => "Le champ :attribute ne doit pas être supérieure à :max kilobytes.",
"string" => "Le champ :attribute ne doit pas être supérieure à :max caractères.",
"array" => "Le champ :attribute ne doit pas avoir plus de :max objets.",
],
"mimes" => "Le champ :attribute doit être un fichier de type : :values.",
"min" => [
"numeric" => "Le champ :attribute doit être supérieur à :min.",
"file" => "Le champ :attribute doit être supérieur à :min kilobytes.",
"string" => "Le champ :attribute doit être supérieur à :min caractères.",
"array" => "Le champ :attribute doit avoir au moins :min objets.",
],
"not_in" => "Le champ sélectionné :attribute est invalide.",
"numeric" => "Le champ :attribute doit être un nombre.",
"regex" => "Le format du champ :attribute est invalide.",
"required" => "Le champ :attribute est obligatoire.",
"required_if" => "Le champ :attribute est obligatoire quand :other est :value.",
"required_with" => "Le champ :attribute est obligatoire quand :values est présent.",
"required_with_all" => "Le champ :attribute est obligatoire quand :values est présent.",
"required_without" => "Le champ :attribute est obligatoire quand :values n'est pas présent.",
"required_without_all" => "Le champ :attribute est obligatoire quand aucun des champs :values n'est présent.",
"same" => "Le champ :attribute et :other doivent être identiques.",
"size" => [
"numeric" => "La taille du champ :attribute doit être de :size.",
"file" => "Le poids du champ :attribute doit être de :size kilobytes.",
"string" => "Le nombre de caractères du champ :attribute doit être de :size caractères.",
"array" => "Le champ :attribute doit contenir :size objets.",
],
"unique" => "Le champ :attribute est déjà utilisé.",
"url" => "Le format du champ :attribute est invalide.",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [ ],
];

59
resources/lang/pt-BR/cachet.php Executable file
View File

@@ -0,0 +1,59 @@
<?php
return [
// Components
'components' => [
'status' => [
1 => 'Operacional',
2 => 'Problemas de performance',
3 => 'Indisponibilidade parcial',
4 => 'Indisponibilidade total',
],
],
// Incidents
'incidents' => [
'none' => 'Nenhum incidente reportado.',
'past' => 'Incidentes anteriores',
'previous_week' => 'Semana anterior',
'next_week' => 'Próxima semana',
'none' => 'Nenhum incidente reportado.',
'scheduled' => '',
'scheduled_at' => '',
'status' => [
0 => '', // TODO: Hopefully remove this.
1 => 'Investigando',
2 => 'Identificado',
3 => 'Observando',
4 => 'Resolvido',
],
],
// Service Status
'service' => [
'good' => 'Todos os serviços estão operando normalmente.',
'bad' => 'Alguns serviços estão passando por problemas.',
],
'api' => [
'regenerate' => 'Gerar nova chave de API',
'revoke' => 'Revogar a chave de API',
],
// Metrics
'metrics' => [
'filter' => [
'hourly' => '',
'daily' => '',
'monthly' => '',
],
],
// Other
'powered_by' => ':app Esta Status Page é fornecida por <a href="https://cachethq.github.io">Cachet</a>.',
'about_this_site' => 'Sobre este site',
'rss-feed' => 'RSS Feed',
'atom-feed' => 'Atom Feed',
'feed' => 'Status Feed',
];

View File

@@ -0,0 +1,184 @@
<?php
return [
'dashboard' => 'Dashboard',
// Incidents
'incidents' => [
'title' => '',
'incidents' => 'Incidentes',
'logged' => '{0} Não existem incidentes, bom trabalho.|Você registrou um incidente.|Você reportou <strong>:count</strong> incidentes.',
'incident-create-template' => 'Criar template',
'incident-templates' => 'Template de incidentes',
'add' => [
'title' => 'Adicionar um incidente',
'success' => 'Incidente adicionado.',
'failure' => 'Algo deu errado com o incidente.',
],
'edit' => [
'title' => 'Editar um incidente',
'success' => 'Incidente atualizado.',
'failure' => 'Algo deu errado com o incidente.',
],
// Incident templates
'templates' => [
'title' => 'Template de incidentes',
'add' => [
'title' => 'Criar um template de incidente',
'success' => 'Template criado.',
'failure' => 'Algo deu errado com o template de incidente.',
],
'edit' => [
'title' => 'Editar template',
'success' => 'Template foi atualizado!',
'failure' => 'Algo deu errado atualizando o template de incidente',
],
],
],
// Incident Maintenance
'schedule' => [
'schedule' => '',
'scheduled_at' => '',
'add' => [
'title' => '',
'success' => '',
'failure' => '',
],
'edit' => [
'title' => '',
'success' => '',
'failure' => '',
],
'delete' => [
'success' => '',
'failure' => '',
],
],
// Components
'components' => [
'components' => 'Componentes',
'component_statuses' => 'Status do componente',
'add' => [
'title' => 'Adicionar componente',
'message' => 'Você deve adicionar um componente.',
'success' => 'Componente criado.',
'failure' => 'Algo deu errado com o componente.',
],
'edit' => [
'title' => 'Editar um componente',
'success' => 'Componente atualizado.',
'failure' => 'Algo deu errado com o componente.',
],
// Component groups
'groups' => [
'groups' => 'Grupo de componente|Grupos de componente',
'add' => [
'title' => 'Adicionar um grupo de componentes',
'success' => 'Grupo de componente adicionado.',
'failure' => 'Algo deu errado com o grupo de componente.',
],
'edit' => [
'title' => '',
'success' => '',
'failure' => '',
],
],
],
// Metrics
'metrics' => [
'metrics' => 'Metricas',
'add' => [
'title' => '',
'success' => '',
'failure' => '',
],
'edit' => [
'title' => '',
'success' => '',
'failure' => '',
],
],
// Team
'team' => [
'team' => 'Equipe',
'member' => 'Membro',
'profile' => 'Perfil ',
'description' => 'Membros da equipe serão capazes de adicionar, modificar &amp; editar componentes e incidentes.',
'add' => [
'title' => 'Adicionar um novo membro da equipe',
'success' => 'Membro da equipe adicionado.',
'failure' => 'Algo deu errado com o componente.',
],
'edit' => [
'title' => 'Atualizar perfil',
'success' => 'Perfil atualizado.',
'failure' => 'Algo deu errado duante a atualização.',
],
],
// Settings
'settings' => [
'settings' => 'Configurações',
'app-setup' => [
'app-setup' => 'Instalação do aplicativo',
'images-only' => 'Somente imagens podem ser carregadas.',
'too-big' => 'O arquivo que você carregou é muito grande. Envie uma imagem inferior à :size',
],
'security' => [
'security' => 'Segurança',
],
'stylesheet' => [
'stylesheet' => 'Folha de estilo',
],
'theme' => [
'theme' => 'Tema',
],
'edit' => [
'success' => 'Configurações salvas.',
'failure' => 'Não foi possível salvar as configurações.',
],
],
// Login
'login' => [
'login' => 'Login',
'logged_in' => 'Você está logado.',
'welcome' => 'Bem-vindo de volta!',
'two-factor' => 'Por favor insira o seu token.',
],
// Sidebar footer
'help' => 'Ajuda',
'status_page' => 'Página de status',
'logout' => 'Sair',
// Notifications
'notifications' => [
'notifications' => 'Notificações',
'awesome' => 'Excelente.',
'whoops' => 'Opa.',
],
// Welcome modal
'welcome' => [
'welcome' => 'Bem-vindo ao Cachet',
'message' => 'Sua página de status está quase pronta! Tavez vocë queira checar essas configurações extras',
'close' => 'Basta ir direto para o meu painel de controle',
'steps' => [
'component' => 'Criar componentes',
'incident' => 'Criar incidentes',
'customize' => 'Personalizar',
'team' => 'Adicionar usuários',
'api' => 'Gerar token de API',
'two-factor' => '',
],
],
];

16
resources/lang/pt-BR/errors.php Executable file
View File

@@ -0,0 +1,16 @@
<?php
return [
'not-found' => [
'code' => '404',
'title' => 'Essa página desapareceu!',
'message' => 'Desculpe, mas a página que você está procurando não foi encontrada. Verifique a URL por erros e tente novamente.',
'link' => 'Voltar para a página inicial',
],
'unauthorized' => [
'code' => '401',
'title' => 'Não autorizado',
'message' => 'Desculpe, que você precisa de privilégios de administrador para ver esta página.',
'link' => 'Voltar para a página inicial',
],
];

126
resources/lang/pt-BR/forms.php Executable file
View File

@@ -0,0 +1,126 @@
<?php
return [
// Setup form fields
'setup' => [
'email' => 'Email',
'username' => 'Usuário',
'password' => 'Senha',
'site_name' => 'Nome do site',
'site_domain' => 'Domínio do site',
'site_timezone' => 'Selecione o seu fuso horário',
'site_locale' => 'Selecione seu idioma',
'enable_google2fa' => 'Habilitar a autenticação de dois fatores do Google',
],
// Login form fields
'login' => [
'email' => 'Email',
'password' => 'Senha',
'2fauth' => 'Código de autenticação',
'invalid' => 'E-mail ou senha inválidos',
'invalid-token' => 'Token inválido',
],
// Incidents form fields
'incidents' => [
'name' => 'Nome',
'status' => 'Status',
'component' => 'Componente',
'message' => 'Mensagem',
'message-help' => 'Você também pode usar o Markdown.',
'scheduled_at' => '',
'templates' => [
'name' => 'Nome',
'template' => 'Template',
],
],
// Components form fields
'components' => [
'name' => 'Nome',
'status' => 'Status',
'group' => 'Grupo',
'description' => 'Descrição',
'link' => 'Link',
'tags' => 'Marcações',
'tags-help' => 'Separados por vírgulas.',
'groups' => [
'name' => 'Nome',
],
],
// Metric form fields
'metrics' => [
'name' => '',
'suffix' => '',
'description' => '',
'description-help' => '',
'display-chart' => '',
'default-value' => '',
'calc_type' => 'Calculation of metrics',
'type_sum' => 'Sum',
'type_avg' => 'Average',
'points' => [
'value' => '',
],
],
// Settings
'settings' => [
/// Application setup
'app-setup' => [
'site-name' => 'Nome do site',
'site-url' => 'URL do site',
'site-timezone' => 'Fuso horário do site',
'site-locale' => 'Idioma do site',
'date-format' => 'Formato da Data',
'display-graphs' => '',
'about-this-page' => 'Sobre esta página',
'days-of-incidents' => 'Quantos dias de incidentes para mostrar?',
'banner' => 'Imagem do banner',
'banner-help' => "É recomendável que você faça upload de arquivos menores que 930px .",
'google-analytics' => "Código do Google Analytics",
],
'security' => [
'allowed-domains' => 'Domínios permitidos',
'allowed-domains-help' => 'Separados por vírgula. O domínio definido acima é permitido automaticamente por padrão.',
],
'stylesheet' => [
'custom-css' => 'Folha de estilos personalizada',
],
'theme' => [
'background-color' => 'Cor de fundo',
'text-color' => 'Cor do Texto',
],
],
'user' => [
'username' => 'Usuário',
'email' => 'Email',
'password' => 'Senha',
'api-token' => 'Token da API',
'api-token-help' => 'Regenerar a chave da API impedirá que aplicativos existentes acessem o Cachet.',
'2fa' => [
'help' => 'Ativando autenticação de dois fatores aumenta a segurança de sua conta. Você vai precisar baixar <a href="https://support.google.com/accounts/answer/1066447?hl=en"> Google Authenticator</a> ou um app similar em seu dispositivo móvel. Quando você entrar você será solicitado um token gerado pelo app.',
],
],
// Buttons
'add' => 'Adicionar',
'save' => 'Salvar',
'update' => 'Atualizar',
'create' => 'Criar',
'edit' => 'Editar',
'delete' => 'Apagar',
'submit' => 'Enviar',
'cancel' => 'Cancelar',
'remove' => 'Remover',
// Other
'optional' => '* Opcional',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Anterior',
'next' => 'Próximo &raquo;',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'A senha precisa ter no minimo seis caracteres e tem que ser igual à confirmação.',
'user' => 'Não foi encontrado nenhum usuário com este endereço de email.',
'token' => 'Este código de redefinição de senha é inválido.',
'sent' => 'Lembrete de senha foi enviado!',
'reset' => 'A senha foi redefinida!',
];

14
resources/lang/pt-BR/setup.php Executable file
View File

@@ -0,0 +1,14 @@
<?php
return [
'setup' => 'Configuração',
'title' => 'Configurar o Cachet',
'service_details' => 'Detalhes do serviço',
'status_page_setup' => 'Configuração da página de status',
'show_support' => 'Mostrar apoio ao Cachet? <small>Coloca um link no rodapé direcionando para Cachet.</small>',
'admin_account' => 'Conta de administrador',
'complete_setup' => 'Configuração completa',
'completed' => 'Cachet foi configurado com sucesso!',
'finish_setup' => 'Ir para o painel de controle',
'allow_tracking' => 'Permite rastreamento de uso anônimo?',
];

View File

@@ -0,0 +1,106 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
"accepted" => "O campo :attribute deve ser aceito.",
"active_url" => "O campo :attribute não é uma URL válida.",
"after" => "O campo :attribute deverá conter uma data posterior a :date.",
"alpha" => "O campo :attribute deverá conter apenas letras.",
"alpha_dash" => "O campo :attribute só pode conter letras, números, e hifens.",
"alpha_num" => "O campo :attribute só pode conter letras e números.",
"array" => "O campo :attribute deve ser um vetor.",
"before" => "O campo :attribute deverá conter uma data anterior a :date.",
"between" => [
"numeric" => "O campo :attribute deverá ter um valor entre :min - :max.",
"file" => "O campo :attribute deverá ter um tamanho entre :min - :max kilobytes.",
"string" => "O campo :attribute deverá conter entre :min - :max caracteres.",
"array" => "O campo :attribute deve ter entre :min e :max itens.",
],
"boolean" => "O campo :attribute deve ser verdadeiro ou falso.",
"confirmed" => "A confirmação para o campo :attribute não coincide.",
"date" => "O :attribute não é uma data válida.",
"date_format" => "O :attribute não corresponde ao formato :format.",
"different" => "O :attribute e :other devem ser diferentes.",
"digits" => "O campo :attribute deverá conter :digits dígitos.",
"digits_between" => "O :attribute deve ter entre :min e :max dígitos.",
"email" => "A: attribute deve ser um endereço de email válido.",
"exists" => "O :attribute selecionado é inválido.",
"image" => "O :attribute deve ser uma imagem.",
"in" => "O :attribute selecionado é inválido.",
"integer" => "O :attribute deve ser um número inteiro.",
"ip" => "O :attribute deve ser um endereço de IP válido.",
"max" => [
"numeric" => "O :attribute não pode ser maior do que :max.",
"file" => "O campo :attribute não deverá ter um tamanho superior a :max kilobytes.",
"string" => "O :attribute não pode ser maior do que :max caracteres.",
"array" => "A: atributo não pode ter mais de que :max itens.",
],
"mimes" => "O :attribute deve ser um arquivo do tipo: :values.",
"min" => [
"numeric" => "O :attribute deve ter pelo menos :min.",
"file" => "O :attribute deve ter pelo menos :min kilobytes.",
"string" => "O :attribute deve ter pelo menos :min caracteres.",
"array" => "O :attribute deve ter pelo menos :min itens.",
],
"not_in" => "O :attribute selecionado é inválido.",
"numeric" => "O :attribute deve ser um número.",
"regex" => "O formato de :attribute é inválido.",
"required" => "O campo de :attribute é obrigatório.",
"required_if" => "O campo de :attribute é obrigatório quando :other é :value.",
"required_with" => "O campo :attribute é obrigatório quando :values está presente.",
"required_with_all" => "O campo :attribute é obrigatório quando :values está presente.",
"required_without" => "O campo de :attribute é obrigatório quando :values não está presente.",
"required_without_all" => "O campo de :attribute é obrigatório quando qualquer um dos :values estão presentes.",
"same" => "O :attribute e :other devem corresponder.",
"size" => [
"numeric" => "O :attribute deve ser :size.",
"file" => "O :attribute deve ter :size kilobytes.",
"string" => "O :attribute deve ter :size caracteres.",
"array" => "O :attribute deve ter :size itens.",
],
"unique" => "O :attribute já existe.",
"url" => "O formato de :attribute é inválido.",
"timezone" => "O :attribute deve ser uma zona válida.",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'Mensagem-personalizada',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

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

Some files were not shown because too many files have changed in this diff Show More