Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1204ffd306 | ||
|
|
fb2428e21b | ||
|
|
e36a126c01 | ||
|
|
b186978624 | ||
|
|
49773d7654 | ||
|
|
53c03751a1 | ||
|
|
9d2908449a | ||
|
|
caf92bcf6d | ||
|
|
cbef469e02 | ||
|
|
a6bfc1d76c | ||
|
|
0446a74de9 | ||
|
|
1a14079b39 | ||
|
|
d9c1919ddc | ||
|
|
f42ac0c5ba | ||
|
|
c073929895 | ||
|
|
02df7844a4 | ||
|
|
e43aba0111 | ||
|
|
ac7446ffe6 | ||
|
|
e45d3ca6ec | ||
|
|
603550a453 | ||
|
|
4463ef4a9a | ||
|
|
49b8dc0079 | ||
|
|
ab83c3a551 | ||
|
|
98c6093674 |
31
.env
@@ -1,31 +0,0 @@
|
||||
APP_NAME=Heimdall
|
||||
APP_ENV=local
|
||||
APP_KEY=base64:I206O8ibx+GQyRE7BeOxDobn04Mfmyyc5Ptzns/C0mY=
|
||||
APP_DEBUG=true
|
||||
APP_LOG_LEVEL=debug
|
||||
APP_URL=http://localhost
|
||||
|
||||
DB_CONNECTION=sqlite
|
||||
DB_DATABASE=app.sqlite
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=120
|
||||
QUEUE_DRIVER=sync
|
||||
|
||||
REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_HOST=smtp.mailtrap.io
|
||||
MAIL_PORT=2525
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
PUSHER_APP_SECRET=
|
||||
PUSHER_APP_CLUSTER=mt1
|
||||
10
.env.example
@@ -1,16 +1,12 @@
|
||||
APP_NAME=Laravel
|
||||
APP_NAME=Heimdall
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_LOG_LEVEL=debug
|
||||
APP_URL=http://localhost
|
||||
|
||||
DB_CONNECTION=mysql
|
||||
DB_HOST=127.0.0.1
|
||||
DB_PORT=3306
|
||||
DB_DATABASE=homestead
|
||||
DB_USERNAME=homestead
|
||||
DB_PASSWORD=secret
|
||||
DB_CONNECTION=sqlite
|
||||
DB_DATABASE=app.sqlite
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
|
||||
2
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
/app/SupportedApps
|
||||
/node_modules
|
||||
/public/hot
|
||||
/public/storage
|
||||
@@ -25,3 +26,4 @@ yarn-error.log
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
storage/app/public/avatars/*
|
||||
.env
|
||||
|
||||
@@ -13,6 +13,14 @@ class Application extends Model
|
||||
//
|
||||
public function icon()
|
||||
{
|
||||
if(!file_exists(storage_path('app/public/'.$this->icon))) {
|
||||
$img_src = app_path('SupportedApps/'.$this->name.'/'.str_replace('icons/', '', $this->icon));
|
||||
$img_dest = storage_path('app/public/'.$this->icon);
|
||||
//die("i: ".$img_src);
|
||||
@copy($img_src, $img_dest);
|
||||
}
|
||||
|
||||
|
||||
return $this->icon;
|
||||
}
|
||||
|
||||
|
||||
20
app/Item.php
@@ -7,6 +7,7 @@ use Symfony\Component\ClassLoader\ClassMapGenerator;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\User;
|
||||
use App\Application;
|
||||
|
||||
class Item extends Model
|
||||
{
|
||||
@@ -200,7 +201,26 @@ class Item extends Model
|
||||
return $config;
|
||||
}
|
||||
|
||||
public static function applicationDetails($class)
|
||||
{
|
||||
if(!empty($class)) {
|
||||
$name = self::nameFromClass($class);
|
||||
$application = Application::where('name', $name)->first();
|
||||
if($application) return $application;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
public static function getApplicationDescription($class)
|
||||
{
|
||||
$details = self::applicationDetails($class);
|
||||
if($details !== false) {
|
||||
return $details->description.' - '.$details->license;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the user that owns the item.
|
||||
|
||||
@@ -21,9 +21,9 @@ class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
|
||||
if(!is_file(base_path('.env'))) {
|
||||
touch(base_path('.env'));
|
||||
Artisan::call('key:generate');
|
||||
copy(base_path('.env.example'), base_path('.env'));
|
||||
}
|
||||
$this->genKey();
|
||||
if(!is_file(database_path('app.sqlite'))) {
|
||||
// first time setup
|
||||
touch(database_path('app.sqlite'));
|
||||
@@ -47,6 +47,11 @@ class AppServiceProvider extends ServiceProvider
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(!is_file(public_path('storage/.gitignore'))) {
|
||||
Artisan::call('storage:link');
|
||||
\Session::put('current_user', null);
|
||||
}
|
||||
|
||||
$applications = Application::all();
|
||||
if($applications->count() <= 0) {
|
||||
@@ -58,11 +63,6 @@ class AppServiceProvider extends ServiceProvider
|
||||
|
||||
}
|
||||
|
||||
if(!is_file(public_path('storage'))) {
|
||||
Artisan::call('storage:link');
|
||||
\Session::put('current_user', null);
|
||||
}
|
||||
|
||||
// User specific settings need to go here as session isn't available at this point in the app
|
||||
view()->composer('*', function ($view)
|
||||
{
|
||||
@@ -117,6 +117,21 @@ class AppServiceProvider extends ServiceProvider
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate app key if missing and .env exists
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function genKey()
|
||||
{
|
||||
if(is_file(base_path('.env'))) {
|
||||
if(empty(env('APP_KEY'))) {
|
||||
Artisan::call('key:generate', array('--force' => true, '--no-interaction' => true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register any application services.
|
||||
*
|
||||
|
||||
@@ -13,6 +13,13 @@ abstract class SupportedApps
|
||||
|
||||
public function appTest($url, $attrs = [], $overridevars=false)
|
||||
{
|
||||
if(empty($this->config->url)) {
|
||||
return (object)[
|
||||
'code' => 404,
|
||||
'status' => 'No URL has been specified',
|
||||
'response' => 'No URL has been specified',
|
||||
];
|
||||
}
|
||||
$res = $this->execute($url, $attrs);
|
||||
if($res == null) {
|
||||
return (object)[
|
||||
@@ -136,8 +143,8 @@ abstract class SupportedApps
|
||||
|
||||
public static function saveApp($details, $app)
|
||||
{
|
||||
if(!file_exists(public_path('storage/icons'))) {
|
||||
mkdir(public_path('storage/icons'), 0777, true);
|
||||
if(!file_exists(storage_path('app/public/icons'))) {
|
||||
mkdir(storage_path('app/public/icons'), 0777, true);
|
||||
}
|
||||
|
||||
$img_src = app_path('SupportedApps/'.className($details->name).'/'.$details->icon);
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Ghost;
|
||||
|
||||
class Ghost extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "c4745785181de931cfd5bd79294cb1687d82aea9",
|
||||
"name": "Ghost",
|
||||
"website": "https://github.com/tryghost/ghost",
|
||||
"license": "MIT License",
|
||||
"description": "Fiercely independent, professional publishing. A fully open source, powerful platform for building and running modern publications, we power serious blogs, magazines and journalism from DuckDuckGo to OpenAI & Sky News.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "ghost.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\MailcowSOGo;
|
||||
|
||||
class MailcowSOGo extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "1ec48781d2c87a9e6dc9ee99e5eff0ab5958df09",
|
||||
"name": "Mailcow - SOGo",
|
||||
"website": "https://sogo.nu/",
|
||||
"license": "GNU GPL/LGPL v2 and above",
|
||||
"description": "SOGo is a fully supported and trusted groupware server with a focus on scalability and open standards.\r\n\r\nPart of the Mailcow stack.",
|
||||
"enhanced": false,
|
||||
"tile_background": "dark",
|
||||
"icon": "mailcowsogo.svg"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Mattermost;
|
||||
|
||||
class Mattermost extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "b3e1424fb69ca08481b03ad9d81e95488421997f",
|
||||
"name": "Mattermost",
|
||||
"website": "https://mattermost.com/",
|
||||
"license": "MIT License",
|
||||
"description": "Mattermost provides high trust collaboration and messaging solutions through an open source, community-powered approach. Enjoy all the productivity benefits of workplace messaging across web, mobile and PC, with unlimited archiving, search and integrations within IT-controlled private environments in public clouds, including AWS and Azure, as well as on-premise in private clouds and virtual or physical servers.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "mattermost.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 25 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\MayanEDMS;
|
||||
|
||||
class MayanEDMS extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "6b9e062ff02ea610df64e9b0eca1c973faf1b51d",
|
||||
"name": "Mayan EDMS",
|
||||
"website": "https://github.com/tryghost/ghost",
|
||||
"license": "Apache License 2.0",
|
||||
"description": "Mayan EDMS is an open-source document management system. Its main purpose is to store, introspect, and categorize files, with a strong emphasis on preserving the contextual and business information of documents. It can also OCR, preview, label, sign, send, and receive thoses files. Other features of interest are its workflow system, role based access control, and REST API.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "mayanedms.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.9 KiB |
@@ -1,45 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Nzbget;
|
||||
|
||||
class Nzbget extends \App\SupportedApps implements \App\EnhancedApps {
|
||||
|
||||
public $config;
|
||||
|
||||
public function test()
|
||||
{
|
||||
$test = parent::appTest($this->url('status'));
|
||||
echo $test->status;
|
||||
}
|
||||
|
||||
public function livestats()
|
||||
{
|
||||
$status = 'inactive';
|
||||
$res = parent::execute($this->url('status'));
|
||||
$details = json_decode($res->getBody());
|
||||
|
||||
$data = [];
|
||||
|
||||
if($details) {
|
||||
$size = $details->result->RemainingSizeMB;
|
||||
$rate = $details->result->DownloadRate;
|
||||
$data['queue_size'] = format_bytes($size*1000*1000, false, ' <span>', '</span>');
|
||||
$data['current_speed'] = format_bytes($rate, false, ' <span>');
|
||||
$status = ($size > 0 || $rate > 0) ? 'active' : 'inactive';
|
||||
}
|
||||
|
||||
return parent::getLiveStats($status, $data);
|
||||
|
||||
}
|
||||
|
||||
public function url($endpoint)
|
||||
{
|
||||
$api_url = parent::normaliseurl($this->config->url);
|
||||
$username = $this->config->username;
|
||||
$password = $this->config->password;
|
||||
$rebuild_url = str_replace('http://', 'http://'.$username.':'.$password.'@', $api_url);
|
||||
$rebuild_url = str_replace('https://', 'https://'.$username.':'.$password.'@', $rebuild_url);
|
||||
$rebuild_url = rtrim($rebuild_url, '/');
|
||||
|
||||
$api_url = $rebuild_url.'/jsonrpc/'.$endpoint;
|
||||
return $api_url;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Privatebin;
|
||||
|
||||
class Privatebin extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "87ecbead58e42b5ab9e1a92ccc0b42075f4fba91",
|
||||
"name": "Privatebin",
|
||||
"website": "https://privatebin.info/",
|
||||
"license": "zlib/libpng License with Acknowledgement",
|
||||
"description": "PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data.\r\n\r\nData is encrypted and decrypted in the browser using 256bit AES in Galois Counter mode.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "privatebin.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 13 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Rspamd;
|
||||
|
||||
class Rspamd extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "5876529d5d47f91c435d9230576044bc4cad8547",
|
||||
"name": "Rspamd",
|
||||
"website": "https://rspamd.com/",
|
||||
"license": "Apache 2.0",
|
||||
"description": "Fast, free and open-source spam filtering system.",
|
||||
"enhanced": false,
|
||||
"tile_background": "dark",
|
||||
"icon": "rspamd.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 15 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\SOGo;
|
||||
|
||||
class SOGo extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "d143b3a76b72591495655c5257c7523456bdd736",
|
||||
"name": "SOGo",
|
||||
"website": "https://sogo.nu/",
|
||||
"license": "GNU GPL/LGPL v2 and above",
|
||||
"description": "SOGo is a fully supported and trusted groupware server with a focus on scalability and open standards.",
|
||||
"enhanced": false,
|
||||
"tile_background": "light",
|
||||
"icon": "sogo.svg"
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="792px" height="464px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path d="M643.711,144.938C633.849,144.938 626.847,137.721 626.847,128.035C626.847,118.341 633.849,111.123 643.711,111.123C653.65,111.123 660.652,118.341 660.652,128.035C660.652,137.721 653.65,144.938 643.711,144.938ZM643.681,94.5835C624.154,94.5835 610.288,108.861 610.288,128.035C610.288,147.2 624.154,161.478 643.681,161.478C663.335,161.478 677.202,147.2 677.202,128.035C677.202,108.861 663.335,94.5835 643.681,94.5835ZM643.652,178.811C614.019,178.811 592.965,157.13 592.965,128.035C592.965,98.9315 614.019,77.2602 643.652,77.2602C673.48,77.2602 694.525,98.9315 694.525,128.035C694.525,157.13 673.48,178.811 643.652,178.811ZM643.613,58.4876C603.032,58.4876 574.212,88.1791 574.212,128.035C574.212,167.882 603.032,197.564 643.613,197.564C684.458,197.564 713.288,167.882 713.288,128.035C713.288,88.1791 684.458,58.4876 643.613,58.4876ZM157.492,182.836L136.653,177.871C117.684,173.513 108.048,168.538 108.048,154.858C108.048,139.307 123.903,133.079 138.21,133.079C152.752,133.079 163.377,140.345 169.635,151.656C169.654,151.704 169.684,151.753 169.723,151.812C169.85,152.057 169.997,152.292 170.124,152.537L170.154,152.517C172.122,155.494 175.432,157.482 178.997,157.482C185.068,157.482 189.465,153.095 189.465,147.024C189.465,144.703 188.966,142.245 187.879,140.394C177.205,122.248 159.607,114.424 139.454,114.424C112.093,114.424 85.6524,128.104 85.6524,158.266C85.6524,185.95 113.023,194.038 122.972,196.516L142.871,201.187C158.109,204.918 170.546,209.903 170.546,224.504C170.546,241.298 153.134,248.77 136.34,248.77C119.241,248.77 106.579,240.025 97.8541,227.118L97.8443,227.118C95.9054,224.288 92.899,222.3 89.2169,222.3C83.2826,222.3 78.5037,227.177 78.7191,233.102C78.8171,235.52 79.6201,237.567 80.854,239.32C94.5246,259.777 114.296,267.425 136.34,267.425C164.641,267.425 192.942,254.362 192.942,222.643C192.942,202.127 177.704,187.507 157.492,182.836ZM296.617,248.682C263.038,248.682 241.886,223.495 241.886,190.846C241.886,158.187 263.038,133 296.617,133C330.52,133 351.662,158.187 351.662,190.846C351.662,223.495 330.52,248.682 296.617,248.682ZM296.617,114.345C251.531,114.345 219.499,146.994 219.499,190.846C219.499,234.688 251.531,267.337 296.617,267.337C342.016,267.337 374.048,234.688 374.048,190.846C374.048,146.994 342.016,114.345 296.617,114.345ZM514.985,232.818C514.221,233.552 513.448,234.277 512.606,234.972C511.509,235.981 510.236,237.068 508.786,238.155C500.032,244.491 488.976,248.163 476.049,248.163C442.46,248.163 421.318,222.976 421.318,190.327C421.318,157.668 442.46,132.481 476.049,132.481C509.942,132.481 531.084,157.668 531.084,190.327C531.084,207.376 525.316,222.369 514.985,232.818ZM464.797,315.733C467.304,315.733 469.899,315.566 472.592,315.233C477.567,314.607 482.101,314.332 486.204,314.332C505.281,314.44 514.995,319.983 520.851,326.387C526.697,332.831 528.95,341.566 528.94,348.989C528.95,352.544 528.391,355.726 527.774,357.636C524.856,366.488 518.961,372.511 509.932,377.045C500.972,381.491 489.015,383.763 476.51,383.743C472.034,383.743 467.481,383.459 462.986,382.921C454.486,381.941 443.244,378.289 435.096,371.923C430.993,368.751 427.614,364.99 425.235,360.534C422.875,356.059 421.406,350.869 421.396,344.23L421.396,343.495C421.651,331.254 427.272,323.126 433.431,317.221C436.477,314.342 439.611,312.198 441.892,310.836C442.255,310.621 442.597,310.425 442.911,310.249C448.953,313.823 456.454,315.762 464.797,315.733ZM476.049,113.826C430.964,113.826 398.922,146.475 398.922,190.327C398.922,219.96 413.562,244.461 436.976,257.241C436.663,257.554 436.359,257.877 436.066,258.2C430.014,264.83 426.919,273.32 426.909,281.909C426.9,285.698 427.526,289.586 428.868,293.307C425.832,295.246 422.209,297.9 418.497,301.386C409.547,309.72 399.921,323.733 399.637,343.123C399.627,343.573 399.627,343.946 399.627,344.23C399.617,354.218 401.987,363.227 406.031,370.778C412.113,382.147 421.582,390.059 431.355,395.338C441.187,400.626 451.44,403.436 460.381,404.533C465.708,405.17 471.114,405.512 476.51,405.512C491.532,405.493 506.514,402.957 519.549,396.572C532.524,390.285 543.678,379.464 548.496,364.285C549.926,359.771 550.689,354.649 550.709,348.989C550.689,337.492 547.389,323.449 537.058,311.855C526.727,300.221 509.638,292.455 486.204,292.563C481.112,292.563 475.687,292.916 469.919,293.63C468.058,293.856 466.354,293.963 464.797,293.963C457.619,293.915 454.016,291.927 451.871,289.899C449.756,287.833 448.698,285.101 448.669,281.909C448.659,278.657 449.942,275.24 452.106,272.909C454.319,270.598 457.071,269.031 461.869,268.972C462.3,268.972 462.761,268.982 463.231,269.021C466.306,269.237 469.292,269.345 472.191,269.345C496.173,269.393 514.212,261.961 526.482,251.737C538.791,241.514 545.294,229.077 548.369,219.255L548.329,219.245C551.669,210.422 553.48,200.688 553.48,190.327C553.48,146.475 521.448,113.826 476.049,113.826Z" style="fill:rgb(80,189,55);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 5.2 KiB |
@@ -1,5 +0,0 @@
|
||||
<?php namespace App\SupportedApps\Snibox;
|
||||
|
||||
class Snibox extends \App\SupportedApps {
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"appid": "6c050d5bdf522fa20599560ff0f6b74e7dcd97a8",
|
||||
"name": "Snibox",
|
||||
"website": "https://github.com/snibox/snibox",
|
||||
"license": "MIT License",
|
||||
"description": "Snibox is a self-hosted, single-user (for now) snippet manager. Developed to collect and organize code snippets. Supports various programming languages, markdown, plain text.",
|
||||
"enhanced": false,
|
||||
"tile_background": "dark",
|
||||
"icon": "snibox.png"
|
||||
}
|
||||
|
Before Width: | Height: | Size: 8.6 KiB |
@@ -14,7 +14,7 @@ return [
|
||||
*/
|
||||
|
||||
'name' => env('APP_NAME', 'Heimdall'),
|
||||
'version' => '2.1.10',
|
||||
'version' => '2.1.13',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
6183
public/css/app.css
vendored
160
public/js/app.js
vendored
6
public/mix-manifest.json
generated
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"/css/app.css": "/css/app.css?id=476a34b0b53427a036fd",
|
||||
"/js/app.js": "/js/app.js?id=8dc4a6ea723d0df7469d"
|
||||
}
|
||||
"/css/app.css": "/css/app.css?id=d346be37404d0fda1d66",
|
||||
"/js/app.js": "/js/app.js?id=0db2e72b5cd42d83e306"
|
||||
}
|
||||
|
||||
@@ -434,6 +434,8 @@ body {
|
||||
padding: 20px 25px;
|
||||
font-size: 13px;
|
||||
color: $app-text;
|
||||
max-width: 500px;
|
||||
word-break: break-word;
|
||||
&.form-error {
|
||||
background: #e69191;
|
||||
color: white;
|
||||
@@ -866,11 +868,6 @@ hr {
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
|
||||
li {
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
line-height: 1;
|
||||
}
|
||||
span {
|
||||
display: block;
|
||||
text-transform: uppercase;
|
||||
@@ -893,6 +890,18 @@ hr {
|
||||
margin-left: 4px;
|
||||
}
|
||||
}
|
||||
li {
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
line-height: 1;
|
||||
&.right {
|
||||
text-align: right;
|
||||
span {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.flexcolumn {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
115
resources/lang/pt/app.php
Normal file
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => 'Sistema',
|
||||
'settings.appearance' => 'Aparência',
|
||||
'settings.miscellaneous' => 'Diversos',
|
||||
'settings.support' => 'Ajuda',
|
||||
'settings.donate' => 'Doar',
|
||||
|
||||
'settings.version' => 'Versão',
|
||||
'settings.background_image' => 'Imagem de fundo',
|
||||
'settings.window_target' => 'O link abre em',
|
||||
'settings.window_target.current' => 'Abrir neste separador',
|
||||
'settings.window_target.one' => 'Abrir no mesmo separador',
|
||||
'settings.window_target.new' => 'Abrir num novo separador',
|
||||
'settings.homepage_search' => 'Pesquisa na página inicial',
|
||||
'settings.search_provider' => 'Provedor de pesquisa',
|
||||
'settings.language' => 'Linguagem',
|
||||
'settings.reset' => 'Restabelecer de volta ao inicial',
|
||||
'settings.remove' => 'Remover',
|
||||
'settings.search' => 'procura',
|
||||
'settings.no_items' => 'Nenhum item encontrado',
|
||||
|
||||
|
||||
'settings.label' => 'Etiqueta',
|
||||
'settings.value' => 'Valor',
|
||||
'settings.edit' => 'Editar',
|
||||
'settings.view' => 'Ver',
|
||||
|
||||
'options.none' => '- não definido -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.startpage' => 'StartPage',
|
||||
'options.yes' => 'Sim',
|
||||
'options.no' => 'Não',
|
||||
|
||||
'buttons.save' => 'Guardar',
|
||||
'buttons.cancel' => 'Cancelar',
|
||||
'buttons.add' => 'Adicionar',
|
||||
'buttons.upload' => 'Carregar um ficheiro',
|
||||
'buttons.downloadapps' => 'Atualizar lista de aplicações',
|
||||
|
||||
'dash.pin_item' => 'Afixar item na dashboard',
|
||||
'dash.no_apps' => 'Atualmente não existem aplicações afixadas, :link1 or :link2',
|
||||
'dash.link1' => 'Adicionar uma aplicação aqui',
|
||||
'dash.link2' => 'Afixar um item na dashboard',
|
||||
'dash.pinned_items' => 'Items Afixados',
|
||||
|
||||
'apps.app_list' => 'Lista de aplicações',
|
||||
'apps.view_trash' => 'Ver lixo',
|
||||
'apps.add_application' => 'Adicionar aplicação',
|
||||
'apps.application_name' => 'Nome da aplicação',
|
||||
'apps.colour' => 'Cor',
|
||||
'apps.icon' => 'Ícone',
|
||||
'apps.pinned' => 'Afixado',
|
||||
'apps.title' => 'Título',
|
||||
'apps.hex' => 'Cor hexadecimal',
|
||||
'apps.username' => 'Username',
|
||||
'apps.password' => 'Palavra-passe',
|
||||
'apps.config' => 'Configuração',
|
||||
'apps.apikey' => 'API Key',
|
||||
'apps.enable' => 'Ativar',
|
||||
'apps.tag_list' => 'Lista de tags',
|
||||
'apps.add_tag' => 'Adicionar tag',
|
||||
'apps.tag_name' => 'Nome da tag',
|
||||
'apps.tags' => 'Tags',
|
||||
'apps.override' => 'Se diferente do URL principal',
|
||||
'apps.preview' => 'Pré-visualizar',
|
||||
'apps.apptype' => 'Tipo de Aplicação',
|
||||
|
||||
'user.user_list' => 'Utilizadores',
|
||||
'user.add_user' => 'Adicionar utilizador',
|
||||
'user.username' => 'Username',
|
||||
'user.avatar' => 'Avatar',
|
||||
'user.email' => 'Email',
|
||||
'user.password_confirm' => 'Confirmar Palavra-passe',
|
||||
'user.secure_front' => 'Permitir acesso público à frente - Só é forçado se existir uma palavra-passe definida.',
|
||||
'user.autologin' => 'Permitir o início de sessão a partir de um URL específico. Qualquer pessoa com o link pode iniciar a sessão.',
|
||||
|
||||
'url' => 'URL',
|
||||
'title' => 'Título',
|
||||
'delete' => 'Apagar',
|
||||
'optional' => 'Opcional',
|
||||
'restore' => 'Restaurar',
|
||||
|
||||
'alert.success.item_created' => 'Item criado com sucesso',
|
||||
'alert.success.item_updated' => 'Item atualizado com sucesso',
|
||||
'alert.success.item_deleted' => 'Item apagado com sucesso',
|
||||
'alert.success.item_restored' => 'Item restaurado com sucesso',
|
||||
'alert.success.updating' => 'A atualizar a lista de aplicações',
|
||||
|
||||
'alert.success.tag_created' => 'Tag criada com sucesso',
|
||||
'alert.success.tag_updated' => 'Tag atualizada com sucesso',
|
||||
'alert.success.tag_deleted' => 'Tag apagada com sucesso',
|
||||
'alert.success.tag_restored' => 'Tag restaurada com sucesso',
|
||||
|
||||
'alert.success.setting_updated' => 'Definição editada com sucesso',
|
||||
'alert.error.not_exist' => 'Esta definição não existe.',
|
||||
|
||||
'alert.success.user_created' => 'Utilizador criada com sucesso',
|
||||
'alert.success.user_updated' => 'Utilizador atualizada com sucesso',
|
||||
'alert.success.user_deleted' => 'Utilizador apagada com sucesso',
|
||||
'alert.success.user_restored' => 'Utilizador restaurada com sucesso',
|
||||
|
||||
|
||||
];
|
||||
19
resources/lang/pt/auth.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used during authentication for various
|
||||
| messages that we need to display to the user. You are free to modify
|
||||
| these language lines according to your application's requirements.
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => 'Estas credenciais não se encontram nos nossos registos.',
|
||||
'throttle' => 'Demasiadas tentativas de início de sessão. Por favor tente de novo dentro de :seconds segundos',
|
||||
|
||||
];
|
||||
19
resources/lang/pt/pagination.php
Normal 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' => '« Anterior',
|
||||
'next' => 'Próximo »',
|
||||
|
||||
];
|
||||
22
resources/lang/pt/passwords.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset 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' => 'As palavras-passe necessitam de conter no mínimo seis caracteres e igualar a confirmação.',
|
||||
'reset' => 'A sua palavra-passe foi restabelecida!',
|
||||
'sent' => 'Enviámos-lhe por email o seu link de restauro de palavra-passe!',
|
||||
'token' => 'Este token de restabelecimento de palavra-passe é inválido.',
|
||||
'user' => "Não conseguimos encontrar nenhum utilizador com este endereço de email.",
|
||||
|
||||
];
|
||||
121
resources/lang/pt/validation.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'The :attribute must be accepted.',
|
||||
'active_url' => 'The :attribute is not a valid URL.',
|
||||
'after' => 'The :attribute must be a date after :date.',
|
||||
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
|
||||
'alpha' => 'The :attribute may only contain letters.',
|
||||
'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
|
||||
'alpha_num' => 'The :attribute may only contain letters and numbers.',
|
||||
'array' => 'The :attribute must be an array.',
|
||||
'before' => 'The :attribute must be a date before :date.',
|
||||
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
|
||||
'between' => [
|
||||
'numeric' => 'The :attribute must be between :min and :max.',
|
||||
'file' => 'The :attribute must be between :min and :max kilobytes.',
|
||||
'string' => 'The :attribute must be between :min and :max characters.',
|
||||
'array' => 'The :attribute must have between :min and :max items.',
|
||||
],
|
||||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'confirmed' => 'The :attribute confirmation does not match.',
|
||||
'date' => 'The :attribute is not a valid date.',
|
||||
'date_format' => 'The :attribute does not match the format :format.',
|
||||
'different' => 'The :attribute and :other must be different.',
|
||||
'digits' => 'The :attribute must be :digits digits.',
|
||||
'digits_between' => 'The :attribute must be between :min and :max digits.',
|
||||
'dimensions' => 'The :attribute has invalid image dimensions.',
|
||||
'distinct' => 'The :attribute field has a duplicate value.',
|
||||
'email' => 'The :attribute must be a valid email address.',
|
||||
'exists' => 'The selected :attribute is invalid.',
|
||||
'file' => 'The :attribute must be a file.',
|
||||
'filled' => 'The :attribute field must have a value.',
|
||||
'image' => 'The :attribute must be an image.',
|
||||
'in' => 'The selected :attribute is invalid.',
|
||||
'in_array' => 'The :attribute field does not exist in :other.',
|
||||
'integer' => 'The :attribute must be an integer.',
|
||||
'ip' => 'The :attribute must be a valid IP address.',
|
||||
'ipv4' => 'The :attribute must be a valid IPv4 address.',
|
||||
'ipv6' => 'The :attribute must be a valid IPv6 address.',
|
||||
'json' => 'The :attribute must be a valid JSON string.',
|
||||
'max' => [
|
||||
'numeric' => 'The :attribute may not be greater than :max.',
|
||||
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||
'string' => 'The :attribute may not be greater than :max characters.',
|
||||
'array' => 'The :attribute may not have more than :max items.',
|
||||
],
|
||||
'mimes' => 'The :attribute must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute must be a file of type: :values.',
|
||||
'min' => [
|
||||
'numeric' => 'The :attribute must be at least :min.',
|
||||
'file' => 'The :attribute must be at least :min kilobytes.',
|
||||
'string' => 'The :attribute must be at least :min characters.',
|
||||
'array' => 'The :attribute must have at least :min items.',
|
||||
],
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'numeric' => 'The :attribute must be a number.',
|
||||
'present' => 'The :attribute field must be present.',
|
||||
'regex' => 'The :attribute format is invalid.',
|
||||
'required' => 'The :attribute field is required.',
|
||||
'required_if' => 'The :attribute field is required when :other is :value.',
|
||||
'required_unless' => 'The :attribute field is required unless :other is in :values.',
|
||||
'required_with' => 'The :attribute field is required when :values is present.',
|
||||
'required_with_all' => 'The :attribute field is required when :values is present.',
|
||||
'required_without' => 'The :attribute field is required when :values is not present.',
|
||||
'required_without_all' => 'The :attribute field is required when none of :values are present.',
|
||||
'same' => 'The :attribute and :other must match.',
|
||||
'size' => [
|
||||
'numeric' => 'The :attribute must be :size.',
|
||||
'file' => 'The :attribute must be :size kilobytes.',
|
||||
'string' => 'The :attribute must be :size characters.',
|
||||
'array' => 'The :attribute must contain :size items.',
|
||||
],
|
||||
'string' => 'The :attribute must be a string.',
|
||||
'timezone' => 'The :attribute must be a valid zone.',
|
||||
'unique' => 'The :attribute has already been taken.',
|
||||
'uploaded' => 'The :attribute failed to upload.',
|
||||
'url' => 'The :attribute format is invalid.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| 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' => [],
|
||||
|
||||
];
|
||||
@@ -15,7 +15,7 @@ $user = \App\User::currentUser();
|
||||
<img class="user-img" src="{{ asset('/img/heimdall-icon-small.png') }}" />
|
||||
@endif
|
||||
{{ $user->username }}
|
||||
<input id="password" type="password" class="form-control" name="password" required>
|
||||
<input id="password" type="password" class="form-control" name="password" autofocus required>
|
||||
<button type="submit" class="btn btn-primary">Login</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<div data-id="{{ $app->id }}" data-dataonly="{{ $app->getconfig()->dataonly ?? '0' }}" class="livestats-container{{ title_color($app->colour) }}"></div>
|
||||
@endif
|
||||
</div>
|
||||
<a class="link{{ title_color($app->colour) }}"{!! $app->link_target !!} href="{{ $app->link }}"><i class="fas {{ $app->link_icon }}"></i></a>
|
||||
<a title="{{ App\Item::getApplicationDescription($app->class) }}" class="link{{ title_color($app->colour) }}"{!! $app->link_target !!} href="{{ $app->link }}"><i class="fas {{ $app->link_icon }}"></i></a>
|
||||
</div>
|
||||
<a class="item-edit" href="{{ route($app->link_type.'.edit', [ $app->id ], false) }}"><i class="fas fa-pencil"></i></a>
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
@foreach($apps as $app)
|
||||
<tr>
|
||||
<td>{{ $app->title }}</td>
|
||||
<td><a{{ $app->target }} href="{{ $app->url }}">{{ $app->link }}</a></td>
|
||||
<td><a{{ $app->target }} href="/tag/{{ $app->url }}">{{ $app->link }}</a></td>
|
||||
<td class="text-center"><a href="{!! route('tags.edit', [$app->id], false) !!}" title="{{ __('app.settings.edit') }} {!! $app->title !!}"><i class="fas fa-edit"></i></a></td>
|
||||
<td class="text-center">
|
||||
{!! Form::open(['method' => 'DELETE','route' => ['tags.destroy', $app->id],'style'=>'display:inline']) !!}
|
||||
|
||||
@@ -29,6 +29,7 @@ Route::resources([
|
||||
|
||||
Route::get('tag/{slug}', 'TagController@show')->name('tags.show');
|
||||
Route::get('tag/add/{tag}/{item}', 'TagController@add')->name('tags.add');
|
||||
Route::get('tag/restore/{id}', 'TagController@restore')->name('tags.restore');
|
||||
|
||||
|
||||
Route::get('items/pin/{id}', 'ItemController@pin')->name('items.pin');
|
||||
|
||||