Compare commits

...

6 Commits

Author SHA1 Message Date
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
22 changed files with 691 additions and 549 deletions

View File

@@ -43,15 +43,15 @@ class UsersController extends Controller
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,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

@@ -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,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

@@ -109,6 +109,13 @@ 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" => "Users",
"url" => "users.index",
@@ -205,6 +212,7 @@ 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();
// Superadmin gets all menus
$superadmin->menus()->sync([
@@ -229,6 +237,7 @@ 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],
]);
// 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

@@ -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

@@ -0,0 +1,53 @@
//
// custom_circle.scss
//
.custom-circle-wrapper {
width: 100px; // Default width
height: 100px; // Default height
border: 4px solid white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background-color: rgb(1, 44, 124);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* Efek bayangan */
text-align: center;
&.large {
width: 150px;
height: 150px;
}
&.small {
width: 95px;
height: 95px;
}
}
.custom-circle-content {
display: flex;
flex-direction: column;
align-items: center;
}
.custom-circle-text {
font-size: 14px;
font-weight: bold;
color: white;
padding: 0;
margin: 0;
}
.custom-circle-data {
font-size: 12px;
color: white;
background-color: #f0195b;
padding: 0 5px;
border-radius: 3px;
}
.custom-circle-data-type {
font-size: 12px;
color: white;
}

View File

@@ -0,0 +1,234 @@
//
// lack-of-potential.scss
//
.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)
);
}
.lack-of-potential-wrapper {
background-image: url("/public/images/bg-dashboard.jpg");
background-size: cover;
background-position: center;
background-color: rgba(255, 255, 255, 0.7);
max-width: 100vw;
}
.lack-of-potential-wrapper::before {
content: "";
position: absolute;
pointer-events: none; /* Prevents the overlay from blocking interaction */
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, 0.7);
}
// #lack-of-potential-fixed-container {
// min-width: 1110px;
// max-width: unset; /* Allow it to grow if needed */
// }
// @media (max-width: 768px) {
// #lack-of-potential-fixed-container {
// transform: scale(0.8); /* Adjust the scale as needed */
// }
// }
// line degrees
.line {
background-color: black;
position: absolute;
height: 3px;
}
.home-to-non-usaha {
width: 100px;
top: 13%;
left: 38%;
transform: rotate(90deg);
}
.restoran-to-bapenda {
width: 110px;
top: 14%;
left: 60%;
transform: rotate(40deg);
}
.pbb-to-bapenda {
width: 80px;
top: 21%;
left: 80%;
}
.reklame-to-bapenda {
width: 120px;
left: 75%;
top: 30%;
transform: rotateZ(142deg);
}
.non-usaha-to-bapenda {
width: 116px;
left: 18%;
top: 33%;
transform: rotateZ(124deg);
}
.non-usaha-to-pdam {
width: 100px;
left: 38%;
top: 34%;
transform: rotateZ(90deg);
}
.non-usaha-to-kecamatan {
width: 140px;
left: 55%;
top: 33%;
transform: rotateZ(237deg);
}
.bapenda-to-usaha {
width: 114px;
left: 18%;
top: 49%;
transform: rotateZ(56deg);
}
.pdam-to-usaha {
width: 88px;
left: 39%;
top: 49%;
transform: rotateZ(90deg);
}
.kecamatan-to-usaha {
width: 118px;
left: 56%;
top: 50%;
transform: rotateZ(117deg);
}
.usaha-to-villa {
width: 100px;
left: 10%;
top: 63%;
transform: rotateZ(143deg);
}
.usaha-to-pabrik {
width: 150px;
left: 15%;
top: 70%;
transform: rotateZ(143deg);
}
.usaha-to-pariwisata {
width: 150px;
left: 43%;
top: 70%;
transform: rotateZ(38deg);
}
.usaha-to-protocol {
width: 106px;
left: 36%;
top: 71%;
transform: rotateZ(86deg);
}
.pariwisata-to-disbudpar {
width: 86px;
left: 54%;
top: 83%;
transform: rotateZ(150deg);
}
.non-usaha-to-wasdal {
width: 300px;
left: -32%;
top: 34%;
transform: rotateZ(226deg);
}
.usaha-to-wasdal {
width: 300px;
left: -34%;
top: 50%;
transform: rotateZ(129deg);
}
.wasdal-to-upt {
width: 155px;
left: 3%;
top: -67%;
transform: rotateZ(127deg);
}
.wasdal-to-satpol {
width: 155px;
left: 19%;
top: -52%;
transform: rotateZ(76deg);
}
.wasdal-to-kejari {
width: 182px;
left: 25%;
top: -55%;
transform: rotateZ(51deg);
}
.wasdal-to-tni {
width: 260px;
left: 29%;
top: -62%;
transform: rotateZ(30deg);
}
.wasdal-to-potential {
width: 50px;
left: 28%;
top: 41%;
}
.potential-to-tata-ruang {
width: 50px;
left: 72%;
top: 41%;
}
.tata-ruang-to-non-usaha {
width: 220px;
left: 0%;
top: 30%;
transform: rotateZ(144deg);
}
.tata-ruang-to-usaha {
width: 280px;
left: 0%;
top: 52%;
transform: rotateZ(224deg);
}
.tata-ruang-to-peta {
width: 122px;
left: 8%;
top: 41%;
}
.peta-to-tapak {
width: 30px;
left: 47%;
top: 41%;
}

