Compare commits

..

63 Commits
3.x ... 0.1

Author SHA1 Message Date
James Brooks
7c57ed65fa Don't use url helper 2015-04-18 16:51:18 +01:00
James Brooks
e0fd2db5ea Fixes #583, use 24H in PgSQL 2015-04-15 18:57:32 +01:00
James Brooks
7e1d0ebc75 Fixes #584, change the metrics display to include current hour values. 2015-04-15 18:56:29 +01:00
James Brooks
7f0a77ffa1 Fixes #585 - Multiple metrics under PgSql/SQLite would fail 2015-04-15 18:53:20 +01:00
James Brooks
a3f696e5b3 Fix CS 2015-04-15 09:10:42 +01:00
James Brooks
fe0cc779b9 Merge pull request #581 from silverxp/master
Added Dutch translation
2015-04-15 08:41:21 +01:00
Thom
02a240a172 Fixed indentation 2015-04-15 09:17:10 +02:00
Thom Spooren
47d0d4e007 Added Dutch translation 2015-04-12 22:29:21 +02:00
James Brooks
3e6a9fc77f Fix CS error 2015-04-11 19:15:41 +01:00
James Brooks
94d92aa6dc Do not use Lato anymore. Closes #578. 2015-04-11 19:14:02 +01:00
James Brooks
a35ea250da Fix poor metrics calculations. Closes #577 2015-04-11 19:10:42 +01:00
James Brooks
a1346deda9 Fix CS issues caused by new fixer settings. 2015-04-11 18:52:22 +01:00
James Brooks
07db5defb7 Merge pull request #580 from ApfelUser/patch-1
Fix typo
2015-04-11 18:49:31 +01:00
ApfelUser
f26d4c41c5 Fix typo
https://crowdin.com/translate/cachet/9/en-de#435
2015-04-10 13:57:01 +02:00
James Brooks
a88eadf79f Merge pull request #575 from bimlendu/sensu-handler
adding sensu handler info in README
2015-04-07 20:47:47 +01:00
Bimlendu Mishra
78eb149fc6 adding sensu handler info in README 2015-04-07 22:31:51 +05:30
James Brooks
dfa602f1f5 Merge pull request #570 from applelam/master
zh-Hant and zh-Hans Translation
2015-04-05 20:33:33 +01:00
James Brooks
352090d90f Closes #571 2015-04-05 20:31:40 +01:00
Apple Lam
bffb244506 zh-Hant and zh-Hans Translation
Translation for Chinese (Traditional) and Chinese (Simplified)
2015-04-06 02:48:26 +08:00
James Brooks
108a1fa0dd Make the RSS feed more valid. Still #547 2015-04-03 18:00:57 +01:00
James Brooks
647fb5a4d5 Update dependencies. 2015-04-03 17:53:15 +01:00
James Brooks
8dec726bc4 Closes #550 - Component Group feeds now work. 2015-04-03 17:52:18 +01:00
James Brooks
9f920634db Merge pull request #558 from urtho/master
Polish (PL-pl) translation
2015-03-31 16:07:33 +01:00
Paweł Pierścionek
2934f9be67 PL Translation 2015-03-31 15:01:34 +00:00
James Brooks
6756c037c9 Fix #544 2015-03-31 08:48:49 +01:00
James Brooks
83e979cc25 Order Atom & RSS feed by reversed creation date 2015-03-26 12:21:16 +00:00
James Brooks
438964c1dd Merge pull request #549 from cachethq/component-groups-feed
Feeds can now accept a component group id to filter. Closes #548
2015-03-26 09:00:38 +00:00
James Brooks
9a8e9a47c4 Merge pull request #545 from anarcat/fr
add maintenance translations
2015-03-26 09:00:22 +00:00
James Brooks
5e05b859ae Feeds can now accept a component group id to filter. Closes #548 2015-03-26 08:58:18 +00:00
James Brooks
4becca76f3 Make the Atom feed a little better. Part of #547 2015-03-26 08:46:17 +00:00
James Brooks
46578f9407 Update the RSS feed to be compliant. Part of #547 2015-03-26 08:44:04 +00:00
Antoine Beaupré
0a30a07c43 add maintenance translations 2015-03-25 16:26:06 -04:00
James Brooks
3e9b560640 Added property annotation 2015-03-25 12:10:22 +00:00
James Brooks
ca263d8b50 Don't display the template itself. Closes #541 2015-03-25 12:07:08 +00:00
James Brooks
6986ee95d3 List components within groups. Closes #542 2015-03-25 12:06:33 +00:00
James Brooks
fd429a6ea7 Merge pull request #539 from anarcat/patch-2
'composante' is feminine in french, also adjust other fr trans
2015-03-24 14:18:56 +00:00
Antoine Beaupré
59f69f6d99 'composante' is feminine in french, also adjust other fr trans
'Il s'est passé quelquechose...' doesn't actually mean anything...
2015-03-24 10:17:01 -04:00
James Brooks
f5756ff4bf Commit changes to ComponentGroup for no longer soft deleting 2015-03-24 13:10:13 +00:00
James Brooks
5e907ba04f Component groups are now properly removed. Closes #535 2015-03-24 08:52:28 +00:00
James Brooks
d12748a49d Merge pull request #537 from anarcat/patch-2
add more fr translation
2015-03-23 23:03:22 +00:00
anarcat
eeaa4cbc91 add more fr translation
this especially gets rid of the english word "Cool" but also translates a few more items
2015-03-23 16:38:25 -04:00
James Brooks
2f8db16161 Merge pull request #536 from anarcat/patch-1
more precise french translation for "watching"
2015-03-23 20:26:29 +00:00
anarcat
96d90aff65 more precise french translation for "watching"
`Analyse en cours` means `Under analysis`, which is basically the same as status `1` (`Investigating`), so a little misleading. I chose `Sous surveillance` (litterally `Under surveillance`) because it is more explicit. `Surveillé` (litterally `surveilled`) seemed a bit weird.
2015-03-23 13:57:17 -04:00
James Brooks
1b60d00bba Merge pull request #531 from matejkramny/feature/readme-addons
Add Addons section
2015-03-22 14:43:08 +00:00
Matej Kramny
b0049611af Add Addons section 2015-03-22 12:46:55 +00:00
James Brooks
95bbb955aa Fix #528 - Status value for scheduled statuses. 2015-03-21 11:19:19 +00:00
James Brooks
ad414a11e0 Fallback for $queryTypes 2015-03-21 07:28:15 +00:00
James Brooks
f76e9bab06 Better condition for showing the break item 2015-03-20 22:42:29 +00:00
James Brooks
9aa5972040 Only display the break item if we have ungrouped-components 2015-03-20 22:41:43 +00:00
James Brooks
11b1125cf8 Show components within groups on the status page. Closes #393. 2015-03-20 12:03:18 +00:00
James Brooks
2467d24702 Metric descriptions are no longer required, so make the form know that. 2015-03-20 11:39:50 +00:00
James Brooks
a62860fda3 Use the more appropriate collection method 2015-03-20 11:35:54 +00:00
James Brooks
c91344f79c CS changes 2015-03-20 11:23:17 +00:00
James Brooks
a4819099eb Track setups (pass and fails) 2015-03-20 11:20:55 +00:00
James Brooks
99d599e1c7 Split the new list up a little 2015-03-20 11:03:31 +00:00
James Brooks
77d1a45538 List users who have not enabled two-factor authentication. 2015-03-20 11:03:12 +00:00
James Brooks
b5ca990ae5 Fix responsive positioning of action buttons. 2015-03-20 10:53:16 +00:00
James Brooks
9d6ef75597 Reset the group_id for components if a group is deleted. 2015-03-20 10:49:58 +00:00
James Brooks
5299d9ea16 Show the number of components a group has in it. 2015-03-20 10:48:42 +00:00
James Brooks
d6a55a6540 Fix relationship of ComponentGroup and Components. 2015-03-20 10:48:03 +00:00
James Brooks
38a4fb710f Show the group a component is in, on the dashboard component index. 2015-03-20 10:45:44 +00:00
James Brooks
6496f8c928 Make sure we have a segment write key before we try tracking 2015-03-20 10:34:53 +00:00
James Brooks
c20f1ac785 Don't throw errors if we have no connection. 2015-03-20 10:32:07 +00:00
403 changed files with 24019 additions and 14188 deletions

4
.bowerrc Normal file
View File

@@ -0,0 +1,4 @@
{
"directory": "app/assets/bower_components",
"interactive": false
}

1
.dockerignore Normal file
View File

@@ -0,0 +1 @@
.git

View File

@@ -1,18 +1,12 @@
# This file is for unifying the coding style for different editors and IDEs
# editorconfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[docker-compose.yml]
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

