Compare commits

...

16 Commits

Author SHA1 Message Date
arifal
080582f7ab add new menu peta in dashboard 2025-02-21 11:12:35 +07:00
arifal
91475aeead Merge branch 'dev' into feat/load-map-from-kmz 2025-02-21 10:43:06 +07:00
arifal
a7afbd69fb fix conflict spatial-plannings jamal 2025-02-21 09:07:15 +07:00
arifal
1ff5587050 merge conflix spatial-plannings 2025-02-21 08:42:08 +07:00
arifal
9c8a1a3f3f add vite js customers 2025-02-21 00:49:29 +07:00
arifal
5c4be7635b partial update crud customer data 2025-02-21 00:46:33 +07:00
arifal
7a56735099 done crud spatial plannings 2025-02-20 15:35:06 +07:00
arifal
5d50d6d6cc fix height card 2025-02-19 15:34:28 +07:00
arifal
39717d184c partial update create google map from kmz file 2025-02-19 14:31:12 +07:00
arifal
54146c8c08 partial update spatial plannings crud 2025-02-19 12:08:18 +07:00
arifal
e8da7193ef fix crud users 2025-02-19 11:23:15 +07:00
arifal
006c008542 done dashboard-potential 2025-02-19 07:22:06 +07:00
root
39bb8e6d5f hot fix vite and create view 2025-02-18 23:49:48 +00:00
arifal
7994a62cea change name dashboard 2025-02-19 06:24:44 +07:00
arifal
3a09e2e68a Merge branch 'bug-fix/tourisms' into feat/dashboard-kekurangan-potensi 2025-02-19 06:17:16 +07:00
arifal
116dc1c8c7 add dashboard potential 2025-02-19 06:15:35 +07:00
134 changed files with 1760 additions and 2540 deletions

View File