View File

@@ -45,6 +45,8 @@
@import "components/tooltip";
@import "components/widgets";
@import "components/circle";
@import "components/custom_circle";
@import "dashboards/lack-of-potential";
// Plugin
@import "plugins/simplebar";

View File

@@ -36,10 +36,10 @@ class="authentication-bg"
<div class="mb-3">
<label for="email" class="form-label">Email Address</label>
<input type="email" class="form-control" id="email" name="email" value="user@demo.com" placeholder="Enter your email">
<input type="email" class="form-control" id="email" name="email" placeholder="Enter your email">
</div>
<div class="mb-3">
<input type="password" class="form-control" id="password" name="password" value="password" placeholder="Enter your password">
<input type="password" class="form-control" id="password" name="password" placeholder="Enter your password">
</div>
<div class="d-grid">
<button class="btn btn-dark btn-lg fw-medium" type="submit">Sign In</button>

View File

@@ -0,0 +1,30 @@
@props(['title' => 'title component', 'visible_data' => false, 'data' => 'data text', 'visible_data_type' => false,
'data_type' => '','style' => '', 'size' => '', 'line' => []])
@section('css')
@vite(['resources/scss/components/_custom_circle.scss'])
@endsection
<div class="custom-circle-wrapper {{ $size }}" style="{{ $style }}">
<div class="custom-circle-content">
<p class="custom-circle-text">{{ $title }}</p>
@if ($visible_data === "true")
<div class="custom-circle-data">{{ $data }}</div>
@endif
@if ($visible_data_type === "true")
<div class="custom-circle-data-type">{{ $data_type }}</div>
@endif
@if (!empty($lines))
<svg class="absolute w-full h-full" viewBox="0 0 100 100" preserveAspectRatio="none">
@foreach ($lines as $line)
<line
x1="{{ $line['x1'] }}" y1="{{ $line['y1'] }}"
x2="{{ $line['x2'] }}" y2="{{ $line['y2'] }}"
stroke="{{ $line['color'] ?? 'black' }}"
stroke-width="{{ $line['width'] ?? 2 }}"
/>
@endforeach
</svg>
@endif
</div>
</div>

View File