View File

@@ -1,72 +0,0 @@
APP_NAME=Cachet
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_TIMEZONE=UTC
APP_URL=http://cachet.test
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database
BCRYPT_ROUNDS=12
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
CACHE_STORE=database
CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}"
CACHET_BEACON=false
CACHET_EMOJI=false
CACHET_AUTO_TWITTER=true
CACHET_PATH=/
CACHET_TRUSTED_PROXIES=""
NIGHTWATCH_ENABLED=false

11
.env.example.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
return [
'APP_DEBUG' => getenv('APP_DEBUG') ?: false,
'DB_DRIVER' => 'mysql',
'DB_HOST' => 'localhost',
'DB_DATABASE' => 'cachet',
'DB_USERNAME' => 'homestead',
'DB_PASSWORD' => 'secret',
'CACHE_DRIVER' => 'apc',
];

14
.env.heroku.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
$dbURL = parse_url(getenv('DATABASE_URL'));
$dbName = substr($dbURL["path"], 1);
return [
'APP_DEBUG' => getenv('APP_DEBUG') ?: false,
'DB_HOST' => $dbURL['host'],
'DB_DATABASE' => $dbName,
'DB_USERNAME' => $dbURL['user'],
'DB_PASSWORD' => $dbURL['pass'],
'DB_DRIVER' => 'pgsql',
'CACHE_DRIVER' => 'apc',
];

10
.gitattributes vendored
View File

@@ -1,5 +1,9 @@
* text=auto
*.css linguist-vendored
*.scss linguist-vendored
/.github export-ignore
/tests export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/phpunit.xml export-ignore
/CONTRIBUTING.md export-ignore
/INSTALL.md export-ignore
/README.md export-ignore

View File

@@ -1,46 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at james@alt-three.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View File

