Browse Source

Merge branch 'master' into master

pull/105/head
KodeStar 7 years ago
committed by GitHub
parent
commit
9778875d52
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      .gitignore
  2. 15
      CHANGELOG.md
  3. 55
      app/Http/Controllers/ItemController.php
  4. 16
      app/Http/Controllers/SettingsController.php
  5. 193
      app/Http/Controllers/TagController.php
  6. 86
      app/Item.php
  7. 2
      app/Providers/AppServiceProvider.php
  8. 12
      app/SupportedApps/Deluge.php
  9. 12
      app/SupportedApps/Graylog.php
  10. 12
      app/SupportedApps/HomeAssistant.php
  11. 12
      app/SupportedApps/Jackett.php
  12. 12
      app/SupportedApps/Lidarr.php
  13. 12
      app/SupportedApps/Medusa.php
  14. 12
      app/SupportedApps/Netdata.php
  15. 4
      app/SupportedApps/Nzbget.php
  16. 12
      app/SupportedApps/Nzbhydra.php
  17. 12
      app/SupportedApps/Ombi.php
  18. 2
      app/SupportedApps/Openhab.php
  19. 12
      app/SupportedApps/Opnsense.php
  20. 4
      app/SupportedApps/Pihole.php
  21. 2
      app/SupportedApps/Plexrequests.php
  22. 80
      app/SupportedApps/Proxmox.php
  23. 12
      app/SupportedApps/Radarr.php
  24. 4
      app/SupportedApps/Sabnzbd.php
  25. 12
      app/SupportedApps/Sonarr.php
  26. 2
      app/SupportedApps/Traefik.php
  27. 12
      app/SupportedApps/Ttrss.php
  28. 12
      app/SupportedApps/ruTorrent.php
  29. 2
      config/app.php
  30. 3698
      css/app.css
  31. 32
      database/migrations/2018_02_16_175830_add_columns_to_items_for_groups.php
  32. 35
      database/migrations/2018_02_16_193703_item_tag.php
  33. 2
      database/seeds/SettingsSeeder.php
  34. 3
      mix-manifest.json
  35. 19
      package-lock.json
  36. 3
      package.json
  37. 651
      public/css/app.css
  38. 34
      public/js/app.js
  39. 1
      public/js/select2.min.js
  40. 4
      public/mix-manifest.json
  41. 17
      readme.md
  42. 34
      resources/assets/js/app.js
  43. 486
      resources/assets/sass/_select2.scss
  44. 3
      resources/assets/sass/app.scss
  45. 9
      resources/lang/en/app.php
  46. 26
      resources/lang/fi/app.php
  47. 80
      resources/lang/it/app.php
  48. 80
      resources/lang/pl/app.php
  49. 19
      resources/lang/pl/auth.php
  50. 19
      resources/lang/pl/pagination.php
  51. 22
      resources/lang/pl/passwords.php
  52. 121
      resources/lang/pl/validation.php
  53. 30
      resources/lang/sv/app.php
  54. 17
      resources/views/app.blade.php
  55. 10
      resources/views/item.blade.php
  56. 20
      resources/views/items/form.blade.php
  57. 9
      resources/views/items/list.blade.php
  58. 4
      resources/views/items/scripts.blade.php
  59. 4
      resources/views/items/trash.blade.php
  60. 4
      resources/views/settings/form.blade.php
  61. 2
      resources/views/settings/list.blade.php
  62. 2
      resources/views/supportedapps/nzbget.blade.php
  63. 15
      resources/views/supportedapps/proxmox.blade.php
  64. 12
      resources/views/tags/create.blade.php
  65. 12
      resources/views/tags/edit.blade.php
  66. 76
      resources/views/tags/form.blade.php
  67. 56
      resources/views/tags/list.blade.php
  68. 10
      resources/views/tags/scripts.blade.php
  69. 52
      resources/views/tags/trash.blade.php
  70. 2
      resources/views/welcome.blade.php
  71. 6
      routes/web.php
  72. BIN
      storage/app/public/supportedapps/deluge.png
  73. BIN
      storage/app/public/supportedapps/graylog.png
  74. BIN
      storage/app/public/supportedapps/homeassistant.png
  75. BIN
      storage/app/public/supportedapps/jackett.png
  76. BIN
      storage/app/public/supportedapps/lidarr.png
  77. BIN
      storage/app/public/supportedapps/medusa.png
  78. BIN
      storage/app/public/supportedapps/netdata.png
  79. BIN
      storage/app/public/supportedapps/nzbhydra.png
  80. BIN
      storage/app/public/supportedapps/ombi.png
  81. BIN
      storage/app/public/supportedapps/opnsense.png
  82. BIN
      storage/app/public/supportedapps/proxmox.png
  83. BIN
      storage/app/public/supportedapps/radarr.png
  84. BIN
      storage/app/public/supportedapps/rutorrent.png
  85. BIN
      storage/app/public/supportedapps/sonarr.png
  86. BIN
      storage/app/public/supportedapps/tt-rss.png
  87. 22
      vendor/composer/autoload_classmap.php
  88. 22
      vendor/composer/autoload_static.php
  89. 4
      vendor/laravelcollective/html/src/FormBuilder.php

16
.gitignore

@ -9,4 +9,18 @@ Homestead.yaml
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
storage/app/public/.DS_Store ### macOS ###
*.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns

15
CHANGELOG.md

@ -1,5 +1,20 @@
# Release Notes # Release Notes
## v1.4.0 (2018-02-18)
### Added
- Tag(folder) support
- Image preview for uploading icons
- A load of supported apps, full list of apps https://github.com/linuxserver/Heimdall/projects/1
### Changed
- Edited vendor/laravelcollective/html/src/FormBuilder.php to allow relative links #3369de9
- Changed links to use relative links for reverse proxy support
- Links open in new tab
### Fixed
- adds all the fixes in the 1.3.x point releases and on master
## v1.3.0 (2018-02-09) ## v1.3.0 (2018-02-09)
### Added ### Added

55
app/Http/Controllers/ItemController.php

