Skip to content
This repository was archived by the owner on Mar 26, 2022. It is now read-only.

Commit 01de9ba

Browse files
authored
Issue #79 Fault reporter (#116)
Created fault reporter. Everyone can add new fault, users having role "INTERNET_ADMIN" can change status of faults. (This is for testing purposes, different role should be used later.)
1 parent 58fda70 commit 01de9ba

File tree

11 files changed

+301
-1
lines changed

11 files changed

+301
-1
lines changed

app/FaultsTable.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace App;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
7+
class FaultsTable extends Model
8+
{
9+
const UNSEEN = "UNSEEN";
10+
const SEEN = "SEEN";
11+
const DONE = "DONE";
12+
const WONT_FIX = "WONT_FIX";
13+
const STATES = [self::UNSEEN, self::SEEN, self::DONE, self::WONT_FIX];
14+
15+
static function getState($value) {
16+
return strtoupper($value);
17+
}
18+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\FaultsTable;
6+
use App\Role;
7+
use DB;
8+
use Illuminate\Http\Request;
9+
use Illuminate\Support\Facades\Auth;
10+
11+
class FaultsController extends Controller
12+
{
13+
public function index()
14+
{
15+
return view('faults.app');
16+
}
17+
18+
public function addFault(Request $new)
19+
{
20+
DB::table('faults')->insert(
21+
[
22+
'reporter_id' => Auth::User()->id,
23+
'location' => $new['location'],
24+
'description' => $new['description'],
25+
'status' => FaultsTable::UNSEEN,
26+
'created_at' => date('Y-m-d H:i:s'),
27+
'updated_at' => date('Y-m-d H:i:s')
28+
]
29+
);
30+
31+
return redirect()->route('faults');
32+
}
33+
34+
public function getFaultsTable(Request $request)
35+
{
36+
return json_encode(DB::table('faults')->get());
37+
}
38+
39+
public function updateStatus(Request $new)
40+
{
41+
$auth = Auth::User()->hasRole(Role::INTERNET_ADMIN) || FaultsTable::getState($new['status']) === FaultsTable::UNSEEN;
42+
43+
if ($auth) {
44+
DB::table('faults')->where('id', $new['id'])->update(['status' => FaultsTable::getState($new['status'])]);
45+
}
46+
47+
return var_export($auth);
48+
}
49+
}

config/app.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
|
6868
*/
6969

70-
'timezone' => 'UTC',
70+
'timezone' => 'Europe/Budapest',
7171

7272
/*
7373
|--------------------------------------------------------------------------
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
use App\FaultsTable;
4+
use Illuminate\Database\Migrations\Migration;
5+
use Illuminate\Database\Schema\Blueprint;
6+
use Illuminate\Support\Facades\Schema;
7+
8+
class CreateFaultsTable extends Migration
9+
{
10+
/**
11+
* Run the migrations.
12+
*
13+
* @return void
14+
*/
15+
public function up()
16+
{
17+
Schema::create('faults', function (Blueprint $table) {
18+
$table->bigIncrements('id');
19+
$table->unsignedBigInteger('reporter_id');
20+
$table->string('location');
21+
$table->string('description');
22+
$table->enum('status', FaultsTable::STATES);
23+
$table->timestamps();
24+
});
25+
}
26+
27+
/**
28+
* Reverse the migrations.
29+
*
30+
* @return void
31+
*/
32+
public function down()
33+
{
34+
Schema::dropIfExists('faults');
35+
}
36+
}

public/js/moment.min.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/lang/en/faults.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
return [
4+
"faults" => "Faults",
5+
"created_at" => "Date",
6+
"location" => "Location",
7+
"description" => "Description",
8+
"status" => "Status",
9+
"submit" => "Submit",
10+
"new_fault" => "Report fault",
11+
"cancel" => "Cancel",
12+
"confirm_message" => "Would you like to change the status to the following: ",
13+
"confirm" => "Confirm",
14+
"done" => "Done",
15+
"wont_fix" => "Won't fix",
16+
"unseen" => "Unseen",
17+
"seen" => "Seen",
18+
"reopened" => "Reopened",
19+
"reopen" => "Reopen",
20+
"autherror" => "Error. Could not authenticate user permissions."
21+
];