@@ -1,94 +0,0 @@
# Contribution Guidelines
## Thank you
Firstly, thank you for taking an interest in Cachet and for reading this guide.
## Creating issues
We track feature requests and bug reports on the [issue tracker](https://github.com/cachethq/Cachet/issues). Please send support requests to our support email; [support@alt-three.com](mailto:support@alt-three.com?subject=Cachet%20Support).
**Always be respectful.** Organisation members reserve the right to lock topics if they feel necessary.
## Languages
This project accepts **English translations** only. Translations will be updated automatically through the [CrowdIn](https://translate.cachethq.io) integration.
Please submit alternative translations to the [Cachet CrowdIn](https://translate.cachethq.io) project. CrowdIn will automatically send a Pull Request with your updates in.
## Coding Standards
Please try to follow existing coding standards. [StyleCI](https://styleci.io) will analyse and fix any discrepancies in coding standards.
## Introduction into Git and GitHub
If you are new to Git, GitHub and the whole open source software community, welcome! Here are some resources for getting started and understanding what it's all about.
- [Try Git](https://try.github.io/levels/1/challenges/1) by Code School
- [GitHub Help](https://help.github.com)
If you're not fond of the command line, you can get one of GitHub's free GUI desktop apps:
- [GitHub for Mac](https://github.com/blog/1510-installing-git-from-github-for-mac)
- [GitHub for Windows](https://github.com/blog/1127-github-for-windows)
If you're feeling adventurous, you can become a Git & GitHub master with the [Git Path on Code School](https://www.codeschool.com/paths/git).
## .editorconfig
You should also make use of the [.editorconfig](/.editorconfig) file found within the root of the repository. It'll make sure that your editor is setup with the same file settings.
## Ways to help:
Start by becoming familiar with Cachet. If you're already using Cachet, that's a great head start. If not, check out the latest [demo](https://dev.cachethq.io) and have a play. You can also download and install Cachet locally to familiarise yourself that way.
You don't have to be a developer to help improve Cachet, infact there are lots of ways that you can help us.
### Spread the word
There are a lot of people who don't know about Cachet or what a status page is and how important it can be. [Tweet about Cachet](https://twitter.com/CachetHQ). Write blog posts about your success (or failures, we're not perfect) with Cachet and share what you took away from it.
### Help with Documentation
Cachet is in use around the world. Cachet speaks multiple languages. Our documentation doesn't and can be hard to understand for non-English speaking people. Documentation should be easy to understand and we need your help to make this possible. Check out [CachetHQ/Docs](https://github.com/CachetHQ/Docs) to contribute to our documentation.
### As a non-developer/non-designer
We're always looking for new [translations](#translations).
Of course bug reports, feature requests and [documentation](https://docs.cachethq.io) are always appreciated.
### As a designer
As Cachet gains new features, the design and ideas that were once a perfect fit need updating and in some cases designing from scratch. This is where you come in! Fancy giving Cachet a lick of paint? Sweet!
You'll need to install Node.js with NPM or Yarn.
To get started you can do the following:
1. Install Node.js and our dev dependencies.
2. Run `npm run dev`
3. Make your changes to the SCSS files in `./resources/assets/sass/`
If you're making a lot of changes, you'll find that running `npm run watch` will make life easier for you!
When you're happy with your changes, please run `npm run prod` to minify the assets.
### As a developer
Built using [Laravel](https://laravel.com).
We use these extra dependencies to develop Cachet:
- Node.js
- NPM or Yarn
- Composer
- Git
Once cloned to your local machine, you'll need some demo data! Run `php artisan cachet:seed` to get the demo installation ready for action.
### #YOLO JUST SUBMIT A PR
_A great idea taken from https://github.com/metabase/metabase/blob/master/docs/contributing.md#yolo-just-submit-a-pr._
> If you come up with something really cool, and want to share it with us, just submit a PR. If it hasn't gone through the above process, we probably won't merge it as is, but if it's compelling, we're more than willing to help you via code review, design review and generally OCD nitpicking so that it fits into the rest of our codebase.

5
.github/FUNDING.yml vendored
View File

@@ -1,5 +0,0 @@
# These are supported funding model platforms
github:
- jbrooksuk
- cachethq

View File

@@ -1,29 +0,0 @@
version: 2
updates:
- package-ecosystem: composer
directory: "/"
schedule:
interval: daily
time: "07:00"
groups:
php-dependencies:
update-types:
- "minor"
- "patch"
allow:
- dependency-type: direct
versioning-strategy: increase-if-necessary
- package-ecosystem: npm
directory: "/"
schedule:
interval: weekly
day: monday
groups:
js-dependencies:
update-types:
- "minor"
- "patch"
allow:
- dependency-type: direct
versioning-strategy: increase-if-necessary

44
.gitignore vendored
View File

@@ -1,22 +1,24 @@
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/public/css/filament
/public/js/filament
/public/vendor/cachethq/cachet
/storage/*.key
/vendor
.env
.env.backup
.env.production
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
# Laravel
bootstrap/compiled.php
vendor
# Configuration
.env.*.php
.env.php
config.codekit
!.env.heroku.php
!.env.example.php
# Assets
app/assets/bower_components
node_modules
public/dist
public/css
public/js
# Packages
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode
.vagrant
# PHPUnit
phpunit.xml

26
.travis.yml Normal file
View File

@@ -0,0 +1,26 @@
language: php
php:
- 5.4
- 5.5
- 5.6
- nightly
- hhvm
matrix:
allow_failures:
- php: nightly
sudo: false
install: travis_retry composer install --no-interaction --ignore-platform-reqs --no-scripts --prefer-source
before_script: php artisan cachet:one-click-deploy
script:
- bash -c 'if [ "$TRAVIS_PHP_VERSION" == "hhvm" ]; then vendor/bin/phpunit; fi;'
- bash -c 'if [ "$TRAVIS_PHP_VERSION" != "hhvm" ]; then vendor/bin/phpunit --coverage-clover build/logs/clover.xml; fi;'
after_script:
- bash -c 'if [ "$TRAVIS_PHP_VERSION" != "hhvm" ]; then wget https://scrutinizer-ci.com/ocular.phar; fi;'
- bash -c 'if [ "$TRAVIS_PHP_VERSION" != "hhvm" ]; then php ocular.phar code-coverage:upload --format=php-clover build/logs/clover.xml; fi;'

82
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,82 @@
# Contribution Guidelines
## Creating issues
Issues should be made by using the [issue tracker](https://github.com/cachethq/Cachet/issues).
Things to remember:
- Be descriptive
- Be respectful of others
## Languages
When needing to add labels, placeholders or general text, you **must not** write directly into the source file, rather make use of the `./app/lang/` directory. Always provide the English translation and copy your English string to all other languages - making sure that the indentation and alignment of the arrays are updated.
## Coding Standards
Please follow existing coding standards:
```php
<?php
namespace Foo\Bar\Controller;
use Foo\Bar\Bar;
class Foo extends Bar
{
public function baz()
{
if ($condition) {
}
}
}
```
- At least one newline separating `namespace`, `use`, `function` and `class` declarations.
- Spaces around operators, loops, conditions and control blocks:
```php
<?php
use \Exception;
if ($condition === (10 + 2)) {
try {
throw Exception("Something went wrong...");
} catch (Exception $e) {
// Do something here.
}
}
```
- Braces on a new line following: `namespace`, `use`, `function` and `class`.
- Line lengths have a soft 80 limit and hard 120 length.
- PHP constants should be in lowercase; `true`, `false` and `null`.
- Defined constants should always be in uppercase.
- Never leave trailing spaces at the end of a line.
- Files should end with one blank line.
- Do not use `# Bash` style comments.
- Always add or update Docblocs to functions.
- If your pull request consists of more than two commits, you **must** squash them into one.
If you're still unsure, then take a look at existing code.
## Introduction into to Git and GitHub
If you are new to Git, GitHub and the whole open source software community, welcome! Here are some resources for getting started and understanding what it's all about.
- [Try Git](https://try.github.io/levels/1/challenges/1) by Code School
- [GitHub Help](https://help.github.com)
If you're not particularly fond of the command line, you can get one of GitHub's free GUI desktop apps:
- [GitHub for Mac](https://github.com/blog/1510-installing-git-from-github-for-mac)
- [GitHub for Windows](https://github.com/blog/1127-github-for-windows)
If you're feeling adventurous, you can become a Git & GitHub master with the [Git Path on Code School](https://www.codeschool.com/paths/git).
There is always the Cachet Gitter chat to ask any questions you may have:
[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/cachethq/Cachet?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
You should also make use of the [.editorconfig](/.editorconfig) file found within the root of the repository. It'll make sure that your editor is setup with the same file settings.

42
Dockerfile Normal file
View File

@@ -0,0 +1,42 @@
FROM debian:jessie
ENV DB_DRIVER=mysql \
ENV=production \
DB_DATABASE=cachet \
DB_HOST= \
DB_USERNAME= \
DB_PASSWORD= \
DEBIAN_FRONTEND=noninteractive
COPY . /var/www/html/
WORKDIR /var/www/html/
# Using nodesource and debian jessie packages instead of compiling from scratch
RUN echo "APT::Install-Recommends \"0\";" >> /etc/apt/apt.conf.d/02recommends && \
echo "APT::Install-Suggests \"0\";" >> /etc/apt/apt.conf.d/02recommends && \
apt-get -qq update && \
apt-get -qq install \
ca-certificates nginx php5-fpm=5.* php5-curl php5-readline php5-mcrypt php5-mysql php5-apcu php5-cli \
git sqlite libsqlite3-dev curl supervisor && \
apt-get clean && apt-get autoremove -qq && \
rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man /tmp/* && \
chown -R www-data /var/www/html
# Hardcode the Illuminate key in app/config/app.php. If you want security, feel free
# to override the key in your own container with a 'php artisan key:generate' :)
RUN sed -i "s/'key' => '\w.*/'key' => 'f20d3e5ae02125a94bd60203a4edfbde',/" app/config/app.php && \
grep key app/config/app.php
# copy the various nginx and supervisor conf (to handle both fpm and nginx)
RUN sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf ;\
echo "daemon off;" >> /etc/nginx/nginx.conf ;\
mv /var/www/html/docker/php-fpm-pool.conf /etc/php5/fpm/pool.d/www.conf ;\
rm -f /etc/nginx/sites-enabled/* && rm -f /etc/nginx/conf.d/* && mv /var/www/html/docker/nginx-site.conf /etc/nginx/conf.d/default.conf
RUN curl -sS https://getcomposer.org/installer | php && php composer.phar install --no-dev -o
COPY docker/supervisord.conf /etc/supervisor/supervisord.conf
EXPOSE 8000
CMD ["/usr/bin/supervisord"]

12
LICENSE Normal file
View File

@@ -0,0 +1,12 @@
Copyright (c) 2015 James Brooks and individual contributors.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the Cachet nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -1,50 +0,0 @@
# Cachet license
This License from Alt Three Services Limited. (“Cachet”) governs your use of the accompanying Software. By using the Software, you accept the terms of this License. The Cachet software is copyrighted by Alt Three Services Limited.
## Permissions
Subject to the following conditions, you are permitted to:
- Use the Software in your commercial or non-commercial projects.
- Modify the Software to suit your needs.
- Bundle the Software with your own projects.
- Submit modifications of the Software to Cachet.
## Conditions
In exchange for these permissions, you agree:
- Not to remove any copyright or other notices from the Software.
- Not to make the Software available under a license that supersedes or negates the effect of this License.
- Not to distribute the Software or modifications of the Software as a standalone product, but only as part of another application.
- To include a verbatim copy of this License in any distribution of the Software.
- To comply with Cachet's [trademark policy](https://github.com/cachethq/core/blob/main/TRADEMARKS.md).
### Termination
Your license to use the Software will terminate automatically if you breach any terms of this License or initiate a copyright, trade secret, or patent claim against Cachet, any of its affiliates, or any user of the Software (including as modified by you).
### Disclaimer of Warranties
The Software is provided "AS IS," without any warranties. This includes any implied warranties of merchantability, fitness for a particular purpose, or non-infringement. You must pass this disclaimer on whenever you distribute the Software or derivative works.
### Limitation of Liability
Cachet is not liable for any damages related to the Software or this License, including direct, indirect, special, or incidental damages, to the fullest extent permitted by law. You must pass this limitation of liability on whenever you distribute the Software or derivative works.
### Governing Law
This License is governed by the laws of Delaware, and the parties consent to exclusive jurisdiction in Delaware courts. The parties waive all defenses of lack of personal jurisdiction and forum non-conveniens.
### Entire Agreement / Assignment
This License is the entire agreement between the parties, and supersedes any and all prior agreements, understandings or communications, written or oral, between the parties relating to the subject matter hereof. This License may be assigned by Cachet without your prior consent.
### Reservation of Rights
Alt Three Services Limited reserves all rights not expressly granted to you in this License. Alt Three Services Limited owns all right, title, and interest in and to the Software.
## Alternative License
For alternative licensing, please contact support@cachethq.io.

1
Procfile Normal file
View File

@@ -0,0 +1 @@
web: vendor/bin/heroku-php-nginx -C nginx.conf public

114
README.md
View File

@@ -1,50 +1,100 @@
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://cachethq.io/assets/cachet-logo-dark.svg">
<img alt="Cachet Logo" src="https://cachethq.io/assets/cachet-logo-light.svg">
</picture>
</p>
# Cachet [![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
Cachet, the open-source self-hosted status page system.
[![StyleCI](https://styleci.io/repos/26730195/shield)](https://styleci.io/repos/26730195/)
[![Build Status](https://img.shields.io/travis/cachethq/Cachet.svg?style=flat-square)](https://travis-ci.org/cachethq/Cachet)
[![Quality Score](https://img.shields.io/scrutinizer/g/cachethq/Cachet.svg?style=flat-square)](https://scrutinizer-ci.com/g/cachethq/Cachet)
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
[![Gitter](https://img.shields.io/badge/gitter-join%20chat-brightgreen.svg?style=flat-square)](https://gitter.im/cachethq/Cachet?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
## Cachet 3.x Announcement
![Screenshot](https://cachethq.io/img/main-interface.jpg)
For more information on the Cachet rebuild and our plans for 3.x, you can read the announcement [here](https://github.com/CachetHQ/Cachet/discussions/4342).
**Currently in development. Things may change or break until a solid release has been announced.**
## Features
- List your services components.
- Log incidents.
- Apply a custom stylesheet to the status page.
- Markdown support for incident messages.
- RESTful API.
- Translated into several languages.
- Easy Heroku deployment.
- Metrics.
- Cross-database support: MySQL, PostgreSQL and SQLite.
## Requirements
- PHP 8.2 or later
- PHP 5.4 or newer
- mcrypt extension
- [Composer](https://getcomposer.org)
- A supported database: MariaDB, MySQL, PostgreSQL or SQLite
## Installation, Upgrades and Documentation
### Development Requirements
You can find documentation at [https://docs.cachethq.io](https://docs.cachethq.io).
The following extra dependencies are required to develop Cachet.
Here are some useful quick links:
- Node.js
+ Bower
+ Gulp
- [Installing Cachet](https://docs.cachethq.io/v3.x/installation)
## Installation & Documentation
### Demo
You can now find our documentation at [https://docs.cachethq.io](https://docs.cachethq.io) or, directly at [http://cachet.readme.io](http://cachet.readme.io) if the first link fails to load. [Cachet Demo](https://demo.cachethq.io)
To test out the v3 demo, you can log in to the [Cachet dashboard](https://v3.cachethq.io/dashboard) with the following credentials:
### Demo Account
- **Email:** `test@test.com`
- **Password:** `test123`
To test out the demo, you may login to the [Dashboard](https://demo.cachethq.io/dashboard) with the following:
> **Note**
> The demo will automatically reset every 30 minutes.
>
## Sponsors
- **Username:** test@test.com
- **Password:** test123
<p align="center">
<a href="https://jump24.co.uk"><img width="100px" src="https://github.com/jumptwentyfour.png" alt="Jump24"></a>
<a href="https://dreamtilt.com.au"><img width="100px" src="https://github.com/dreamtilt.png" alt="Dreamtilt"></a>
<a href="https://xyphen-it.nl"><img width="100px" src="https://github.com/xyphen-it.png" alt="Xyphen-IT"></a>
<a href="https://coderabbit.ai/"><img width="100px" src="https://github.com/coderabbitai.png" alt="Code Rabbit"></a>
<a href="https://scramble.dedoc.co/"><img width="100px" src="https://github.com/dedoc.png" alt="de:doc"></a>
</p>
The demo is reset every half past the hour.
## Security Vulnerabilities
## What Cachet is not
If you discover a security vulnerability within Cachet, please send an e-mail to [support@cachethq.io](mailto:support@cachethq.io?Cachet%20Security%20Vulnerability). All security vulnerabilities are reviewed on a case-by-case basis.
Here is a list of things that Cachet is not or does not do:
1. It does not monitor your services. It works only as a way to display the status of your services. *However, Cachet is able to receive updates from third-party services via its API.*
2. It does not work on a plugin system. There are no monitoring services to extend.
3. It's not a Twitter clone.
## Quickstart with Docker
Run a DB container (you can either pass in environment variables for the DB, or mount a config with `-v /my/database.php:/var/www/html/app/config/database.php`):
```bash
$ export DB_USERNAME=cachet
$ export DB_PASSWORD=cachet
$ export DB_ROOT_PASSWORD=cachet
$ export DB_DATABASE=cachet
$ docker run --name mysql -e MYSQL_USER=$DB_USERNAME -e MYSQL_PASSWORD=$DB_PASSWORD -e MYSQL_ROOT_PASSWORD=$DB_ROOT_PASSWORD -e MYSQL_DATABASE=$DB_DATABASE -d mysql
```
Initialize the DB if you haven't yet:
```bash
$ docker run --link mysql:mysql -e DB_HOST=mysql -e DB_DATABASE=$DB_DATABASE -e DB_USERNAME=$DB_USERNAME -e DB_PASSWORD=$DB_PASSWORD cachethq/cachet:latest php artisan migrate --force
```
Run Cachet:
```bash
$ docker run -d --name cachet --link mysql:mysql -p 80:8000 -e DB_HOST=mysql -e DB_DATABASE=$DB_DATABASE -e DB_USERNAME=$DB_USERNAME -e DB_PASSWORD=$DB_PASSWORD cachethq/cachet:latest
```
Now go to `http://<ipdockerisboundto>/setup` and have fun!
Note: When running in production you should ensure that you enable SSL.
This is commonly achieved by running Nginx with your certificates on your Docker host, service or load balancers in-front of the running container, or by adding your custom SSL certificates and configuration to the supplied Nginx configuration.
## Addons
- [cachet-monitor](https://github.com/castawaylabs/cachet-monitor) - For url monitoring. Automatic incident updates
- [sensu-cachet](https://github.com/bimlendu/sensu-cachethq) - Sensu handler for updating CachetHQ.
## Read more about Cachet
For more information on why I started developing Cachet, check out my [Cachet articles on my blog](https://james-brooks.uk/tag/cachet/?utm_source=github&utm_medium=readme&utm_campaign=github-cachet).
## Translations
A special thank you to our [translators](https://crowdin.com/project/cachet/activity_stream), who have allowed us to share Cachet with the world. If you'd like to contribute translations, please check out our [CrowdIn project](https://crowdin.com/project/cachet).

View File

@@ -1,17 +0,0 @@
# Security Policy
**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, [SEE BELOW](#reporting-a-vulnerability).**
## Supported Versions
Use this section to tell people about which versions of your project are
currently being supported with security updates.
| Version | Supported |
| ------- | ------------------ |
| 2.4 | :white_check_mark: |
| < 2.4 | :x: |
## Reporting a Vulnerability
If you discover a security vulnerability within Cachet, please email James Brooks at james@cachethq.io. All security vulnerabilities will be promptly addressed.

View File

@@ -1,66 +0,0 @@
# Cachet Trademark Guidelines
This trademark policy was prepared to help you understand how to use the Cachet trademarks, service marks and logos.
While the copyright to our open source software is licensed under the Cachet license, our trademarks appearing in or on the open source software are the exclusive property of Cachet Inc. This means that our open source license does not include a license to use our trademarks.
Because we make some of our code available to download and modify, proper use of our trademarks is essential to inform people whether or not Cachet stands behind a product or service. When using Cachet trademarks, you must comply with these Cachet Trademark Guidelines.
This policy is intended to explain how to use our trademarks in a way that is consistent with background law and community expectations. This policy covers:
1. Our word trademarks and service marks: Cachet
2. Our logos: The Cachet logos
This policy encompasses all trademarks and service marks, whether they are registered or not.
## General guidelines
Whenever you use one of our marks, you must always do so in a way that does not mislead anyone about what they are getting and from whom.
Do not use the Cachet marks in any way that could mistakenly imply that Cachet has reviewed, approved or guaranteed your goods or services. You also cannot use our logo on your website in a way that suggests that your website is an official website or that we endorse your website. You can, though, say you like the Cachet software, that you use Cachet, that the analytics are powered by Cachet or that you participate in the Cachet community.
Do not use the "Cachet" prefix in a way that could mistakenly imply that your product is related to Cachet. For example, an analytics product that uses Cachet should not use the name "cachetanalytics".
You may not use or register our marks or variations of them as part of your trademark, business, product, service, app, domain name, social media account or business indicator. You may not use our marks as a part of an advertising campaign. You may not display Cachet trademarks more prominently than your product, service or company name. You may not use Cachet trademarks on merchandise for sale (e.g., selling t-shirts, mugs, etc).
Trademark law does not allow your use of names or trademarks that are too similar to ours. You therefore may not use an obvious variation of any of our marks or any phonetic equivalent, foreign language equivalent, takeoff, or abbreviation for a similar or compatible product or service.
## Acceptable uses
You can use the Cachet name to truthfully and accurately refer to or identify Cachet and its products and services in the following instances:
- To refer to Cachet and its products and services in news articles and other content without alteration
- To discuss Cachet and its products in a fair and honest manner that does not suggest sponsorship or endorsement by or affiliation with Cachet
- To refer to and/or to link to the products and services hosted on Cachets servers and website
- To indicate if your product, service or solution integrates, or is interoperable or compatible, with Cachet, for example, “we offer a simple integration with Cachet”, provided that doing so does not create a likelihood of confusion as to the origin of such product, service, or solution
- You may use our word marks as part of a public subdomain solely for the purpose of serving as the URL for your self-managed Cachet instance, for example, cachethq.iopanyname.com
## Prohibited uses
Unless you have express written permission from Cachet, or your use is permitted pursuant to the acceptable uses set forth above, the use of Cachet trademarks is strictly prohibited. Here is a short, non-exhaustive list of the kinds of uses that are not permitted without Cachets express written permission but that Cachet may consider granting you the right to do should you request permission:
- Use of Cachet trademarks in connection with the provision of a public website that makes Cachet software available for installation and use on a server (rather than directing users to the official Cachet site)
- Use of Cachet trademarks in connection with versions of Cachet products made publicly available or made available in the cloud on a managed service provider, resale or other commercial basis
- Use of Cachet trademarks in connection with Cachet product bundled with other software
In the above cases:
- You must follow the terms of the open source license for Cachet software products and code
- You must remove all of our logos from it and choose your branding, logos and trademarks that denote your unique identity to clearly signal to users that there is no affiliation with or endorsement by Cachet
- You must not use any Cachet trademark in connection with the user-facing name, branding or marketing materials of your project
- You may use word marks, but not our logos, in truthful statements that describe the relationship between your software and ours, for example, “this software is derived from the source code of the Cachet software”, as long as you also include a statement that your project is not officially associated with Cachet or its products
- Cachet reserves the right in its sole discretion to (i) terminate, revoke, modify, or otherwise change permission to use the trademarks at any time and; (ii) object to any use or misuse of the trademarks in any jurisdiction worldwide. All changes to these guidelines are effective immediately when posted and your continued use of the trademarks following the posting of revised guidelines signifies your acceptance of such revision.
## To request the use of the trademarks
Anyone wishing to use any of Cachets trademarks in a manner other than the acceptable uses listed above, including but not limited to marketing, promotion or advertising, or on software derivative of Cachet software, must obtain Cachets express, written permission in advance.
To request the use of the trademarks in a manner or for a purpose not expressly permitted in these guidelines, including use for any purpose of the logos, please email [hello@cachethq.io](mailto:hello@cachethq.io) to discuss. If you need clarification on whether your use qualifies, please ask.
## To report misuse
If you want to report misuse of a Cachet trademark, please email [hello@cachethq.io](mailto:hello@cachethq.io).
Last updated: November 25 2024
These guidelines are based on the Model Trademark Guidelines, available at http://www.modeltrademarkguidelines.org., used under a Creative Commons Attribution 3.0 Unported license: https://creativecommons.org/licenses/by/3.0/deed.en_US

34
app.json Normal file
View File

@@ -0,0 +1,34 @@
{
"name": "Cachet",
"description": "An open source status page system.",
"keywords": [
"cachet",
"laravel",
"status",
"page"
],
"website": "https://cachethq.io",
"logo": "https://raw.githubusercontent.com/cachethq/assets/79336a33c24b28c470a89742671e0e291813d004/images/icon/Cachet-Icon.png",
"success_url": "/setup",
"repository": "https://github.com/cachethq/Cachet",
"addons": [
"heroku-postgresql"
],
"env": {
"ENV": {
"value": "heroku",
"description": "Warning: Do not modify this value on Heroku deployments."
},
"BUILDPACK_URL": {
"value": "https://github.com/heroku/heroku-buildpack-php",
"description": "Warning: Do not modify this value on Heroku deployments."
},
"CACHE_DRIVER": {
"value": "apc",
"description": "Warning: Do not modify this value on Heroku deployments."
}
},
"scripts": {
"postdeploy": "php artisan migrate --env=heroku; php artisan key:generate;"
}
}

View File

@@ -1,22 +0,0 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
abstract class Controller extends BaseController
{
use AuthorizesRequests;
use ValidatesRequests;
}

View File

@@ -1,34 +0,0 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Middleware\TrustProxies as LaravelTrustProxies;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class TrustProxies extends LaravelTrustProxies
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if (config('cachet.trusted_proxies')) {
LaravelTrustProxies::at(explode(',', config('cachet.trusted_proxies')));
}
return parent::handle($request, $next);
}
}

View File

@@ -1,72 +0,0 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Models;
use Cachet\Models\User as CachetUser;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends CachetUser implements FilamentUser
{
use HasApiTokens;
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
public function canAccessPanel(Panel $panel): bool
{
return true;
}
/**
* Determine if the user is an admin.
*/
public function isAdmin(): bool
{
return $this->is_admin;
}
}

View File

@@ -1,54 +0,0 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* The path to your application's "home" route.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/home';
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
//
$this->bootRoute();
}
public function bootRoute(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
}

256
app/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: $base-font-family;
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%);
}
}

41
app/assets/sass/main.scss Normal file
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: "Open Sans", "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;
}

196
app/config/app.php Normal file
View File

@@ -0,0 +1,196 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Debug Mode
|--------------------------------------------------------------------------
|
| When your application is in debug mode, detailed error messages with
| stack traces will be shown on every error that occurs within your
| application. If disabled, a simple generic error page is shown.
|
*/
'debug' => getenv('APP_DEBUG') ?: false,
/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| your application so that it is used when running Artisan tasks.
|
*/
'url' => 'http://localhost',
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'UTC',
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| This key is used by the Illuminate encrypter service and should be set
| to a random, 32 character string, otherwise these encrypted strings
| will not be safe. Please do this before deploying an application!
|
*/
'key' => 'kCifbUiHYswooAvSZBQjWZVY1S6aBdnD',
'cipher' => MCRYPT_RIJNDAEL_128,
/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
| The service providers listed here will be automatically loaded on the
| request to your application. Feel free to add your own services to
| this array to grant expanded functionality to your applications.
|
*/
'providers' => [
/*
* Laravel Framework Service Providers...
*/
'Illuminate\Foundation\Providers\ArtisanServiceProvider',
'Illuminate\Auth\AuthServiceProvider',
'Illuminate\Cache\CacheServiceProvider',
'Illuminate\Session\CommandsServiceProvider',
'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider',
'Illuminate\Routing\ControllerServiceProvider',
'Illuminate\Cookie\CookieServiceProvider',
'Illuminate\Database\DatabaseServiceProvider',
'Illuminate\Encryption\EncryptionServiceProvider',
'Illuminate\Filesystem\FilesystemServiceProvider',
'Illuminate\Hashing\HashServiceProvider',
'Illuminate\Html\HtmlServiceProvider',
'Illuminate\Log\LogServiceProvider',
'Illuminate\Mail\MailServiceProvider',
'Illuminate\Database\MigrationServiceProvider',
'Illuminate\Pagination\PaginationServiceProvider',
'Illuminate\Queue\QueueServiceProvider',
'Illuminate\Redis\RedisServiceProvider',
'Illuminate\Auth\Reminders\ReminderServiceProvider',
'Illuminate\Database\SeedServiceProvider',
'Illuminate\Session\SessionServiceProvider',
'Illuminate\Translation\TranslationServiceProvider',
'Illuminate\Validation\ValidationServiceProvider',
'Illuminate\View\ViewServiceProvider',
/*
* Packages Service Providers...
*/
'Dingo\Api\Provider\ApiServiceProvider',
'Fideloper\Proxy\ProxyServiceProvider',
'GrahamCampbell\Binput\BinputServiceProvider',
'GrahamCampbell\Markdown\MarkdownServiceProvider',
'GrahamCampbell\Security\SecurityServiceProvider',
'GrahamCampbell\Throttle\ThrottleServiceProvider',
'Jenssegers\Date\DateServiceProvider',
'McCool\LaravelAutoPresenter\LaravelAutoPresenterServiceProvider',
'PragmaRX\Google2FA\Vendor\Laravel\ServiceProvider',
'Roumen\Feed\FeedServiceProvider',
'Thujohn\Rss\RssServiceProvider',
/*
* Application Service Providers...
*/
'CachetHQ\Cachet\Providers\AuthServiceProvider',
'CachetHQ\Cachet\Providers\ConsoleServiceProvider',
'CachetHQ\Cachet\Providers\RepositoryServiceProvider',
'CachetHQ\Cachet\Providers\RoutingServiceProvider',
'CachetHQ\Cachet\Providers\ViewComposerServiceProvider',
'CachetHQ\Cachet\Providers\LoadConfigServiceProvider',
'CachetHQ\Cachet\Providers\SettingsServiceProvider',
'CachetHQ\Cachet\Providers\SegmentApiServiceProvider',
'CachetHQ\Segment\SegmentServiceProvider',
],
/*
|--------------------------------------------------------------------------
| Service Provider Manifest
|--------------------------------------------------------------------------
|
| The service provider manifest is used by Laravel to lazy load service
| providers which are not needed for each request, as well to keep a
| list of all of the services. Here, you may set its storage spot.
|
*/
'manifest' => storage_path().'/meta',
/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
|
| This array of class aliases will be registered when this application
| is started. However, feel free to register as many as you wish as
| the aliases are "lazy" loaded so they don't hinder performance.
|
*/
'aliases' => [
'App' => 'Illuminate\Support\Facades\App',
'Auth' => 'Illuminate\Support\Facades\Auth',
'Form' => 'Illuminate\Support\Facades\Form',
'Input' => 'Illuminate\Support\Facades\Input',
'Redirect' => 'Illuminate\Support\Facades\Redirect',
'Request' => 'Illuminate\Support\Facades\Request',
'Response' => 'Illuminate\Support\Facades\Response',
'Route' => 'Illuminate\Support\Facades\Route',
'Session' => 'Illuminate\Support\Facades\Session',
'Setting' => 'CachetHQ\Cachet\Facades\Setting',
'Str' => 'Illuminate\Support\Str',
],
];

71
app/config/auth.php Normal file
View File

@@ -0,0 +1,71 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Authentication Driver
|--------------------------------------------------------------------------
|
| This option controls the authentication driver that will be utilized.
| This driver manages the retrieval and authentication of the users
| attempting to get access to protected areas of your application.
|
| Supported: "database", "eloquent"
|
*/
'driver' => 'eloquent',
/*
|--------------------------------------------------------------------------
| Authentication Model
|--------------------------------------------------------------------------
|
| When using the "Eloquent" authentication driver, we need to know which
| Eloquent model should be used to retrieve your users. Of course, it
| is often just the "User" model but you may use whatever you like.
|
*/
'model' => 'CachetHQ\Cachet\Models\User',
/*
|--------------------------------------------------------------------------
| Authentication Table
|--------------------------------------------------------------------------
|
| When using the "Database" authentication driver, we need to know which
| table should be used to retrieve your users. We have chosen a basic
| default value but you may easily change it to any table you like.
|
*/
'table' => 'users',
/*
|--------------------------------------------------------------------------
| Password Reminder Settings
|--------------------------------------------------------------------------
|
| Here you may set the settings for password reminders, including a view
| that should be used as your password reminder e-mail. You will also
| be able to set the name of the table that holds the reset tokens.
|
| The "expire" time is the number of minutes that the reminder should be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/
'reminder' => [
'email' => 'emails.auth.reminder',
'table' => 'password_reminders',
'expire' => 60,
],
];

89
app/config/cache.php Normal file
View File

@@ -0,0 +1,89 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Cache Driver
|--------------------------------------------------------------------------
|
| This option controls the default cache "driver" that will be used when
| using the Caching library. Of course, you may use other drivers any
| time you wish. This is the default when another is not specified.
|
| Supported: "file", "database", "apc", "memcached", "redis", "array"
|
*/
'driver' => getenv('CACHE_DRIVER') ?: 'apc',
/*
|--------------------------------------------------------------------------
| File Cache Location
|--------------------------------------------------------------------------
|
| When using the "file" cache driver, we need a location where the cache
| files may be stored. A sensible default has been specified, but you
| are free to change it to any other place on disk that you desire.
|
*/
'path' => storage_path().'/cache',
/*
|--------------------------------------------------------------------------
| Database Cache Connection
|--------------------------------------------------------------------------
|
| When using the "database" cache driver you may specify the connection
| that should be used to store the cached items. When this option is
| null the default database connection will be utilized for cache.
|
*/
'connection' => null,
/*
|--------------------------------------------------------------------------
| Database Cache Table
|--------------------------------------------------------------------------
|
| When using the "database" cache driver we need to know the table that
| should be used to store the cached items. A default table name has
| been provided but you're free to change it however you deem fit.
|
*/
'table' => 'cache',
/*
|--------------------------------------------------------------------------
| Memcached Servers
|--------------------------------------------------------------------------
|
| Now you may specify an array of your Memcached servers that should be
| used when utilizing the Memcached cache driver. All of the servers
| should contain a value for "host", "port", and "weight" options.
|
*/
'memcached' => [
['host' => '127.0.0.1', 'port' => 11211, 'weight' => 100],
],
/*
|--------------------------------------------------------------------------
| Cache Key Prefix
|--------------------------------------------------------------------------
|
| When utilizing a RAM based store such as APC or Memcached, there might
| be other applications utilizing the same cache. So, we'll specify a
| value to get prefixed to all our keys so we can avoid collisions.
|
*/
'prefix' => 'laravel',
];

16
app/config/compile.php Normal file
View File

@@ -0,0 +1,16 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Additional Compiled Classes
|--------------------------------------------------------------------------
|
| Here you may specify additional classes to include in the compiled file
| generated by the `artisan optimize` command. These should be classes
| that are included on basically every request into the application.
|
*/
];

124
app/config/database.php Normal file
View File

@@ -0,0 +1,124 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| PDO Fetch Style
|--------------------------------------------------------------------------
|
| By default, database results will be returned as instances of the PHP
| stdClass object; however, you may desire to retrieve records in an
| array format for simplicity. Here you can tweak the fetch style.
|
*/
'fetch' => PDO::FETCH_CLASS,
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
*/
'default' => getenv('DB_DRIVER') ?: 'sqlite',
/*
|--------------------------------------------------------------------------
| Database Connections
|--------------------------------------------------------------------------
|
| Here are each of the database connections setup for your application.
| Of course, examples of configuring each database platform that is
| supported by Laravel is shown below to make development simple.
|
|
| All database work in Laravel is done through the PHP PDO facilities
| so make sure you have the driver for your particular database of
| choice installed on your machine before you begin development.
|
*/
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => app_path('database').'/'.getenv('DB_DATABASE') ?: null,
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => getenv('DB_HOST') ?: null,
'database' => getenv('DB_DATABASE') ?: null,
'username' => getenv('DB_USERNAME') ?: null,
'password' => getenv('DB_PASSWORD') ?: null,
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
],
'pgsql' => [
'driver' => 'pgsql',
'host' => getenv('DB_HOST') ?: null,
'database' => getenv('DB_DATABASE') ?: null,
'username' => getenv('DB_USERNAME') ?: null,
'password' => getenv('DB_PASSWORD') ?: null,
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => getenv('DB_HOST') ?: null,
'database' => getenv('DB_DATABASE') ?: null,
'username' => getenv('DB_USERNAME') ?: null,
'password' => getenv('DB_PASSWORD') ?: null,
'prefix' => '',
],
],
/*
|--------------------------------------------------------------------------
| Migration Repository Table
|--------------------------------------------------------------------------
|
| This table keeps track of all the migrations that have already run for
| your application. Using this information, we can determine which of
| the migrations on disk haven't actually been run in the database.
|
*/
'migrations' => 'migrations',
/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer set of commands than a typical key-value systems
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
*/
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
];