@ -18,8 +18,8 @@ class ItemController extends Controller
*/ */
public function dash() public function dash()
{ {
$data['apps'] = Item::pinned()->orderBy('order', 'asc')->get(); $data['apps'] = Item::doesntHave('parents')->pinned()->orderBy('order', 'asc')->get();
$data['all_apps'] = Item::all(); $data['all_apps'] = Item::doesntHave('parents')->get();
return view('welcome', $data); return view('welcome', $data);
} }
@ -49,7 +49,8 @@ class ItemController extends Controller
$item = Item::findOrFail($id); $item = Item::findOrFail($id);
$item->pinned = true; $item->pinned = true;
$item->save(); $item->save();
return redirect()->route('dash'); $route = route('dash', [], false);
return redirect($route);
} }
/** /**
@ -62,7 +63,8 @@ class ItemController extends Controller
$item = Item::findOrFail($id); $item = Item::findOrFail($id);
$item->pinned = false; $item->pinned = false;
$item->save(); $item->save();
return redirect()->route('dash'); $route = route('dash', [], false);
return redirect($route);
} }
/** /**
@ -81,8 +83,9 @@ class ItemController extends Controller
$data['ajax'] = true; $data['ajax'] = true;
return view('sortable', $data); return view('sortable', $data);
} else { } else {
return redirect()->route('dash'); $route = route('dash', [], false);
} return redirect($route);
}
} }
@ -95,8 +98,8 @@ class ItemController extends Controller
{ {
$trash = (bool)$request->input('trash'); $trash = (bool)$request->input('trash');
$data['apps'] = Item::orderBy('title', 'asc')->get(); $data['apps'] = Item::ofType('item')->orderBy('title', 'asc')->get();
$data['trash'] = Item::onlyTrashed()->get(); $data['trash'] = Item::ofType('item')->onlyTrashed()->get();
if($trash) { if($trash) {
return view('items.trash', $data); return view('items.trash', $data);
} else { } else {
@ -113,7 +116,8 @@ class ItemController extends Controller
public function create() public function create()
{ {
// //
$data = []; $data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
$data['current_tags'] = [];
return view('items.create', $data); return view('items.create', $data);
} }
@ -129,7 +133,7 @@ class ItemController extends Controller
// //
$validatedData = $request->validate([ $validatedData = $request->validate([
'title' => 'required|max:255', 'title' => 'required|max:255',
'url' => 'required', 'url' => 'required|url',
]); ]);
if($request->hasFile('file')) { if($request->hasFile('file')) {
@ -146,9 +150,12 @@ class ItemController extends Controller
//die(print_r($request->input('config'))); //die(print_r($request->input('config')));
Item::create($request->all()); $item = Item::create($request->all());
return redirect()->route('dash') $item->parents()->sync($request->tags);
$route = route('dash', [], false);
return redirect($route)
->with('success', __('app.alert.success.item_created')); ->with('success', __('app.alert.success.item_created'));
} }
@ -172,11 +179,12 @@ class ItemController extends Controller
public function edit($id) public function edit($id)
{ {
// Get the item // Get the item
$item = Item::find($id); $data['item'] = Item::find($id);
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
$data['current_tags'] = $data['item']->parents;
// show the edit form and pass the nerd // show the edit form and pass the nerd
return view('items.edit') return view('items.edit', $data);
->with('item', $item);
} }
/** /**
@ -190,7 +198,7 @@ class ItemController extends Controller
{ {
$validatedData = $request->validate([ $validatedData = $request->validate([
'title' => 'required|max:255', 'title' => 'required|max:255',
'url' => 'required', 'url' => 'required|url',
]); ]);
//die(print_r($request->all())); //die(print_r($request->all()));
if($request->hasFile('file')) { if($request->hasFile('file')) {
@ -205,9 +213,13 @@ class ItemController extends Controller
'description' => $config 'description' => $config
]); ]);
Item::find($id)->update($request->all()); $item = Item::find($id);
$item->update($request->all());
$item->parents()->sync($request->tags);
return redirect()->route('dash') $route = route('dash', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_updated')); ->with('success',__('app.alert.success.item_updated'));
} }
@ -229,7 +241,8 @@ class ItemController extends Controller
Item::find($id)->delete(); Item::find($id)->delete();
} }
return redirect()->route('items.index') $route = route('items.index', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_deleted')); ->with('success',__('app.alert.success.item_deleted'));
} }
@ -245,7 +258,9 @@ class ItemController extends Controller
Item::withTrashed() Item::withTrashed()
->where('id', $id) ->where('id', $id)
->restore(); ->restore();
return redirect()->route('items.index')
$route = route('items.inded', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_restored')); ->with('success',__('app.alert.success.item_restored'));
} }

16
app/Http/Controllers/SettingsController.php

@ -39,7 +39,9 @@ class SettingsController extends Controller
'setting' => $setting, 'setting' => $setting,
]); ]);
} else { } else {
return redirect()->route('settings.list')->with([ $route = route('settings.list', [], false);
return redirect($route)
->with([
'error' => __('app.alert.error.not_exist'), 'error' => __('app.alert.error.not_exist'),
]); ]);
} }
@ -73,11 +75,15 @@ class SettingsController extends Controller
$setting->save(); $setting->save();
return redirect()->route('settings.index')->with([ $route = route('settings.index', [], false);
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'), 'success' => __('app.alert.success.setting_updated'),
]); ]);
} else { } else {
return redirect()->route('settings.index')->with([ $route = route('settings.index', [], false);
return redirect($route)
->with([
'error' => __('app.alert.error.not_exist'), 'error' => __('app.alert.error.not_exist'),
]); ]);
} }
@ -94,7 +100,9 @@ class SettingsController extends Controller
$setting->value = ''; $setting->value = '';
$setting->save(); $setting->save();
} }
return redirect()->route('settings.index')->with([ $route = route('settings.index', [], false);
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'), 'success' => __('app.alert.success.setting_updated'),
]); ]);

193
app/Http/Controllers/TagController.php

@ -0,0 +1,193 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Item;
use DB;
class TagController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$trash = (bool)$request->input('trash');
$data['apps'] = Item::ofType('tag')->orderBy('title', 'asc')->get();
$data['trash'] = Item::ofType('tag')->onlyTrashed()->get();
if($trash) {
return view('tags.trash', $data);
} else {
return view('tags.list', $data);
}
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$data = [];
return view('tags.create', $data);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
]);
if($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
]);
}
$slug = str_slug($request->title, '-');
// set item type to tag
$request->merge([
'type' => '1',
'url' => $slug
]);
//die(print_r($request->all()));
Item::create($request->all());
$route = route('dash', [], false);
return redirect($route)
->with('success', __('app.alert.success.tag_created'));
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($slug)
{
$item = Item::whereUrl($slug)->first();
//print_r($item);
$data['apps'] = $item->children()->pinned()->orderBy('order', 'asc')->get();
$data['all_apps'] = $item->children;
return view('welcome', $data);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
// Get the item
$item = Item::find($id);
// show the edit form and pass the nerd
return view('tags.edit')
->with('item', $item);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
]);
if($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
]);
}
$slug = str_slug($request->title, '-');
// set item type to tag
$request->merge([
'url' => $slug
]);
Item::find($id)->update($request->all());
$route = route('dash', [], false);
return redirect($route)
->with('success',__('app.alert.success.tag_updated'));
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Request $request, $id)
{
//
$force = (bool)$request->input('force');
if($force) {
Item::withTrashed()
->where('id', $id)
->forceDelete();
} else {
Item::find($id)->delete();
}
$route = route('tags.index', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_deleted'));
}
/**
* Restore the specified resource from soft deletion.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function restore($id)
{
//
Item::withTrashed()
->where('id', $id)
->restore();
$route = route('tags.index', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_restored'));
}
public function add($tag, $item)
{
$output = 0;
$tag = Item::find($tag);
$item = Item::find($item);
if($tag && $item) {
// only add items, not cats
if((int)$item->type === 0) {
$tag->children()->attach($item);
return 1;
}
}
return $output;
}
}

86
app/Item.php

@ -13,7 +13,7 @@ class Item extends Model
// //
protected $fillable = [ protected $fillable = [
'title', 'url', 'colour', 'icon', 'description', 'pinned', 'order' 'title', 'url', 'colour', 'icon', 'description', 'pinned', 'order', 'type'
]; ];
/** /**
@ -26,22 +26,37 @@ class Item extends Model
public static function supportedList() public static function supportedList()
{ {
return [ return [
'Deluge' => \App\SupportedApps\Deluge::class,
'Duplicati' => \App\SupportedApps\Duplicati::class, 'Duplicati' => \App\SupportedApps\Duplicati::class,
'Emby' => \App\SupportedApps\Emby::class, 'Emby' => \App\SupportedApps\Emby::class,
'Graylog' => \App\SupportedApps\Graylog::class,
'Home Assistant' => \App\SupportedApps\HomeAssistant::class,
'Jackett' => \App\SupportedApps\Jackett::class,
'Jdownloader' => \App\SupportedApps\Jdownloader::class, 'Jdownloader' => \App\SupportedApps\Jdownloader::class,
'Lidarr' => \App\SupportedApps\Lidarr::class,
'Mcmyadmin' => \App\SupportedApps\Mcmyadmin::class, 'Mcmyadmin' => \App\SupportedApps\Mcmyadmin::class,
'Medusa' => \App\SupportedApps\Medusa::class,
'NZBGet' => \App\SupportedApps\Nzbget::class, 'NZBGet' => \App\SupportedApps\Nzbget::class,
'Netdata' => \App\SupportedApps\Netdata::class,
'Nextcloud' => \App\SupportedApps\Nextcloud::class, 'Nextcloud' => \App\SupportedApps\Nextcloud::class,
'Nzbhydra' => \App\SupportedApps\Nzbhydra::class,
'Ttrss' => \App\SupportedApps\Ttrss::class,
'Ombi' => \App\SupportedApps\Ombi::class,
'OPNSense' => \App\SupportedApps\Opnsense::class,
'Openhab' => \App\SupportedApps\Openhab::class, 'Openhab' => \App\SupportedApps\Openhab::class,
'Pihole' => \App\SupportedApps\Pihole::class, 'Pihole' => \App\SupportedApps\Pihole::class,
'Plex' => \App\SupportedApps\Plex::class, 'Plex' => \App\SupportedApps\Plex::class,
'Plexpy' => \App\SupportedApps\Plexpy::class, 'Plexpy' => \App\SupportedApps\Plexpy::class,
'Plexrequests' => \App\SupportedApps\Plexrequests::class, 'Plexrequests' => \App\SupportedApps\Plexrequests::class,
'Portainer' => \App\SupportedApps\Portainer::class, 'Portainer' => \App\SupportedApps\Portainer::class,
'Proxmox' => \App\SupportedApps\Proxmox::class,
'Radarr' => \App\SupportedApps\Radarr::class,
'Sabnzbd' => \App\SupportedApps\Sabnzbd::class, 'Sabnzbd' => \App\SupportedApps\Sabnzbd::class,
'Sonarr' => \App\SupportedApps\Sonarr::class,
'Traefik' => \App\SupportedApps\Traefik::class, 'Traefik' => \App\SupportedApps\Traefik::class,
'UniFi' => \App\SupportedApps\Unifi::class, 'UniFi' => \App\SupportedApps\Unifi::class,
'pFsense' => \App\SupportedApps\Pfsense::class, 'pFsense' => \App\SupportedApps\Pfsense::class,
'ruTorrent' => \App\SupportedApps\ruTorrent::class,
]; ];
} }
public static function supportedOptions() public static function supportedOptions()
@ -101,4 +116,73 @@ class Item extends Model
return $config; return $config;
} }
public function parents()
{
return $this->belongsToMany('App\Item', 'item_tag', 'item_id', 'tag_id');
}
public function children()
{
return $this->belongsToMany('App\Item', 'item_tag', 'tag_id', 'item_id');
}
public function getLinkAttribute()
{
if((int)$this->type === 1) {
return '/tag/'.$this->url;
} else {
return $this->url;
}
}
public function getDroppableAttribute()
{
if((int)$this->type === 1) {
return ' droppable';
} else {
return '';
}
}
public function getLinkTargetAttribute()
{
if((int)$this->type === 1) {
return '';
} else {
return ' target="_blank"';
}
}
public function getLinkIconAttribute()
{
if((int)$this->type === 1) {
return 'fa-tag';
} else {
return 'fa-arrow-alt-to-right';
}
}
public function getLinkTypeAttribute()
{
if((int)$this->type === 1) {
return 'tags';
} else {
return 'items';
}
}
public function scopeOfType($query, $type)
{
switch($type) {
case 'item':
$typeid = 0;
break;
case 'tag':
$typeid = 1;
break;
}
return $query->where('type', $typeid);
}
} }

2
app/Providers/AppServiceProvider.php

@ -33,7 +33,7 @@ class AppServiceProvider extends ServiceProvider
if(is_file(database_path('app.sqlite'))) { if(is_file(database_path('app.sqlite'))) {
if(Schema::hasTable('settings')) { if(Schema::hasTable('settings')) {
if($bg_image = Setting::fetch('background_image')) { if($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url('.asset('storage/'.$bg_image).')"'; $alt_bg = ' style="background-image: url(/storage/'.$bg_image.')"';
} }
// check version to see if an upgrade is needed // check version to see if an upgrade is needed

12
app/SupportedApps/Deluge.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Deluge implements Contracts\Applications {
public function defaultColour()
{
return '#357';
}
public function icon()
{
return 'supportedapps/deluge.png';
}
}

12
app/SupportedApps/Graylog.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Graylog implements Contracts\Applications {
public function defaultColour()
{
return '#158';
}
public function icon()
{
return 'supportedapps/graylog.png';
}
}

12
app/SupportedApps/HomeAssistant.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class HomeAssistant implements Contracts\Applications {
public function defaultColour()
{
return '#073c52';
}
public function icon()
{
return 'supportedapps/homeassistant.png';
}
}

12
app/SupportedApps/Jackett.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Jackett implements Contracts\Applications {
public function defaultColour()
{
return '#484814';
}
public function icon()
{
return 'supportedapps/jackett.png';
}
}

12
app/SupportedApps/Lidarr.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Lidarr implements Contracts\Applications {
public function defaultColour()
{
return '#183c18';
}
public function icon()
{
return 'supportedapps/lidarr.png';
}
}

12
app/SupportedApps/Medusa.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Medusa implements Contracts\Applications {
public function defaultColour()
{
return '#4b5e55';
}
public function icon()
{
return 'supportedapps/medusa.png';
}
}

12
app/SupportedApps/Netdata.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Netdata implements Contracts\Applications {
public function defaultColour()
{
return '#543737';
}
public function icon()
{
return 'supportedapps/netdata.png';
}
}

4
app/SupportedApps/Nzbget.php

@ -68,8 +68,10 @@ class Nzbget implements Contracts\Applications, Contracts\Livestats {
$rebuild_url = str_replace('http://', 'http://'.$username.':'.$password.'@', $url); $rebuild_url = str_replace('http://', 'http://'.$username.':'.$password.'@', $url);
$rebuild_url = str_replace('https://', 'https://'.$username.':'.$password.'@', $rebuild_url); $rebuild_url = str_replace('https://', 'https://'.$username.':'.$password.'@', $rebuild_url);
$rebuild_url = rtrim($rebuild_url, '/');
$api_url = $rebuild_url.'jsonrpc/'.$endpoint;
$api_url = $rebuild_url.'/jsonrpc/'.$endpoint;
$client = new Client(['http_errors' => false]); $client = new Client(['http_errors' => false]);
$res = $client->request('GET', $api_url); $res = $client->request('GET', $api_url);

12
app/SupportedApps/Nzbhydra.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Nzbhydra implements Contracts\Applications {
public function defaultColour()
{
return '#53644d';
}
public function icon()
{
return 'supportedapps/nzbhydra.png';
}
}

12
app/SupportedApps/Ombi.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Ombi implements Contracts\Applications {
public function defaultColour()
{
return '#150f09';
}
public function icon()
{
return 'supportedapps/ombi.png';
}
}

2
app/SupportedApps/Openhab.php

@ -3,7 +3,7 @@
class Openhab implements Contracts\Applications { class Openhab implements Contracts\Applications {
public function defaultColour() public function defaultColour()
{ {
return '#b7b7b7'; return '#2b2525';
} }
public function icon() public function icon()
{ {

12
app/SupportedApps/Opnsense.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Opnsense implements Contracts\Applications {
public function defaultColour()
{
return '#211914';
}
public function icon()
{
return 'supportedapps/opnsense.png';
}
}

4
app/SupportedApps/Pihole.php

@ -57,7 +57,9 @@ class Pihole implements Contracts\Applications, Contracts\Livestats {
$config = $this->config; $config = $this->config;
$url = $config->url; $url = $config->url;
$api_url = $url.'admin/api.php'; $url = rtrim($url, '/');
$api_url = $url.'/api.php';
//die( $api_url.' --- '); //die( $api_url.' --- ');
$client = new Client(['http_errors' => false]); $client = new Client(['http_errors' => false]);

2
app/SupportedApps/Plexrequests.php

@ -3,7 +3,7 @@
class Plexrequests implements Contracts\Applications { class Plexrequests implements Contracts\Applications {
public function defaultColour() public function defaultColour()
{ {
return '#845c2c'; return '#3c2d1c';
} }
public function icon() public function icon()
{ {

80
app/SupportedApps/Proxmox.php

@ -0,0 +1,80 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Proxmox implements Contracts\Applications, Contracts\Livestats {
public function defaultColour()
{
return '#542e0a';
}
public function icon()
{
return 'supportedapps/proxmox.png';
}
public function configDetails()
{
//return 'proxmox';
return null;
}
public function testConfig()
{
/*$res = $this->buildRequest();
switch($res->getStatusCode()) {
case 200:
echo 'Successfully connected to the API';
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}*/
return null;
}
public function executeConfig()
{
/*
$output = '';
$res = $this->buildRequest();
$data = json_decode($res->getBody());
$output = '
<ul class="livestats">
<li><span class="title">Domains<br />Blocked</span><strong>'.$data->domains_being_blocked.'</strong></li>
<li><span class="title">Blocked<br />Today</span><strong>'.$data->ads_blocked_today.'</span></strong></li>
</ul>
';
return $output;
*/
return null;
}
public function buildRequest($endpoint='')
{
$config = $this->config;
$username = $config->username;
$password = $config->password;
$url = $config->url;
$url = rtrim($url, '/');
$api_url = $url.'/api2/json/'.$endpoint.'?username='.$username.'&password='.$password;
//die( $api_url.' --- ');
$client = new Client(['http_errors' => false, 'verify' => false ]);
$res = $client->request('GET', $api_url);
return $res;
}
}

12
app/SupportedApps/Radarr.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Radarr implements Contracts\Applications {
public function defaultColour()
{
return '#3e3726';
}
public function icon()
{
return 'supportedapps/radarr.png';
}
}

4
app/SupportedApps/Sabnzbd.php

@ -70,7 +70,9 @@ class Sabnzbd implements Contracts\Applications, Contracts\Livestats {
$url = $config->url; $url = $config->url;
$apikey = $config->apikey; $apikey = $config->apikey;
$api_url = $url.'api?output=json&apikey='.$apikey.'&mode='.$endpoint; $url = rtrim($url, '/');
$api_url = $url.'/api?output=json&apikey='.$apikey.'&mode='.$endpoint;
//die( $api_url.' --- '); //die( $api_url.' --- ');
$client = new Client(['http_errors' => false]); $client = new Client(['http_errors' => false]);

12
app/SupportedApps/Sonarr.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Sonarr implements Contracts\Applications {
public function defaultColour()
{
return '#163740';
}
public function icon()
{
return 'supportedapps/sonarr.png';
}
}

2
app/SupportedApps/Traefik.php

@ -3,7 +3,7 @@
class Traefik implements Contracts\Applications { class Traefik implements Contracts\Applications {
public function defaultColour() public function defaultColour()
{ {
return '#427d8c'; return '#28434a';
} }
public function icon() public function icon()
{ {

12
app/SupportedApps/Ttrss.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Ttrss implements Contracts\Applications {
public function defaultColour()
{
return '#9d704c';
}
public function icon()
{
return 'supportedapps/tt-rss.png';
}
}

12
app/SupportedApps/ruTorrent.php

@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class ruTorrent implements Contracts\Applications {
public function defaultColour()
{
return '#004';
}
public function icon()
{
return 'supportedapps/rutorrent.png';
}
}

2
config/app.php

@ -14,7 +14,7 @@ return [
*/ */
'name' => env('APP_NAME', 'Heimdall'), 'name' => env('APP_NAME', 'Heimdall'),
'version' => '1.3.2', 'version' => '1.4.3',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

3698
css/app.css

File diff suppressed because it is too large

32
database/migrations/2018_02_16_175830_add_columns_to_items_for_groups.php

@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddColumnsToItemsForGroups extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('items', function (Blueprint $table) {
$table->integer('type')->default(0)->index(); // 0 = item, 1 = category
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
$table->dropColumn(['type']);
});
}
}

35
database/migrations/2018_02_16_193703_item_tag.php

@ -0,0 +1,35 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class ItemTag extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('item_tag', function (Blueprint $table) {
$table->integer('item_id')->unsigned()->index();
$table->foreign('item_id')->references('id')->on('items')->onDelete('cascade');
$table->integer('tag_id')->unsigned()->index();
$table->foreign('tag_id')->references('id')->on('items')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('item_tag');
}
}

2
database/seeds/SettingsSeeder.php

@ -115,7 +115,9 @@ class SettingsSeeder extends Seeder
'en' => 'English', 'en' => 'English',
'fi' => 'Suomi (Finnish)', 'fi' => 'Suomi (Finnish)',
'fr' => 'Français (French)', 'fr' => 'Français (French)',
'it' => 'Italiano (Italian)',
'no' => 'Norsk (Norwegian)', 'no' => 'Norsk (Norwegian)',
'pl' => 'Polski (Polish)',
'sv' => 'Svenska (Swedish)', 'sv' => 'Svenska (Swedish)',
'es' => 'Español (Spanish)', 'es' => 'Español (Spanish)',
'tr' => 'Türkçe (Turkish)', 'tr' => 'Türkçe (Turkish)',

3
mix-manifest.json

@ -0,0 +1,3 @@
{
"/css/app.css": "/css/app.css"
}

19
package-lock.json

@ -115,6 +115,11 @@
"repeat-string": "1.6.1" "repeat-string": "1.6.1"
} }
}, },
"almond": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/almond/-/almond-0.3.3.tgz",
"integrity": "sha1-oOfJWsdiTWQXtElLHmi/9pMWiiA="
},
"alphanum-sort": { "alphanum-sort": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
@ -6237,6 +6242,11 @@
"integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==", "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==",
"dev": true "dev": true
}, },
"jquery-mousewheel": {
"version": "3.1.13",
"resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz",
"integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU="
},
"js-base64": { "js-base64": {
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.2.tgz", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.2.tgz",
@ -10696,6 +10706,15 @@
"integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
"dev": true "dev": true
}, },
"select2": {
"version": "4.0.6-rc.1",
"resolved": "https://registry.npmjs.org/select2/-/select2-4.0.6-rc.1.tgz",
"integrity": "sha1-qmwwOKfw8ukf+t448KIcFeGBMnY=",
"requires": {
"almond": "0.3.3",
"jquery-mousewheel": "3.1.13"
}
},
"selfsigned": { "selfsigned": {
"version": "1.10.1", "version": "1.10.1",
"resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz",

3
package.json

@ -19,6 +19,7 @@
"vue": "^2.5.7" "vue": "^2.5.7"
}, },
"dependencies": { "dependencies": {
"node-sass": "^4.7.2" "node-sass": "^4.7.2",
"select2": "^4.0.6-rc.1"
} }
} }