@@ -33,7 +33,7 @@
<div id="dashboard-fixed-container" class="row" style="width:1110px;height:770px;position:relative;margin:auto;">
@component('components.circle', [
'document_title' => 'Kekurangan Potensi',
'document_color' => '#911701',
'document_color' => '#ff5757',
'document_type' => '',
'document_id' => 'chart-kekurangan-potensi',
'visible_small_circle' => true,
@@ -43,7 +43,7 @@
@component('components.circle', [
'document_title' => 'Target PAD 2024',
'document_color' => '#020e42',
'document_color' => '#204f6b',
'document_type' => '',
'document_id' => 'chart-target-pad',
'visible_small_circle' => true,
@@ -61,7 +61,7 @@
@component('components.circle', [
'document_title' => 'Total Potensi Berkas',
'document_color' => '#02acfa',
'document_color' => '#0097b3',
'document_type' => 'Pemohon',
'document_id' => 'chart-total-potensi',
'visible_small_circle' => true,
@@ -77,7 +77,7 @@
@component('components.circle', [
'document_title' => 'Perkiraan Potensi PBG Dari Tata Ruang',
'document_color' => '#bf04bc',
'document_color' => '#ed9d2e',
'document_type' => '',
'document_id' => 'chart-potensi-tata-ruang',
'visible_small_circle' => true,
@@ -90,7 +90,7 @@
@component('components.circle', [
'document_title' => 'Non Usaha',
'document_color' => '#028399',
'document_color' => '#399787',
'document_type' => 'Berkas',
'document_id' => 'chart-non-business',
'visible_small_circle' => true,
@@ -100,7 +100,7 @@
@component('components.circle', [
'document_title' => 'Usaha',
'document_color' => '#616b7d',
'document_color' => '#5e7c89',
'document_type' => 'Berkas',
'document_id' => 'chart-business',
'visible_small_circle' => true,
@@ -110,7 +110,7 @@
@component('components.circle', [
'document_title' => 'Berkas Terverifikasi',
'document_color' => '#0561f5',
'document_color' => '#5170ff',
'document_type' => 'Berkas',
'document_id' => 'chart-berkas-terverifikasi',
'visible_small_circle' => true,
@@ -126,7 +126,7 @@
@component('components.circle', [
'document_title' => 'Berkas Belum Terverifikasi',
'document_color' => '#b973ff',
'document_color' => '#5170ff',
'document_type' => 'Berkas',
'document_id' => 'chart-berkas-belum-terverifikasi',
'visible_small_circle' => true,
@@ -143,7 +143,7 @@
@component('components.circle',[
'document_title' => 'Realisasi Terbit PBG',
'document_color' => '#09ab5a',
'document_color' => '#8cc540',
'document_type' => 'Berkas',
'document_id' => 'chart-realisasi-tebit-pbg',
'visible_small_circle' => true,
@@ -156,7 +156,7 @@
@component('components.circle',[
'document_title' => 'Menunggu Klik DPMPTSP',
'document_color' => '#0294ad',
'document_color' => '#00bf61',
'document_type' => 'Berkas',
'document_id' => 'chart-menunggu-klik-dpmptsp',
'visible_small_circle' => true,
@@ -169,7 +169,7 @@
@component('components.circle',[
'document_title' => 'Berproses Di Dinas Teknis',
'document_color' => '#422519',
'document_color' => '#737373',
'document_type' => 'Berkas',
'document_id' => 'chart-proses-dinas-teknis',
'visible_small_circle' => true,

View File

@@ -0,0 +1,119 @@
@extends('layouts.vertical', ['subtitle' => 'Dashboards'])
@section('css')
@vite(['resources/scss/dashboards/_lack-of-potential.scss'])
@endsection
@section('content')
@include('layouts.partials.page-title', ['title' => 'Dashboards', 'subtitle' => 'Lack Of Potential'])
<div class="lack-of-potential-wrapper">
<div class="row" id="lack-of-potential-wrapper">
<div class="col-12">
<h3 class="mt-3 ms-2 text-danger">
ANALISA BIG DATA MELALUI APLIKASI SIBEDAS PBG
</h3>
</div>
</div>
<div class="">
<div class="">
<div id="lack-of-potential-fixed-container" class="" style="width:1400px;height:770px;position:relative;margin:auto;z-index:1;">
<div style="position: absolute; top: 200px; left: 50px;">
<x-custom-circle title="Restoran" size="small" style="background-color: #0e4753;" />
<div class="square dia-top-left-bottom-right" style="top:30px;left:50px;width:150px;height:120px;"></div>
<x-custom-circle title="PBB Bangunan" visible_data="true" data="649.157" size="small" style="background-color: #0e4753;" />
<div class="square" style="width:150px;height:2px;background-color:black;left:50px;top:150px;"></div>
<x-custom-circle title="Reklame" visible_data="true" data="2.428" size="small" style="background-color: #0e4753;" />
<div class="square dia-top-right-bottom-left" style="top:140px;left:50px;width:150px;height:120px;"></div>
</div>
<div style="position: absolute; top: 300px; left: 200px;">
<div class="square dia-top-right-bottom-left" style="top:-100px;left:30px;width:150px;height:120px;"></div>
<div class="square dia-top-left-bottom-right" style="top:-100px;left:120px;width:120px;height:120px;"></div>
<x-custom-circle title="BAPENDA" size="small" style="float:left;background-color: #234f6c;" />
<x-custom-circle title="PDAM" visible_data="true" data="9.022" visible_data_type="true" data_type="Pelanggan" size="small" style="float:left;background-color: #234f6c;" />
<x-custom-circle title="KECAMATAN" size="small" style="float:left;background-color: #234f6c;" />
</div>
<div style="position: absolute; top: 0px; left: 270px;">
<div class="square" style="width:5px;height:600px;background-color:black;left:70px;top:50px;"></div>
<div class="square dia-top-left-bottom-right" style="top:350px;left:-50px;width:120px;height:120px;"></div>
<div class="square dia-top-right-bottom-left" style="top:350px;left:70px;width:120px;height:120px;"></div>
<x-custom-circle title="Rumah Tinggal" size="small" style="background-color: #234f6c;margin:auto;" />
<x-custom-circle title="Non Usaha" size="large" style="background-color: #3a968b;margin-top:20px;" />
<x-custom-circle title="USAHA" size="large" style="background-color: #627c8b;margin-top:150px;" />
</div>
<div style="position: absolute; top: 650px; left: 110px;">
<div class="square dia-top-right-bottom-left" style="top:-110px;left:40px;width:200px;height:120px;"></div>
<div class="square dia-top-right-bottom-left" style="top:-110px;left:90px;width:150px;height:170px;"></div>
<div class="square dia-top-left-bottom-right" style="top:-110px;left:230px;width:150px;height:170px;"></div>
<div class="square dia-top-left-bottom-right" style="top:-110px;left:260px;width:200px;height:180px;"></div>
<x-custom-circle title="Villa" size="small" style="float:left;background-color: #234f6c;" />
<x-custom-circle title="Pabrik" size="small" style="float:left;background-color: #234f6c;" />
<x-custom-circle title="Jalan Protocol" size="small" style="float:left;background-color: #234f6c;" />
<x-custom-circle title="Ruko" size="small" style="float:left;background-color: #234f6c;" />
<x-custom-circle title="Pariwisata" size="small" style="float:left;background-color: #234f6c; margin-right: 20px;" />
<div class="square" style="width:150px;height:2px;background-color:black;left:350px;top:50px;"></div>
<x-custom-circle title="DISBUDPAR" size="small" style="background-color: #3a968b;" />
</div>
<div style="position: absolute; top: 280px; left: 550px;">
<div class="square dia-top-left-bottom-right" style="top:-110px;left:-150px;width:200px;height:180px;"></div>
<div class="square dia-top-right-bottom-left" style="top:70px;left:-150px;width:200px;height:130px;"></div>
<x-custom-circle title="Tim Wasdal Gabungan" size="large" style="background-color: #da6635;float:left" />
<div class="square" style="width:650px;height:5px;background-color:black;left:100px;top:75px;"></div>
@component('components.circle', [
'document_title' => 'Kekurangan Potensi',
'document_color' => '#ff5757',
'document_type' => '',
'document_id' => 'chart-lack-of-potential',
'visible_small_circle' => false,
'style' => 'margin-left:180px;top:-20px;'
])
@endcomponent
<x-custom-circle title="Tata Ruang" size="large" style="background-color: #da6635;float:left;margin-left:250px;" />
</div>
<div style="position: absolute; top: 310px; left: 1150px;">
<div class="square dia-top-left-bottom-right" style="top:90px;left:-100px;width:100px;height:100px;"></div>
<div class="square dia-top-right-bottom-left" style="top:-110px;left:-100px;width:100px;height:100px;"></div>
<x-custom-circle title="Peta" visible_data_type="true" data_type="1:5000" size="small" style="background-color: #224f6d;float:left;" />
<x-custom-circle title="Tapak Bangunan" size="small" style="background-color: #2390af;float:left;margin-left:20px;" />
</div>
<x-custom-circle title="UUCK" size="small" style="background-color: #2390af;position:absolute;left:1270px;top:440px;" />
<div style="position: absolute; top: 470px; left: 430px;">
<div class="square dia-top-right-bottom-left" style="top:-80px;left:20px;width:150px;height:120px;"></div>
<div class="square dia-top-right-bottom-left" style="top:-50px;left:100px;width:100px;height:100px;"></div>
<div class="square dia-top-left-bottom-right" style="top:-50px;left:180px;width:100px;height:100px;"></div>
<div class="square dia-top-left-bottom-right" style="top:-60px;left:240px;width:120px;height:120px;"></div>
<x-custom-circle title="UPT Wasdal" size="small" style="background-color: #0f4853;float:left;" />
<x-custom-circle title="Satpol PP" size="small" style="background-color: #0f4853;float:left;" />
<x-custom-circle title="KEJARI" size="small" style="background-color: #0f4853;float:left;" />
<x-custom-circle title="TNI & POLRI" size="small" style="background-color: #0f4853;float:left;" />
</div>
<x-custom-circle title="UUCK" size="small" style="background-color: #2390af;position:absolute;left:980px;top:500px;" />
<div style="position: absolute; top: 50px; left: 1100px;">
<x-custom-circle title="Non Usaha" size="large" style="background-color: #3a968b;margin-top:20px;" />
<x-custom-circle title="USAHA" size="large" style="background-color: #627c8b;margin-top:260px;" />
</div>
</div>
</div>
</div>
</div>
@endsection
@section('scripts')
@vite(['resources/js/dashboards/lack-of-potential.js'])
@endsection

View File

@@ -8,8 +8,13 @@
<div class="row d-flex justify-content-center">
<div class="col-lg-6">
<div class="card">
<div class="card-header">
<div class="d-flex justify-content-end">
<a href="{{ route('users.index') }}" class="btn btn-sm btn-secondary me-2">Back</a>
</div>
</div>
<div class="card-body">
<form id="formCreateUsers" action="{{route('users.store')}}" method="POST">
<form id="formCreateUsers" action="{{route('api.users.store')}}" method="POST">
@csrf
<div class="mb-3">
<label class="form-label" for="name">Name</label>

View File

@@ -8,6 +8,11 @@
<div class="row d-flex justify-content-center">
<div class="col-lg-6">
<div class="card">
<div class="card-header">
<div class="d-flex justify-content-end">
<a href="{{ route('users.index') }}" class="btn btn-sm btn-secondary me-2">Back</a>
</div>
</div>
<div class="card-body">
<form id="formUpdateUsers" action="{{ route('users.update', $user->id)}}" method="post">
@csrf

View File

@@ -21,8 +21,12 @@ use Illuminate\Support\Facades\Route;
Route::post('/login', [UsersController::class, 'login'])->name('api.user.login');
Route::group(['middleware' => 'auth:sanctum'], function (){
// users
Route::get('/users', [UsersController::class, 'index'])->name('users');
Route::post('/logout', [UsersController::class, 'logout'])->name('api.user.logout');
Route::controller(UsersController::class)->group(function(){
Route::get('/users', 'index')->name('api.users');
Route::post('/users', 'store')->name('api.users.store');
Route::put('/users/{id}', 'update')->name('api.users.update');
Route::post('/logout','logout')->name('api.users.logout');
});
// global settings
Route::apiResource('global-settings', GlobalSettingsController::class);

View File

@@ -1,6 +1,7 @@
<?php
use App\Http\Controllers\BusinessOrIndustriesController;
use App\Http\Controllers\Dashboards\LackOfPotentialController;
use App\Http\Controllers\DataSettingController;
use App\Http\Controllers\Dashboards\BigDataController;
use App\Http\Controllers\Home\HomeController;
@@ -27,6 +28,7 @@ Route::group(['middleware' => 'auth'], function(){
Route::group(['prefix' => '/dashboards'], function(){
Route::get('/bigdata', [BigDataController::class, 'index'])->name('dashboard.home');
Route::get('/dashboard-pbg', [BigDataController::class, 'pbg'])->name('dashboard.pbg');
Route::get('/lack-of-potential', [LackOfPotentialController::class, 'lack_of_potential'])->name('dashboard.lack_of_potential');
});
// settings

View File

@@ -20,6 +20,8 @@ export default defineConfig({
"resources/scss/style.scss",
"resources/scss/components/_circle.scss",
"resources/scss/dashboards/_bigdata.scss",
"resources/scss/dashboards/_lack-of-potential.scss",
"resources/scss/components/_custom_circle.scss",
"node_modules/quill/dist/quill.snow.css",
"node_modules/quill/dist/quill.bubble.css",
@@ -49,11 +51,14 @@ export default defineConfig({
"resources/js/data/advertisements/form-upload.js",
//js-additional
"resources/js/dashboards/bigdata.js",
"resources/js/settings/syncronize/syncronize.js",
"resources/js/pbg-task/index.js",
"resources/js/settings/general/general-settings.js",
"resources/js/tables/common-table.js",
// dashboards
"resources/js/dashboards/bigdata.js",
"resources/js/dashboards/lack-of-potential.js",
// roles
"resources/js/roles/index.js",
"resources/js/roles/create.js",