15
app/config/langs.php Normal file
View File

@@ -0,0 +1,15 @@
<?php
return [
// Enabled langs
'en-UD' => 'CrowdIn - InContext Localization',
'de' => 'Deutsch',
'en' => 'English',
'pl' => 'Polski',
'es' => 'Español',
'fr' => 'Français',
'nl' => 'Nederlands',
'pt-BR' => 'Portuguese, Brazilian',
'zh-Hant' => 'Chinese (Traditional)',
'zh-Hans' => 'Chinese (Simplified)',
];

124
app/config/mail.php Normal file
View File

@@ -0,0 +1,124 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Mail Driver
|--------------------------------------------------------------------------
|
| Laravel supports both SMTP and PHP's "mail" function as drivers for the
| sending of e-mail. You may specify which one you're using throughout
| your application here. By default, Laravel is setup for SMTP mail.
|
| Supported: "smtp", "mail", "sendmail", "mailgun", "mandrill", "log"
|
*/
'driver' => 'smtp',
/*
|--------------------------------------------------------------------------
| SMTP Host Address
|--------------------------------------------------------------------------
|
| Here you may provide the host address of the SMTP server used by your
| applications. A default option is provided that is compatible with
| the Mailgun mail service which will provide reliable deliveries.
|
*/
'host' => 'smtp.mailgun.org',
/*
|--------------------------------------------------------------------------
| SMTP Host Port
|--------------------------------------------------------------------------
|
| This is the SMTP port used by your application to deliver e-mails to
| users of the application. Like the host we have set this value to
| stay compatible with the Mailgun e-mail application by default.
|
*/
'port' => 587,
/*
|--------------------------------------------------------------------------
| Global "From" Address
|--------------------------------------------------------------------------
|
| You may wish for all e-mails sent by your application to be sent from
| the same address. Here, you may specify a name and address that is
| used globally for all e-mails that are sent by your application.
|
*/
'from' => ['address' => null, 'name' => null],
/*
|--------------------------------------------------------------------------
| E-Mail Encryption Protocol
|--------------------------------------------------------------------------
|
| Here you may specify the encryption protocol that should be used when
| the application send e-mail messages. A sensible default using the
| transport layer security protocol should provide great security.
|
*/
'encryption' => 'tls',
/*
|--------------------------------------------------------------------------
| SMTP Server Username
|--------------------------------------------------------------------------
|
| If your SMTP server requires a username for authentication, you should
| set it here. This will get used to authenticate with your server on
| connection. You may also set the "password" value below this one.
|
*/
'username' => null,
/*
|--------------------------------------------------------------------------
| SMTP Server Password
|--------------------------------------------------------------------------
|
| Here you may set the password required by your SMTP server to send out
| messages from your application. This will be given to the server on
| connection so that the application will be able to send messages.
|
*/
'password' => null,
/*
|--------------------------------------------------------------------------
| Sendmail System Path
|--------------------------------------------------------------------------
|
| When using the "sendmail" driver to send e-mails, we will need to know
| the path to where Sendmail lives on this server. A default path has
| been provided here, which will work well on most of your systems.
|
*/
'sendmail' => '/usr/sbin/sendmail -bs',
/*
|--------------------------------------------------------------------------
| Mail "Pretend"
|--------------------------------------------------------------------------
|
| When this option is enabled, e-mail will not actually be sent over the
| web and will instead be written to your application's logs files so
| you may inspect the message. This is great for local development.
|
*/
'pretend' => false,
];

