Update Dashboard Layout
This commit is contained in:
@@ -69,5 +69,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"minimum-stability": "stable",
|
"minimum-stability": "stable",
|
||||||
"prefer-stable": true
|
"prefer-stable": true,
|
||||||
|
"repositories": {
|
||||||
|
"grocery-crud": {
|
||||||
|
"type": "composer",
|
||||||
|
"url": "https://composer.grocerycrud.com/"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
846
composer.lock
generated
846
composer.lock
generated
File diff suppressed because it is too large
Load Diff
52
config/laravel-code-generator.php
Normal file
52
config/laravel-code-generator.php
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| CodeGenerator config overrides
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| It is a good idea to separate your configuration form the code-generator's
|
||||||
|
| own configuration. This way you won't lose any settings/preference
|
||||||
|
| you have when upgrading to a new version of the package.
|
||||||
|
|
|
||||||
|
| Additionally, you will always know any the configuration difference between
|
||||||
|
| the default config than your own.
|
||||||
|
|
|
||||||
|
| To override the setting that is found in the 'config/default.php' file, you'll
|
||||||
|
| need to create identical key here with a different value
|
||||||
|
|
|
||||||
|
| IMPORTANT: When overriding an option that is an array, the configurations
|
||||||
|
| are merged together using php's array_merge() function. This means that
|
||||||
|
| any option that you list here will take presence during a conflict in keys.
|
||||||
|
|
|
||||||
|
| EXAMPLE: The following addition to this file, will add another entry in
|
||||||
|
| the common_definitions collection
|
||||||
|
|
|
||||||
|
| 'common_definitions' =>
|
||||||
|
| [
|
||||||
|
| [
|
||||||
|
| 'match' => '*_at',
|
||||||
|
| 'set' => [
|
||||||
|
| 'css-class' => 'datetime-picker',
|
||||||
|
| ],
|
||||||
|
| ],
|
||||||
|
| ],
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| The default path of where the uploaded files live.
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| You can use Laravel Storage filesystem. By default, the code-generator
|
||||||
|
| uses the default file system.
|
||||||
|
| For more info about Laravel's file system visit
|
||||||
|
| https://laravel.com/docs/5.5/filesystem
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
'files_upload_path' => 'uploads',
|
||||||
|
|
||||||
|
];
|
||||||
@@ -408,6 +408,7 @@ class BigData {
|
|||||||
console.error("error fetching chart dara : ", error);
|
console.error("error fetching chart dara : ", error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ArrowConnectorCircles {
|
class ArrowConnectorCircles {
|
||||||
@@ -436,3 +437,33 @@ document.addEventListener("DOMContentLoaded", async function (e) {
|
|||||||
await new BigData().init();
|
await new BigData().init();
|
||||||
// new ArrowConnectorCircles().init();
|
// new ArrowConnectorCircles().init();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function resizeDashboard(){
|
||||||
|
//Target Width
|
||||||
|
let targetElement = document.getElementById("dashboard-fixed-wrapper");
|
||||||
|
let targetWidth = targetElement.offsetWidth;
|
||||||
|
//console.log("TARGET ",targetWidth);
|
||||||
|
|
||||||
|
//Real Object Width
|
||||||
|
let dashboardElement = document.getElementById("dashboard-fixed-container");
|
||||||
|
let dashboardWidth = 1110; //dashboardElement.offsetWidth;
|
||||||
|
//console.log("CURRENT ",dashboardWidth);
|
||||||
|
|
||||||
|
if(targetWidth> dashboardWidth){
|
||||||
|
targetWidth = dashboardWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
dashboardElement.style.transformOrigin = "left top";
|
||||||
|
dashboardElement.style.transition = "transform 0.2s ease-in-out";
|
||||||
|
dashboardElement.style.transform = "scale(" + (targetWidth/dashboardWidth).toFixed(2) + ")";
|
||||||
|
//console.log("SCALE ", (targetWidth/dashboardWidth).toFixed(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("load", function () {
|
||||||
|
resizeDashboard();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener("resize", function () {
|
||||||
|
resizeDashboard();
|
||||||
|
|
||||||
|
});
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||||
|
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||||
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||||
|
use Illuminate\Routing\Controller as BaseController;
|
||||||
|
|
||||||
|
class Controller extends BaseController
|
||||||
|
{
|
||||||
|
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
||||||
|
|
||||||
|
[% response_methods %]
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_deleted %]);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return $this->successResponse(
|
||||||
|
[% model_was_deleted %],
|
||||||
|
$this->transform($[% model_name_singular_variable %])
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_collection_class %]($[% model_name_plural_variable %], [% models_were_retrieved %]);
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
$[% data_variable %] = $[% model_name_plural_variable %]->transform(function ($[% model_name_singular_variable %]) {
|
||||||
|
return $this->transform($[% model_name_singular_variable %]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return $this->successResponse(
|
||||||
|
[% models_were_retrieved %],
|
||||||
|
$[% data_variable %],
|
||||||
|
[
|
||||||
|
'links' => [
|
||||||
|
'first' => $[% model_name_plural_variable %]->url(1),
|
||||||
|
'last' => $[% model_name_plural_variable %]->url($[% model_name_plural_variable %]->lastPage()),
|
||||||
|
'prev' => $[% model_name_plural_variable %]->previousPageUrl(),
|
||||||
|
'next' => $[% model_name_plural_variable %]->nextPageUrl(),
|
||||||
|
],
|
||||||
|
'meta' =>
|
||||||
|
[
|
||||||
|
'current_page' => $[% model_name_plural_variable %]->currentPage(),
|
||||||
|
'from' => $[% model_name_plural_variable %]->firstItem(),
|
||||||
|
'last_page' => $[% model_name_plural_variable %]->lastPage(),
|
||||||
|
'path' => $[% model_name_plural_variable %]->resolveCurrentPath(),
|
||||||
|
'per_page' => $[% model_name_plural_variable %]->perPage(),
|
||||||
|
'to' => $[% model_name_plural_variable %]->lastItem(),
|
||||||
|
'total' => $[% model_name_plural_variable %]->total(),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_retrieved %]);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return $this->successResponse(
|
||||||
|
[% model_was_retrieved %],
|
||||||
|
$this->transform($[% model_name_singular_variable %])
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_added %]);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return $this->successResponse(
|
||||||
|
[% model_was_added %],
|
||||||
|
$this->transform($[% model_name_singular_variable %])
|
||||||
|
);
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_updated %]);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
return $this->successResponse(
|
||||||
|
[% model_was_updated %],
|
||||||
|
$this->transform($[% model_name_singular_variable %])
|
||||||
|
);
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Get an error response
|
||||||
|
*
|
||||||
|
* @param mix $message
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
protected function errorResponse($message)
|
||||||
|
{
|
||||||
|
return response()->json([
|
||||||
|
'errors' => (array) $message,
|
||||||
|
'success' => false,
|
||||||
|
], 422);
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a new validator instance with the defined rules.
|
||||||
|
*
|
||||||
|
* @param [% request_fullname %] $request
|
||||||
|
*
|
||||||
|
* @return Illuminate\Support\Facades\Validator
|
||||||
|
*/
|
||||||
|
protected function getValidator(Request $request)
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
[% validation_rules %]
|
||||||
|
];
|
||||||
|
[% file_validation_snippet %]
|
||||||
|
return Validator::make($request->all(), $rules);
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Get a success response
|
||||||
|
*
|
||||||
|
* @param mix $message
|
||||||
|
* @param mix $data
|
||||||
|
* @param array $meta
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
protected function successResponse($message, $data, array $meta = [])
|
||||||
|
{
|
||||||
|
return response()->json(
|
||||||
|
array_merge([
|
||||||
|
'data' => $data,
|
||||||
|
'message' => $message,
|
||||||
|
'success' => true,
|
||||||
|
], $meta), 200);
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Transform the giving [% model_name %] to public friendly array
|
||||||
|
*
|
||||||
|
* @param [% use_full_model_name %] $[% model_name_singular_variable %]
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function [% transform_method_name %]([% model_name_class %] $[% model_name_singular_variable %])
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[% model_api_array %]
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
$validator = $this->getValidator($request);
|
||||||
|
|
||||||
|
if ($validator->fails()) {
|
||||||
|
return $this->errorResponse($validator->errors()->all());
|
||||||
|
}
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class [% controller_name %] [% controller_extends %]
|
||||||
|
{
|
||||||
|
[% constructor %]
|
||||||
|
/**
|
||||||
|
* Display a listing of the assets.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$[% model_name_plural_variable %] = [% model_name_class %]::[% with_relations_for_index %]paginate([% models_per_page %]);
|
||||||
|
|
||||||
|
[% index_return_success %]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a new [% model_name %] in the storage.
|
||||||
|
*
|
||||||
|
* @param [% request_fullname %] [% request_variable %]
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function store([% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
[% validator_request %]
|
||||||
|
$[% data_variable %] = [% call_get_data %];
|
||||||
|
[% on_store_setter %]
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::create($[% data_variable %]);
|
||||||
|
|
||||||
|
[% store_return_success %]
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
return $this->errorResponse([% unexpected_error %]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified [% model_name %].
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function show($id)
|
||||||
|
{
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::[% with_relations_for_show %]findOrFail($id);
|
||||||
|
|
||||||
|
[% show_return_success %]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified [% model_name %] in the storage.
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
* @param [% request_fullname %] [% request_variable %]
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function update($id, [% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
[% validator_request %]
|
||||||
|
$[% data_variable %] = [% call_get_data %];
|
||||||
|
[% on_update_setter %]
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||||
|
$[% model_name_singular_variable %]->update($[% data_variable %]);
|
||||||
|
|
||||||
|
[% update_return_success %]
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
return $this->errorResponse([% unexpected_error %]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified [% model_name %] from the storage.
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function destroy($id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||||
|
$[% model_name_singular_variable %]->delete();
|
||||||
|
|
||||||
|
[% destroy_return_success %]
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
return $this->errorResponse([% unexpected_error %]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[% get_validator_method %]
|
||||||
|
[% get_data_method %]
|
||||||
|
[% upload_method %]
|
||||||
|
[% transform_method %]
|
||||||
|
[% response_methods %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
|
||||||
|
class [% controller_name %] [% controller_extends %]
|
||||||
|
{
|
||||||
|
[% constructor %]
|
||||||
|
/**
|
||||||
|
* Display the documentation which corresponds to the giving version.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function index($version)
|
||||||
|
{
|
||||||
|
$viewName = sprintf('[% view_access_fullname %]index', $this->getVersion($version));
|
||||||
|
|
||||||
|
return view($viewName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
|
||||||
|
class [% controller_name %] [% controller_extends %]
|
||||||
|
{
|
||||||
|
[% constructor %]
|
||||||
|
/**
|
||||||
|
* Display the documentation's view.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('[% view_access_fullname %]index');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<span class="label label-danger" title="[% this_parameter_must_be_present_in_the_request %]">[% required_title %]</span>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<tr>
|
||||||
|
<td>Authorization</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>
|
||||||
|
<span class="label label-primary" title="[% this_parameter_is_an_http_header %]">[% header_title %]</span>
|
||||||
|
</td>
|
||||||
|
<td>[% access_token_with_bearer %]</td>
|
||||||
|
@if(isset($showValidation) && $showValidation)
|
||||||
|
<td></td>
|
||||||
|
@endif
|
||||||
|
</tr>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<h4 class="text-danger"><strong>401 - Unauthorized</strong></h4>
|
||||||
|
<p class="text-muted">[% the_user_does_not_have_permission_to_access_the_requested_resource %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>error</td>
|
||||||
|
<td>[% array_of_strings %]</td>
|
||||||
|
<td>[% the_error_message %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<h4 class="text-danger"><strong>202 - Accepted</strong></h4>
|
||||||
|
<p class="text-muted">[% the_requested_model_does_not_exists %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>error</td>
|
||||||
|
<td>[% array_of_strings %]</td>
|
||||||
|
<td>[% the_error_message %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<h4 class="text-danger"><strong>422 - Unprocessable Entity</strong></h4>
|
||||||
|
<p class="text-muted">[% the_request_failed_validation %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>errors</td>
|
||||||
|
<td>[% array_of_strings %]</td>
|
||||||
|
<td>[% list_of_the_invalid_errors %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<tr>
|
||||||
|
<td>[% field_name %]</td>
|
||||||
|
<td>[% field_type_title %]</td>
|
||||||
|
<td>[% api_field_description %]</td>
|
||||||
|
</tr>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<tr>
|
||||||
|
<td>[% field_name %]</td>
|
||||||
|
<td>[% field_type_title %]</td>
|
||||||
|
<td><span class="label label-default" title="[% this_parameter_is_part_of_the_body %]">[% body_title %]</span></td>
|
||||||
|
<td>[% api_field_description %]</td>
|
||||||
|
@if($showValidation)
|
||||||
|
<td>
|
||||||
|
[% validation_rule_required %]
|
||||||
|
<span>[% validation_rules %]</span>
|
||||||
|
</td>
|
||||||
|
@endif
|
||||||
|
</tr>
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
$showValidation = (isset($withValidation) && $withValidation) ? true : false;
|
||||||
|
?>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>[% parameter_name_title %]</th>
|
||||||
|
<th>[% data_type_title %]</th>
|
||||||
|
<th>[% parameter_type_title %]</th>
|
||||||
|
<th>[% description_title %]</th>
|
||||||
|
@if($showValidation)
|
||||||
|
<th>[% validation_title %]</th>
|
||||||
|
@endif
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% include_parameter_for_authorized_request %]
|
||||||
|
@if(isset($withPathId) && $withPathId)
|
||||||
|
<tr>
|
||||||
|
<td>[% model_name %]</td>
|
||||||
|
<td>[% primary_key_type_title %]</td>
|
||||||
|
<td><span class="label label-info" title="[% this_parameter_is_part_of_the_path %]">[% path_title %]</span></td>
|
||||||
|
<td>[% the_id_of_the_model %]</td>
|
||||||
|
@if($showValidation)
|
||||||
|
<td>
|
||||||
|
[% validation_rule_required %]
|
||||||
|
</td>
|
||||||
|
@endif
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
@endif
|
||||||
|
|
||||||
|
[% fields_list_for_body %]
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>[% parameter_name_title %]</th>
|
||||||
|
<th>[% data_type_title %]</th>
|
||||||
|
<th>[% parameter_type_title %]</th>
|
||||||
|
<th>[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% include_parameter_for_authorized_request %]
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<tr>
|
||||||
|
<td>[% field_name %]</td>
|
||||||
|
<td>[% field_type_title %]</td>
|
||||||
|
<td>[% api_field_description %]</td>
|
||||||
|
</tr>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>[% name_title %]</th>
|
||||||
|
<th>[% type_title %]</th>
|
||||||
|
<th>[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% fields_list_for_body %]
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<h4 class="text-success"><strong>200 - Ok</strong></h4>
|
||||||
|
<p class="text-muted">[% request_was_successful %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>[% indicate_whether_the_request_was_successful_or_not %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>message</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% the_success_message %]</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>data</td>
|
||||||
|
<td>[% array_title %]</td>
|
||||||
|
<td>[% the_key_is_the_model_property_and_the_value_is_the_model_value %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
@@ -0,0 +1,386 @@
|
|||||||
|
@extends('[% layout_name %]')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<h2>[% model_plural %]</h2>
|
||||||
|
[% general_description %]
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>[% available_resources %]</h2>
|
||||||
|
<div class="card mb-3" id="index-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-primary d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">GET</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% index_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% index_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#index" aria-controls="index" class="btn btn-primary btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="index">
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
[% authorized_request_for_index %]
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
|
||||||
|
<p>[% index_route_response_description %]</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
<h4><strong class="text-success">200 - Ok</strong></h4>
|
||||||
|
<p class="text-muted">[% request_was_successful %]</p>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>success</td>
|
||||||
|
<td>[% boolean_title %]</td>
|
||||||
|
<td>Was the request successful or not.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>message</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% the_success_message %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>data</td>
|
||||||
|
<td>[% array_title %]</td>
|
||||||
|
<td>
|
||||||
|
[% the_key_is_the_model_property_and_the_value_is_the_model_value %]
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>links</td>
|
||||||
|
<td>[% array_title %]</td>
|
||||||
|
<td>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-2">[% key_title %]</th>
|
||||||
|
<th class="col-md-2">[% data_type_title %]</th>
|
||||||
|
<th class="col-md-8">[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>first</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% link_to_retrieve_first_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>last</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% link_to_retrieve_last_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>prev</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% link_to_retrieve_previous_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>next</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% link_to_retrieve_next_page %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>meta</td>
|
||||||
|
<td>[% array_title %]</td>
|
||||||
|
<td>
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-2">[% key_title %]</th>
|
||||||
|
<th class="col-md-2">[% data_type_title %]</th>
|
||||||
|
<th class="col-md-8">[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>current_page</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_number_of_current_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>from</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_index_of_the_first_retrieved_item %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>last_page</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_number_of_the_last_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>Path</td>
|
||||||
|
<td>[% string_title %]</td>
|
||||||
|
<td>[% the_base_link_to_the_resource %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>per_page</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_number_of_models_per_page %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>to</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_index_of_the_last_retrieved_item %]</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>total</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td>[% the_total_of_available_pages %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card mb-3" id="store-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-success d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span>POST</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% store_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% store_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#store" aria-controls="store" class="btn btn-success btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="store">
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]fields-list', [
|
||||||
|
'withValidation' => true
|
||||||
|
])
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
<p>[% store_route_response_description %]</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]retrieved')
|
||||||
|
@include('[% path_to_view_home %]failed-to-retrieve')
|
||||||
|
@include('[% path_to_view_home %]failed-validation')
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card mb-3" id="update-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-warning d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">POST</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% update_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% update_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#update" aria-controls="update" class="btn btn-warning btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-collapse collapse" id="update">
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]fields-list', [
|
||||||
|
'withValidation' => true,
|
||||||
|
'withPathId' => true,
|
||||||
|
])
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
<p>[% update_route_response_description %]</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]retrieved')
|
||||||
|
@include('[% path_to_view_home %]failed-to-retrieve')
|
||||||
|
@include('[% path_to_view_home %]failed-validation')
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card mb-3" id="show-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-info d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">GET</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% show_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% show_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#show" aria-controls="show" class="btn btn-info btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="show">
|
||||||
|
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-2">[% parameter_name_title %]</th>
|
||||||
|
<th class="col-md-2">[% data_type_title %]</th>
|
||||||
|
<th class="col-md-2">[% parameter_type_title %]</th>
|
||||||
|
<th class="col-md-6">[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% include_parameter_for_authorized_request %]
|
||||||
|
<tr>
|
||||||
|
<td>[% model_name %]</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td><span class="label label-info" title="[% this_parameter_is_part_of_the_path %]">[% path_title %]</span></td>
|
||||||
|
<td>[% the_id_of_model_to_retrieve %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
<p>[% show_route_response_description %] </p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]retrieved')
|
||||||
|
@include('[% path_to_view_home %]failed-to-retrieve')
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card card-danger mb-3" id="destroy-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-danger d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">DELETE</span>
|
||||||
|
<span><strong>/{{ Route::getRoutes()->getByName('[% destroy_route_name %]')->uri() }}</strong></span>
|
||||||
|
<p class="mb-0">[% destroy_route_description %]</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#destroy" aria-controls="destroy" class="btn btn-danger btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="destroy">
|
||||||
|
|
||||||
|
<h3><strong>[% request_title %]</strong></h3>
|
||||||
|
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="col-md-2">[% parameter_name_title %]</th>
|
||||||
|
<th class="col-md-2">[% data_type_title %]</th>
|
||||||
|
<th class="col-md-2">[% parameter_type_title %]</th>
|
||||||
|
<th class="col-md-6">[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% include_parameter_for_authorized_request %]
|
||||||
|
<tr>
|
||||||
|
<td>[% model_name %]</td>
|
||||||
|
<td>[% integer_title %]</td>
|
||||||
|
<td><span class="label label-info" title="[% this_parameter_is_part_of_the_path %]">[% path_title %]</span></td>
|
||||||
|
<td>[% the_id_of_model_to_delete %]</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<h3><strong>[% response_title %]</strong></h3>
|
||||||
|
<p>[% destroy_route_response_description %]</p>
|
||||||
|
<p></p>
|
||||||
|
|
||||||
|
@include('[% path_to_view_home %]retrieved')
|
||||||
|
@include('[% path_to_view_home %]failed-to-retrieve')
|
||||||
|
[% include_failed_authentication_for_authorized_request %]
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>[% model_definition_title %]</h2>
|
||||||
|
<div class="card" id="[% model_name %]-model-documentation">
|
||||||
|
|
||||||
|
<div class="card-header text-bg-secondary d-flex justify-content-between align-items-center p-3">
|
||||||
|
<div>
|
||||||
|
<span class="">[% model_name_title %]</span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button type="button" data-bs-toggle="collapse" data-bs-target="#model-definitions" aria-controls="model-definitions" class="btn btn-secondary btn-sm" aria-expanded="false">
|
||||||
|
<span class="fa-solid fa-chevron-down"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body collapse" id="model-definitions">
|
||||||
|
<table class="table table-stripped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>[% field_name_title %]</th>
|
||||||
|
<th>[% field_type_title %]</th>
|
||||||
|
<th>[% description_title %]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
[% fields_list_for_body %]
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Route::get('[% prefix %][% version %]', [[% controller_name %]::class, 'index'])
|
||||||
|
->name('[% index_route_name %]');
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Route::get('[% prefix %][% version %]', '[% controller_name %]@index')
|
||||||
|
->name('[% index_route_name %]');
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||||
|
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||||
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||||
|
use Illuminate\Routing\Controller as BaseController;
|
||||||
|
|
||||||
|
class Controller extends BaseController
|
||||||
|
{
|
||||||
|
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valid versions
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $versions = [
|
||||||
|
'[% api_version_number %]',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a valid version from the available list.
|
||||||
|
*
|
||||||
|
* @param string $version
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function getVersion($version)
|
||||||
|
{
|
||||||
|
if (in_array($version, $this->versions)) {
|
||||||
|
return $version;
|
||||||
|
}
|
||||||
|
|
||||||
|
return end($this->versions);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
use Illuminate\Http\Resources\Json\ResourceCollection;
|
||||||
|
use [% use_full_model_name %];
|
||||||
|
|
||||||
|
class [% api_resource_collection_class %] extends ResourceCollection
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The response message
|
||||||
|
*
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new resource instance.
|
||||||
|
*
|
||||||
|
* @param mixed $resource
|
||||||
|
* @param mixed $message
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct($resource, $message = null)
|
||||||
|
{
|
||||||
|
parent::__construct($resource);
|
||||||
|
|
||||||
|
$this->message = $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform the resource collection into an array.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray($request)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'data' => $this->collection->transform(function ($[% model_name_singular_variable %]) {
|
||||||
|
return $this->transformModel($[% model_name_singular_variable %]);
|
||||||
|
}),
|
||||||
|
'message' => $this->message,
|
||||||
|
'success' => true,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
[% transform_method %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
use Illuminate\Http\Resources\Json\Resource;
|
||||||
|
|
||||||
|
class [% api_resource_class %] extends Resource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The response message
|
||||||
|
*
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
protected $message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new resource instance.
|
||||||
|
*
|
||||||
|
* @param mixed $resource
|
||||||
|
* @param mixed $message
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct($resource, $message = null)
|
||||||
|
{
|
||||||
|
parent::__construct($resource);
|
||||||
|
|
||||||
|
$this->message = $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray($request)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[% model_api_array %]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get any additional data that should be returned with the resource array.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function with($request)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'success' => true,
|
||||||
|
'message' => $this->message,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Route::get('/', [[% controller_name %]::class, 'index'])
|
||||||
|
->name('[% index_route_name %]');
|
||||||
|
Route::get('/show/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'show'])
|
||||||
|
->name('[% show_route_name %]')[% route_id_clause %];
|
||||||
|
Route::post('/', [[% controller_name %]::class, 'store'])
|
||||||
|
->name('[% store_route_name %]');
|
||||||
|
Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', [[% controller_name %]::class, 'update'])
|
||||||
|
->name('[% update_route_name %]')[% route_id_clause %];
|
||||||
|
Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'destroy'])
|
||||||
|
->name('[% destroy_route_name %]')[% route_id_clause %];
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Route::get('/', '[% controller_name %]@index')
|
||||||
|
->name('[% index_route_name %]');
|
||||||
|
Route::get('/show/{[% model_name_singular_variable %]}','[% controller_name %]@show')
|
||||||
|
->name('[% show_route_name %]')[% route_id_clause %];
|
||||||
|
Route::post('/', '[% controller_name %]@store')
|
||||||
|
->name('[% store_route_name %]');
|
||||||
|
Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', '[% controller_name %]@update')
|
||||||
|
->name('[% update_route_name %]')[% route_id_clause %];
|
||||||
|
Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}','[% controller_name %]@destroy')
|
||||||
|
->name('[% destroy_route_name %]')[% route_id_clause %];
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Validate the given request with the defined rules.
|
||||||
|
*
|
||||||
|
* @param [% request_fullname %] $request
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
protected function affirm(Request $request)
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
[% validation_rules %]
|
||||||
|
];
|
||||||
|
[% file_validation_snippet %]
|
||||||
|
|
||||||
|
return $this->validate($request, $rules);
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* Create a new controller instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
[% auth_middleware %]
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Get the request's data from the request.
|
||||||
|
*
|
||||||
|
* [% request_name_comment %]
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
[% visibility_level %] function getData([% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
[% validation_rules %]
|
||||||
|
];
|
||||||
|
|
||||||
|
[% file_validation_snippet %]
|
||||||
|
$data = [% request_variable %]->validate($rules);
|
||||||
|
|
||||||
|
[% file_snippet %]
|
||||||
|
[% boolean_snippet %]
|
||||||
|
[% string_to_null_snippet %]
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Get the request's data from the request.
|
||||||
|
*
|
||||||
|
* [% request_name_comment %]
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
[% visibility_level %] function getData([% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
$data = [% request_variable %]->only([% fillable %]);
|
||||||
|
[% file_snippet %]
|
||||||
|
[% boolean_snippet %]
|
||||||
|
[% string_to_null_snippet %]
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Moves the attached file to the server.
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\HttpFoundation\File\UploadedFile $file
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function moveFile($file)
|
||||||
|
{
|
||||||
|
if (!$file->isValid()) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$path = config('laravel-code-generator.files_upload_path', 'uploads');
|
||||||
|
$saved = $file->store('public/' . $path, config('filesystems.default'));
|
||||||
|
|
||||||
|
return substr($saved, 7);
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Moves the attached file to the server.
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\HttpFoundation\File\UploadedFile $file
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function moveFile($file)
|
||||||
|
{
|
||||||
|
if (!$file->isValid()) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$fileName = sprintf('%s.%s', uniqid(), $file->getClientOriginalExtension());
|
||||||
|
$destinationPath = config('laravel-code-generator.files_upload_path','uploads');
|
||||||
|
$path = $file->move($destinationPath, $fileName);
|
||||||
|
|
||||||
|
return $destinationPath . '/' . $fileName;
|
||||||
|
}
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class [% controller_name %] [% controller_extends %]
|
||||||
|
{
|
||||||
|
[% constructor %]
|
||||||
|
/**
|
||||||
|
* Display a listing of the [% model_name_plural %].
|
||||||
|
*
|
||||||
|
* @return \Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$[% model_name_plural_variable %] = [% model_name_class %]::[% with_relations_for_index %]paginate([% models_per_page %]);
|
||||||
|
|
||||||
|
return view('[% index_view_name %]'[% view_variables_for_index %]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new [% model_name %].
|
||||||
|
*
|
||||||
|
* @return \Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
[% relation_collections %]
|
||||||
|
|
||||||
|
return view('[% create_view_name %]'[% view_variables_for_create %]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a new [% model_name %] in the storage.
|
||||||
|
*
|
||||||
|
* @param [% request_fullname %] [% request_variable %]
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\RedirectResponse | \Illuminate\Routing\Redirector
|
||||||
|
*/
|
||||||
|
public function store([% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
[% call_affirm %]
|
||||||
|
$[% data_variable %] = [% call_get_data %];
|
||||||
|
[% on_store_setter %]
|
||||||
|
[% model_name_class %]::create($[% data_variable %]);
|
||||||
|
|
||||||
|
return redirect()->route('[% index_route_name %]')
|
||||||
|
->with('success_message', [% model_was_added %]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified [% model_name %].
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
*
|
||||||
|
* @return \Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function show($id)
|
||||||
|
{
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::[% with_relations_for_show %]findOrFail($id);
|
||||||
|
|
||||||
|
return view('[% show_view_name %]'[% view_variables_for_show %]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing the specified [% model_name %].
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
*
|
||||||
|
* @return \Illuminate\View\View
|
||||||
|
*/
|
||||||
|
public function edit($id)
|
||||||
|
{
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||||
|
[% relation_collections %]
|
||||||
|
|
||||||
|
return view('[% edit_view_name %]'[% view_variables_for_edit %]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified [% model_name %] in the storage.
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
* @param [% request_fullname %] [% request_variable %]
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\RedirectResponse | \Illuminate\Routing\Redirector
|
||||||
|
*/
|
||||||
|
public function update($id, [% type_hinted_request_name %])
|
||||||
|
{
|
||||||
|
[% call_affirm %]
|
||||||
|
$[% data_variable %] = [% call_get_data %];
|
||||||
|
[% on_update_setter %]
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||||
|
$[% model_name_singular_variable %]->update($[% data_variable %]);
|
||||||
|
|
||||||
|
return redirect()->route('[% index_route_name %]')
|
||||||
|
->with('success_message', [% model_was_updated %]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified [% model_name %] from the storage.
|
||||||
|
*
|
||||||
|
* @param int $id
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\RedirectResponse | \Illuminate\Routing\Redirector
|
||||||
|
*/
|
||||||
|
public function destroy($id)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$[% model_name_singular_variable %] = [% model_name_class %]::findOrFail($id);
|
||||||
|
$[% model_name_singular_variable %]->delete();
|
||||||
|
|
||||||
|
return redirect()->route('[% index_route_name %]')
|
||||||
|
->with('success_message', [% model_was_deleted %]);
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
|
||||||
|
return back()->withInput()
|
||||||
|
->withErrors(['unexpected_error' => [% unexpected_error %]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[% affirm_method %]
|
||||||
|
[% get_data_method %]
|
||||||
|
[% upload_method %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
@extends('[% layout_name %]')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<div class="card text-bg-theme">
|
||||||
|
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center p-3">
|
||||||
|
<h4 class="m-0">[% create_model %]</h4>
|
||||||
|
<div>
|
||||||
|
<a href="{{ route('[% index_route_name %]') }}" class="btn btn-primary" title="[% show_all_models %]">
|
||||||
|
<span class="fa-solid fa-table-list" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
@if ($errors->any())
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<ul class="list-unstyled mb-0">
|
||||||
|
@foreach ($errors->all() as $error)
|
||||||
|
<li>{{ $error }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<form method="POST" class="needs-validation" novalidate action="{{ route('[% store_route_name %]') }}" accept-charset="UTF-8" id="[% form_id %]" name="[% form_name %]" [% upload_files %]>
|
||||||
|
{{ csrf_field() }}
|
||||||
|
@include ('[% form_view_name %]', [
|
||||||
|
'[% model_name_singular_variable %]' => null,
|
||||||
|
])
|
||||||
|
|
||||||
|
<div class="col-lg-10 col-xl-9 offset-lg-2 offset-xl-3">
|
||||||
|
<input class="btn btn-primary" type="submit" value="[% add %]">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
@extends('[% layout_name %]')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<div class="card text-bg-theme">
|
||||||
|
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center p-3">
|
||||||
|
<h4 class="m-0">{{ !empty([% model_header %]) ? [% model_header %] : '[% model_name_title %]' }}</h4>
|
||||||
|
<div>
|
||||||
|
<a href="{{ route('[% index_route_name %]') }}" class="btn btn-primary" title="[% show_all_models %]">
|
||||||
|
<span class="fa-solid fa-table-list" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a href="{{ route('[% create_route_name %]') }}" class="btn btn-secondary" title="[% create_model %]">
|
||||||
|
<span class="fa-solid fa-plus" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
@if ($errors->any())
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<ul class="list-unstyled mb-0">
|
||||||
|
@foreach ($errors->all() as $error)
|
||||||
|
<li>{{ $error }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<form method="POST" class="needs-validation" novalidate action="{{ route('[% update_route_name %]', $[% model_name_singular_variable %]->[% primary_key %]) }}" id="[% form_id %]" name="[% form_name %]" accept-charset="UTF-8" [% upload_files %]>
|
||||||
|
{{ csrf_field() }}
|
||||||
|
<input name="_method" type="hidden" value="PUT">
|
||||||
|
@include ('[% form_view_name %]', [
|
||||||
|
'[% model_name_singular_variable %]' => $[% model_name_singular_variable %],
|
||||||
|
])
|
||||||
|
|
||||||
|
<div class="col-lg-10 col-xl-9 offset-lg-2 offset-xl-3">
|
||||||
|
<input class="btn btn-primary" type="submit" value="[% update %]">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<div class="mb-3">
|
||||||
|
<input class="form-control{{ $errors->has('[% field_name %]') ? ' is-invalid' : '' }}" type="file" name="[% field_name %]" id="[% field_name %]" class="[% css_class %]">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if (isset($[% model_name_singular_variable %]->[% field_name %]) && !empty($[% model_name_singular_variable %]->[% field_name %]))
|
||||||
|
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" name="custom_delete_[% field_name %]" id="custom_delete_[% field_name %]" class="form-check-input custom-delete-file" value="1" {{ old('custom_delete_[% field_name %]', '0') == '1' ? 'checked' : '' }}>
|
||||||
|
</div>
|
||||||
|
<label class="form-check-label" for="custom_delete_[% field_name %]"> Delete {{ [% field_value %] }}</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endif
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{!! $errors->first('[% field_name %]', '<div class="invalid-feedback">:message</div>') !!}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<input class="form-control{{ $errors->has('[% field_name %]') ? ' is-invalid' : '' }}[% css_class %]" name="[% field_name %]" type="[% field_type %]" id="[% field_name %]" value="[% field_value %]"[% min_length %][% max_length %][% min_value %][% max_value %][% required_field %][% placeholder %][% step %]>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
<div class="mb-3 row">
|
||||||
|
[% field_label %]
|
||||||
|
<div class="col-lg-10 col-xl-9">
|
||||||
|
[% field_input %]
|
||||||
|
[% field_validation_helper %]
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<label for="[% field_name %]" class="col-form-label text-lg-end col-lg-2 col-xl-3">[% field_title %]</label>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<select class="form-select{{ $errors->has('[% field_name %]') ? ' is-invalid' : '' }}[% css_class %]" id="[% field_name %]" name="[% field_name %]">
|
||||||
|
[% placeholder %]
|
||||||
|
@foreach (range(1, 12) as $value)
|
||||||
|
<option value="{{ $value }}"[% selected_value %]>
|
||||||
|
{{ date('F', mktime(0, 0, 0, $value, 1)) }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<div class="col-form-label text-lg-end col-lg-2 col-xl-3"></div>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<input class="form-control{{ $errors->has('[% field_name %]') ? ' is-invalid' : '' }}[% css_class %]" name="[% field_name %]" type="password" id="[% field_name %]" value="[% field_value %]"[% min_length %][% max_length %][% min_value %][% max_value %][% required_field %][% placeholder %]>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<div class="form-check [% field_type %]">
|
||||||
|
<input id="[% item_id %]" class="form-check-input[% required_class %][% css_class %]" name="[% field_name %]" type="[% field_type %]" value="[% option_value %]"[% required_field %][% checked_item %]>
|
||||||
|
<label class="form-check-label" for="[% item_id %]">
|
||||||
|
[% item_title %]
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<div class="form-check form-check-inline[% field_type %]">
|
||||||
|
<input id="[% item_id %]" class="form-check-input[% required_class %][% css_class %]" name="[% field_name %]" type="[% field_type %]" value="[% option_value %]"[% required_field %][% checked_item %]>
|
||||||
|
<label class="form-check-label" for="[% item_id %]">
|
||||||
|
[% item_title %]
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% class_namespace %];
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
|
||||||
|
class [% form_request_class %] extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return [% autherized_boolean %];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
$rules = [
|
||||||
|
[% validation_rules %]
|
||||||
|
];
|
||||||
|
[% file_validation_snippet %]
|
||||||
|
return $rules;
|
||||||
|
}
|
||||||
|
[% get_data_method %]
|
||||||
|
[% upload_method %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<select class="form-select{{ $errors->has('[% field_name %]') ? ' is-invalid' : '' }}[% css_class %]" id="[% field_name %]" name="[% field_name %]"[% field_multiple %][% required_field %]>
|
||||||
|
[% placeholder %]
|
||||||
|
@foreach ([% field_items %] as $key => [% field_item %])
|
||||||
|
<option value="{{ $key }}"[% selected_value %]>
|
||||||
|
{{ [% field_item %] }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<select class="form-select{{ $errors->has('[% field_name %]') ? ' is-invalid' : '' }}[% css_class %]" id="[% field_name %]" name="[% field_name %]">
|
||||||
|
[% placeholder %]
|
||||||
|
@foreach (range([% min_value %], [% max_value %]) as $value)
|
||||||
|
<option value="{{ $value }}"[% selected_value %]>
|
||||||
|
{{ $value }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<textarea class="form-control{{ $errors->has('[% field_name %]') ? ' is-invalid' : '' }}[% css_class %]" name="[% field_name %]" id="[% field_name %]"[% min_length %][% max_length %][% min_value %][% max_value %][% required_field %][% placeholder %]>[% field_value %]</textarea>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[% form_fields_html %]
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
@extends('[% layout_name %]')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
@if(Session::has('success_message'))
|
||||||
|
<div class="alert alert-success alert-dismissible" role="alert">
|
||||||
|
{!! session('success_message') !!}
|
||||||
|
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div class="card text-bg-theme">
|
||||||
|
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center p-3">
|
||||||
|
<h4 class="m-0">[% model_name_plural_title %]</h4>
|
||||||
|
<div>
|
||||||
|
<a href="{{ route('[% create_route_name %]') }}" class="btn btn-secondary" title="[% create_model %]">
|
||||||
|
<span class="fa-solid fa-plus" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if(count($[% model_name_plural_variable %]) == 0)
|
||||||
|
<div class="card-body text-center">
|
||||||
|
<h4>[% no_models_available %]</h4>
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<div class="card-body p-0">
|
||||||
|
<div class="table-responsive">
|
||||||
|
|
||||||
|
<table class="table table-striped ">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
[% header_cells %]
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($[% model_name_plural_variable %] as $[% model_name_singular_variable %])
|
||||||
|
<tr>
|
||||||
|
[% body_cells %]
|
||||||
|
<td class="text-end">
|
||||||
|
|
||||||
|
<form method="POST" action="{!! route('[% destroy_route_name %]', $[% model_name_singular_variable %]->[% primary_key %]) !!}" accept-charset="UTF-8">
|
||||||
|
<input name="_method" value="DELETE" type="hidden">
|
||||||
|
{{ csrf_field() }}
|
||||||
|
|
||||||
|
<div class="btn-group btn-group-sm" role="group">
|
||||||
|
<a href="{{ route('[% show_route_name %]', $[% model_name_singular_variable %]->[% primary_key %] ) }}" class="btn btn-info" title="[% show_model %]">
|
||||||
|
<span class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('[% edit_route_name %]', $[% model_name_singular_variable %]->[% primary_key %] ) }}" class="btn btn-primary" title="[% edit_model %]">
|
||||||
|
<span class="fa-regular fa-pen-to-square" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-danger" title="[% delete_model %]" onclick="return confirm("[% confirm_delete %]")">
|
||||||
|
<span class="fa-regular fa-trash-can" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{!! $[% model_name_plural_variable %]->links('[% pagination_view_name %]') !!}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<td class="align-middle">{{ [% field_value %] }}</td>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<th>[% field_title %]</th>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
[% messages %]
|
||||||
|
];
|
||||||
194
resources/laravel-code-generator/templates/default/layout.stub
Normal file
194
resources/laravel-code-generator/templates/default/layout.stub
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="{{ App::getLocale() }}" data-bs-theme="auto">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||||
|
<title>{{ config('app.name', '[% application_name %]') }}</title>
|
||||||
|
<script>
|
||||||
|
const darkThemeName = 'dark';
|
||||||
|
const lightThemeName = 'light';
|
||||||
|
const getTenantName = () => document.documentElement.getAttribute('data-tenant') || '';
|
||||||
|
const getStoredTheme = () => localStorage.getItem(getTenantName() + '-admintheme');
|
||||||
|
const setStoredTheme = theme => localStorage.setItem(getTenantName() + '-admintheme', theme);
|
||||||
|
const getPreferredTheme = () => {
|
||||||
|
const storedTheme = getStoredTheme()
|
||||||
|
if (storedTheme) {
|
||||||
|
return storedTheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
return window.matchMedia('(prefers-color-scheme: dark)').matches ? darkThemeName : lightThemeName;
|
||||||
|
}
|
||||||
|
const setTheme = theme => {
|
||||||
|
if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||||
|
document.documentElement.setAttribute('data-bs-theme', darkThemeName);
|
||||||
|
} else {
|
||||||
|
document.documentElement.setAttribute('data-bs-theme', theme);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const getAdminPreferenceKey = () => getTenantName() + '-adminPreferences';
|
||||||
|
const getAdminPreferences = () => JSON.parse(localStorage.getItem(getAdminPreferenceKey()));
|
||||||
|
const setAdminPreferences = (adminPreferences) => {
|
||||||
|
const key = getAdminPreferenceKey();
|
||||||
|
|
||||||
|
localStorage.setItem(key, JSON.stringify(adminPreferences));
|
||||||
|
Cookies.set(key, JSON.stringify(adminPreferences), { expires: 360 });
|
||||||
|
};
|
||||||
|
|
||||||
|
const themeObserver = new MutationObserver(function (mutations) {
|
||||||
|
|
||||||
|
for (let i = 0; i < mutations.length; i++) {
|
||||||
|
for (let j = 0; j < mutations[i].addedNodes.length; j++) {
|
||||||
|
|
||||||
|
if (mutations[i].addedNodes[j].tagName == 'BODY') {
|
||||||
|
setTheme(getPreferredTheme());
|
||||||
|
|
||||||
|
// we're done:
|
||||||
|
themeObserver.disconnect();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
themeObserver.observe(document.documentElement, {
|
||||||
|
childList: true,
|
||||||
|
subtree: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const showActiveTheme = (theme, focus = false) => {
|
||||||
|
const themeSwitcher = document.querySelector('#bd-theme');
|
||||||
|
|
||||||
|
if (!themeSwitcher) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const themeSwitcherText = document.querySelector('#bd-theme-text');
|
||||||
|
const activeThemeIcon = document.querySelector('.theme-icon-active');
|
||||||
|
const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`);
|
||||||
|
const svgOfActiveBtn = btnToActive.querySelector('.theme-icon');
|
||||||
|
|
||||||
|
btnToActive.classList.add('active');
|
||||||
|
btnToActive.setAttribute('aria-pressed', 'true');
|
||||||
|
|
||||||
|
activeThemeIcon.innerHTML = svgOfActiveBtn.innerHTML;
|
||||||
|
|
||||||
|
const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`;
|
||||||
|
themeSwitcher.setAttribute('aria-label', themeSwitcherLabel);
|
||||||
|
|
||||||
|
const btnsToInactive = document.querySelectorAll(`[data-bs-theme-value]:not([data-bs-theme-value="${theme}"])`);
|
||||||
|
|
||||||
|
for (let i = 0; i < btnsToInactive.length; i++) {
|
||||||
|
btnsToInactive[i].classList.remove('active');
|
||||||
|
btnsToInactive[i].setAttribute('aria-pressed', 'false');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (focus) {
|
||||||
|
themeSwitcher.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
|
||||||
|
const storedTheme = getStoredTheme()
|
||||||
|
if (storedTheme !== lightThemeName && storedTheme !== darkThemeName) {
|
||||||
|
setTheme(getPreferredTheme());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener('DOMContentLoaded', () => {
|
||||||
|
showActiveTheme(getPreferredTheme());
|
||||||
|
|
||||||
|
document.querySelectorAll('[data-bs-theme-value]')
|
||||||
|
.forEach(toggle => {
|
||||||
|
toggle.addEventListener('click', () => {
|
||||||
|
const theme = toggle.getAttribute('data-bs-theme-value');
|
||||||
|
setStoredTheme(theme);
|
||||||
|
setTheme(theme);
|
||||||
|
showActiveTheme(theme, true);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
|
||||||
|
{{-- <link href="{{ asset('css/app.css') }}" rel="stylesheet"> --}}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<nav class="navbar-main navbar navbar-expand-lg fixed-stiky bg-body-tertiary">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<a class="navbar-brand" href="{!! url('/') !!}">{{ config('app.name', '[% application_name %]') }}</a>
|
||||||
|
|
||||||
|
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar" aria-expanded="false" aria-controls="navbar" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="collapse navbar-collapse" id="navbar">
|
||||||
|
<div class="navbar-nav d-flex align-items-end justify-content-end w-100">
|
||||||
|
<ul class="menu menu-main-menu navbar-nav">
|
||||||
|
<li class="nav-item px-2">
|
||||||
|
<a class="nav-link active" aria-current="page" href="{!! url('/') !!}">Home</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul class="navbar-nav user-top-navbar">
|
||||||
|
<li class="nav-item">
|
||||||
|
<div class="dropdown">
|
||||||
|
<button class="btn btn-link nav-link dropdown-toggle" id="bd-theme" type="button" aria-expanded="false" data-bs-toggle="dropdown" data-bs-display="static" aria-label="Toggle theme (light)">
|
||||||
|
<span class="theme-icon-active">
|
||||||
|
<i class="fa-solid fa-sun"></i>
|
||||||
|
</span>
|
||||||
|
<span class="d-none" id="bd-theme-text">Toggle theme</span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-end position-absolute" aria-labelledby="bd-theme-text">
|
||||||
|
<li>
|
||||||
|
<button type="button" class="dropdown-item" data-bs-theme-value="auto" aria-pressed="false">
|
||||||
|
<span class="theme-icon">
|
||||||
|
<i class="fa-solid fa-circle-half-stroke"></i>
|
||||||
|
</span>
|
||||||
|
<span class="ps-2">Auto</span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button type="button" class="dropdown-item active" data-bs-theme-value="light" aria-pressed="true">
|
||||||
|
<span class="theme-icon">
|
||||||
|
<i class="fa-solid fa-sun"></i>
|
||||||
|
</span>
|
||||||
|
<span class="ps-2">Light</span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button type="button" class="dropdown-item" data-bs-theme-value="dark" aria-pressed="false">
|
||||||
|
<span class="theme-icon">
|
||||||
|
<i class="fa-solid fa-moon"></i>
|
||||||
|
</span>
|
||||||
|
<span class="ps-2">Dark</span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
@if (!Auth::check())
|
||||||
|
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ url('/login') }}"> <i class="fa-solid fa-sign-in-alt fa-fw" aria-hidden="true"></i> Log in</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ url('/register') }}"> Register</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="container body-content py-3">
|
||||||
|
@yield('content')
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
|
||||||
|
{{-- <script src="{{ asset('js/app.js') }}"></script> --}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
@if (Route::has('login'))
|
||||||
|
<ul class="nav navbar-nav navbar-right">
|
||||||
|
@if (Auth::check())
|
||||||
|
<li><a href="{{ url('/home') }}">Home</a></li>
|
||||||
|
@else
|
||||||
|
<li><a href="{{ url('/login') }}">Login</a></li>
|
||||||
|
<li><a href="{{ url('/register') }}">Register</a></li>
|
||||||
|
@endif
|
||||||
|
</ul>
|
||||||
|
@endif
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Schema::[% connection_name %]drop('[% table_name %]');
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Schema::[% connection_name %][% operation_name %]('[% table_name %]', function(Blueprint $table)
|
||||||
|
{
|
||||||
|
[% blue_print_body %]
|
||||||
|
});
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
|
||||||
|
class [% migration_name %] extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
[% schema_up %]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
[% schema_down %]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return \DateTime::createFromFormat($this->getDateFormat(), $value)->format('[% date_format %]');
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
return json_decode($value) ?: [];
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* Get [% field_name %] in array format
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get[% field_name_cap %]Attribute($value)
|
||||||
|
{
|
||||||
|
[% content %]
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$this->attributes['[% field_name %]'] = !empty($value) ? \DateTime::createFromFormat('[% date_format %]', $value) : null;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
$this->attributes['[% field_name %]'] = json_encode($value);
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* Set the [% field_name %].
|
||||||
|
*
|
||||||
|
* @param string $value
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function set[% field_name_cap %]Attribute($value)
|
||||||
|
{
|
||||||
|
[% content %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* The database primary key value.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $primaryKey = '[% primary_key %]';
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* Get the [% relation_name %] for this model.
|
||||||
|
*
|
||||||
|
* @return [% relation_return_type %]
|
||||||
|
*/
|
||||||
|
public function [% relation_name %]()
|
||||||
|
{
|
||||||
|
return $this->[% relation_type %]([% relation_params %]);
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* Indicates if the model should be timestamped.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $timestamps = false;
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace [% namespace %];
|
||||||
|
|
||||||
|
[% use_command_placeholder %]
|
||||||
|
|
||||||
|
class [% model_name_class %] [% model_extends %]
|
||||||
|
{
|
||||||
|
[% use_soft_delete_trait %]
|
||||||
|
[% time_stamps %]
|
||||||
|
/**
|
||||||
|
* The database table used by the model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $table = '[% table %]';
|
||||||
|
|
||||||
|
[% primary_key %]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attributes that should be mass-assignable.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $fillable = [% fillable %];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The attributes that should be mutated to dates.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $dates = [% dates %];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The attributes that should be cast to native types.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $casts = [% casts %];
|
||||||
|
|
||||||
|
[% relationships %]
|
||||||
|
[% mutators %]
|
||||||
|
[% accessors %]
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
@if ($paginator->hasPages())
|
||||||
|
<nav class="d-flex justify-content-center">
|
||||||
|
<ul class="pagination">
|
||||||
|
{{-- Previous Page Link --}}
|
||||||
|
@if ($paginator->onFirstPage())
|
||||||
|
<li class="page-item disabled">
|
||||||
|
<a href="#" class="page-link"><i class="fa-solid fa-angle-left"></i></a>
|
||||||
|
</li>
|
||||||
|
@else
|
||||||
|
<li class="page-item">
|
||||||
|
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev"><i class="fa-solid fa-angle-left"></i></a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
{{-- Pagination Elements --}}
|
||||||
|
@foreach ($elements as $element)
|
||||||
|
{{-- "Three Dots" Separator --}}
|
||||||
|
@if (is_string($element))
|
||||||
|
<li class="page-item disabled"><span>{{ $element }}</span></li>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
{{-- Array Of Links --}}
|
||||||
|
@if (is_array($element))
|
||||||
|
@foreach ($element as $page => $url)
|
||||||
|
@if ($page == $paginator->currentPage())
|
||||||
|
<li class="page-item active">
|
||||||
|
<a class="page-link" href="{{ $url }}">{{ $page }}</a>
|
||||||
|
</li>
|
||||||
|
@else
|
||||||
|
<li class="page-item">
|
||||||
|
<a class="page-link" href="{{ $url }}">{{ $page }}</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
{{-- Next Page Link --}}
|
||||||
|
@if ($paginator->hasMorePages())
|
||||||
|
<li class="page-item">
|
||||||
|
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next"><i class="fa-solid fa-angle-right"></i></a>
|
||||||
|
</li>
|
||||||
|
@else
|
||||||
|
<li class="page-item disabled">
|
||||||
|
<a href="#" class="page-link"><i class="fa-solid fa-angle-right"></i></a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
@endif
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
Route::get('/', [[% controller_name %]::class, 'index'])
|
||||||
|
->name('[% index_route_name %]');
|
||||||
|
Route::get('/create', [[% controller_name %]::class, 'create'])
|
||||||
|
->name('[% create_route_name %]');
|
||||||
|
Route::get('/show/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'show'])
|
||||||
|
->name('[% show_route_name %]')[% route_id_clause %];
|
||||||
|
Route::get('/{[% model_name_singular_variable %]}/edit',[[% controller_name %]::class, 'edit'])
|
||||||
|
->name('[% edit_route_name %]')[% route_id_clause %];
|
||||||
|
Route::post('/', [[% controller_name %]::class, 'store'])
|
||||||
|
->name('[% store_route_name %]');
|
||||||
|
Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', [[% controller_name %]::class, 'update'])
|
||||||
|
->name('[% update_route_name %]')[% route_id_clause %];
|
||||||
|
Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}',[[% controller_name %]::class, 'destroy'])
|
||||||
|
->name('[% destroy_route_name %]')[% route_id_clause %];
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
Route::group([
|
||||||
|
[% prefix %]
|
||||||
|
], function () {
|
||||||
|
[% routes %]
|
||||||
|
});
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
Route::get('/', '[% controller_name %]@index')
|
||||||
|
->name('[% index_route_name %]');
|
||||||
|
Route::get('/create','[% controller_name %]@create')
|
||||||
|
->name('[% create_route_name %]');
|
||||||
|
Route::get('/show/{[% model_name_singular_variable %]}','[% controller_name %]@show')
|
||||||
|
->name('[% show_route_name %]')[% route_id_clause %];
|
||||||
|
Route::get('/{[% model_name_singular_variable %]}/edit','[% controller_name %]@edit')
|
||||||
|
->name('[% edit_route_name %]')[% route_id_clause %];
|
||||||
|
Route::post('/', '[% controller_name %]@store')
|
||||||
|
->name('[% store_route_name %]');
|
||||||
|
Route::put('[% model_name_snake %]/{[% model_name_singular_variable %]}', '[% controller_name %]@update')
|
||||||
|
->name('[% update_route_name %]')[% route_id_clause %];
|
||||||
|
Route::delete('/[% model_name_snake %]/{[% model_name_singular_variable %]}','[% controller_name %]@destroy')
|
||||||
|
->name('[% destroy_route_name %]')[% route_id_clause %];
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
@extends('[% layout_name %]')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<div class="card text-bg-theme">
|
||||||
|
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center p-3">
|
||||||
|
<h4 class="m-0">{{ isset([% model_header %]) ? [% model_header %] : '[% model_name_title %]' }}</h4>
|
||||||
|
<div>
|
||||||
|
<form method="POST" action="{!! route('[% destroy_route_name %]', $[% model_name_singular_variable %]->[% primary_key %]) !!}" accept-charset="UTF-8">
|
||||||
|
<input name="_method" value="DELETE" type="hidden">
|
||||||
|
{{ csrf_field() }}
|
||||||
|
|
||||||
|
<a href="{{ route('[% edit_route_name %]', $[% model_name_singular_variable %]->[% primary_key %] ) }}" class="btn btn-primary" title="[% edit_model %]">
|
||||||
|
<span class="fa-regular fa-pen-to-square" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-danger" title="[% delete_model %]" onclick="return confirm("[% confirm_delete %]?")">
|
||||||
|
<span class="fa-regular fa-trash-can" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<a href="{{ route('[% index_route_name %]') }}" class="btn btn-primary" title="[% show_all_models %]">
|
||||||
|
<span class="fa-solid fa-table-list" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a href="{{ route('[% create_route_name %]') }}" class="btn btn-secondary" title="[% create_model %]">
|
||||||
|
<span class="fa-solid fa-plus" aria-hidden="true"></span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<dl class="row">
|
||||||
|
[% table_rows %]
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<dt class="text-lg-end col-lg-2 col-xl-3">[% field_title %]</dt>
|
||||||
|
<dd class="col-lg-10 col-xl-9">{{ [% field_value %] }}</dd>
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class [% view_model_class %] extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[% validation_rules %]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,8 +3,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.circle-container {
|
.circle-container {
|
||||||
width: 250px; /* Ukuran lingkaran */
|
width: 200px; /* Ukuran lingkaran */
|
||||||
height: 250px;
|
height: 200px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -12,11 +12,11 @@
|
|||||||
border-radius: 50%; /* Membuat lingkaran */
|
border-radius: 50%; /* Membuat lingkaran */
|
||||||
border: 6px solid white; /* Border putih */
|
border: 6px solid white; /* Border putih */
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Efek bayangan */
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Efek bayangan */
|
||||||
position: relative;
|
position: absolute;
|
||||||
|
|
||||||
.circle-content {
|
.circle-content {
|
||||||
width: 200px; /* Ukuran lingkaran dalam */
|
width: 180px; /* Ukuran lingkaran dalam */
|
||||||
height: 200px;
|
height: 180px;
|
||||||
background-color: var(--circle-color); /* Warna lingkaran dalam */
|
background-color: var(--circle-color); /* Warna lingkaran dalam */
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -62,8 +62,8 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
width: 80px; /* Ukuran lingkaran kecil */
|
width: 50px; /* Ukuran lingkaran kecil */
|
||||||
height: 80px;
|
height: 50px;
|
||||||
background-color: #2d4f90; /* Warna lingkaran kecil */
|
background-color: #2d4f90; /* Warna lingkaran kecil */
|
||||||
border-radius: 50%; /* Membuat lingkaran */
|
border-radius: 50%; /* Membuat lingkaran */
|
||||||
// border: 4px solid white; /* Border putih */
|
// border: 4px solid white; /* Border putih */
|
||||||
@@ -73,17 +73,17 @@
|
|||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Efek bayangan */
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Efek bayangan */
|
||||||
|
|
||||||
.small-circle-content{
|
.small-circle-content{
|
||||||
width: 70px;
|
width: 45px;
|
||||||
height: 70px;
|
height: 45px;
|
||||||
background-color: #2d4f90; /* Warna lingkaran kecil */
|
background-color: #2d4f90; /* Warna lingkaran kecil */
|
||||||
border-radius: 50%; /* Membuat lingkaran */
|
border-radius: 50%; /* Membuat lingkaran */
|
||||||
border: 4px solid white; /* Border putih */
|
border: 2px solid white; /* Border putih */
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
.small-percentage {
|
.small-percentage {
|
||||||
font-size: 14px;
|
font-size: 10px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: white; /* Warna teks */
|
color: white; /* Warna teks */
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
@vite(['resources/scss/components/_circle.scss'])
|
@vite(['resources/scss/components/_circle.scss'])
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
<div class="circle-container" style="--circle-color: {{$document_color}};" id="{{$document_id}}">
|
<div class="circle-container" id="{{$document_id}}" style="--circle-color: {{$document_color}};{{$style}}">
|
||||||
<div class="circle-content">
|
<div class="circle-content">
|
||||||
<p class="document-title {{$document_id}}" >{{$document_title}}</p>
|
<p class="document-title {{$document_id}}" >{{$document_title}}</p>
|
||||||
<p class="document-total {{$document_id}}" >Rp.0</p>
|
<p class="document-total {{$document_id}}" >Rp.0</p>
|
||||||
|
|||||||
@@ -2,28 +2,189 @@
|
|||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
@include('layouts.partials/page-title', ['title' => 'Dashboards', 'subtitle' => 'SIBEDAS'])
|
@include('layouts.partials/page-title', ['title' => 'Dashboards', 'subtitle' => 'DASHBOARD PIMPINAN'])
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.square{
|
||||||
|
height: 100px;
|
||||||
|
width: 100px;
|
||||||
|
position: absolute;
|
||||||
|
z-index:-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dia-top-left-bottom-right:after {
|
||||||
|
content: "";
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
background: linear-gradient(to top right, transparent calc(50% - 2px), black, transparent calc(50% + 2px));
|
||||||
|
}
|
||||||
|
|
||||||
|
.dia-top-right-bottom-left:after {
|
||||||
|
content: "";
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
background: linear-gradient(to top left, transparent calc(50% - 2px), black, transparent calc(50% + 2px));
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div id="dashboard-fixed-wrapper" class="row">
|
||||||
|
<div id="dashboard-fixed-container" style="width:1110px;height:770px;position:relative;margin:auto;">
|
||||||
|
@component('components.circle', [
|
||||||
|
'document_title' => 'Kekurangan Potensi',
|
||||||
|
'document_color' => '#911701',
|
||||||
|
'document_type' => 'Pemohon',
|
||||||
|
'document_id' => 'chart-all-task',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'top:150px;'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
@component('components.circle', [
|
||||||
|
'document_title' => 'Target PAD 2024',
|
||||||
|
'document_color' => '#020e42',
|
||||||
|
'document_type' => 'Pemohon',
|
||||||
|
'document_id' => 'chart-all-task',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'left:200px;'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
<div class="square dia-top-left-bottom-right" style="top:150px;left:350px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="square dia-top-right-bottom-left" style="top:150px;left:150px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@component('components.circle', [
|
||||||
|
'document_title' => 'Total Potensi Berkas',
|
||||||
|
'document_color' => '#02acfa',
|
||||||
|
'document_type' => 'Pemohon',
|
||||||
|
'document_id' => 'chart-all-task',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'left:400px;top:150px;'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
<div class="square dia-top-right-bottom-left" style="top:300px;left:350px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="square dia-top-left-bottom-right" style="top:300px;left:550px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="row d-flex justify-content-center">
|
|
||||||
@component('components.circle', [
|
@component('components.circle', [
|
||||||
'document_title' => 'Perkiraan Potensi PBG Dari Tata Ruang',
|
'document_title' => 'Perkiraan Potensi PBG Dari Tata Ruang',
|
||||||
'document_color' => '#bf04bc',
|
'document_color' => '#bf04bc',
|
||||||
'document_type' => 'Pemohon',
|
'document_type' => 'Pemohon',
|
||||||
'document_id' => 'chart-all-task',
|
'document_id' => 'chart-all-task',
|
||||||
'visible_small_circle' => true
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'left:600px;'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
<div class="square dia-top-right-bottom-left" style="top:150px;left:550px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@component('components.circle', [
|
||||||
|
'document_title' => 'Non Usaha',
|
||||||
|
'document_color' => '#028399',
|
||||||
|
'document_type' => 'Berkas',
|
||||||
|
'document_id' => 'chart-non-business',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'left:900px;top:150px;'
|
||||||
])
|
])
|
||||||
@endcomponent
|
@endcomponent
|
||||||
|
|
||||||
@component('components.circle', [
|
@component('components.circle', [
|
||||||
'document_title' => 'Perkiraan Potensi PBG Dari Tata Ruang',
|
'document_title' => 'Usaha',
|
||||||
'document_color' => '#f75b1b',
|
'document_color' => '#616b7d',
|
||||||
'document_type' => 'Pemohon',
|
'document_type' => 'Berkas',
|
||||||
'document_id' => 'chart-all-task',
|
'document_id' => 'chart-business',
|
||||||
'visible_small_circle' => true
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'left:900px;top:400px;'
|
||||||
])
|
])
|
||||||
@endcomponent
|
@endcomponent
|
||||||
|
|
||||||
|
@component('components.circle', [
|
||||||
|
'document_title' => 'Berkas Terverifikasi',
|
||||||
|
'document_color' => '#0561f5',
|
||||||
|
'document_type' => 'Berkas',
|
||||||
|
'document_id' => 'chart-business',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'top:300px;left:200px;'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
<div class="square dia-top-right-bottom-left" style="top:500px;left:200px;width:50px">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="square dia-top-left-bottom-right" style="top:450px;left:350px;width:500px;height:200px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@component('components.circle', [
|
||||||
|
'document_title' => 'Berkas Belum Terverifikasi',
|
||||||
|
'document_color' => '#b973ff',
|
||||||
|
'document_type' => 'Berkas',
|
||||||
|
'document_id' => 'chart-business',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'top:300px;left:600px;'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
<div class="square dia-top-right-bottom-left" style="top:200px;left:750px;width:250px;height:150px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="square dia-top-left-bottom-right" style="top:400px;left:750px;width:250px;height:150px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
@component('components.circle',[
|
||||||
|
'document_title' => 'Realisasi Terbit PBG',
|
||||||
|
'document_color' => '#09ab5a',
|
||||||
|
'document_type' => 'Berkas',
|
||||||
|
'document_id' => 'chart-business',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'top:550px;left:100px;'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
<div class="square" style="top:650px;left:200px;width:250px;height:2px;background-color:black;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@component('components.circle',[
|
||||||
|
'document_title' => 'Menunggu Klik DPMPTSP',
|
||||||
|
'document_color' => '#0294ad',
|
||||||
|
'document_type' => 'Berkas',
|
||||||
|
'document_id' => 'chart-business',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'top:550px;left:400px'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
|
||||||
|
<div class="square" style="top:650px;left:600px;width:250px;height:2px;background-color:black;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@component('components.circle',[
|
||||||
|
'document_title' => 'Berproses Di Dinas Teknis',
|
||||||
|
'document_color' => '#422519',
|
||||||
|
'document_type' => 'Berkas',
|
||||||
|
'document_id' => 'chart-business',
|
||||||
|
'visible_small_circle' => true,
|
||||||
|
'style' => 'top:550px;left:700px'
|
||||||
|
])
|
||||||
|
@endcomponent
|
||||||
|
</div>
|
||||||
|
<div class="row d-flex justify-content-center">
|
||||||
|
|
||||||
|
|
||||||
<!-- <div id="circle1" class="absolute w-16 h-16 bg-blue-500 rounded-full flex items-center justify-center text-white text-lg font-bold top-40 left-40">
|
<!-- <div id="circle1" class="absolute w-16 h-16 bg-blue-500 rounded-full flex items-center justify-center text-white text-lg font-bold top-40 left-40">
|
||||||
1
|
1
|
||||||
</div>
|
</div>
|
||||||
@@ -42,99 +203,29 @@
|
|||||||
</svg> -->
|
</svg> -->
|
||||||
</div>
|
</div>
|
||||||
<div class="row d-flex justify-content-center">
|
<div class="row d-flex justify-content-center">
|
||||||
@component('components.circle', [
|
|
||||||
'document_title' => 'Target PAD 2024',
|
|
||||||
'document_color' => '#020e42',
|
|
||||||
'document_type' => 'Pemohon',
|
|
||||||
'document_id' => 'chart-all-task',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row d-flex justify-content-center">
|
<div class="row d-flex justify-content-center">
|
||||||
@component('components.circle', [
|
|
||||||
'document_title' => 'Kekurangan Potensi',
|
|
||||||
'document_color' => '#911701',
|
|
||||||
'document_type' => 'Pemohon',
|
|
||||||
'document_id' => 'chart-all-task',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
|
|
||||||
@component('components.circle', [
|
|
||||||
'document_title' => 'Total Potensi Berkas',
|
|
||||||
'document_color' => '#02acfa',
|
|
||||||
'document_type' => 'Pemohon',
|
|
||||||
'document_id' => 'chart-all-task',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row d-flex justify-content-center">
|
<div class="row d-flex justify-content-center">
|
||||||
@component('components.circle', [
|
|
||||||
'document_title' => 'Berkas Terverifikasi',
|
|
||||||
'document_color' => '#0561f5',
|
|
||||||
'document_type' => 'Berkas',
|
|
||||||
'document_id' => 'chart-business',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
|
|
||||||
@component('components.circle', [
|
|
||||||
'document_title' => 'Berkas Belum Terverifikasi',
|
|
||||||
'document_color' => '#b973ff',
|
|
||||||
'document_type' => 'Berkas',
|
|
||||||
'document_id' => 'chart-business',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row d-flex justify-content-center">
|
<div class="row d-flex justify-content-center">
|
||||||
@component('components.circle', [
|
|
||||||
'document_title' => 'Non Usaha',
|
|
||||||
'document_color' => '#028399',
|
|
||||||
'document_type' => 'Berkas',
|
|
||||||
'document_id' => 'chart-non-business',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
|
|
||||||
@component('components.circle', [
|
|
||||||
'document_title' => 'Usaha',
|
|
||||||
'document_color' => '#616b7d',
|
|
||||||
'document_type' => 'Berkas',
|
|
||||||
'document_id' => 'chart-business',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
|
|
||||||
@component('components.circle',[
|
|
||||||
'document_title' => 'Realisasi Terbit PBG',
|
|
||||||
'document_color' => '#09ab5a',
|
|
||||||
'document_type' => 'Berkas',
|
|
||||||
'document_id' => 'chart-business',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
|
|
||||||
@component('components.circle',[
|
|
||||||
'document_title' => 'Berproses Di Dinas Teknis',
|
|
||||||
'document_color' => '#422519',
|
|
||||||
'document_type' => 'Berkas',
|
|
||||||
'document_id' => 'chart-business',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row d-flex justify-content-center">
|
<div class="row d-flex justify-content-center">
|
||||||
@component('components.circle',[
|
|
||||||
'document_title' => 'Progress Manual',
|
|
||||||
'document_color' => '#0294ad',
|
|
||||||
'document_type' => 'Berkas',
|
|
||||||
'document_id' => 'chart-business',
|
|
||||||
'visible_small_circle' => true
|
|
||||||
])
|
|
||||||
@endcomponent
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user