651
public/css/app.css

@ -5312,3 +5312,654 @@ readers do not read off random characters that represent icons */
font-weight: 900; font-weight: 900;
} }
.select2-container {
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: inline-block;
margin: 0;
position: relative;
vertical-align: middle;
}
.select2-container .select2-selection--single {
-webkit-box-sizing: border-box;
box-sizing: border-box;
cursor: pointer;
display: block;
height: 28px;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-user-select: none;
}
.select2-container .select2-selection--single .select2-selection__rendered {
display: block;
padding-left: 8px;
padding-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.select2-container .select2-selection--single .select2-selection__clear {
position: relative;
}
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 8px;
padding-left: 20px;
}
.select2-container .select2-selection--multiple {
-webkit-box-sizing: border-box;
box-sizing: border-box;
cursor: pointer;
display: block;
min-height: 39px;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-user-select: none;
}
.select2-container .select2-selection--multiple .select2-selection__rendered {
display: inline-block;
overflow: hidden;
padding-left: 8px;
text-overflow: ellipsis;
white-space: nowrap;
}
.select2-container .select2-search--inline {
float: left;
}
.select2-container .select2-search--inline .select2-search__field {
-webkit-box-sizing: border-box;
box-sizing: border-box;
border: none;
font-size: 100%;
margin-top: 5px;
padding: 0;
}
.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none;
}
.select2-dropdown {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: block;
position: absolute;
left: -100000px;
width: 100%;
z-index: 1051;
}
.select2-results {
display: block;
}
.select2-results__options {
list-style: none;
margin: 0;
padding: 0;
}
.select2-results__option {
padding: 6px;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-user-select: none;
}
.select2-results__option[aria-selected] {
cursor: pointer;
}
.select2-container--open .select2-dropdown {
left: 0;
}
.select2-container--open .select2-dropdown--above {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.select2-container--open .select2-dropdown--below {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.select2-search--dropdown {
display: block;
padding: 4px;
}
.select2-search--dropdown .select2-search__field {
padding: 4px;
width: 100%;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none;
}
.select2-search--dropdown.select2-search--hide {
display: none;
}
.select2-close-mask {
border: 0;
margin: 0;
padding: 0;
display: block;
position: fixed;
left: 0;
top: 0;
min-height: 100%;
min-width: 100%;
height: auto;
width: auto;
opacity: 0;
z-index: 99;
background-color: #fff;
filter: alpha(opacity=0);
}
.select2-hidden-accessible {
border: 0 !important;
clip: rect(0 0 0 0) !important;
-webkit-clip-path: inset(50%) !important;
clip-path: inset(50%) !important;
height: 1px !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
width: 1px !important;
white-space: nowrap !important;
}
.select2-container--default .select2-selection--single {
background-color: #fff;
border: 1px solid #aaa;
border-radius: 4px;
}
.select2-container--default .select2-selection--single .select2-selection__rendered {
color: #444;
line-height: 28px;
}
.select2-container--default .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
}
.select2-container--default .select2-selection--single .select2-selection__placeholder {
color: #999;
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px;
}
.select2-container--default .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0;
}
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left;
}
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
left: 1px;
right: auto;
}
.select2-container--default.select2-container--disabled .select2-selection--single {
background-color: #eee;
cursor: default;
}
.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
display: none;
}
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px;
}
.select2-container--default .select2-selection--multiple {
background-color: white;
border: 1px solid #dedfe2;
border-radius: 4px;
cursor: text;
}
.select2-container--default .select2-selection--multiple .select2-selection__rendered {
-webkit-box-sizing: border-box;
box-sizing: border-box;
list-style: none;
margin: 0;
padding: 0 5px;
width: 100%;
}
.select2-container--default .select2-selection--multiple .select2-selection__rendered li {
list-style: none;
}
.select2-container--default .select2-selection--multiple .select2-selection__placeholder {
color: #999;
margin-top: 5px;
float: left;
}
.select2-container--default .select2-selection--multiple .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
margin-top: 5px;
margin-right: 10px;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #f2f3f6;
border: 1px solid #dedfe2;
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
font-size: 13px;
font-weight: 300;
margin-top: 5px;
padding: 5px;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
color: #999;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #333;
}
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
float: right;
}
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
margin-left: 5px;
margin-right: auto;
}
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto;
}
.select2-container--default.select2-container--focus .select2-selection--multiple {
border: solid #dedfe2 1px;
outline: 0;
}
.select2-container--default.select2-container--disabled .select2-selection--multiple {
background-color: #eee;
cursor: default;
}
.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
display: none;
}
.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,
.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,
.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.select2-container--default .select2-search--dropdown .select2-search__field {
border: 1px solid #aaa;
}
.select2-container--default .select2-search--inline .select2-search__field {
background: transparent;
border: none;
outline: 0;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-appearance: textfield;
}
.select2-container--default .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto;
}
.select2-container--default .select2-results__option[role=group] {
padding: 0;
}
.select2-container--default .select2-results__option[aria-disabled=true] {
color: #999;
}
.select2-container--default .select2-results__option[aria-selected=true] {
background-color: #ddd;
}
.select2-container--default .select2-results__option .select2-results__option {
padding-left: 1em;
}
.select2-container--default .select2-results__option .select2-results__option .select2-results__group {
padding-left: 0;
}
.select2-container--default .select2-results__option .select2-results__option .select2-results__option {
margin-left: -1em;
padding-left: 2em;
}
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -2em;
padding-left: 3em;
}
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -3em;
padding-left: 4em;
}
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -4em;
padding-left: 5em;
}
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -5em;
padding-left: 6em;
}
.select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #5897fb;
color: white;
}
.select2-container--default .select2-results__group {
cursor: default;
display: block;
padding: 6px;
}
.select2-container--classic .select2-selection--single {
background-color: #f7f7f7;
border: 1px solid #aaa;
border-radius: 4px;
outline: 0;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(50%, white), to(#eeeeee));
background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0);
}
.select2-container--classic .select2-selection--single:focus {
border: 1px solid #5897fb;
}
.select2-container--classic .select2-selection--single .select2-selection__rendered {
color: #444;
line-height: 28px;
}
.select2-container--classic .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
margin-right: 10px;
}
.select2-container--classic .select2-selection--single .select2-selection__placeholder {
color: #999;
}
.select2-container--classic .select2-selection--single .select2-selection__arrow {
background-color: #ddd;
border: none;
border-left: 1px solid #aaa;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #eeeeee), to(#cccccc));
background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0);
}
.select2-container--classic .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0;
}
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left;
}
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
border: none;
border-right: 1px solid #aaa;
border-radius: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
left: 1px;
right: auto;
}
.select2-container--classic.select2-container--open .select2-selection--single {
border: 1px solid #5897fb;
}
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
background: transparent;
border: none;
}
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px;
}
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
background-image: -webkit-gradient(linear, left top, left bottom, from(white), color-stop(50%, #eeeeee));
background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0);
}
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(50%, #eeeeee), to(white));
background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0);
}
.select2-container--classic .select2-selection--multiple {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
cursor: text;
outline: 0;
}
.select2-container--classic .select2-selection--multiple:focus {
border: 1px solid #5897fb;
}
.select2-container--classic .select2-selection--multiple .select2-selection__rendered {
list-style: none;
margin: 0;
padding: 0 5px;
}
.select2-container--classic .select2-selection--multiple .select2-selection__clear {
display: none;
}
.select2-container--classic .select2-selection--multiple .select2-selection__choice {
background-color: #e4e4e4;
border: 1px solid #aaa;
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
margin-top: 5px;
padding: 0 5px;
}
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
color: #888;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px;
}
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #555;
}
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
float: right;
margin-left: 5px;
margin-right: auto;
}
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto;
}
.select2-container--classic.select2-container--open .select2-selection--multiple {
border: 1px solid #5897fb;
}
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.select2-container--classic .select2-search--dropdown .select2-search__field {
border: 1px solid #aaa;
outline: 0;
}
.select2-container--classic .select2-search--inline .select2-search__field {
outline: 0;
-webkit-box-shadow: none;
box-shadow: none;
}
.select2-container--classic .select2-dropdown {
background-color: white;
border: 1px solid transparent;
}
.select2-container--classic .select2-dropdown--above {
border-bottom: none;
}
.select2-container--classic .select2-dropdown--below {
border-top: none;
}
.select2-container--classic .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto;
}
.select2-container--classic .select2-results__option[role=group] {
padding: 0;
}
.select2-container--classic .select2-results__option[aria-disabled=true] {
color: grey;
}
.select2-container--classic .select2-results__option--highlighted[aria-selected] {
background-color: #3875d7;
color: white;
}
.select2-container--classic .select2-results__group {
cursor: default;
display: block;
padding: 6px;
}
.select2-container--classic.select2-container--open .select2-dropdown {
border-color: #5897fb;
}

34
public/js/app.js