View File

@@ -0,0 +1,9 @@
<?php
return [
'write_key' => '',
'consumer' => 'socket',
'debug' => false,
'ssl' => true,
'error_handler' => null,
];

View File

@@ -0,0 +1,159 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| API Vendor
|--------------------------------------------------------------------------
|
| Your vendor is used in the "Accept" request header and will be used by
| the consumers of your API. Typically this will be the name of your
| application or website.
|
*/
'vendor' => 'cachet',
/*
|--------------------------------------------------------------------------
| Default API Version
|--------------------------------------------------------------------------
|
| When a request is made to the API and no version is specified then it
| will default to the version specified here.
|
*/
'version' => 'v1',
/*
|--------------------------------------------------------------------------
| Default API Prefix
|--------------------------------------------------------------------------
|
| A default prefix to use for your API routes so you don't have to
| specify it for each group.
|
*/
'prefix' => 'api',
/*
|--------------------------------------------------------------------------
| Default API Domain
|--------------------------------------------------------------------------
|
| A default domain to use for your API routes so you don't have to
| specify it for each group.
|
*/
'domain' => null,
/*
|--------------------------------------------------------------------------
| Conditional Requests
|--------------------------------------------------------------------------
|
| Globally enable conditional requests so that an ETag header is added to
| any successful response. Subsequent requests will perform a check and
| will return a 304 Not Modified. This can also be enabled or disabled
| on certain groups or routes.
|
*/
'conditional_request' => true,
/*
|--------------------------------------------------------------------------
| Authentication Providers
|--------------------------------------------------------------------------
|
| The authentication providers that should be used when attempting to
| authenticate an incoming API request.
|
*/
'auth' => [
'basic' => function ($app) {
return new Dingo\Api\Auth\BasicProvider($app['auth']);
},
'api_token' => function ($app) {
return new CachetHQ\Cachet\Http\Auth\ApiTokenAuthenticator();
},
],
/*
|--------------------------------------------------------------------------
| Rate Limiting
|--------------------------------------------------------------------------
|
| Consumers of your API can be limited to the amount of requests they can
| make. You can configure the limit based on whether the consumer is
| authenticated or unauthenticated.
|
| The "limit" is the number of requests the consumer can make within a
| certain amount time which is defined by "reset" in minutes.
|
| By default rate limiting is disabled.
|
*/
'rate_limiting' => [
'authenticated' => [
'limit' => 0,
'reset' => 60,
],
'unauthenticated' => [
'limit' => 0,
'reset' => 60,
],
'exceeded' => 'API rate limit has been exceeded.',
],
/*
|--------------------------------------------------------------------------
| Response Transformer
|--------------------------------------------------------------------------
|
| Responses can be transformed so that they are easier to format. By
| default a Fractal transformer will be used to transform any
| responses prior to formatting. You can easily replace
| this with your own transformer.
|
*/
'transformer' => function ($app) {
$fractal = new League\Fractal\Manager();
return new Dingo\Api\Transformer\FractalTransformer($fractal);
},
/*
|--------------------------------------------------------------------------
| Response Formats
|--------------------------------------------------------------------------
|
| Responses can be returned in multiple formats by registering different
| response formatters. You can also customize an existing response
| formatter.
|
*/
'default_format' => 'json',
'formats' => [
'json' => new Dingo\Api\Http\ResponseFormat\JsonResponseFormat(),
],
];