@@ -0,0 +1,130 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\CustomersRequest;
use App\Http\Requests\ExcelUploadRequest;
use App\Http\Resources\CustomersResource;
use App\Imports\CustomersImport;
use App\Models\Customer;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class CustomersController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$query = Customer::query()->orderBy('id', 'desc');
if ($request->has('search') &&!empty($request->get('search'))) {
$query = $query->where('nomor_pelanggan', 'LIKE', '%'.$request->get('search').'%')
->orWhere('nama', 'LIKE', '%'.$request->get('search').'%')
->orWhere('kota_palayanan', 'LIKE', '%'.$request->get('search').'%');
}
return CustomersResource::collection($query->paginate());
}
/**
* Store a newly created resource in storage.
*/
public function store(CustomersRequest $request)
{
try{
$customer = Customer::create($request->validated());
return response()->json(['message' => 'Successfully created', new CustomersResource($customer)]);
}catch(\Exception $e){
return response()->json([
'message' => 'Failed to create customer',
'error' => $e->getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
try{
$customer = Customer::find($id);
if($customer){
return new CustomersResource($customer);
} else {
return response()->json(['message' => 'Customer not found'], 404);
}
}catch(\Exception $e){
return response()->json([
'message' => 'Failed to retrieve customer',
'error' => $e->getMessage()
], 500);
}
}
/**
* Update the specified resource in storage.
*/
public function update(CustomersRequest $request, string $id)
{
try{
$customer = Customer::find($id);
if($customer){
$customer->update($request->validated());
return response()->json(['message' => 'Successfully updated', new CustomersResource($customer)]);
} else {
return response()->json(['message' => 'Customer not found'], 404);
}
}catch(\Exception $e) {
return response()->json([
'message' => 'Failed to update customer',
'error' => $e->getMessage()
], 500);
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
try{
$customer = Customer::find($id);
if($customer){
$customer->delete();
return response()->json(['message' => 'Successfully deleted']);
}else {
return response()->json(['message' => 'Customer not found'], 404);
}
}catch(\Exception $e) {
return response()->json([
'message' => 'Failed to delete customer',
'error' => $e->getMessage()
], 500);
}
}
public function upload(ExcelUploadRequest $request){
try{
if(!$request->hasFile('file')){
return response()->json([
'error' => 'No file provided'
], 400);
}
$file = $request->file('file');
Excel::import(new CustomersImport, $file);
return response()->json([
'message' => 'File uploaded successfully',
]);
}catch(\Exception $e){
\Log::info($e->getMessage());
return response()->json([
'error' => 'Failed to upload file',
'message' => $e->getMessage()
], 500);
}
}
}

View File

@@ -38,20 +38,20 @@ class UsersController extends Controller
return response()->json(['message' => 'logged out successfully']);
}
public function store(UsersRequest $request){
$validate_data = $request->validated();
$validate_data = $request->validated();
DB::beginTransaction();
try{
$user = User::create([
'name' => $validate_data->name,
'email' => $validate_data->email,
'password' => Hash::make($validate_data->password),
'firstname' => $validate_data->firstname,
'lastname' => $validate_data->lastname,
'position' => $validate_data->position
'name' => $validate_data['name'],
'email' => $validate_data['email'],
'password' => Hash::make($validate_data['password']),
'firstname' => $validate_data['firstname'],
'lastname' => $validate_data['lastname'],
'position' => $validate_data['position'],
]);
$user->roles()->attach($request->role_id);
$user->roles()->attach((int) $validate_data['role_id']);
DB::commit();
return response()->json(['message' => 'Successfully created'],201);
@@ -60,4 +60,27 @@ class UsersController extends Controller
return response()->json(['message' => $e->getMessage()],500);
};
}
public function update(UsersRequest $request, $id){
try{
$validate_data = $request->validated();
$user = User::findOrFail($id);
DB::beginTransaction();
$user->update([
'name' => $validate_data['name'],
'email' => $validate_data['email'],
'firstname' => $validate_data['firstname'],
'lastname' => $validate_data['lastname'],
'position' => $validate_data['position']
]);
$user->roles()->sync($request->role_id);
DB::commit();
return response()->json(['message' => 'Successfully updated'], 200);
}catch(\Exception $e){
DB::rollBack();
return response()->json(['message' => $e->getMessage()],500);
}
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers;
use App\Models\Customer;
use Illuminate\Http\Request;
class CustomersController extends Controller
{
public function index()
{
return view('customers.index');
}
public function create()
{
return view('customers.create');
}
public function edit(string $id)
{
$data = Customer::findOrFail($id);
return view('customers.edit', compact('data'));
}
public function upload(){
return view('customers.upload');
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers\Dashboards;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class LackOfPotentialController extends Controller
{
public function lack_of_potential(){
return view('dashboards.lack_of_potential');
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class GoogleApisController extends Controller
{
public function index(){
return view('maps.google-api');
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CustomersRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'nomor_pelanggan' => ['required', 'string'],
'kota_pelayanan' => ['required', 'string'],
'nama' => ['required', 'string'],
'alamat' => ['required', 'string'],
'latitude' => ['required', 'numeric', 'between:-90,90'],
'longitude' => ['required', 'numeric', 'between:-180,180'],
];
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ExcelUploadRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
"file" => "required|file|mimes:xlsx,xls|max:102400"
];
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class SpatialPlanningsRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => ['required','string','max:255'],
'kbli' => ['required','string','max:255'],
'kegiatan' => ['required','string'],
'luas' => ['required','numeric','regex:/^\d{1,16}(\.\d{1,2})?$/'],
'lokasi' => ['required','string'],
'nomor' => ['required','string','max:255',Rule::unique('spatial_plannings')->ignore($this->id)],
'sp_date' => ['required','date'],
];
}
}

View File

@@ -22,7 +22,7 @@ class UsersRequest extends FormRequest
*/
public function rules(): array
{
$userId = $this->route('user'); // Get user ID from route (used in update)
$userId = $this->route('users'); // Get user ID from route (used in update)
return [
'name' => ['required', 'string', 'max:255'],
@@ -31,7 +31,7 @@ class UsersRequest extends FormRequest
'string',
'email',
'max:255',
Rule::unique('users')->ignore($userId), // Ignore the user's own email when updating
Rule::unique('users')->ignore($userId)
],
'password' => [$this->isMethod('post') ? 'required' : 'nullable', 'confirmed', 'max:255'],
'firstname' => ['required', 'string', 'max:255'],

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class CustomersResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class SpatialPlanningsResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return parent::toArray($request);
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace App\Imports;
use App\Models\Customer;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithLimit;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
class CustomersImport implements ToCollection, WithMultipleSheets
{
/**
* @param Collection $collection
*/
public function collection(Collection $collection)
{
$batchData = [];
foreach ($collection->skip(1) as $row) {
if (!isset($row[0]) || empty($row[0])) {
continue;
}
$latitude = filter_var($row[4], FILTER_VALIDATE_FLOAT) ? bcadd($row[4], '0', 18) : null;
$longitude = filter_var($row[5], FILTER_VALIDATE_FLOAT) ? bcadd($row[5], '0', 18) : null;
$batchData[] = [
'nomor_pelanggan' => $row[0],
'kota_pelayanan' => $row[1],
'nama' => $row[2],
'alamat' => $row[3],
'latitude' => $latitude,
'longitude' => $longitude,
];
}
if (!empty($batchData)) {
Customer::upsert($batchData, ['nomor_pelanggan'], ['kota_pelayanan', 'nama', 'alamat', 'latitude', 'longitude']);
}
}
public function sheets(): array {
return [
0 => $this
];
}
}

20
app/Models/Customer.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Customer extends Model
{
protected $table = 'customers';
protected $fillable = [
'nomor_pelanggan',
'kota_pelayanan',
'nama',
'alamat',
'latitude',
'longitude',
];
}

View File

@@ -0,0 +1,26 @@
<?php
namespace App\View\Components;
use Closure;
use Illuminate\Contracts\View\View;
use Illuminate\View\Component;
class CustomCircle extends Component
{
/**
* Create a new component instance.
*/
public function __construct()
{
//
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
{
return view('components.custom-circle');
}
}

View File

@@ -19,7 +19,6 @@
},
"require-dev": {
"fakerphp/faker": "^1.23",
"ibex/crud-generator": "^2.1",
"laravel/pail": "^1.1",
"laravel/pint": "^1.13",
"laravel/sail": "^1.26",

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('customers', function (Blueprint $table) {
$table->id();
$table->string('nomor_pelanggan')->unique();
$table->string('kota_pelayanan');
$table->string('nama');
$table->text('alamat');
$table->decimal('latitude', 22,18);
$table->decimal('longitude', 22,18);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('customers');
}
};

View File

@@ -109,6 +109,20 @@ class UsersRoleMenuSeeder extends Seeder
"parent_id" => $dashboard->id,
"sort_order" => 2,
],
[
"name" => "Dashboard Potensi",
"url" => "dashboard.lack_of_potential",
"icon" => null,
"parent_id" => $dashboard->id,
"sort_order" => 3,
],
[
"name" => "PETA",
"url" => "dashboard.maps",
"icon" => null,
"parent_id" => $dashboard->id,
"sort_order" => 4,
],
[
"name" => "Users",
"url" => "users.index",
@@ -179,6 +193,20 @@ class UsersRoleMenuSeeder extends Seeder
"parent_id" => $data->id,
"sort_order" => 5,
],
[
"name" => "Tata Ruang",
"url" => "spatial-plannings.index",
"icon" => null,
"parent_id" => $data->id,
"sort_order" => 6,
],
[
"name" => "PDAM",
"url" => "customers",
"icon" => null,
"parent_id" => $data->id,
"sort_order" => 7,
],
[
"name" => "Lap Pariwisata",
"url" => "tourisms.index",
@@ -205,6 +233,10 @@ class UsersRoleMenuSeeder extends Seeder
$pariwisata = Menu::where('name', 'Pariwisata')->first();
$laporan_pariwisata = Menu::where('name', 'Lap Pariwisata')->first();
$umkm = Menu::where('name', 'UMKM')->first();
$lack_of_potentials = Menu::where('name', 'Dashboard Potensi')->first();
$spatial_plannings = Menu::where('name', 'Tata Ruang')->first();
$pdam = Menu::where('name', 'PDAM')->first();
$peta = Menu::where('name', 'PETA')->first();
// Superadmin gets all menus
$superadmin->menus()->sync([
@@ -229,6 +261,10 @@ class UsersRoleMenuSeeder extends Seeder
$pariwisata->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
$laporan_pariwisata->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
$umkm->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
$lack_of_potentials->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
$spatial_plannings->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
$pdam->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
$peta->id => ["allow_show" => true, "allow_create" => true, "allow_update" => true, "allow_destroy" => true],
]);
// Admin gets limited menus

2
package-lock.json generated
View File

@@ -1,5 +1,5 @@
{
"name": "sibedas-pbg-web",
"name": "sibedas-pbg",
"lockfileVersion": 3,
"requires": true,
"packages": {

View File

@@ -1,516 +0,0 @@
{
"__commonjsHelpers-C4iS2aBk.js": {
"file": "assets/_commonjsHelpers-C4iS2aBk.js",
"name": "_commonjsHelpers"
},
"_apexcharts.common-7mov3gaG.js": {
"file": "assets/apexcharts.common-7mov3gaG.js",
"name": "apexcharts.common",
"imports": [
"__commonjsHelpers-C4iS2aBk.js"
]
},
"_dropzone-B5tMhgFp.js": {
"file": "assets/dropzone-B5tMhgFp.js",
"name": "dropzone"
},
"_global-config-9uDKFQ8j.js": {
"file": "assets/global-config-9uDKFQ8j.js",
"name": "global-config"
},
"_gridjs.umd-BiCNXlqL.js": {
"file": "assets/gridjs.umd-BiCNXlqL.js",
"name": "gridjs.umd",
"imports": [
"__commonjsHelpers-C4iS2aBk.js"
]
},
"_table-generator-DPFVsCqk.js": {
"file": "assets/table-generator-DPFVsCqk.js",
"name": "table-generator",
"imports": [
"_gridjs.umd-BiCNXlqL.js"
]
},
"_world-BH8KG5u4.js": {
"file": "assets/world-BH8KG5u4.js",
"name": "world",
"imports": [
"__commonjsHelpers-C4iS2aBk.js"
]
},
"node_modules/flatpickr/dist/flatpickr.min.css": {
"file": "assets/flatpickr-CksuuEqD.css",
"src": "node_modules/flatpickr/dist/flatpickr.min.css",
"isEntry": true
},
"node_modules/flatpickr/dist/themes/dark.css": {
"file": "assets/dark-CLxH30By.css",
"src": "node_modules/flatpickr/dist/themes/dark.css",
"isEntry": true
},
"node_modules/gridjs/dist/theme/mermaid.css": {
"file": "assets/mermaid-B5wPN5RC.css",
"src": "node_modules/gridjs/dist/theme/mermaid.css",
"isEntry": true
},
"node_modules/gridjs/dist/theme/mermaid.min.css": {
"file": "assets/mermaid-1KsrsKla.css",
"src": "node_modules/gridjs/dist/theme/mermaid.min.css",
"isEntry": true
},
"node_modules/quill/dist/quill.bubble.css": {
"file": "assets/quill-BzaoboQ1.css",
"src": "node_modules/quill/dist/quill.bubble.css",
"isEntry": true
},
"node_modules/quill/dist/quill.snow.css": {
"file": "assets/quill-D-Ncpkvi.css",
"src": "node_modules/quill/dist/quill.snow.css",
"isEntry": true
},
"public/images/bg-dashboard.jpg": {
"file": "assets/bg-dashboard-CUwt8_jP.jpg",
"src": "public/images/bg-dashboard.jpg"
},
"resources/fonts/boxicons.eot": {
"file": "assets/boxicons-0t2gX1vj.eot",
"src": "resources/fonts/boxicons.eot"
},
"resources/fonts/boxicons.svg": {
"file": "assets/boxicons-KSR1BgPC.svg",
"src": "resources/fonts/boxicons.svg"
},
"resources/fonts/boxicons.ttf": {
"file": "assets/boxicons-BEZXjQG5.ttf",
"src": "resources/fonts/boxicons.ttf"
},
"resources/fonts/boxicons.woff": {
"file": "assets/boxicons-CEgI8ccS.woff",
"src": "resources/fonts/boxicons.woff"
},
"resources/fonts/boxicons.woff2": {
"file": "assets/boxicons-C7pETWQJ.woff2",
"src": "resources/fonts/boxicons.woff2"
},
"resources/js/app.js": {
"file": "assets/app-Wz_4hh3O.js",
"name": "app",
"src": "resources/js/app.js",
"isEntry": true,
"imports": [
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/business-industries/create.js": {
"file": "assets/create-CiRhiWZV.js",
"name": "create",
"src": "resources/js/business-industries/create.js",
"isEntry": true,
"imports": [
"_dropzone-B5tMhgFp.js",
"_global-config-9uDKFQ8j.js"
]
},
"resources/js/business-industries/index.js": {
"file": "assets/index-BIXijOG8.js",
"name": "index",
"src": "resources/js/business-industries/index.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/business-industries/update.js": {
"file": "assets/update-C8VOvIbF.js",
"name": "update",
"src": "resources/js/business-industries/update.js",
"isEntry": true
},
"resources/js/config.js": {
"file": "assets/config-DqV4EBmE.js",
"name": "config",
"src": "resources/js/config.js",
"isEntry": true
},
"resources/js/dashboards/bigdata.js": {
"file": "assets/bigdata-BGlke4DN.js",
"name": "bigdata",
"src": "resources/js/dashboards/bigdata.js",
"isEntry": true,
"imports": [
"_global-config-9uDKFQ8j.js"
],
"css": [
"assets/flatpickr-CksuuEqD.css"
]
},
"resources/js/data-settings/create.js": {
"file": "assets/create-C1IbeTHP.js",
"name": "create",
"src": "resources/js/data-settings/create.js",
"isEntry": true
},
"resources/js/data-settings/index.js": {
"file": "assets/index-C4raIbBK.js",
"name": "index",
"src": "resources/js/data-settings/index.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/data-settings/update.js": {
"file": "assets/update-nNw3P4hj.js",
"name": "update",
"src": "resources/js/data-settings/update.js",
"isEntry": true
},
"resources/js/data/advertisements/data-advertisements.js": {
"file": "assets/data-advertisements-ckr1EtLP.js",
"name": "data-advertisements",
"src": "resources/js/data/advertisements/data-advertisements.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"_table-generator-DPFVsCqk.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/data/advertisements/form-create-update.js": {
"file": "assets/form-create-update-CyN97GsU.js",
"name": "form-create-update",
"src": "resources/js/data/advertisements/form-create-update.js",
"isEntry": true,
"imports": [
"_global-config-9uDKFQ8j.js"
]
},
"resources/js/data/advertisements/form-upload.js": {
"file": "assets/form-upload-tA9zPESO.js",
"name": "form-upload",
"src": "resources/js/data/advertisements/form-upload.js",
"isEntry": true,
"imports": [
"_dropzone-B5tMhgFp.js",
"_global-config-9uDKFQ8j.js"
]
},
"resources/js/data/tourisms/data-tourisms.js": {
"file": "assets/data-tourisms-Db9aMSJn.js",
"name": "data-tourisms",
"src": "resources/js/data/tourisms/data-tourisms.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"_table-generator-DPFVsCqk.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/data/tourisms/form-create-update.js": {
"file": "assets/form-create-update-SviVezNW.js",
"name": "form-create-update",
"src": "resources/js/data/tourisms/form-create-update.js",
"isEntry": true,
"imports": [
"_global-config-9uDKFQ8j.js"
]
},
"resources/js/data/tourisms/form-upload.js": {
"file": "assets/form-upload-BtbLOLpA.js",
"name": "form-upload",
"src": "resources/js/data/tourisms/form-upload.js",
"isEntry": true,
"imports": [
"_dropzone-B5tMhgFp.js",
"_global-config-9uDKFQ8j.js"
]
},
"resources/js/data/umkm/data-umkm.js": {
"file": "assets/data-umkm-CLB33rMj.js",
"name": "data-umkm",
"src": "resources/js/data/umkm/data-umkm.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"_table-generator-DPFVsCqk.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/data/umkm/form-create-update.js": {
"file": "assets/form-create-update-BrB0xTMN.js",
"name": "form-create-update",
"src": "resources/js/data/umkm/form-create-update.js",
"isEntry": true,
"imports": [
"_global-config-9uDKFQ8j.js"
]
},
"resources/js/data/umkm/form-upload.js": {
"file": "assets/form-upload-BDyAWo4b.js",
"name": "form-upload",
"src": "resources/js/data/umkm/form-upload.js",
"isEntry": true,
"imports": [
"_dropzone-B5tMhgFp.js",
"_global-config-9uDKFQ8j.js"
]
},
"resources/js/master/users/create.js": {
"file": "assets/create-BfiYISiN.js",
"name": "create",
"src": "resources/js/master/users/create.js",
"isEntry": true
},
"resources/js/master/users/update.js": {
"file": "assets/update-DhoG4v8r.js",
"name": "update",
"src": "resources/js/master/users/update.js",
"isEntry": true
},
"resources/js/master/users/users.js": {
"file": "assets/users-jfWUOWyP.js",
"name": "users",
"src": "resources/js/master/users/users.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/menus/create.js": {
"file": "assets/create-ChUgh-yc.js",
"name": "create",
"src": "resources/js/menus/create.js",
"isEntry": true
},
"resources/js/menus/index.js": {
"file": "assets/index-C4xA1kYa.js",
"name": "index",
"src": "resources/js/menus/index.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/menus/update.js": {
"file": "assets/update-8JQOGES4.js",
"name": "update",
"src": "resources/js/menus/update.js",
"isEntry": true
},
"resources/js/pages/chart.js": {
"file": "assets/chart-DQBoD9wk.js",
"name": "chart",
"src": "resources/js/pages/chart.js",
"isEntry": true,
"imports": [
"_apexcharts.common-7mov3gaG.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/pages/dashboard.js": {
"file": "assets/dashboard-nkb3Omy9.js",
"name": "dashboard",
"src": "resources/js/pages/dashboard.js",
"isEntry": true,
"imports": [
"_apexcharts.common-7mov3gaG.js",
"_world-BH8KG5u4.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/pages/form-fileupload.js": {
"file": "assets/form-fileupload-DGbdX8GT.js",
"name": "form-fileupload",
"src": "resources/js/pages/form-fileupload.js",
"isEntry": true,
"imports": [
"_dropzone-B5tMhgFp.js"
]
},
"resources/js/pages/form-flatepicker.js": {
"file": "assets/form-flatepicker-ChSlk6xC.js",
"name": "form-flatepicker",
"src": "resources/js/pages/form-flatepicker.js",
"isEntry": true,
"imports": [
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/pages/form-quilljs.js": {
"file": "assets/form-quilljs-pSObT4Ti.js",
"name": "form-quilljs",
"src": "resources/js/pages/form-quilljs.js",
"isEntry": true,
"imports": [
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/pages/maps-canada.js": {
"file": "assets/maps-canada-Btz07hSk.js",
"name": "maps-canada",
"src": "resources/js/pages/maps-canada.js",
"isEntry": true
},
"resources/js/pages/maps-google.js": {
"file": "assets/maps-google-KamR_rNw.js",
"name": "maps-google",
"src": "resources/js/pages/maps-google.js",
"isEntry": true,
"imports": [
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/pages/maps-iraq.js": {
"file": "assets/maps-iraq-Blhf9V_8.js",
"name": "maps-iraq",
"src": "resources/js/pages/maps-iraq.js",
"isEntry": true
},
"resources/js/pages/maps-russia.js": {
"file": "assets/maps-russia-C3XucoMP.js",
"name": "maps-russia",
"src": "resources/js/pages/maps-russia.js",
"isEntry": true
},
"resources/js/pages/maps-spain.js": {
"file": "assets/maps-spain-CdBIHB66.js",
"name": "maps-spain",
"src": "resources/js/pages/maps-spain.js",
"isEntry": true
},
"resources/js/pages/maps-vector.js": {
"file": "assets/maps-vector-C2WpvMU7.js",
"name": "maps-vector",
"src": "resources/js/pages/maps-vector.js",
"isEntry": true,
"imports": [
"_world-BH8KG5u4.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/pages/table-gridjs.js": {
"file": "assets/table-gridjs-BQh80cFh.js",
"name": "table-gridjs",
"src": "resources/js/pages/table-gridjs.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/pbg-task/index.js": {
"file": "assets/index-CqcfkvSL.js",
"name": "index",
"src": "resources/js/pbg-task/index.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/report/tourisms/index.js": {
"file": "assets/index-DlxOSPEG.js",
"name": "index",
"src": "resources/js/report/tourisms/index.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/roles/create.js": {
"file": "assets/create-Dd-lHOwF.js",
"name": "create",
"src": "resources/js/roles/create.js",
"isEntry": true
},
"resources/js/roles/index.js": {
"file": "assets/index-C_kI_q7O.js",
"name": "index",
"src": "resources/js/roles/index.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/roles/role_menu.js": {
"file": "assets/role_menu-BuFAi1wM.js",
"name": "role_menu",
"src": "resources/js/roles/role_menu.js",
"isEntry": true
},
"resources/js/roles/update.js": {
"file": "assets/update-CapXnAP8.js",
"name": "update",
"src": "resources/js/roles/update.js",
"isEntry": true
},
"resources/js/settings/general/general-settings.js": {
"file": "assets/general-settings-BoJeYQk1.js",
"name": "general-settings",
"src": "resources/js/settings/general/general-settings.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/settings/syncronize/syncronize.js": {
"file": "assets/syncronize-DjtcngRb.js",
"name": "syncronize",
"src": "resources/js/settings/syncronize/syncronize.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/js/tables/common-table.js": {
"file": "assets/common-table-KF_NVAIE.js",
"name": "common-table",
"src": "resources/js/tables/common-table.js",
"isEntry": true,
"imports": [
"_gridjs.umd-BiCNXlqL.js",
"_global-config-9uDKFQ8j.js",
"__commonjsHelpers-C4iS2aBk.js"
]
},
"resources/scss/components/_circle.scss": {
"file": "assets/_circle-DgPqpfJw.css",
"src": "resources/scss/components/_circle.scss",
"isEntry": true
},
"resources/scss/dashboards/_bigdata.scss": {
"file": "assets/_bigdata-Syu0AGbZ.css",
"src": "resources/scss/dashboards/_bigdata.scss",
"isEntry": true
},
"resources/scss/icons.scss": {
"file": "assets/icons-CHxf0fE3.css",
"src": "resources/scss/icons.scss",
"isEntry": true
},
"resources/scss/style.scss": {
"file": "assets/style-CnBzxVPJ.css",
"src": "resources/scss/style.scss",
"isEntry": true
}
}

View File

@@ -0,0 +1,65 @@
class CreateCustomer {
constructor() {
this.initCreateCustomer();
}
initCreateCustomer() {
const toastNotification = document.getElementById("toastNotification");
const toast = new bootstrap.Toast(toastNotification);
document
.getElementById("btnCreateCustomer")
.addEventListener("click", async function () {
let submitButton = this;
let spinner = document.getElementById("spinner");
let form = document.getElementById("formCreateCustomer");
if (!form) {
console.error("Form element not found!");
return;
}
// Get form data
let formData = new FormData(form);
// Disable button and show spinner
submitButton.disabled = true;
spinner.classList.remove("d-none");
try {
let response = await fetch(form.action, {
method: "POST",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
},
body: formData,
});
if (response.ok) {
let result = await response.json();
document.getElementById("toast-message").innerText =
result.message;
toast.show();
setTimeout(() => {
window.location.href = "/data/customers";
}, 2000);
} else {
let error = await response.json();
document.getElementById("toast-message").innerText =
error.message;
toast.show();
console.error("Error:", error);
}
} catch (error) {
console.error("Request failed:", error);
document.getElementById("toast-message").innerText =
error.message;
toast.show();
}
});
}
}
document.addEventListener("DOMContentLoaded", function (e) {
new CreateCustomer();
});

View File

@@ -0,0 +1,65 @@
class UpdateCustomer {
constructor() {
this.initUpdateSpatial();
}
initUpdateSpatial() {
const toastNotification = document.getElementById("toastNotification");
const toast = new bootstrap.Toast(toastNotification);
document
.getElementById("btnUpdateCustomer")
.addEventListener("click", async function () {
let submitButton = this;
let spinner = document.getElementById("spinner");
let form = document.getElementById("formUpdateCustomer");
if (!form) {
console.error("Form element not found!");
return;
}
// Get form data
let formData = new FormData(form);
// Disable button and show spinner
submitButton.disabled = true;
spinner.classList.remove("d-none");
try {
let response = await fetch(form.action, {
method: "POST",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
},
body: formData,
});
if (response.ok) {
let result = await response.json();
document.getElementById("toast-message").innerText =
result.message;
toast.show();
setTimeout(() => {
window.location.href = "/data/customers";
}, 2000);
} else {
let error = await response.json();
document.getElementById("toast-message").innerText =
error.message;
toast.show();
console.error("Error:", error);
}
} catch (error) {
console.error("Request failed:", error);
document.getElementById("toast-message").innerText =
error.message;
toast.show();
}
});
}
}
document.addEventListener("DOMContentLoaded", function (e) {
new UpdateCustomer();
});

View File

@@ -0,0 +1,151 @@
import { Grid } from "gridjs/dist/gridjs.umd.js";
import gridjs from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../global-config";
import Swal from "sweetalert2";
class Customers {
constructor() {
this.toastMessage = document.getElementById("toast-message");
this.toastElement = document.getElementById("toastNotification");
this.toast = new bootstrap.Toast(this.toastElement);
this.table = null;
// Initialize functions
this.initTableSpatialPlannings();
this.initEvents();
}
initEvents() {
document.body.addEventListener("click", async (event) => {
const deleteButton = event.target.closest(".btn-delete-customers");
if (deleteButton) {
event.preventDefault();
await this.handleDelete(deleteButton);
}
});
}
initTableSpatialPlannings() {
let tableContainer = document.getElementById("table-customers");
// Create a new Grid.js instance only if it doesn't exist
this.table = new Grid({
columns: [
"ID",
"Nomor Pelanggan",
"Nama",
"Kota Pelayanan",
"Alamat",
"Latitude",
"Longitude",
{
name: "Action",
formatter: (cell) =>
gridjs.html(`
<div class="d-flex justify-content-center gap-2">
<a href="/data/customers/${cell}/edit" class="btn btn-yellow btn-sm d-inline-flex align-items-center justify-content-center">
<i class='bx bx-edit'></i>
</a>
<button data-id="${cell}" class="btn btn-sm btn-red btn-delete-customers d-inline-flex align-items-center justify-content-center">
<i class='bx bxs-trash' ></i>
</button>
</div>
`),
},
],
pagination: {
limit: 15,
server: {
url: (prev, page) =>
`${prev}${prev.includes("?") ? "&" : "?"}page=${
page + 1
}`,
},
},
sort: true,
search: {
server: {
url: (prev, keyword) => `${prev}?search=${keyword}`,
},
},
server: {
url: `${GlobalConfig.apiHost}/api/customers`,
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
then: (data) =>
data.data.map((item) => [
item.id,
item.nomor_pelanggan,
item.nama,
item.kota_pelayanan,
item.alamat,
item.latitude,
item.longitude,
item.id,
]),
total: (data) => data.meta.total,
},
}).render(tableContainer);
}
async handleDelete(deleteButton) {
const id = deleteButton.getAttribute("data-id");
const result = await Swal.fire({
title: "Are you sure?",
text: "You won't be able to revert this!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: "Yes, delete it!",
});
if (result.isConfirmed) {
try {
let response = await fetch(
`${GlobalConfig.apiHost}/api/customers/${id}`,
{
method: "DELETE",
credentials: "include",
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
"Content-Type": "application/json",
},
}
);
if (response.ok) {
let result = await response.json();
this.toastMessage.innerText =
result.message || "Deleted successfully!";
this.toast.show();
// Refresh Grid.js table
if (typeof this.table !== "undefined") {
this.table.updateConfig({}).forceRender();
}
} else {
let error = await response.json();
console.error("Delete failed:", error);
this.toastMessage.innerText =
error.message || "Delete failed!";
this.toast.show();
}
} catch (error) {
console.error("Error deleting item:", error);
this.toastMessage.innerText = "An error occurred!";
this.toast.show();
}
}
}
}
document.addEventListener("DOMContentLoaded", function (e) {
new Customers();
});

View File

@@ -0,0 +1,78 @@
import { Dropzone } from "dropzone";
Dropzone.autoDiscover = false;
class UploadCustomers {
constructor() {
this.spatialDropzone = null;
this.formElement = document.getElementById("formUploadCustomers");
this.uploadButton = document.getElementById("submit-upload");
this.spinner = document.getElementById("spinner");
if (!this.formElement) {
console.error("Element formUploadCustomers tidak ditemukan!");
}
}
init() {
this.initDropzone();
this.setupUploadButton();
}
initDropzone() {
const toastNotification = document.getElementById("toastNotification");
const toast = new bootstrap.Toast(toastNotification);
var previewTemplate,
dropzonePreviewNode = document.querySelector(
"#dropzone-preview-list"
);
(dropzonePreviewNode.id = ""),
dropzonePreviewNode &&
((previewTemplate = dropzonePreviewNode.parentNode.innerHTML),
dropzonePreviewNode.parentNode.removeChild(dropzonePreviewNode),
(this.spatialDropzone = new Dropzone(".dropzone", {
url: this.formElement.action,
method: "post",
acceptedFiles: ".xls,.xlsx",
previewTemplate: previewTemplate,
previewsContainer: "#dropzone-preview",
autoProcessQueue: false,
headers: {
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
},
init: function () {
this.on("success", function (file, response) {
document.getElementById("toast-message").innerText =
response.message;
toast.show();
setTimeout(() => {
window.location.href = "/data/customers";
}, 2000);
});
this.on("error", function (file, errorMessage) {
document.getElementById("toast-message").innerText =
errorMessage.message;
toast.show();
this.uploadButton.disabled = false;
this.spinner.classList.add("d-none");
});
},
})));
}
setupUploadButton() {
this.uploadButton.addEventListener("click", (e) => {
if (this.spatialDropzone.files.length > 0) {
this.spatialDropzone.processQueue();
this.uploadButton.disabled = true;
this.spinner.classList.remove("d-none");
} else {
return;
}
});
}
}
document.addEventListener("DOMContentLoaded", function (e) {
new UploadCustomers().init();
});

View File

@@ -118,7 +118,7 @@ class BigData {
this.dataNonVerification.total
);
this.percentageResultNonVerification =
this.bigTotalNonVerification <= 0 || this.bigTotalPotensi
this.bigTotalNonVerification <= 0 || this.bigTotalPotensi <= 0
? 0
: this.bigTotalNonVerification
.div(this.bigTotalPotensi)

View File

@@ -0,0 +1,119 @@
import Big from "big.js";
import GlobalConfig, { addThousandSeparators } from "../global-config.js";
class LackOfPotential {
async init() {
this.bigTotalLackPotential = 0;
this.totalPotensi = await this.getDataTotalPotensi(2025);
this.totalTargetPAD = await this.getDataSettings("TARGET_PAD");
this.bigTargetPAD = new Big(this.totalTargetPAD ?? 0);
this.bigTotalPotensi = new Big(this.totalPotensi.totalData ?? 0);
this.bigTotalLackPotential = this.bigTargetPAD - this.bigTotalPotensi;
this.initChartKekuranganPotensi();
}
async getDataTotalPotensi(year) {
try {
const response = await fetch(
`${GlobalConfig.apiHost}/api/all-task-documents?year=${year}`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
console.error("Network response was not ok", response);
}
const data = await response.json();
return {
countData: data.data.count,
totalData: data.data.total,
};
} catch (error) {
console.error("Error fetching chart data:", error);
return null;
}
}
async getDataSettings(string_key) {
try {
const response = await fetch(
`${GlobalConfig.apiHost}/api/api-data-settings?search=${string_key}`,
{
credentials: "include",
headers: {
Authorization: `Bearer ${
document.querySelector("meta[name='api-token']")
.content
}`,
"Content-Type": "application/json",
},
}
);
if (!response.ok) {
console.error("Network response was not ok", response);
}
const data = await response.json();
return data.data[0].value;
} catch (error) {
console.error("Error fetching chart data:", error);
return 0;
}
}
initChartKekuranganPotensi() {
document
.querySelectorAll(".document-count.chart-lack-of-potential")
.forEach((element) => {
element.innerText = ``;
});
document
.querySelectorAll(".document-total.chart-lack-of-potential")
.forEach((element) => {
element.innerText = `Rp.${addThousandSeparators(
this.bigTotalLackPotential.toString()
)}`;
});
document
.querySelectorAll(".small-percentage.chart-lack-of-potential")
.forEach((element) => {
element.innerText = ``;
});
}
}
document.addEventListener("DOMContentLoaded", async function (e) {
await new LackOfPotential().init();
});
function resizeDashboard() {
let targetElement = document.getElementById("lack-of-potential-wrapper");
let dashboardElement = document.getElementById(
"lack-of-potential-fixed-container"
);
let targetWidth = targetElement.offsetWidth;
let dashboardWidth = 1400;
let scaleFactor = (targetWidth / dashboardWidth).toFixed(2);
// Prevent scaling beyond 1 (100%) to avoid overflow
scaleFactor = Math.min(scaleFactor, 1);
dashboardElement.style.transformOrigin = "left top";
dashboardElement.style.transition = "transform 0.2s ease-in-out";
dashboardElement.style.transform = `scale(${scaleFactor})`;
// Ensure horizontal scrolling is allowed if necessary
document.body.style.overflowX = "auto";
}
window.addEventListener("load", resizeDashboard);
window.addEventListener("resize", resizeDashboard);

View File

@@ -19,15 +19,24 @@ document.addEventListener("DOMContentLoaded", function (e) {
submitButton.disabled = true;
spinner.classList.remove("d-none");
let jsonData = {};
formData.forEach((value, key) => {
jsonData[key] = value;
});
console.log(jsonData);
try {
let response = await fetch(form.action, {
method: "POST",
headers: {
"X-CSRF-TOKEN": document
.querySelector('meta[name="csrf-token"]')
.getAttribute("content"),
"Content-Type": "application/json",
Accept: "application/json",
Authorization: `Bearer ${document
.querySelector('meta[name="api-token"]')
.getAttribute("content")}`,
},
body: formData,
body: JSON.stringify(jsonData),
});
if (response.ok) {

View File

@@ -1,15 +0,0 @@
<?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 %]
}

View File

@@ -1 +0,0 @@
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_deleted %]);

View File

@@ -1,4 +0,0 @@
return $this->successResponse(
[% model_was_deleted %],
$this->transform($[% model_name_singular_variable %])
);

View File

@@ -1 +0,0 @@
return new [% api_resource_collection_class %]($[% model_name_plural_variable %], [% models_were_retrieved %]);

View File

@@ -1,26 +0,0 @@
$[% 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(),
],
]
);

View File

@@ -1 +0,0 @@
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_retrieved %]);

View File

@@ -1,4 +0,0 @@
return $this->successResponse(
[% model_was_retrieved %],
$this->transform($[% model_name_singular_variable %])
);

View File

@@ -1 +0,0 @@
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_added %]);

View File

@@ -1,4 +0,0 @@
return $this->successResponse(
[% model_was_added %],
$this->transform($[% model_name_singular_variable %])
);

View File

@@ -1 +0,0 @@
return new [% api_resource_class %]($[% model_name_singular_variable %], [% model_was_updated %]);

View File

@@ -1,4 +0,0 @@
return $this->successResponse(
[% model_was_updated %],
$this->transform($[% model_name_singular_variable %])
);

View File

@@ -1,14 +0,0 @@
/**
* Get an error response
*
* @param mix $message
*
* @return Illuminate\Http\Response
*/
protected function errorResponse($message)
{
return response()->json([
'errors' => (array) $message,
'success' => false,
], 422);
}

View File

@@ -1,16 +0,0 @@
/**
* 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);
}

View File

@@ -1,18 +0,0 @@
/**
* 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);
}

View File

@@ -1,13 +0,0 @@
/**
* 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 %]
];
}

View File

@@ -1,5 +0,0 @@
$validator = $this->getValidator($request);
if ($validator->fails()) {
return $this->errorResponse($validator->errors()->all());
}

View File

@@ -1,104 +0,0 @@
<?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 %]
}

View File

@@ -1,21 +0,0 @@
<?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);
}
}

View File

@@ -1,20 +0,0 @@
<?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');
}
}

View File

@@ -1 +0,0 @@
<span class="label label-danger" title="[% this_parameter_must_be_present_in_the_request %]">[% required_title %]</span>

View File

@@ -1,11 +0,0 @@
<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>

View File

@@ -1,16 +0,0 @@
<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>

View File

@@ -1,16 +0,0 @@
<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>

View File

@@ -1,16 +0,0 @@
<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>

View File

@@ -1,5 +0,0 @@
<tr>
<td>[% field_name %]</td>
<td>[% field_type_title %]</td>
<td>[% api_field_description %]</td>
</tr>

View File

@@ -1,12 +0,0 @@
<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>

View File

@@ -1,37 +0,0 @@
<?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>

View File

@@ -1,14 +0,0 @@
<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>

View File

@@ -1,5 +0,0 @@
<tr>
<td>[% field_name %]</td>
<td>[% field_type_title %]</td>
<td>[% api_field_description %]</td>
</tr>

View File

@@ -1,12 +0,0 @@
<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>

View File

@@ -1,21 +0,0 @@
<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>

View File

@@ -1,386 +0,0 @@
@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

View File

@@ -1,2 +0,0 @@
Route::get('[% prefix %][% version %]', [[% controller_name %]::class, 'index'])
->name('[% index_route_name %]');

View File

@@ -1,2 +0,0 @@
Route::get('[% prefix %][% version %]', '[% controller_name %]@index')
->name('[% index_route_name %]');

View File

@@ -1,38 +0,0 @@
<?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);
}
}

View File

@@ -1,50 +0,0 @@
<?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 %]
}

View File

@@ -1,59 +0,0 @@
<?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,
];
}
}

View File

@@ -1,10 +0,0 @@
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 %];

View File

@@ -1,10 +0,0 @@
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 %];

View File

@@ -1,17 +0,0 @@
/**
* 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);
}

View File

@@ -1,10 +0,0 @@
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
[% auth_middleware %]
}

View File

@@ -1,21 +0,0 @@
/**
* 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;
}

View File

@@ -1,15 +0,0 @@
/**
* 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;
}

View File

@@ -1,19 +0,0 @@
/**
* 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);
}

View File

@@ -1,20 +0,0 @@
/**
* 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;
}

View File

@@ -1,126 +0,0 @@
<?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 %]
}

View File

@@ -1,46 +0,0 @@
@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

View File

@@ -1,47 +0,0 @@
@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

View File

@@ -1,14 +0,0 @@
<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

View File

@@ -1 +0,0 @@
{!! $errors->first('[% field_name %]', '<div class="invalid-feedback">:message</div>') !!}

View File

@@ -1 +0,0 @@
<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 %]>

View File

@@ -1,8 +0,0 @@
<div class="mb-3 row">
[% field_label %]
<div class="col-lg-10 col-xl-9">
[% field_input %]
[% field_validation_helper %]
</div>
</div>

View File

@@ -1 +0,0 @@
<label for="[% field_name %]" class="col-form-label text-lg-end col-lg-2 col-xl-3">[% field_title %]</label>

View File

@@ -1,8 +0,0 @@
<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>

View File

@@ -1 +0,0 @@
<div class="col-form-label text-lg-end col-lg-2 col-xl-3"></div>

View File

@@ -1 +0,0 @@
<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 %]>

View File

@@ -1,6 +0,0 @@
<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>

View File

@@ -1,6 +0,0 @@
<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>

View File

@@ -1,35 +0,0 @@
<?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 %]
}

View File

@@ -1,9 +0,0 @@
<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>

View File

@@ -1,9 +0,0 @@
<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>

View File

@@ -1 +0,0 @@
<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>

View File

@@ -1 +0,0 @@
[% form_fields_html %]

View File

@@ -1,78 +0,0 @@
@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(&quot;[% confirm_delete %]&quot;)">
<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

View File

@@ -1 +0,0 @@
<td class="align-middle">{{ [% field_value %] }}</td>

View File

@@ -1 +0,0 @@
<th>[% field_title %]</th>

View File

@@ -1,5 +0,0 @@
<?php
return [
[% messages %]
];

View File

@@ -1,194 +0,0 @@
<!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>

View File

@@ -1,10 +0,0 @@
@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

View File

@@ -1 +0,0 @@
Schema::[% connection_name %]drop('[% table_name %]');

View File

@@ -1,4 +0,0 @@
Schema::[% connection_name %][% operation_name %]('[% table_name %]', function(Blueprint $table)
{
[% blue_print_body %]
});

View File

@@ -1,27 +0,0 @@
<?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 %]
}
}

View File

@@ -1 +0,0 @@
return \DateTime::createFromFormat($this->getDateFormat(), $value)->format('[% date_format %]');

View File

@@ -1 +0,0 @@
return json_decode($value) ?: [];

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