@ -45,6 +45,39 @@ $.when( $.ready ).then(function() {
} }
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
$('#appimage img').attr('src', e.target.result);
}
reader.readAsDataURL(input.files[0]);
}
}
$("#upload").change(function() {
readURL(this);
});
/*$(".droppable").droppable({
tolerance: "intersect",
drop: function( event, ui ) {
var tag = $( this ).data('id');
var item = $( ui.draggable ).data('id');
$.get('tag/add/'+tag+'/'+item, function(data) {
if(data == 1) {
$( ui.draggable ).remove();
} else {
alert('not added');
}
});
}
});*/
$( "#sortable" ).sortable({ $( "#sortable" ).sortable({
stop: function (event, ui) { stop: function (event, ui) {
var idsInOrder = $("#sortable").sortable('toArray', { var idsInOrder = $("#sortable").sortable('toArray', {
@ -60,6 +93,7 @@ $.when( $.ready ).then(function() {
$("#sortable").sortable("disable"); $("#sortable").sortable("disable");
$('#app').on('click', '#config-button', function(e) { $('#app').on('click', '#config-button', function(e) {
e.preventDefault(); e.preventDefault();
var app = $('#app'); var app = $('#app');

1
public/js/select2.min.js

File diff suppressed because one or more lines are too long

4
public/mix-manifest.json

@ -1,4 +1,4 @@
{ {
"/css/app.css": "/css/app.css?id=a571eeda02c71a01f251", "/css/app.css": "/css/app.css?id=353c513dd97a5fa0607d",
"/js/app.js": "/js/app.js?id=b38be2e595ece6fcef81" "/js/app.js": "/js/app.js?id=24ea5e5c1fbea3461a14"
} }

17
readme.md

@ -1,5 +1,14 @@
![alt text](https://i.imgur.com/iuV8w3y.png) ![alt text](https://i.imgur.com/iuV8w3y.png)
____
[![Discord](https://img.shields.io/discord/354974912613449730.svg)](https://discord.gg/CCjHKn4)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/heimdall.svg)](https://hub.docker.com/r/linuxserver/heimdall/)
[![firsttimersonly](http://img.shields.io/badge/first--timers--only-friendly-blue.svg?style=flat-square)](http://www.firsttimersonly.com/)
[![Paypal](https://heimdall.site/img/paypaldonate.svg)](https://paypal.me/pools/c/81ZR4dfBGo)
___
## About ## About
As the name suggests Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like. As the name suggests Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like.
@ -121,6 +130,14 @@ location / {
} }
``` ```
## Support
https://discord.gg/CCjHKn4 or through Github issues
## Donate
If you would like to show your appreciation, feel free to use the link below.
[![Paypal](https://heimdall.site/img/paypaldonate.svg)](https://paypal.me/pools/c/81ZR4dfBGo)
## Credits ## Credits
- PHP Framework - [Laravel](https://laravel.com/) - PHP Framework - [Laravel](https://laravel.com/)
- Icons - [FonteAwesome 5](https://fontawesome.com/) - Icons - [FonteAwesome 5](https://fontawesome.com/)

34
resources/assets/js/app.js

@ -36,6 +36,39 @@ $.when( $.ready ).then(function() {
} }
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
$('#appimage img').attr('src', e.target.result);
}
reader.readAsDataURL(input.files[0]);
}
}
$("#upload").change(function() {
readURL(this);
});
/*$(".droppable").droppable({
tolerance: "intersect",
drop: function( event, ui ) {
var tag = $( this ).data('id');
var item = $( ui.draggable ).data('id');
$.get('tag/add/'+tag+'/'+item, function(data) {
if(data == 1) {
$( ui.draggable ).remove();
} else {
alert('not added');
}
});
}
});*/
$( "#sortable" ).sortable({ $( "#sortable" ).sortable({
stop: function (event, ui) { stop: function (event, ui) {
var idsInOrder = $("#sortable").sortable('toArray', { var idsInOrder = $("#sortable").sortable('toArray', {
@ -51,6 +84,7 @@ $.when( $.ready ).then(function() {
$("#sortable").sortable("disable"); $("#sortable").sortable("disable");
$('#app').on('click', '#config-button', function(e) { $('#app').on('click', '#config-button', function(e) {
e.preventDefault(); e.preventDefault();
var app = $('#app'); var app = $('#app');

486
resources/assets/sass/_select2.scss

@ -0,0 +1,486 @@
.select2-container {
box-sizing: border-box;
display: inline-block;
margin: 0;
position: relative;
vertical-align: middle; }
.select2-container .select2-selection--single {
box-sizing: border-box;
cursor: pointer;
display: block;
height: 28px;
user-select: none;
-webkit-user-select: none; }
.select2-container .select2-selection--single .select2-selection__rendered {
display: block;
padding-left: 8px;
padding-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
.select2-container .select2-selection--single .select2-selection__clear {
position: relative; }
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 8px;
padding-left: 20px; }
.select2-container .select2-selection--multiple {
box-sizing: border-box;
cursor: pointer;
display: block;
min-height: 39px;
user-select: none;
-webkit-user-select: none; }
.select2-container .select2-selection--multiple .select2-selection__rendered {
display: inline-block;
overflow: hidden;
padding-left: 8px;
text-overflow: ellipsis;
white-space: nowrap; }
.select2-container .select2-search--inline {
float: left; }
.select2-container .select2-search--inline .select2-search__field {
box-sizing: border-box;
border: none;
font-size: 100%;
margin-top: 5px;
padding: 0; }
.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none; }
.select2-dropdown {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
box-sizing: border-box;
display: block;
position: absolute;
left: -100000px;
width: 100%;
z-index: 1051; }
.select2-results {
display: block; }
.select2-results__options {
list-style: none;
margin: 0;
padding: 0; }
.select2-results__option {
padding: 6px;
user-select: none;
-webkit-user-select: none; }
.select2-results__option[aria-selected] {
cursor: pointer; }
.select2-container--open .select2-dropdown {
left: 0; }
.select2-container--open .select2-dropdown--above {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--open .select2-dropdown--below {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-search--dropdown {
display: block;
padding: 4px; }
.select2-search--dropdown .select2-search__field {
padding: 4px;
width: 100%;
box-sizing: border-box; }
.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none; }
.select2-search--dropdown.select2-search--hide {
display: none; }
.select2-close-mask {
border: 0;
margin: 0;
padding: 0;
display: block;
position: fixed;
left: 0;
top: 0;
min-height: 100%;
min-width: 100%;
height: auto;
width: auto;
opacity: 0;
z-index: 99;
background-color: #fff;
filter: alpha(opacity=0); }
.select2-hidden-accessible {
border: 0 !important;
clip: rect(0 0 0 0) !important;
-webkit-clip-path: inset(50%) !important;
clip-path: inset(50%) !important;
height: 1px !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
width: 1px !important;
white-space: nowrap !important; }
.select2-container--default .select2-selection--single {
background-color: #fff;
border: 1px solid #aaa;
border-radius: 4px; }
.select2-container--default .select2-selection--single .select2-selection__rendered {
color: #444;
line-height: 28px; }
.select2-container--default .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold; }
.select2-container--default .select2-selection--single .select2-selection__placeholder {
color: #999; }
.select2-container--default .select2-selection--single .select2-selection__arrow {
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px; }
.select2-container--default .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0; }
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left; }
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
left: 1px;
right: auto; }
.select2-container--default.select2-container--disabled .select2-selection--single {
background-color: #eee;
cursor: default; }
.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
display: none; }
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px; }
.select2-container--default .select2-selection--multiple {
background-color: white;
border: 1px solid #dedfe2;
border-radius: 4px;
cursor: text; }
.select2-container--default .select2-selection--multiple .select2-selection__rendered {
box-sizing: border-box;
list-style: none;
margin: 0;
padding: 0 5px;
width: 100%; }
.select2-container--default .select2-selection--multiple .select2-selection__rendered li {
list-style: none; }
.select2-container--default .select2-selection--multiple .select2-selection__placeholder {
color: #999;
margin-top: 5px;
float: left; }
.select2-container--default .select2-selection--multiple .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
margin-top: 5px;
margin-right: 10px; }
.select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #f2f3f6;
border: 1px solid #dedfe2;
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
font-size: 13px;
font-weight: 300;
margin-top: 5px;
padding: 5px; }
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
color: #999;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px; }
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #333; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
float: right; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
margin-left: 5px;
margin-right: auto; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto; }
.select2-container--default.select2-container--focus .select2-selection--multiple {
border: solid #dedfe2 1px;
outline: 0; }
.select2-container--default.select2-container--disabled .select2-selection--multiple {
background-color: #eee;
cursor: default; }
.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
display: none; }
.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--default .select2-search--dropdown .select2-search__field {
border: 1px solid #aaa; }
.select2-container--default .select2-search--inline .select2-search__field {
background: transparent;
border: none;
outline: 0;
box-shadow: none;
-webkit-appearance: textfield; }
.select2-container--default .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto; }
.select2-container--default .select2-results__option[role=group] {
padding: 0; }
.select2-container--default .select2-results__option[aria-disabled=true] {
color: #999; }
.select2-container--default .select2-results__option[aria-selected=true] {
background-color: #ddd; }
.select2-container--default .select2-results__option .select2-results__option {
padding-left: 1em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__group {
padding-left: 0; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option {
margin-left: -1em;
padding-left: 2em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -2em;
padding-left: 3em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -3em;
padding-left: 4em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -4em;
padding-left: 5em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -5em;
padding-left: 6em; }
.select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #5897fb;
color: white; }
.select2-container--default .select2-results__group {
cursor: default;
display: block;
padding: 6px; }
.select2-container--classic .select2-selection--single {
background-color: #f7f7f7;
border: 1px solid #aaa;
border-radius: 4px;
outline: 0;
background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
.select2-container--classic .select2-selection--single:focus {
border: 1px solid #5897fb; }
.select2-container--classic .select2-selection--single .select2-selection__rendered {
color: #444;
line-height: 28px; }
.select2-container--classic .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
margin-right: 10px; }
.select2-container--classic .select2-selection--single .select2-selection__placeholder {
color: #999; }
.select2-container--classic .select2-selection--single .select2-selection__arrow {
background-color: #ddd;
border: none;
border-left: 1px solid #aaa;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px;
background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
.select2-container--classic .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0; }
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left; }
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
border: none;
border-right: 1px solid #aaa;
border-radius: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
left: 1px;
right: auto; }
.select2-container--classic.select2-container--open .select2-selection--single {
border: 1px solid #5897fb; }
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
background: transparent;
border: none; }
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px; }
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
.select2-container--classic .select2-selection--multiple {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
cursor: text;
outline: 0; }
.select2-container--classic .select2-selection--multiple:focus {
border: 1px solid #5897fb; }
.select2-container--classic .select2-selection--multiple .select2-selection__rendered {
list-style: none;
margin: 0;
padding: 0 5px; }
.select2-container--classic .select2-selection--multiple .select2-selection__clear {
display: none; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice {
background-color: #e4e4e4;
border: 1px solid #aaa;
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
margin-top: 5px;
padding: 0 5px; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
color: #888;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #555; }
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
float: right;
margin-left: 5px;
margin-right: auto; }
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto; }
.select2-container--classic.select2-container--open .select2-selection--multiple {
border: 1px solid #5897fb; }
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--classic .select2-search--dropdown .select2-search__field {
border: 1px solid #aaa;
outline: 0; }
.select2-container--classic .select2-search--inline .select2-search__field {
outline: 0;
box-shadow: none; }
.select2-container--classic .select2-dropdown {
background-color: white;
border: 1px solid transparent; }
.select2-container--classic .select2-dropdown--above {
border-bottom: none; }
.select2-container--classic .select2-dropdown--below {
border-top: none; }
.select2-container--classic .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto; }
.select2-container--classic .select2-results__option[role=group] {
padding: 0; }
.select2-container--classic .select2-results__option[aria-disabled=true] {
color: grey; }
.select2-container--classic .select2-results__option--highlighted[aria-selected] {
background-color: #3875d7;
color: white; }
.select2-container--classic .select2-results__group {
cursor: default;
display: block;
padding: 6px; }
.select2-container--classic.select2-container--open .select2-dropdown {
border-color: #5897fb; }

3
resources/assets/sass/app.scss

@ -17,3 +17,6 @@
// fontawesome // fontawesome
@import "fontawesome/fontawesome"; @import "fontawesome/fontawesome";
@import "fontawesome/fa-solid"; @import "fontawesome/fa-solid";
@import "select2";

9
resources/lang/en/app.php

@ -61,6 +61,10 @@ return [
'apps.config' => 'Config', 'apps.config' => 'Config',
'apps.apikey' => 'Api Key', 'apps.apikey' => 'Api Key',
'apps.enable' => 'Enable', 'apps.enable' => 'Enable',
'apps.tag_list' => 'Tags list',
'apps.add_tag' => 'Add tag',
'apps.tag_name' => 'Tag name',
'apps.tags' => 'Tags',
'url' => 'Url', 'url' => 'Url',
'title' => 'Title', 'title' => 'Title',
@ -73,6 +77,11 @@ return [
'alert.success.item_deleted' => 'Item deleted successfully', 'alert.success.item_deleted' => 'Item deleted successfully',
'alert.success.item_restored' => 'Item restored successfully', 'alert.success.item_restored' => 'Item restored successfully',
'alert.success.tag_created' => 'Tag created successfully',
'alert.success.tag_updated' => 'Tag updated successfully',
'alert.success.tag_deleted' => 'Tag deleted successfully',
'alert.success.tag_restored' => 'Tag restored successfully',
'alert.success.setting_updated' => 'You have successfully edited this Setting', 'alert.success.setting_updated' => 'You have successfully edited this Setting',
'alert.error.not_exist' => 'This Setting does not exist.', 'alert.error.not_exist' => 'This Setting does not exist.',

26
resources/lang/fi/app.php

@ -5,11 +5,11 @@ return array (
'settings.appearance' => 'Ulkonäkö', 'settings.appearance' => 'Ulkonäkö',
'settings.miscellaneous' => 'Sekalainen', 'settings.miscellaneous' => 'Sekalainen',
'settings.version' => 'Versio', 'settings.version' => 'Versio',
'settings.background_image' => 'Tausta Kuva', 'settings.background_image' => 'Taustakuva',
'settings.homepage_search' => 'Kotisivu Haku', 'settings.homepage_search' => 'Kotisivu Haku',
'settings.search_provider' => 'Hakupalvelu', 'settings.search_provider' => 'Hakupalvelu',
'settings.language' => 'Kieli', 'settings.language' => 'Kieli',
'settings.reset' => 'Palauta takaisin default', 'settings.reset' => 'Palauta oletusasetukset',
'settings.remove' => 'Poista', 'settings.remove' => 'Poista',
'settings.search' => 'haku', 'settings.search' => 'haku',
'settings.no_items' => 'Kohteita ei löytynyt', 'settings.no_items' => 'Kohteita ei löytynyt',
@ -17,7 +17,7 @@ return array (
'settings.value' => 'Arvo', 'settings.value' => 'Arvo',
'settings.edit' => 'Muokkaa', 'settings.edit' => 'Muokkaa',
'settings.view' => 'Näkymä', 'settings.view' => 'Näkymä',
'options.none' => '- ole asetettu -', 'options.none' => '- ei asetettu -',
'options.google' => 'Google', 'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo', 'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing', 'options.bing' => 'Bing',
@ -27,32 +27,32 @@ return array (
'buttons.cancel' => 'Peruuta', 'buttons.cancel' => 'Peruuta',
'buttons.add' => 'Lisää', 'buttons.add' => 'Lisää',
'buttons.upload' => 'Lataa tiedosto', 'buttons.upload' => 'Lataa tiedosto',
'dash.pin_item' => 'Kiinnitä kohde kojelautaan', 'dash.pin_item' => 'Kiinnitä kohde hallintapaneliin',
'dash.no_apps' => 'Tällä hetkellä ei ole kiinnitettyjä sovelluksia :link1 tai :link2', 'dash.no_apps' => 'Tällä hetkellä ei ole kiinnitettyjä sovelluksia :link1 tai :link2',
'dash.link1' => 'Lisää sovellus tähän', 'dash.link1' => 'Lisää sovellus tähän',
'dash.link2' => 'Kiinnitä kohde kojelautaan', 'dash.link2' => 'Kiinnitä kohde hallintapaneliin',
'dash.pinned_items' => 'Kiinnitetyt Kohteet', 'dash.pinned_items' => 'Kiinnitetyt Kohteet',
'apps.app_list' => 'Sovellus luettelosta', 'apps.app_list' => 'Sovellusluettelo',
'apps.view_trash' => 'Näytä roskakori', 'apps.view_trash' => 'Näytä roskakori',
'apps.add_application' => 'Lisää sovellus', 'apps.add_application' => 'Lisää sovellus',
'apps.application_name' => 'Sovelluksen nimi', 'apps.application_name' => 'Sovelluksen nimi',
'apps.colour' => 'Väri', 'apps.colour' => 'Väri',
'apps.icon' => 'Kuvake', 'apps.icon' => 'Kuvake',
'apps.pinned' => 'Puristuksiin', 'apps.pinned' => 'Kiinnitetty',
'apps.title' => 'Otsikko', 'apps.title' => 'Otsikko',
'apps.hex' => 'Hex väri', 'apps.hex' => 'Hex väri',
'apps.username' => 'Käyttäjätunnus', 'apps.username' => 'Käyttäjätunnus',
'apps.password' => 'Salasana', 'apps.password' => 'Salasana',
'apps.config' => 'Config', 'apps.config' => 'Konfiguraatio',
'url' => 'Url', 'url' => 'Url',
'title' => 'Otsikko', 'title' => 'Otsikko',
'delete' => 'Poistaa', 'delete' => 'Poistaa',
'optional' => 'Valinnainen', 'optional' => 'Valinnainen',
'restore' => 'Palauttaa', 'restore' => 'Palauta',
'alert.success.item_created' => 'Tuote luotiin onnistuneesti', 'alert.success.item_created' => 'Kohde luotu onnistuneesti',
'alert.success.item_updated' => 'Kohde on päivitetty onnistuneesti', 'alert.success.item_updated' => 'Kohde päivitetty onnistuneesti',
'alert.success.item_deleted' => 'Kohde poistettu onnistuneesti', 'alert.success.item_deleted' => 'Kohde poistettu onnistuneesti',
'alert.success.item_restored' => 'Tuote palautettiin onnistuneesti', 'alert.success.item_restored' => 'Kohde palautettu onnistuneesti',
'alert.success.setting_updated' => 'Olet muokannut tätä asetusta', 'alert.success.setting_updated' => 'Asetus muokattu onnistuneesti',
'alert.error.not_exist' => 'Tätä asetusta ei ole olemassa.', 'alert.error.not_exist' => 'Tätä asetusta ei ole olemassa.',
); );

80
resources/lang/it/app.php

@ -0,0 +1,80 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| App Language Lines
|--------------------------------------------------------------------------
|
*/
'settings.system' => 'Sistema',
'settings.appearance' => 'Aspetto',
'settings.miscellaneous' => 'Miscellaneous',
'settings.version' => 'Versione',
'settings.background_image' => 'Immagine di sfondo',
'settings.homepage_search' => 'Ricerca in homepage',
'settings.search_provider' => 'Motore di ricerca',
'settings.language' => 'Lingua',
'settings.reset' => 'Ripristina le impostazioni di default',
'settings.remove' => 'Rimuovi',
'settings.search' => 'Cerca',
'settings.no_items' => 'Nessun elemento trovato',
'settings.label' => 'Etichetta',
'settings.value' => 'Valore',
'settings.edit' => 'Modifica',
'settings.view' => 'Vista',
'options.none' => '- non impostato -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.yes' => 'Si',
'options.no' => 'No',
'buttons.save' => 'Salva',
'buttons.cancel' => 'Annulla',
'buttons.add' => 'Aggiungi',
'buttons.upload' => 'Aggiungi un file',
'dash.pin_item' => 'Fissa un elemento sulla dashboard',
'dash.no_apps' => 'Non ci sono applicazioni fissate, :link1 o :link2',
'dash.link1' => 'Aggiungi un\'applicazione qui',
'dash.link2' => 'Fissa un elemento alla dashboard',
'dash.pinned_items' => 'Elementi fissati',
'apps.app_list' => 'Lista delle applicazioni',
'apps.view_trash' => 'Guarda il cestino',
'apps.add_application' => 'Aggiungi applicazione',
'apps.application_name' => 'Nome dell\'applicazione',
'apps.colour' => 'Colore',
'apps.icon' => 'Icona',
'apps.pinned' => 'Fissato',
'apps.title' => 'Titolo',
'apps.hex' => 'Colore esadecimale',
'apps.username' => 'Nome utente',
'apps.password' => 'Password',
'apps.config' => 'Configurazione',
'apps.apikey' => 'Api Key',
'apps.enable' => 'Abilitato',
'url' => 'Url',
'title' => 'Titolo',
'delete' => 'Elimina',
'optional' => 'Opzionale',
'restore' => 'Ripristina',
'alert.success.item_created' => 'Elemento creato con successo',
'alert.success.item_updated' => 'Elemento aggiornato con successo',
'alert.success.item_deleted' => 'Elemento cancellato con successo',
'alert.success.item_restored' => 'Elemento ripristinato con successo',
'alert.success.setting_updated' => 'Hai modificato questi settaggi',
'alert.error.not_exist' => 'Questi settaggi non esistono.',
];

80
resources/lang/pl/app.php

@ -0,0 +1,80 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| App Language Lines
|--------------------------------------------------------------------------
|
*/
'settings.system' => 'System',
'settings.appearance' => 'Wygląd',
'settings.miscellaneous' => 'Różne',
'settings.version' => 'Wersja',
'settings.background_image' => 'Tapeta Pulpitu',
'settings.homepage_search' => 'Strona Domowa Wyszukiwanie',
'settings.search_provider' => 'Operator Wyszukiwania',
'settings.language' => 'Język',
'settings.reset' => 'Przywróć ustawienia domyślne',
'settings.remove' => 'Usuń',
'settings.search' => 'szukaj',
'settings.no_items' => 'Nic nie znaleziono',
'settings.label' => 'Etykieta',
'settings.value' => 'Wartość',
'settings.edit' => 'Edytuj',
'settings.view' => 'Widok',
'options.none' => '- not set -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.yes' => 'Tak',
'options.no' => 'Nie',
'buttons.save' => 'Zapisz',
'buttons.cancel' => 'Anuluj',
'buttons.add' => 'Dodaj',
'buttons.upload' => 'Prześlij plik',
'dash.pin_item' => 'Przypnij element do pulpitu',
'dash.no_apps' => 'Obecnie nie ma przypiętych aplikacji, :link1 or :link2',
'dash.link1' => 'Dodaj aplikację tutaj',
'dash.link2' => 'Przypnij element do pulpitu',
'dash.pinned_items' => 'Przypięte elementy',
'apps.app_list' => 'Lista aplikacji',
'apps.view_trash' => 'Widok kosza',
'apps.add_application' => 'Dodaj Aplikacje',
'apps.application_name' => 'Nazwa Aplikacji',
'apps.colour' => 'Kolor',
'apps.icon' => 'Ikona',
'apps.pinned' => 'Przypięty',
'apps.title' => 'Tytuł',
'apps.hex' => 'Kolor HEX',
'apps.username' => 'Nazwa Użytkownika',
'apps.password' => 'Hasło',
'apps.config' => 'Ustawienia',
'apps.apikey' => 'Klucz API',
'apps.enable' => 'Włącz',
'url' => 'URL',
'title' => 'Tytuł',
'delete' => 'Usuń',
'optional' => 'Opcjonalny',
'restore' => 'Przywróć',
'alert.success.item_created' => 'Element utworzony',
'alert.success.item_updated' => 'Element zaktualizowany',
'alert.success.item_deleted' => 'Element usunięty',
'alert.success.item_restored' => 'Przywrócono element',
'alert.success.setting_updated' => 'Ustawienie zostało zaktualizowane',
'alert.error.not_exist' => 'Takie ustawienie nie istnieje',
];

19
resources/lang/pl/auth.php

@ -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' => 'Nieprawidłowe dane uwierzytelnienia',
'throttle' => 'Zbyt wiele prób logowania. Spróbuj ponownie za :seconds sekund.',
];

19
resources/lang/pl/pagination.php

@ -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; Poprzedni',
'next' => 'Następny &raquo;',
];

22
resources/lang/pl/passwords.php

@ -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' => 'Hasła muszą mieć co najmniej sześć znaków i być zgodne z potwierdzeniem.',
'reset' => 'Twoje hasło zostało zresetowane!',
'sent' => 'Wysłaliśmy e-mailem link do resetowania hasła!',
'token' => 'Ten token resetowania hasła jest nieprawidłowy',
'user' => 'Nie możemy znaleźć użytkownika z tym adresem e-mail',
];

121
resources/lang/pl/validation.php

@ -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' => ':attribute musi zostać zaakceptowany.',
'active_url' => ':attribute nie jest prawidłowym adresem URL.',
'after' => ':attribute musi być datą następną po :date.',
'after_or_equal' => ':attribute musi być datą następną lub równą dacie :date.',
'alpha' => ':attribute może zawierać tylko litery.',
'alpha_dash' => ':attribute mogą zawierać tylko litery, cyfry i myślniki.',
'alpha_num' => ':attribute może zawierać tylko litery i cyfry.',
'array' => ':attribute musi być tablicą.',
'before' => ':attribute musi być datą wcześniejszą od daty :date.',
'before_or_equal' => ':attribute musi być datą wcześniejszą lub równą dacie :date.',
'between' => [
'numeric' => 'Numer :attribute musi byc większy niż :min oraz mniejszy niż :max.',
'file' => 'Rozmiar pliku :attribute musi byc większy niż :min oraz mniejszy niż :max kilobajtów.',
'string' => 'Tekst :attribute musi posiadać więcej niż :min oraz mniej niż :max znaków.',
'array' => 'Tablica :attribute musi zawierać więcej niż :min oraz mniej niż :max elementów.',
],
'boolean' => ':attribute musi zwracac wartość logiczną TRUE lub FALSE.',
'confirmed' => ':attribute nie jest zgodny z polem potwierdzenia.',
'date' => ':attribute nieprawidłowy format daty.',
'date_format' => 'Format daty :attribute musi byc zgodny z formatem :format.',
'different' => 'Wartości :attribute oraz :other muszą być różne.',
'digits' => 'Wartość :attribute musi być liczbą o długość :digits znaków.',
'digits_between' => 'Wartość :attribute musi być liczbą o długość co najmniej :min oraz nie więcej niz :max digits.',
'dimensions' => ':attribute ma nieprawidłowe wymiary obrazu.',
'distinct' => 'Pole :attribute ma zduplikowaną wartość.',
'email' => ':attribute musi być prawidłowym adresem e-mail.',
'exists' => 'Wybrnay :attribute nie istnieje.',
'file' => ':attribute musi być plikiem.',
'filled' => 'Pole :attribute nie może być puste.',
'image' => ':attribute musi być obrazem.',
'in' => 'Wybrany :attribute jest nieprawidłowy.',
'in_array' => 'Pole :attribute nie istnieje w :other.',
'integer' => ':attribute musi być liczbą całkowitą.',
'ip' => ':attribute musi być prawidłowym adresem IP.',
'ipv4' => ':attribute musi być prawidłowym adresem IPv4.',
'ipv6' => ':attribute musi być prawidłowym adresem IPv6.',
'json' => ':attribute musi być poprawnym łańcuchem JSON.',
'max' => [
'numeric' => ':attribute nie może być większa niż :max.',
'file' => 'Rozmiar :attribute nie może być większy niż :max kilobajtów.',
'string' => ':attribute nie może zawierać więcej niż :max znaków.',
'array' => ':attribute nie może zawierać więcej niż :max elementów.',
],
'mimes' => ':attribute musi być plikiem typu: :values.',
'mimetypes' => ':attribute musi być plikiem typu: :values.',
'min' => [
'numeric' => ':attribute musi wynosić conajmniej :min.',
'file' => 'Rozmiar :attribute musi być rowny lub większy niż :min kilobajtów.',
'string' => ':attribute musi zawierać conajmniej :min znaków.',
'array' => ':attribute musi zawierać conajmniej :min elementów.',
],
'not_in' => ':attribute jest nieprawidłowy.',
'numeric' => ':attribute musi być liczbą.',
'present' => 'Obecność pola :attribute jest obowiązkowa.',
'regex' => 'Format :attribute jest nieprawidłowy.',
'required' => ':attribute jest wymagany.',
'required_if' => 'Pole :attribute jest wymagane gdy :other wynosi :value.',
'required_unless' => 'Pole :attribute jest wymagane, chyba że :other jest zawarte w :values.',
'required_with' => 'Pole :attribute jest wymagane gdy pole :values jest obecne.',
'required_with_all' => 'Pole :attribute jest wymagane gdy :values jest obecne.',
'required_without' => 'Pole :attribute jest wymagane gdy pole :values NIE jest obecne.',
'required_without_all' => 'Pole :attribute jest wymagane gdy żadne z pól :values NIE jest obecne.',
'same' => 'Pole :attribute oraz :other muszą być takie same.',
'size' => [
'numeric' => ':attribute musi wynosić dokladnie :size.',
'file' => 'Rozmiar :attribute musi być równy :size kilobajtów.',
'string' => ':attribute musi składać się dokładnie z :size znaków.',
'array' => ':attribute musi składać się dokładnie z :size elementów.',
],
'string' => ':attribute musi być łańcuchem znaków.',
'timezone' => ':attribute musi być prawidłową strefą czasową.',
'unique' => ':attribute jest już zajety.',
'uploaded' => 'Nie udało się przesłać :attribute.',
'url' => ':attribute ma nieprawidłowy format.',
/*
|--------------------------------------------------------------------------
| 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' => 'dowlona-wiadomosc',
],
],
/*
|--------------------------------------------------------------------------
| 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' => [],
];

30
resources/lang/sv/app.php

@ -7,9 +7,9 @@ return array (
'settings.version' => 'Version', 'settings.version' => 'Version',
'settings.background_image' => 'Bakgrundsbild', 'settings.background_image' => 'Bakgrundsbild',
'settings.homepage_search' => 'Startsida Sök', 'settings.homepage_search' => 'Startsida Sök',
'settings.search_provider' => 'Sök Leverantör', 'settings.search_provider' => 'Sökmotor',
'settings.language' => 'Språk', 'settings.language' => 'Språk',
'settings.reset' => 'Återställ tillbaka till standard', 'settings.reset' => 'Återställ standardinställningar',
'settings.remove' => 'Avlägsna', 'settings.remove' => 'Avlägsna',
'settings.search' => 'sök', 'settings.search' => 'sök',
'settings.no_items' => 'Inga poster hittades', 'settings.no_items' => 'Inga poster hittades',
@ -17,7 +17,7 @@ return array (
'settings.value' => 'Värde', 'settings.value' => 'Värde',
'settings.edit' => 'Ändra', 'settings.edit' => 'Ändra',
'settings.view' => 'Visa', 'settings.view' => 'Visa',
'options.none' => '- inte sätta -', 'options.none' => '- inte valt -',
'options.google' => 'Google', 'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo', 'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing', 'options.bing' => 'Bing',
@ -29,30 +29,30 @@ return array (
'buttons.upload' => 'Ladda upp en fil', 'buttons.upload' => 'Ladda upp en fil',
'dash.pin_item' => 'Pin objekt till instrumentpanelen', 'dash.pin_item' => 'Pin objekt till instrumentpanelen',
'dash.no_apps' => 'Det finns för närvarande inga fästa applikationer, :link1 eller :link2', 'dash.no_apps' => 'Det finns för närvarande inga fästa applikationer, :link1 eller :link2',
'dash.link1' => 'Lägg till en ansökan här', 'dash.link1' => 'Lägg till en applikation här',
'dash.link2' => 'Pin-ett objekt till dash', 'dash.link2' => 'Pin-ett objekt till instrumentpanelen',
'dash.pinned_items' => 'Fasta Objekt', 'dash.pinned_items' => 'Fasta Objekt',
'apps.app_list' => 'Applikationslista', 'apps.app_list' => 'Applikationslista',
'apps.view_trash' => 'Visa papperskorgen', 'apps.view_trash' => 'Visa papperskorgen',
'apps.add_application' => 'Lägg till applikation', 'apps.add_application' => 'Lägg till applikation',
'apps.application_name' => 'Ansökan namn', 'apps.application_name' => 'Applikationens namn',
'apps.colour' => 'Färg', 'apps.colour' => 'Färg',
'apps.icon' => 'Ikonen', 'apps.icon' => 'Ikon',
'apps.pinned' => 'Nålas', 'apps.pinned' => 'Nålas',
'apps.title' => 'Titel', 'apps.title' => 'Titel',
'apps.hex' => 'Hex-färg', 'apps.hex' => 'Hex-färg',
'apps.username' => 'Användarnamn', 'apps.username' => 'Användarnamn',
'apps.password' => 'Lösenord', 'apps.password' => 'Lösenord',
'apps.config' => 'Config', 'apps.config' => 'Konfiguration',
'url' => 'Url', 'url' => 'Url',
'title' => 'Titel', 'title' => 'Titel',
'delete' => 'Radera', 'delete' => 'Radera',
'optional' => 'Frivillig', 'optional' => 'Valfri',
'restore' => 'Återställa', 'restore' => 'Återställ',
'alert.success.item_created' => 'Objekt som skapats', 'alert.success.item_created' => 'Artickeln skapad',
'alert.success.item_updated' => 'Föremålet uppdaterades framgångsrikt', 'alert.success.item_updated' => 'Artickeln uppdaterad',
'alert.success.item_deleted' => 'Objekt som har tagits bort', 'alert.success.item_deleted' => 'Artickeln borttagen',
'alert.success.item_restored' => 'Artikeln återställdes framgångsrikt', 'alert.success.item_restored' => 'Artikeln återställd',
'alert.success.setting_updated' => 'Du har framgångsrikt redigerat denna inställning', 'alert.success.setting_updated' => 'Inställningen uppdaterad',
'alert.error.not_exist' => 'Denna inställning existerar inte.', 'alert.error.not_exist' => 'Denna inställning existerar inte.',
); );

17
resources/views/app.blade.php

@ -37,7 +37,7 @@
<?php <?php
$active = ((bool)$app->pinned === true) ? 'active' : ''; $active = ((bool)$app->pinned === true) ? 'active' : '';
?> ?>
<li>{{ $app->title }}<a class="{{ $active }}" data-id="{{ $app->id }}" href="{{ route('items.pintoggle', $app->id) }}"><i class="fas fa-thumbtack"></i></a></li> <li>{{ $app->title }}<a class="{{ $active }}" data-id="{{ $app->id }}" href="{{ route('items.pintoggle', [$app->id], false) }}"><i class="fas fa-thumbtack"></i></a></li>
@endforeach @endforeach
</ul> </ul>
@ -46,8 +46,8 @@
<div class="content"> <div class="content">
<header class="appheader"> <header class="appheader">
<ul> <ul>
<li><a href="{{ route('dash') }}">Dash</a></li><li> <li><a href="{{ route('dash', [], false) }}">Dash</a></li><li>
<a href="{{ route('items.index') }}">Items</a></li> <a href="{{ route('items.index', [], false) }}">Items</a></li>
</ul> </ul>
</header> </header>
<main> <main>
@ -72,13 +72,14 @@
@yield('content') @yield('content')
<div id="config-buttons"> <div id="config-buttons">
@if(Route::is('dash')) @if(Route::is('dash') || Route::is('tags.show'))
<a id="config-button" class="config" href=""><i class="fas fa-exchange"></i></a> <a id="config-button" class="config" href=""><i class="fas fa-exchange"></i></a>
@endif @endif
<a id="dash" class="config" href="{{ route('dash') }}"><i class="fas fa-th"></i></a> <a id="dash" class="config" href="{{ route('dash', [], false) }}"><i class="fas fa-th"></i></a>
<a id="items" class="config" href="{{ route('items.index') }}"><i class="fas fa-list"></i></a> <a id="items" class="config" href="{{ route('items.index', [], false) }}"><i class="fas fa-list"></i></a>
<a id="settings" class="config" href="{{ route('settings.index') }}"><i class="fas fa-cogs"></i></a> <a id="folder" class="config" href="{{ route('tags.index', [], false) }}"><i class="fas fa-tag"></i></a>
<a id="settings" class="config" href="{{ route('settings.index', [], false) }}"><i class="fas fa-cogs"></i></a>
</div> </div>
</main> </main>
@ -87,7 +88,7 @@
<script src="//ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>!window.jQuery && document.write('<script src="/js/jquery-3.3.1.min.js"><\/script>')</script> <script>!window.jQuery && document.write('<script src="/js/jquery-3.3.1.min.js"><\/script>')</script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="{{ asset('js/app.js') }}"></script> <script src="/js/app.js"></script>
@yield('scripts') @yield('scripts')
</body> </body>

10
resources/views/item.blade.php

@ -1,9 +1,9 @@
<section class="item-container" data-id="{{ $app->id }}"> <section class="item-container{{ $app->droppable }}" data-id="{{ $app->id }}">
<div class="item" style="background-color: {{ $app->colour }}"> <div class="item" style="background-color: {{ $app->colour }}">
@if($app->icon) @if($app->icon)
<img class="app-icon" src="{{ asset('storage/'.$app->icon) }}" /> <img class="app-icon" src="/storage/{{ $app->icon }}" />
@else @else
<img class="app-icon" src="{{ asset('img/heimdall-icon-small.png') }}" /> <img class="app-icon" src="/img/heimdall-icon-small.png" />
@endif @endif
<div class="details"> <div class="details">
<div class="title">{{ $app->title }}</div> <div class="title">{{ $app->title }}</div>
@ -11,8 +11,8 @@
<div data-id="{{ $app->id }}" data-dataonly="{{ $app->config->dataonly or '0' }}" class="livestats-container"></div> <div data-id="{{ $app->id }}" data-dataonly="{{ $app->config->dataonly or '0' }}" class="livestats-container"></div>
@endif @endif
</div> </div>
<a class="link" href="{{ $app->url }}"><i class="fas fa-arrow-alt-to-right"></i></a> <a class="link"{{ $app->link_target }} href="{{ $app->link }}"><i class="fas {{ $app->link_icon }}"></i></a>
</div> </div>
<a class="item-edit" href="{{ route('items.edit', $app->id) }}"><i class="fas fa-pencil"></i></a> <a class="item-edit" href="{{ route($app->link_type.'.edit', [ $app->id ], false) }}"><i class="fas fa-pencil"></i></a>
</section> </section>

20
resources/views/items/form.blade.php

@ -3,7 +3,7 @@
<div class="section-title">{{ __('app.apps.add_application') }}</div> <div class="section-title">{{ __('app.apps.add_application') }}</div>
<div class="module-actions"> <div class="module-actions">
<button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button> <button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button>
<a href="{{ route('items.index') }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a> <a href="{{ route('items.index', [], false) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div> </div>
</header> </header>
<div id="create" class="create"> <div id="create" class="create">
@ -15,10 +15,6 @@
<hr /> <hr />
<label>{{ strtoupper(__('app.url')) }}</label> <label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('url', null, array('placeholder' => __('app.url'), 'id' => 'appurl', 'class' => 'form-control')) !!} {!! Form::text('url', null, array('placeholder' => __('app.url'), 'id' => 'appurl', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.colour') }} *</label>
{!! Form::text('colour', null, array('placeholder' => __('app.apps.hex'),'class' => 'form-control color-picker')) !!}
<hr /> <hr />
<label>{{ __('app.apps.pinned') }}</label> <label>{{ __('app.apps.pinned') }}</label>
{!! Form::hidden('pinned', '0') !!} {!! Form::hidden('pinned', '0') !!}
@ -31,6 +27,14 @@
<input type="checkbox" name="pinned" value="1"<?php echo $set_checked;?> /> <input type="checkbox" name="pinned" value="1"<?php echo $set_checked;?> />
<span class="slider round"></span> <span class="slider round"></span>
</label> </label>
</div>
<div class="input">
<label>{{ __('app.apps.colour') }} *</label>
{!! Form::text('colour', null, array('placeholder' => __('app.apps.hex'),'class' => 'form-control color-picker')) !!}
<hr />
<label>{{ __('app.apps.tags') }} ({{ __('app.optional') }})</label>
{!! Form::select('tags', $tags, $current_tags, ['class' => 'tags', 'multiple']) !!}
</div> </div>
<div class="input"> <div class="input">
<label>{{ __('app.apps.icon') }}</label> <label>{{ __('app.apps.icon') }}</label>
@ -43,11 +47,13 @@
?> ?>
<img src="{{ asset('storage/'.$icon) }}" /> <img src="{{ asset('storage/'.$icon) }}" />
{!! Form::hidden('icon', $icon, ['class' => 'form-control']) !!} {!! Form::hidden('icon', $icon, ['class' => 'form-control']) !!}
@else
<img src="/img/heimdall-icon-small.png" />
@endif @endif
</div> </div>
<div class="upload-btn-wrapper"> <div class="upload-btn-wrapper">
<button class="btn">{{ __('app.buttons.upload')}} </button> <button class="btn">{{ __('app.buttons.upload')}} </button>
<input type="file" name="file" /> <input type="file" id="upload" name="file" />
</div> </div>
</div> </div>
</div> </div>
@ -67,7 +73,7 @@
<div class="section-title">&nbsp;</div> <div class="section-title">&nbsp;</div>
<div class="module-actions"> <div class="module-actions">
<button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button> <button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button>
<a href="{{ route('items.index') }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a> <a href="{{ route('items.index', [], false) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div> </div>
</footer> </footer>

9
resources/views/items/list.blade.php

@ -6,12 +6,13 @@
<div class="section-title"> <div class="section-title">
{{ __('app.apps.app_list') }} {{ __('app.apps.app_list') }}
@if( isset($trash) && $trash->count() > 0 ) @if( isset($trash) && $trash->count() > 0 )
<a class="trashed" href="{{ route('items.index', ['trash' => true]) }}">{{ __('app.apps.view_trash') }} ({{ $trash->count() }})</a> <a class="trashed" href="{{ route('items.index', ['trash' => true], false) }}">{{ __('app.apps.view_trash') }} ({{ $trash->count() }})</a>
@endif @endif
</div> </div>
<div class="module-actions"> <div class="module-actions">
<a href="{{ route('items.create') }}" title="" class="button"><i class="fa fa-plus"></i><span>{{ __('app.buttons.add') }}</span></a> <a href="{{ route('items.create', [], false) }}" title="" class="button"><i class="fa fa-plus"></i><span>{{ __('app.buttons.add') }}</span></a>
<a href="{{ route('dash', [], false) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div> </div>
</header> </header>
@ -29,8 +30,8 @@
@foreach($apps as $app) @foreach($apps as $app)
<tr> <tr>
<td>{{ $app->title }}</td> <td>{{ $app->title }}</td>
<td><a href="{{ $app->url }}">{{ $app->url }}</a></td> <td><a href="{{ $app->url }}">{{ $app->link }}</a></td>
<td class="text-center"><a href="{!! route('items.edit', $app->id) !!}" title="{{ __('app.settings.edit') }} {!! $app->title !!}"><i class="fas fa-edit"></i></a></td> <td class="text-center"><a{{ $app->target }} href="{!! route('items.edit', [$app->id], false) !!}" title="{{ __('app.settings.edit') }} {!! $app->title !!}"><i class="fas fa-edit"></i></a></td>
<td class="text-center"> <td class="text-center">
{!! Form::open(['method' => 'DELETE','route' => ['items.destroy', $app->id],'style'=>'display:inline']) !!} {!! Form::open(['method' => 'DELETE','route' => ['items.destroy', $app->id],'style'=>'display:inline']) !!}
<button class="link" type="submit"><i class="fa fa-trash-alt"></i></button> <button class="link" type="submit"><i class="fa fa-trash-alt"></i></button>

4
resources/views/items/scripts.blade.php

@ -1,3 +1,4 @@
<script src="/js/select2.min.js"></script>
<script> <script>
$( function() { $( function() {
@ -30,5 +31,8 @@
}, "json"); }, "json");
} }
}); });
$('.tags').select2();
}); });
</script> </script>

4
resources/views/items/trash.blade.php

@ -7,7 +7,7 @@
Showing Deleted Applications Showing Deleted Applications
</div> </div>
<div class="module-actions"> <div class="module-actions">
<a href="{{ route('items.index') }}" title="" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a> <a href="{{ route('items.index', [], false) }}" title="" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div> </div>
</header> </header>
@ -26,7 +26,7 @@
<tr> <tr>
<td>{{ $app->title }}</td> <td>{{ $app->title }}</td>
<td>{{ __('app.url') }}</td> <td>{{ __('app.url') }}</td>
<td class="text-center"><a href="{!! route('items.restore', $app->id) !!}" title="{{ __('app.restore') }} {!! $app->title !!}"><i class="fas fa-undo"></i></a></td> <td class="text-center"><a href="{!! route('items.restore', [$app->id], false) !!}" title="{{ __('app.restore') }} {!! $app->title !!}"><i class="fas fa-undo"></i></a></td>
<td class="text-center"> <td class="text-center">
{!! Form::open(['method' => 'DELETE','route' => ['items.destroy', $app->id],'style'=>'display:inline']) !!} {!! Form::open(['method' => 'DELETE','route' => ['items.destroy', $app->id],'style'=>'display:inline']) !!}
<input type="hidden" name="force" value="1" /> <input type="hidden" name="force" value="1" />

4
resources/views/settings/form.blade.php

@ -3,7 +3,7 @@
<div class="section-title">{{ __($setting->label) }}</div> <div class="section-title">{{ __($setting->label) }}</div>
<div class="module-actions"> <div class="module-actions">
<button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button> <button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button>
<a href="{{ route('settings.index') }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a> <a href="{{ route('settings.index', [], false) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div> </div>
</header> </header>
<div class="create"> <div class="create">
@ -23,7 +23,7 @@
<div class="section-title">&nbsp;</div> <div class="section-title">&nbsp;</div>
<div class="module-actions"> <div class="module-actions">
<button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button> <button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button>
<a href="{{ route('settings.index') }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a> <a href="{{ route('settings.index', [], false) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div> </div>
</footer> </footer>

2
resources/views/settings/list.blade.php

@ -29,7 +29,7 @@
</td> </td>
<td class="text-center"> <td class="text-center">
@if((bool)$setting->system !== true) @if((bool)$setting->system !== true)
<a href="{!! route('settings.edit', ['id' => $setting->id]) !!}" title="{{ __('app.settings.edit') }} {!! $setting->label !!}" class="secondary"><i class="fa fa-pencil"></i></a> <a href="{!! route('settings.edit', ['id' => $setting->id], false) !!}" title="{{ __('app.settings.edit') }} {!! $setting->label !!}" class="secondary"><i class="fa fa-pencil"></i></a>
@endif @endif
</td> </td>
</tr> </tr>

2
resources/views/supportedapps/nzbget.blade.php

@ -7,7 +7,7 @@
</div> </div>
<div class="input"> <div class="input">
<label>{{ __('app.apps.password') }}</label> <label>{{ __('app.apps.password') }}</label>
{!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!} <input type="password" name="config[password]" value="{{ $item->config->password or '' }}" placeholder="{{ __('app.apps.password') }}" class="form-control config-item" data-config="password" />
</div> </div>
<div class="input"> <div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button> <button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>

15
resources/views/supportedapps/proxmox.blade.php

@ -0,0 +1,15 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }})</h2>
<div class="items">
<input type="hidden" data-config="type" class="config-item" name="config[type]" value="\App\SupportedApps\Proxmox" />
<div class="input">
<label>{{ __('app.apps.username') }}</label>
{!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.password') }}</label>
<input type="password" name="config[password]" value="{{ $item->config->password or '' }}" placeholder="{{ __('app.apps.password') }}" class="form-control config-item" data-config="password" />
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

12
resources/views/tags/create.blade.php

@ -0,0 +1,12 @@
@extends('app')
@section('content')
{!! Form::open(array('route' => 'tags.store', 'id' => 'itemform', 'files' => true, 'method'=>'POST')) !!}
@include('tags.form')
{!! Form::close() !!}
@endsection
@section('scripts')
@include('tags.scripts')
@endsection

12
resources/views/tags/edit.blade.php

@ -0,0 +1,12 @@
@extends('app')
@section('content')
{!! Form::model($item, ['method' => 'PATCH', 'id' => 'itemform', 'files' => true, 'route' => ['tags.update', $item->id]]) !!}
@include('tags.form')
{!! Form::close() !!}
@endsection
@section('scripts')
@include('tags.scripts')
@endsection

76
resources/views/tags/form.blade.php

@ -0,0 +1,76 @@
<section class="module-container">
<header>
<div class="section-title">{{ __('app.apps.add_tag') }}</div>
<div class="module-actions">
<button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button>
<a href="{{ route('tags.index', [], false) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div>
</header>
<div id="create" class="create">
{!! csrf_field() !!}
<div class="input">
<label>{{ __('app.apps.tag_name') }} *</label>
{!! Form::text('title', null, array('placeholder' => __('app.apps.title'), 'class' => 'form-control')) !!}
<hr />
<label>{{ __('app.apps.pinned') }}</label>
{!! Form::hidden('pinned', '0') !!}
<label class="switch">
<?php
$checked = false;
if(isset($item->pinned) && (bool)$item->pinned === true) $checked = true;
$set_checked = ($checked) ? ' checked="checked"' : '';
?>
<input type="checkbox" name="pinned" value="1"<?php echo $set_checked;?> />
<span class="slider round"></span>
</label>
</div>
<div class="input">
<label>{{ __('app.apps.colour') }} *</label>
{!! Form::text('colour', null, array('placeholder' => __('app.apps.hex'),'class' => 'form-control color-picker')) !!}
<hr />
</div>
<div class="input">
<label>{{ __('app.apps.icon') }}</label>
<div class="icon-container">
<div id="appimage">
@if(isset($item->icon) && !empty($item->icon) || old('icon'))
<?php
if(isset($item->icon)) $icon = $item->icon;
else $icon = old('icon');
?>
<img src="{{ asset('storage/'.$icon) }}" />
{!! Form::hidden('icon', $icon, ['class' => 'form-control']) !!}
@else
<img src="/img/heimdall-icon-small.png" />
@endif
</div>
<div class="upload-btn-wrapper">
<button class="btn">{{ __('app.buttons.upload')}} </button>
<input type="file" id="upload" name="file" />
</div>
</div>
</div>
@if(isset($item) && isset($item->config->view))
<div id="sapconfig" style="display: block;">
@if(isset($item))
@include('supportedapps.'.$item->config->view)
@endif
</div>
@else
<div id="sapconfig"></div>
@endif
</div>
<footer>
<div class="section-title">&nbsp;</div>
<div class="module-actions">
<button type="submit"class="button"><i class="fa fa-save"></i><span>{{ __('app.buttons.save') }}</span></button>
<a href="{{ route('tags.index', [], false) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div>
</footer>
</section>

56
resources/views/tags/list.blade.php

@ -0,0 +1,56 @@
@extends('app')
@section('content')
<section class="module-container">
<header>
<div class="section-title">
{{ __('app.apps.tag_list') }}
@if( isset($trash) && $trash->count() > 0 )
<a class="trashed" href="{{ route('tags.index', ['trash' => true], false) }}">{{ __('app.apps.view_trash') }} ({{ $trash->count() }})</a>
@endif
</div>
<div class="module-actions">
<a href="{{ route('tags.create', [], false) }}" title="" class="button"><i class="fa fa-plus"></i><span>{{ __('app.buttons.add') }}</span></a>
<a href="{{ route('dash', [], false) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div>
</header>
<table class="table table-hover">
<thead>
<tr>
<th>{{ __('app.title') }}</th>
<th>{{ __('app.url') }}</th>
<th class="text-center" width="100">{{ __('app.settings.edit') }}</th>
<th class="text-center" width="100">{{ __('app.delete') }}</th>
</tr>
</thead>
<tbody>
@if($apps->first())
@foreach($apps as $app)
<tr>
<td>{{ $app->title }}</td>
<td><a{{ $app->target }} href="{{ $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']) !!}
<button class="link" type="submit"><i class="fa fa-trash-alt"></i></button>
{!! Form::close() !!}
</td>
</tr>
@endforeach
@else
<tr>
<td colspan="4" class="form-error text-center">
<strong>{{ __('app.settings.no_items') }}</strong>
</td>
</tr>
@endif
</tbody>
</table>
</section>
@endsection

10
resources/views/tags/scripts.blade.php

@ -0,0 +1,10 @@
<script>
$( function() {
var elem = $('.color-picker')[0];
var hueb = new Huebee( elem, {
// options
});
});
</script>

52
resources/views/tags/trash.blade.php

@ -0,0 +1,52 @@
@extends('app')
@section('content')
<section class="module-container">
<header>
<div class="section-title">
Showing Deleted Applications
</div>
<div class="module-actions">
<a href="{{ route('tags.index', [], false) }}" title="" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
</div>
</header>
<table class="table table-hover">
<thead>
<tr>
<th>{{ __('app.title') }}</th>
<th>Url</th>
<th class="text-center" width="100">{{ __('app.restore') }}</th>
<th class="text-center" width="100">{{ __('app.delete') }}</th>
</tr>
</thead>
<tbody>
@if($trash->first())
@foreach($trash as $app)
<tr>
<td>{{ $app->title }}</td>
<td>{{ __('app.url') }}</td>
<td class="text-center"><a href="{!! route('tags.restore', [ $app->id ], false) !!}" title="{{ __('app.restore') }} {!! $app->title !!}"><i class="fas fa-undo"></i></a></td>
<td class="text-center">
{!! Form::open(['method' => 'DELETE','route' => ['tags.destroy', $app->id],'style'=>'display:inline']) !!}
<input type="hidden" name="force" value="1" />
<button type="submit"><i class="fa fa-trash-alt"></i></button>
{!! Form::close() !!}
</td>
</tr>
@endforeach
@else
<tr>
<td colspan="5" class="form-error text-center">
<strong>{{ __('app.settings.no_items') }}</strong>
</td>
</tr>
@endif
</tbody>
</table>
</section>
@endsection

2
resources/views/welcome.blade.php

@ -10,7 +10,7 @@
<div class="alert alert-danger"> <div class="alert alert-danger">
<p>{!! __('app.dash.no_apps', <p>{!! __('app.dash.no_apps',
[ [
'link1' => '<a href="'.route('items.create').'">'.__('app.dash.link1').'</a>', 'link1' => '<a href="'.route('items.create', [], false).'">'.__('app.dash.link1').'</a>',
'link2' => '<a id="pin-item" href="">'.__('app.dash.link2').'</a>' 'link2' => '<a id="pin-item" href="">'.__('app.dash.link2').'</a>'
]) !!}</p> ]) !!}</p>
</div> </div>

6
routes/web.php

@ -15,7 +15,13 @@ Route::get('/', 'ItemController@dash')->name('dash');
Route::resources([ Route::resources([
'items' => 'ItemController', 'items' => 'ItemController',
'tags' => 'TagController',
]); ]);
Route::get('tag/{slug}', 'TagController@show')->name('tags.show');
Route::get('tag/add/{tag}/{item}', 'TagController@add')->name('tags.add');
Route::get('items/pin/{id}', 'ItemController@pin')->name('items.pin'); Route::get('items/pin/{id}', 'ItemController@pin')->name('items.pin');
Route::get('items/restore/{id}', 'ItemController@restore')->name('items.restore'); Route::get('items/restore/{id}', 'ItemController@restore')->name('items.restore');
Route::get('items/unpin/{id}', 'ItemController@unpin')->name('items.unpin'); Route::get('items/unpin/{id}', 'ItemController@unpin')->name('items.unpin');

BIN
storage/app/public/supportedapps/deluge.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
storage/app/public/supportedapps/graylog.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
storage/app/public/supportedapps/homeassistant.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
storage/app/public/supportedapps/jackett.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
storage/app/public/supportedapps/lidarr.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
storage/app/public/supportedapps/medusa.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
storage/app/public/supportedapps/netdata.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
storage/app/public/supportedapps/nzbhydra.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
storage/app/public/supportedapps/ombi.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
storage/app/public/supportedapps/opnsense.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
storage/app/public/supportedapps/proxmox.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
storage/app/public/supportedapps/radarr.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
storage/app/public/supportedapps/rutorrent.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
storage/app/public/supportedapps/sonarr.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
storage/app/public/supportedapps/tt-rss.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

22
vendor/composer/autoload_classmap.php

@ -15,6 +15,7 @@ return array(
'App\\Http\\Controllers\\Controller' => $baseDir . '/app/Http/Controllers/Controller.php', 'App\\Http\\Controllers\\Controller' => $baseDir . '/app/Http/Controllers/Controller.php',
'App\\Http\\Controllers\\ItemController' => $baseDir . '/app/Http/Controllers/ItemController.php', 'App\\Http\\Controllers\\ItemController' => $baseDir . '/app/Http/Controllers/ItemController.php',
'App\\Http\\Controllers\\SettingsController' => $baseDir . '/app/Http/Controllers/SettingsController.php', 'App\\Http\\Controllers\\SettingsController' => $baseDir . '/app/Http/Controllers/SettingsController.php',
'App\\Http\\Controllers\\TagController' => $baseDir . '/app/Http/Controllers/TagController.php',
'App\\Http\\Kernel' => $baseDir . '/app/Http/Kernel.php', 'App\\Http\\Kernel' => $baseDir . '/app/Http/Kernel.php',
'App\\Http\\Middleware\\EncryptCookies' => $baseDir . '/app/Http/Middleware/EncryptCookies.php', 'App\\Http\\Middleware\\EncryptCookies' => $baseDir . '/app/Http/Middleware/EncryptCookies.php',
'App\\Http\\Middleware\\RedirectIfAuthenticated' => $baseDir . '/app/Http/Middleware/RedirectIfAuthenticated.php', 'App\\Http\\Middleware\\RedirectIfAuthenticated' => $baseDir . '/app/Http/Middleware/RedirectIfAuthenticated.php',
@ -31,14 +32,35 @@ return array(
'App\\SettingGroup' => $baseDir . '/app/SettingGroup.php', 'App\\SettingGroup' => $baseDir . '/app/SettingGroup.php',
'App\\SupportedApps\\Contracts\\Applications' => $baseDir . '/app/SupportedApps/Contracts/Applications.php', 'App\\SupportedApps\\Contracts\\Applications' => $baseDir . '/app/SupportedApps/Contracts/Applications.php',
'App\\SupportedApps\\Contracts\\Livestats' => $baseDir . '/app/SupportedApps/Contracts/Livestats.php', 'App\\SupportedApps\\Contracts\\Livestats' => $baseDir . '/app/SupportedApps/Contracts/Livestats.php',
'App\\SupportedApps\\Deluge' => $baseDir . '/app/SupportedApps/Deluge.php',
'App\\SupportedApps\\Duplicati' => $baseDir . '/app/SupportedApps/Duplicati.php', 'App\\SupportedApps\\Duplicati' => $baseDir . '/app/SupportedApps/Duplicati.php',
'App\\SupportedApps\\Emby' => $baseDir . '/app/SupportedApps/Emby.php', 'App\\SupportedApps\\Emby' => $baseDir . '/app/SupportedApps/Emby.php',
'App\\SupportedApps\\HomeAssistant' => $baseDir . '/app/SupportedApps/HomeAssistant.php',
'App\\SupportedApps\\Jackett' => $baseDir . '/app/SupportedApps/Jackett.php',
'App\\SupportedApps\\Jdownloader' => $baseDir . '/app/SupportedApps/Jdownloader.php',
'App\\SupportedApps\\Lidarr' => $baseDir . '/app/SupportedApps/Lidarr.php',
'App\\SupportedApps\\Mcmyadmin' => $baseDir . '/app/SupportedApps/Mcmyadmin.php',
'App\\SupportedApps\\Medusa' => $baseDir . '/app/SupportedApps/Medusa.php',
'App\\SupportedApps\\Netdata' => $baseDir . '/app/SupportedApps/Netdata.php',
'App\\SupportedApps\\Nextcloud' => $baseDir . '/app/SupportedApps/Nextcloud.php',
'App\\SupportedApps\\Nzbget' => $baseDir . '/app/SupportedApps/Nzbget.php', 'App\\SupportedApps\\Nzbget' => $baseDir . '/app/SupportedApps/Nzbget.php',
'App\\SupportedApps\\Nzbhydra' => $baseDir . '/app/SupportedApps/Nzbhydra.php',
'App\\SupportedApps\\Openhab' => $baseDir . '/app/SupportedApps/Openhab.php',
'App\\SupportedApps\\Opnsense' => $baseDir . '/app/SupportedApps/Opnsense.php',
'App\\SupportedApps\\Pfsense' => $baseDir . '/app/SupportedApps/Pfsense.php', 'App\\SupportedApps\\Pfsense' => $baseDir . '/app/SupportedApps/Pfsense.php',
'App\\SupportedApps\\Pihole' => $baseDir . '/app/SupportedApps/Pihole.php', 'App\\SupportedApps\\Pihole' => $baseDir . '/app/SupportedApps/Pihole.php',
'App\\SupportedApps\\Plex' => $baseDir . '/app/SupportedApps/Plex.php', 'App\\SupportedApps\\Plex' => $baseDir . '/app/SupportedApps/Plex.php',
'App\\SupportedApps\\Plexpy' => $baseDir . '/app/SupportedApps/Plexpy.php',
'App\\SupportedApps\\Plexrequests' => $baseDir . '/app/SupportedApps/Plexrequests.php',
'App\\SupportedApps\\Portainer' => $baseDir . '/app/SupportedApps/Portainer.php', 'App\\SupportedApps\\Portainer' => $baseDir . '/app/SupportedApps/Portainer.php',
'App\\SupportedApps\\Proxmox' => $baseDir . '/app/SupportedApps/Proxmox.php',
'App\\SupportedApps\\Radarr' => $baseDir . '/app/SupportedApps/Radarr.php',
'App\\SupportedApps\\Sabnzbd' => $baseDir . '/app/SupportedApps/Sabnzbd.php',
'App\\SupportedApps\\Sonarr' => $baseDir . '/app/SupportedApps/Sonarr.php',
'App\\SupportedApps\\Traefik' => $baseDir . '/app/SupportedApps/Traefik.php',
'App\\SupportedApps\\Ttrss' => $baseDir . '/app/SupportedApps/Ttrss.php',
'App\\SupportedApps\\Unifi' => $baseDir . '/app/SupportedApps/Unifi.php', 'App\\SupportedApps\\Unifi' => $baseDir . '/app/SupportedApps/Unifi.php',
'App\\SupportedApps\\ruTorrent' => $baseDir . '/app/SupportedApps/ruTorrent.php',
'App\\User' => $baseDir . '/app/User.php', 'App\\User' => $baseDir . '/app/User.php',
'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', 'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', 'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',

22
vendor/composer/autoload_static.php

@ -353,6 +353,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf
'App\\Http\\Controllers\\Controller' => __DIR__ . '/../..' . '/app/Http/Controllers/Controller.php', 'App\\Http\\Controllers\\Controller' => __DIR__ . '/../..' . '/app/Http/Controllers/Controller.php',
'App\\Http\\Controllers\\ItemController' => __DIR__ . '/../..' . '/app/Http/Controllers/ItemController.php', 'App\\Http\\Controllers\\ItemController' => __DIR__ . '/../..' . '/app/Http/Controllers/ItemController.php',
'App\\Http\\Controllers\\SettingsController' => __DIR__ . '/../..' . '/app/Http/Controllers/SettingsController.php', 'App\\Http\\Controllers\\SettingsController' => __DIR__ . '/../..' . '/app/Http/Controllers/SettingsController.php',
'App\\Http\\Controllers\\TagController' => __DIR__ . '/../..' . '/app/Http/Controllers/TagController.php',
'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php', 'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php',
'App\\Http\\Middleware\\EncryptCookies' => __DIR__ . '/../..' . '/app/Http/Middleware/EncryptCookies.php', 'App\\Http\\Middleware\\EncryptCookies' => __DIR__ . '/../..' . '/app/Http/Middleware/EncryptCookies.php',
'App\\Http\\Middleware\\RedirectIfAuthenticated' => __DIR__ . '/../..' . '/app/Http/Middleware/RedirectIfAuthenticated.php', 'App\\Http\\Middleware\\RedirectIfAuthenticated' => __DIR__ . '/../..' . '/app/Http/Middleware/RedirectIfAuthenticated.php',
@ -369,14 +370,35 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf
'App\\SettingGroup' => __DIR__ . '/../..' . '/app/SettingGroup.php', 'App\\SettingGroup' => __DIR__ . '/../..' . '/app/SettingGroup.php',
'App\\SupportedApps\\Contracts\\Applications' => __DIR__ . '/../..' . '/app/SupportedApps/Contracts/Applications.php', 'App\\SupportedApps\\Contracts\\Applications' => __DIR__ . '/../..' . '/app/SupportedApps/Contracts/Applications.php',
'App\\SupportedApps\\Contracts\\Livestats' => __DIR__ . '/../..' . '/app/SupportedApps/Contracts/Livestats.php', 'App\\SupportedApps\\Contracts\\Livestats' => __DIR__ . '/../..' . '/app/SupportedApps/Contracts/Livestats.php',
'App\\SupportedApps\\Deluge' => __DIR__ . '/../..' . '/app/SupportedApps/Deluge.php',
'App\\SupportedApps\\Duplicati' => __DIR__ . '/../..' . '/app/SupportedApps/Duplicati.php', 'App\\SupportedApps\\Duplicati' => __DIR__ . '/../..' . '/app/SupportedApps/Duplicati.php',
'App\\SupportedApps\\Emby' => __DIR__ . '/../..' . '/app/SupportedApps/Emby.php', 'App\\SupportedApps\\Emby' => __DIR__ . '/../..' . '/app/SupportedApps/Emby.php',
'App\\SupportedApps\\HomeAssistant' => __DIR__ . '/../..' . '/app/SupportedApps/HomeAssistant.php',
'App\\SupportedApps\\Jackett' => __DIR__ . '/../..' . '/app/SupportedApps/Jackett.php',
'App\\SupportedApps\\Jdownloader' => __DIR__ . '/../..' . '/app/SupportedApps/Jdownloader.php',
'App\\SupportedApps\\Lidarr' => __DIR__ . '/../..' . '/app/SupportedApps/Lidarr.php',
'App\\SupportedApps\\Mcmyadmin' => __DIR__ . '/../..' . '/app/SupportedApps/Mcmyadmin.php',
'App\\SupportedApps\\Medusa' => __DIR__ . '/../..' . '/app/SupportedApps/Medusa.php',
'App\\SupportedApps\\Netdata' => __DIR__ . '/../..' . '/app/SupportedApps/Netdata.php',
'App\\SupportedApps\\Nextcloud' => __DIR__ . '/../..' . '/app/SupportedApps/Nextcloud.php',
'App\\SupportedApps\\Nzbget' => __DIR__ . '/../..' . '/app/SupportedApps/Nzbget.php', 'App\\SupportedApps\\Nzbget' => __DIR__ . '/../..' . '/app/SupportedApps/Nzbget.php',
'App\\SupportedApps\\Nzbhydra' => __DIR__ . '/../..' . '/app/SupportedApps/Nzbhydra.php',
'App\\SupportedApps\\Openhab' => __DIR__ . '/../..' . '/app/SupportedApps/Openhab.php',
'App\\SupportedApps\\Opnsense' => __DIR__ . '/../..' . '/app/SupportedApps/Opnsense.php',
'App\\SupportedApps\\Pfsense' => __DIR__ . '/../..' . '/app/SupportedApps/Pfsense.php', 'App\\SupportedApps\\Pfsense' => __DIR__ . '/../..' . '/app/SupportedApps/Pfsense.php',
'App\\SupportedApps\\Pihole' => __DIR__ . '/../..' . '/app/SupportedApps/Pihole.php', 'App\\SupportedApps\\Pihole' => __DIR__ . '/../..' . '/app/SupportedApps/Pihole.php',
'App\\SupportedApps\\Plex' => __DIR__ . '/../..' . '/app/SupportedApps/Plex.php', 'App\\SupportedApps\\Plex' => __DIR__ . '/../..' . '/app/SupportedApps/Plex.php',
'App\\SupportedApps\\Plexpy' => __DIR__ . '/../..' . '/app/SupportedApps/Plexpy.php',
'App\\SupportedApps\\Plexrequests' => __DIR__ . '/../..' . '/app/SupportedApps/Plexrequests.php',
'App\\SupportedApps\\Portainer' => __DIR__ . '/../..' . '/app/SupportedApps/Portainer.php', 'App\\SupportedApps\\Portainer' => __DIR__ . '/../..' . '/app/SupportedApps/Portainer.php',
'App\\SupportedApps\\Proxmox' => __DIR__ . '/../..' . '/app/SupportedApps/Proxmox.php',
'App\\SupportedApps\\Radarr' => __DIR__ . '/../..' . '/app/SupportedApps/Radarr.php',
'App\\SupportedApps\\Sabnzbd' => __DIR__ . '/../..' . '/app/SupportedApps/Sabnzbd.php',
'App\\SupportedApps\\Sonarr' => __DIR__ . '/../..' . '/app/SupportedApps/Sonarr.php',
'App\\SupportedApps\\Traefik' => __DIR__ . '/../..' . '/app/SupportedApps/Traefik.php',
'App\\SupportedApps\\Ttrss' => __DIR__ . '/../..' . '/app/SupportedApps/Ttrss.php',
'App\\SupportedApps\\Unifi' => __DIR__ . '/../..' . '/app/SupportedApps/Unifi.php', 'App\\SupportedApps\\Unifi' => __DIR__ . '/../..' . '/app/SupportedApps/Unifi.php',
'App\\SupportedApps\\ruTorrent' => __DIR__ . '/../..' . '/app/SupportedApps/ruTorrent.php',
'App\\User' => __DIR__ . '/../..' . '/app/User.php', 'App\\User' => __DIR__ . '/../..' . '/app/User.php',
'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', 'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', 'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',

4
vendor/laravelcollective/html/src/FormBuilder.php

@ -1055,10 +1055,10 @@ class FormBuilder
protected function getRouteAction($options) protected function getRouteAction($options)
{ {
if (is_array($options)) { if (is_array($options)) {
return $this->url->route($options[0], array_slice($options, 1)); return $this->url->route($options[0], array_slice($options, 1), false);
} }
return $this->url->route($options); return $this->url->route($options, [], false);
} }
/** /**

Loading…
Cancel
Save