View File

@@ -0,0 +1,52 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Trusted Proxies
|--------------------------------------------------------------------------
|
| Set an array of trusted proxies, so Laravel knows to grab the client's
| information via the X-Forwarded-* headers.
|
| To trust all proxies, use the value '*':
|
| 'proxies' => '*'
|
|
| To trust only specific proxies (recommended), set an array of those
| proxies' IP addresses:
|
| 'proxies' => array('192.168.1.1', '192.168.1.2')
|
|
| Or use CIDR notation:
|
| 'proxies' => array('192.168.12.0/23')
|
*/
'proxies' => [
'204.93.240.0',
'204.93.177.0',
'199.27.128.0',
'173.245.48.0',
'103.21.244.0',
'103.22.200.0',
'103.31.4.0',
'141.101.64.0',
'108.162.192.0',
'190.93.240.0',
'188.114.96.0',
'197.234.240.0',
'198.41.128.0',
'162.158.0.0',
'2400:cb00::',
'2606:4700::',
'2803:f800::',
'2405:b500::',
'2405:8100::',
],
];

View File

@@ -0,0 +1,35 @@
<?php
/*
* This file is part of Laravel Markdown by Graham Campbell.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://bit.ly/UWsjkb.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
return [
/*
|--------------------------------------------------------------------------
| Enable The Engines
|--------------------------------------------------------------------------
|
| This option specifies if the view engines are enabled so you can write
| markdown views and have them compiled into html. The following extensions
| are currently supported: ".md", ".md.php", and ".md.blade.php". You may
| disable the engines if they are conflicting with another package.
|
| Default: true
|
*/
'engines' => false,
];