resources/lang/hu/faults.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
return [
4+
"faults" => "Hibák",
5+
"created_at" => "Létrehozva",
6+
"location" => "Helyszín",
7+
"description" => "Leírás",
8+
"status" => "Állapot",
9+
"submit" => "Küldés",
10+
"new_fault" => "Hiba bejelentése",
11+
"cancel" => "Mégsem",
12+
"confirm_message" => "Biztosan meg akarja változtatni a hiba állapotát a következőre: ",
13+
"confirm" => "Megerősítés",
14+
"done" => "Kész",
15+
"wont_fix" => "Nem megoldandó",
16+
"unseen" => "Nem látta",
17+
"seen" => "Látta",
18+
"reopened" => "Újranyitott",
19+
"reopen" => "Újranyit",
20+
"autherror" => "Hiba. Nem sikerült a felhasználói engedélyek hitelesítése."
21+
];
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
@extends('layouts.app')
2+
3+
@section('content')
4+
<div class="container">
5+
<div class="row justify-content-center">
6+
<div class="card-body">
7+
<div class="card">
8+
<div class="card-header">
9+
@lang('faults.new_fault')
10+
</div>
11+
<div class="card-body">
12+
<form id="send-fault" class="form-horizontal" method="POST" action=" {{ route('faults.add') }} ">
13+
@csrf
14+
<input class="form-control" form="send-fault" name="location" placeholder="@lang('faults.location')"><br>
15+
<textarea class="form-control" form="send-fault" name="description" style="height: 8em" placeholder="@lang('faults.description')"></textarea>
16+
17+
<div class="row" style="margin-top:10px;margin-bottom:10px;">
18+
<div class="col-md-5"></div>
19+
<div class="col-md-2">
20+
<input type="submit" class="form-control btn btn-primary" value="@lang('faults.submit')" />
21+
</div>
22+
<div class="col-md-5"></div>
23+
</div>
24+
</form>
25+
</div>
26+
</div>
27+
@include('faults.list')
28+
</div>
29+
</div>
30+
</div>
31+
@endsection
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<div id="faults-table"></div>
2+
<script src="js/moment.min.js"></script>
3+
<script type="application/javascript">
4+
$(document).ready(function () {
5+
function status_translate(cell) {
6+
if (typeof cell !== "string") {
7+
cell = cell.getValue();
8+
}
9+
const translations = {
10+
{{ App\FaultsTable::UNSEEN }}: "@lang('faults.unseen')",
11+
{{ App\FaultsTable::SEEN }}: "@lang('faults.seen')",
12+
{{ App\FaultsTable::DONE }}: "@lang('faults.done')",
13+
{{ App\FaultsTable::WONT_FIX }}: "@lang('faults.wont_fix')"
14+
};
15+
const colors = {
16+
{{ App\FaultsTable::UNSEEN }}: "text-secondary",
17+
{{ App\FaultsTable::SEEN }}: "text-info",
18+
{{ App\FaultsTable::DONE }}: "text-success",
19+
{{ App\FaultsTable::WONT_FIX }}: "text-danger"
20+
};
21+
return '<div class="font-italic ' + colors[cell] + ' text-right">' + translations[cell] + '</div>';
22+
}
23+
24+
var button = function (cell, formatterParams) {
25+
switch (formatterParams['status']) {
26+
case "{{ App\FaultsTable::DONE }}":
27+
var style = "btn-success";
28+
var text = "@lang('faults.done')";
29+
break;
30+
31+
case "{{ App\FaultsTable::WONT_FIX }}":
32+
var style = "btn-danger";
33+
var text = "@lang('faults.wont_fix')";
34+
break;
35+
36+
case "{{ App\FaultsTable::UNSEEN }}":
37+
var style = "btn-danger";
38+
var text = "@lang('faults.reopen')";
39+
break;
40+
}
41+
42+
return $("<button type=\"button\" class=\"btn btn-sm " + style + " float-left\">" + text + "</button>").click(function () {
43+
var data = cell.getRow().getData();
44+
text = text == "@lang('faults.reopen')" ? "@lang('faults.reopened')" : text;
45+
confirm('@lang('faults.confirm')', '@lang('faults.confirm_message')' + text, '@lang('faults.cancel')', '@lang('faults.confirm')', function() {
46+
$.post("{{ route('faults.update') }}", {id: data.id, status: formatterParams['status']}, function(data){
47+
if (data !== "true"){
48+
alert('@lang('faults.autherror')');
49+
} else {
50+
window.location.reload(true);
51+
}
52+
});
53+
});
54+
})[0];
55+
};
56+
57+
var button_formatter = function (cell, formatterParams, onRendered) {
58+
var status = cell.getRow().getData()["status"];
59+
60+
switch (formatterParams['status']) {
61+
case "{{ App\FaultsTable::DONE }}":
62+
if (status === "{{ App\FaultsTable::SEEN }}" || status === "{{ App\FaultsTable::UNSEEN }}") {
63+
return button(cell, formatterParams);
64+
}
65+
break;
66+
67+
case "{{ App\FaultsTable::WONT_FIX }}":
68+
if (status === "{{ App\FaultsTable::UNSEEN }}") {
69+
onRendered(function () {
70+
$.post("{{ route('faults.update') }}", {id: cell.getValue(), status: "{{ App\FaultsTable::SEEN }}"}, );
71+
});
72+
}
73+
if (status === "{{ App\FaultsTable::SEEN }}" || status === "{{ App\FaultsTable::UNSEEN }}") {
74+
return button(cell, formatterParams);
75+
} else {
76+
return status_translate(status);
77+
}
78+
break;
79+
80+
case "{{ App\FaultsTable::UNSEEN }}":
81+
if (status === "{{ App\FaultsTable::DONE }}" || status === "{{ App\FaultsTable::WONT_FIX }}") {
82+
return button(cell, formatterParams);
83+
}
84+
break;
85+
}
86+
87+
return "";
88+
}
89+
90+
var table = new Tabulator("#faults-table", {
91+
paginationSizeSelector: [10, 25, 50, 100, 250, 500],
92+
paginationSize: 10,
93+
pagination: "local", //enable remote pagination
94+
ajaxURL: "{{ route('faults.table') }}", //set url for ajax request
95+
ajaxFiltering: true,
96+
layout: "fitColumns",
97+
placeholder: "No Data Set",
98+
columns: [
99+
{title: "@lang('faults.created_at')", field: "created_at", sorter: "datetime", sorterParams: {format: "YYYY-MM-DD HH:mm:ss"}, width: 180,
100+
formatter: "datetime", formatterParams: {outputFormat: "YYYY. MM. DD. HH:mm"}},
101+
{title: "@lang('faults.location')", field: "location", sorter: "string", widthGrow: 1, formatter: "textarea"},
102+
{title: "@lang('faults.description')", field: "description", sorter: "string", widthGrow: 4, formatter: "textarea"},
103+
@if(Auth::User()->hasRole(\App\Role::INTERNET_ADMIN))
104+
{title: "", field: "id", headerSort: false, width: 60, formatter: button_formatter, formatterParams: {status: "{{ App\FaultsTable::DONE }}"}},
105+
{title: "", field: "id", headerSort: false, width: 140, formatter: button_formatter, formatterParams: {status: "{{ App\FaultsTable::WONT_FIX }}"}},
106+
@else
107+
{title: "@lang('faults.status')", field: "status", sorter: "string", width: 140, formatter: status_translate},
108+
@endif
109+
{title: "", field: "id", headerSort: false, width: 80, formatter: button_formatter, formatterParams: {status: "{{ App\FaultsTable::UNSEEN }}"}}
110+
],
111+
initialSort: [
112+
{column: "created_at", dir: "desc"}
113+
]
114+
});
115+
});
116+
</script>

resources/views/layouts/navbar/left.blade.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
<li class="nav-item">
1010
<a class="nav-link" href="{{ route('internet') }}">@lang('internet.internet')</a>
1111
</li>
12+
<li class="nav-item">
13+
<a class="nav-link" href="{{ route('faults') }}">@lang('faults.faults')</a>
14+
</li>
1215

1316
@if (Auth::user()->hasRole(\App\Role::INTERNET_ADMIN))
1417
<li class="nav-item dropdown">

0 commit comments

Comments
 (0)