View File

@@ -0,0 +1,35 @@
<?php
/*
* This file is part of Laravel Throttle by Graham Campbell.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://bit.ly/UWsjkb.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
return [
/*
|--------------------------------------------------------------------------
| Cache Driver
|--------------------------------------------------------------------------
|
| This defines the cache driver to be used. It may be the name of any
| driver set in app/config/cache.php. Setting it to null will use the
| driver you have set as default in app/config/cache.php. Please note that
| a driver that supports cache tags is required.
|
| Default: null
|
*/
'driver' => null,
];

85
app/config/queue.php Executable file
View File

@@ -0,0 +1,85 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Queue Driver
|--------------------------------------------------------------------------
|
| The Laravel queue API supports a variety of back-ends via an unified
| API, giving you convenient access to each back-end using the same
| syntax for each one. Here you may set the default queue driver.
|
| Supported: "sync", "beanstalkd", "sqs", "iron", "redis"
|
*/
'default' => 'sync',
/*
|--------------------------------------------------------------------------
| Queue Connections
|--------------------------------------------------------------------------
|
| Here you may configure the connection information for each server that
| is used by your application. A default configuration has been added
| for each back-end shipped with Laravel. You are free to add more.
|
*/
'connections' => [
'sync' => [
'driver' => 'sync',
],
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => 'default',
'ttr' => 60,
],
'sqs' => [
'driver' => 'sqs',
'key' => 'your-public-key',
'secret' => 'your-secret-key',
'queue' => 'your-queue-url',
'region' => 'us-east-1',
],
'iron' => [
'driver' => 'iron',
'host' => 'mq-aws-us-east-1.iron.io',
'token' => 'your-token',
'project' => 'your-project-id',
'queue' => 'your-queue-name',
'encrypt' => true,
],
'redis' => [
'driver' => 'redis',
'queue' => 'default',
],
],
/*
|--------------------------------------------------------------------------
| Failed Queue Jobs
|--------------------------------------------------------------------------
|
| These options configure the behavior of failed queue job logging so you
| can control which database and table are used to store the jobs that
| have failed. You may change them to any database / table you wish.
|
*/
'failed' => [
'database' => 'mysql', 'table' => 'failed_jobs',
],
];

31
app/config/services.php Normal file
View File

@@ -0,0 +1,31 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Third Party Services
|--------------------------------------------------------------------------
|
| This file is for storing the credentials for third party services such
| as Stripe, Mailgun, Mandrill, and others. This file provides a sane
| default location for this type of information, allowing packages
| to have a conventional place to find your various credentials.
|
*/
'mailgun' => [
'domain' => '',
'secret' => '',
],
'mandrill' => [
'secret' => '',
],
'stripe' => [
'model' => 'User',
'secret' => '',
],
];

140
app/config/session.php Normal file
View File

@@ -0,0 +1,140 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
| "memcached", "redis", "array"
|
*/
'driver' => 'apc',
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
'lifetime' => 600,
'expire_on_close' => false,
/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When using the native session driver, we need a location where session
| files may be stored. A default has been set for you but a different
| location may be specified. This is only needed for file sessions.
|
*/
'files' => storage_path().'/sessions',
/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/
'connection' => null,
/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table we
| should use to manage the sessions. Of course, a sensible default is
| provided for you; however, you are free to change this as needed.
|
*/
'table' => 'sessions',
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/
'lottery' => [2, 100],
/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/
'cookie' => 'cachet_session',
/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application but you are free to change this when necessary.
|
*/
'path' => '/',
/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| Here you may change the domain of the cookie used to identify a session
| in your application. This will determine which domains the cookie is
| available to in your application. A sensible default has been set.
|
*/
'domain' => null,
/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you if it can not be done securely.
|
*/
'secure' => false,
];

View File

@@ -0,0 +1,20 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Cache Driver
|--------------------------------------------------------------------------
|
| This option controls the default cache "driver" that will be used when
| using the Caching library. Of course, you may use other drivers any
| time you wish. This is the default when another is not specified.
|
| Supported: "file", "database", "apc", "memcached", "redis", "array"
|
*/
'driver' => 'array',
];

View File

@@ -0,0 +1,21 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "native", "cookie", "database", "apc",
| "memcached", "redis", "array"
|
*/
'driver' => 'array',
];

View File

@@ -1,14 +1,5 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
return [
/*
@@ -22,24 +13,19 @@ return [
|
*/
'paths' => [
resource_path('views'),
],
'paths' => [__DIR__.'/../views'],
/*
|--------------------------------------------------------------------------
| Compiled View Path
| Pagination View
|--------------------------------------------------------------------------
|
| This option determines where all the compiled Blade templates will be
| stored for your application. Typically, this is within the storage
| directory. However, as usual, you are free to change this value.
| This view will be used to render the pagination link output, and can
| be easily customized here to show any view you like. A clean view
| compatible with Twitter's Bootstrap is given to you by default.
|
*/
'compiled' => env(
'VIEW_COMPILED_PATH',
realpath(storage_path('framework/views'))
),
'pagination' => 'pagination::slider-3',
];

1
app/database/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.sqlite

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateComponentGroupsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('component_groups', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('component_groups');
}
}

View File

@@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateComponentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('components', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('description');
$table->text('link');
$table->integer('status');
$table->integer('order');
$table->integer('group_id');
$table->integer('user_id');
$table->timestamps();
$table->softDeletes();
$table->index('group_id');
$table->index('user_id');
$table->index('status');
$table->index('order');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('components');
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateIncidentTemplatesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('incident_templates', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('slug');
$table->longText('template');
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('incident_templates');
}
}

View File

@@ -0,0 +1,41 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateIncidentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('incidents', function (Blueprint $table) {
$table->increments('id');
$table->integer('component_id')->default(0);
$table->string('name');
$table->integer('status');
$table->longText('message');
$table->integer('user_id');
$table->timestamps();
$table->softDeletes();
$table->index('component_id');
$table->index('status');
$table->index('user_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('incidents');
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMetricPointsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('metric_points', function (Blueprint $table) {
$table->increments('id');
$table->integer('metric_id');
$table->decimal('value', 10, 3);
$table->timestamps();
$table->index('metric_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('metric_points');
}
}

View File

@@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMetricsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('metrics', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('suffix');
$table->text('description');
$table->decimal('default_value', 10, 3);
$table->tinyInteger('calc_type');
$table->boolean('display_chart')->default(1);
$table->timestamps();
$table->index('display_chart');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('metrics');
}
}

View File

@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateServicesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('services', function (Blueprint $table) {
$table->increments('id');
$table->string('type');
$table->boolean('active');
$table->text('properties');
$table->timestamps();
$table->index('active');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('services');
}
}

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSettingsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('settings', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->longText('value');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('settings');
}
}

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSubscriptionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('subscriptions', function (Blueprint $table) {
$table->increments('id');
$table->string('email');
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('subscriptions');
}
}

View File

@@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username');
$table->string('password');
$table->rememberToken();
$table->string('email');
$table->string('api_key');
$table->boolean('active')->default(1);
$table->tinyInteger('level')->default(2);
$table->timestamps();
$table->index('remember_token');
$table->index('active');
$table->unique('username');
$table->unique('api_key');
$table->unique('email');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('users');
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AlterTableUsersAdd2FA extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('google_2fa_secret')->nullable()->after('remember_token');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('google_2fa_secret');
});
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTagsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('slug');
$table->timestamps();
$table->unique(['name', 'slug']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('tags');
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateComponentTagTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('component_tag', function (Blueprint $table) {
$table->increments('id');
$table->integer('component_id');
$table->integer('tag_id');
$table->index('component_id');
$table->index('tag_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('component_tag');
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class UpdateIncidentsAddScheduledAt extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('incidents', function (Blueprint $table) {
$table->timestamp('scheduled_at')->after('user_id')->nullable()->default(null);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('incidents', function (Blueprint $table) {
$table->dropColumn('scheduled_at');
});
}
}

View File

@@ -0,0 +1,60 @@
<?php
use CachetHQ\Cachet\Models\Component;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
class ComponentTableSeeder extends Seeder
{
/**
* Run the database seeding.
*
* @return void
*/
public function run()
{
Model::unguard();
$defaultComponents = [
[
'name' => 'API',
'description' => 'Used by third-parties to connect to us',
'status' => 2,
'user_id' => 1,
'order' => 0,
'group_id' => 0,
'link' => '',
], [
'name' => 'Documentation',
'description' => 'Kindly powered by Readme.io',
'status' => 1,
'user_id' => 1,
'order' => 0,
'group_id' => 0,
'link' => 'https://docs.cachethq.io',
], [
'name' => 'Website',
'description' => '',
'status' => 1,
'user_id' => 1,
'order' => 0,
'group_id' => 0,
'link' => 'https://cachethq.io',
], [
'name' => 'Blog',
'description' => 'The Cachet HQ blog.',
'status' => 1,
'user_id' => 1,
'order' => 0,
'group_id' => 0,
'link' => 'https://blog.cachethq.io',
],
];
Component::truncate();
foreach ($defaultComponents as $component) {
Component::create($component);
}
}
}

View File

@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeding.
*
* @return void
*/
public function run()
{
Model::unguard();
$this->call('UsersTableSeeder');
$this->call('SettingsTableSeeder');
$this->call('IncidentTableSeeder');
$this->call('ComponentTableSeeder');
}
}

View File

@@ -0,0 +1,58 @@
<?php
use CachetHQ\Cachet\Models\Incident;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
class IncidentTableSeeder extends Seeder
{
/**
* Run the database seeding.
*
* @return void
*/
public function run()
{
Model::unguard();
$defaultIncidents = [
[
'name' => 'Awesome',
'message' => 'We totally nailed the fix.',
'status' => 4,
'component_id' => 0,
'user_id' => 1,
'scheduled_at' => null,
],
[
'name' => 'Monitoring the fix',
'message' => "We're checking that our fix will first work.",
'status' => 3,
'component_id' => 0,
'user_id' => 1,
'scheduled_at' => null,
],
[
'name' => 'Update',
'message' => "We've found the problem, so we're looking at it.",
'status' => 2,
'component_id' => 0,
'user_id' => 1,
'scheduled_at' => null,
],
[
'name' => 'Test Incident',
'message' => 'Something went wrong, oh noes.',
'component_id' => 0,
'user_id' => 1,
'scheduled_at' => null,
],
];
Incident::truncate();
foreach ($defaultIncidents as $incident) {
Incident::create($incident);
}
}
}

View File

@@ -0,0 +1,59 @@
<?php
use CachetHQ\Cachet\Models\Setting;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
class SettingsTableSeeder extends Seeder
{
/**
* Run the database seeding.
*
* @return void
*/
public function run()
{
Model::unguard();
$defaultSettings = [
[
'name' => 'app_name',
'value' => 'Cachet Demo',
],
[
'name' => 'app_domain',
'value' => 'https://demo.cachethq.io',
],
[
'name' => 'show_support',
'value' => '1',
],
[
'name' => 'app_locale',
'value' => 'en',
],
[
'name' => 'app_timezone',
'value' => 'Europe/London',
],
[
'name' => 'app_track',
'value' => '1',
],
[
'name' => 'app_incident_days',
'value' => '7',
],
[
'name' => 'app_analytics',
'value' => 'UA-58442674-3',
],
];
Setting::truncate();
foreach ($defaultSettings as $setting) {
Setting::create($setting);
}
}
}

View File

@@ -0,0 +1,34 @@
<?php
use CachetHQ\Cachet\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeding.
*
* @return void
*/
public function run()
{
Model::unguard();
$users = [
[
'username' => 'test',
'password' => 'test123',
'email' => 'test@test.com',
'level' => 1,
'api_key' => '9yMHsdioQosnyVK4iCVR',
],
];
User::truncate();
foreach ($users as $user) {
User::create($user);
}
}
}

48
app/lang/de/cachet.php Normal file
View File

@@ -0,0 +1,48 @@
<?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' => [
0 => '',
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',
];

156
app/lang/de/dashboard.php Normal file
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.',
],
],
];

16
app/lang/de/errors.php Normal file
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
app/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;',
];

22
app/lang/de/reminders.php Normal file
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!',
];

14
app/lang/de/setup.php Normal file
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?',
];

106
app/lang/de/validation.php Normal file
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
app/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',
];

184
app/lang/en-UD/dashboard.php Executable file
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
app/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',
],
];

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