fix datatable using token api and paginate when searching, fix skrd_amount column to decimal 20

This commit is contained in:
arifal hidayat
2025-01-30 01:28:36 +07:00
parent 538cdb87ae
commit 8591fafd84
27 changed files with 1228 additions and 1012 deletions

View File

@@ -8,6 +8,7 @@ use App\Http\Resources\GlobalSettingResource;
use App\Models\GlobalSetting; use App\Models\GlobalSetting;
use App\Traits\GlobalApiResponse; use App\Traits\GlobalApiResponse;
use Exception; use Exception;
use Illuminate\Http\Request;
class GlobalSettingsController extends Controller class GlobalSettingsController extends Controller
{ {
@@ -15,9 +16,13 @@ class GlobalSettingsController extends Controller
/** /**
* Display a listing of the resource. * Display a listing of the resource.
*/ */
public function index() public function index(Request $request)
{ {
$query = GlobalSetting::query()->orderBy('id','desc'); $query = GlobalSetting::query()->orderBy('id','desc');
if($request->has('search') && !empty($request->get("search"))){
$query->where('key', 'LIKE', '%'.$request->get('search').'%');
}
return GlobalSettingResource::collection($query->paginate()); return GlobalSettingResource::collection($query->paginate());
} }

View File

@@ -20,7 +20,7 @@ class ImportDatasourceController extends Controller
$search = $request->get("search"); $search = $request->get("search");
$query->where('status', 'like', "%".$search."%"); $query->where('status', 'like', "%".$search."%");
} }
return ImportDatasourceResource::collection($query->paginate(10)); return ImportDatasourceResource::collection($query->paginate());
} }
/** /**

View File

@@ -12,9 +12,12 @@ class RequestAssignmentController extends Controller
/** /**
* Display a listing of the resource. * Display a listing of the resource.
*/ */
public function index() public function index(Request $request)
{ {
$query = PbgTask::query(); $query = PbgTask::query();
if($request->has('search') && !empty($request->get("search"))){
$query->where('name', 'LIKE', '%'.$request->get('search').'%');
}
return RequestAssignmentResouce::collection($query->paginate()); return RequestAssignmentResouce::collection($query->paginate());
} }

View File

@@ -4,12 +4,15 @@ namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest; use App\Http\Requests\Auth\LoginRequest;
use App\Http\Resources\UserResource;
use App\Models\User; use App\Models\User;
use App\Traits\GlobalApiResponse;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class UsersController extends Controller class UsersController extends Controller
{ {
use GlobalApiResponse;
public function login(LoginRequest $request){ public function login(LoginRequest $request){
$user = User::where('email', $request->email)->first(); $user = User::where('email', $request->email)->first();
@@ -21,7 +24,15 @@ class UsersController extends Controller
return response(['user' => $user, 'token' => $token], 200); return response(['user' => $user, 'token' => $token], 200);
} }
public function index(){ public function index(Request $request){
return response()->json(User::all()); $query = User::query();
if($request->has('search') && !empty($request->get("search"))){
$query->where('name', 'LIKE', '%'.$request->get('search').'%');
}
return UserResource::collection($query->paginate());
}
public function logout(Request $request){
$request->user()->tokens()->delete();
return response()->json(['message' => 'logged out successfully']);
} }
} }

View File

@@ -33,6 +33,15 @@ class AuthenticatedSessionController extends Controller
$request->session()->regenerate(); $request->session()->regenerate();
// Ambil user yang sedang login
$user = Auth::user();
// Buat token untuk API
$token = $user->createToken(env('APP_KEY'))->plainTextToken;
// Simpan token di session (bisa digunakan di JavaScript)
session(['api_token' => $token]);
return redirect()->intended(RouteServiceProvider::HOME); return redirect()->intended(RouteServiceProvider::HOME);
} }
@@ -44,12 +53,16 @@ class AuthenticatedSessionController extends Controller
*/ */
public function destroy(Request $request) public function destroy(Request $request)
{ {
if($request->user()){
$request->user()->tokens()->delete();
}
Auth::guard('web')->logout(); Auth::guard('web')->logout();
$request->session()->invalidate(); $request->session()->invalidate();
$request->session()->regenerateToken(); $request->session()->regenerateToken();
return redirect('/'); return redirect()->route('login');
} }
} }

View File

@@ -7,12 +7,18 @@ use Illuminate\Http\Request;
use Illuminate\Validation\Rules; use Illuminate\Validation\Rules;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use App\Models\User; use App\Models\User;
use App\Traits\GlobalApiResponse;
use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Events\Registered;
class UsersController extends Controller class UsersController extends Controller
{ {
use GlobalApiResponse;
public function allUsers(Request $request){
$users = User::all();
return $this->resSuccess($users);
}
public function index(){ public function index(){
$users = User::paginate(20); $users = User::paginate();
return view('master.users.index', compact('users')); return view('master.users.index', compact('users'));
} }
public function create(){ public function create(){

View File

@@ -15,6 +15,7 @@ class RequestAssignmentResouce extends JsonResource
public function toArray(Request $request): array public function toArray(Request $request): array
{ {
return [ return [
'id' => $this->id,
'uuid' => $this->uuid, 'uuid' => $this->uuid,
'name' => $this->name, 'name' => $this->name,
'owner_name' => $this->owner_name, 'owner_name' => $this->owner_name,

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' =>$this->id,
'name' =>$this->name,
'email' =>$this->email,
'created_at' =>$this->created_at->toDateTimeString(),
'updated_at' =>$this->updated_at->toDateTimeString(),
'position' => $this->position,
'firstname' => $this->firstname,
'lastname' => $this->lastname,
];
}
}

View File

@@ -17,7 +17,7 @@ class RouteServiceProvider extends ServiceProvider
* *
* @var string * @var string
*/ */
public const HOME = '/home'; public const HOME = '/dashboards/bigdata';
/** /**
* Define your route model bindings, pattern filters, and other route configuration. * Define your route model bindings, pattern filters, and other route configuration.

View File

@@ -143,7 +143,7 @@ class ServiceSIMBG
'page' => $currentPage, 'page' => $currentPage,
'size' => 20, 'size' => 20,
'sort' => 'ASC', 'sort' => 'ASC',
'type' => 'task', 'type' => 'task'
]); ]);
$url = "/api/pbg/v1/list/?" . $queryParams; $url = "/api/pbg/v1/list/?" . $queryParams;
@@ -192,15 +192,15 @@ class ServiceSIMBG
$this->syncTaskDetailSubmit($item['uid']); $this->syncTaskDetailSubmit($item['uid']);
$savedCount++; $savedCount++;
} catch (Exception $e) { } catch (Exception $e) {
$importDatasource->update([
'status' => ImportDatasourceStatus::Failed->value,
'message' => 'failed to save',
'response_body' => $item
]);
Log::error("Failed to process task", [ Log::error("Failed to process task", [
'error' => $e->getMessage(), 'error' => $e->getMessage(),
'task' => $item, 'task' => $item,
]); ]);
$importDatasource->update([
'status' => ImportDatasourceStatus::Failed->value,
'message' => $e->getMessage(),
'response_body' => $item
]);
$failedCount++; $failedCount++;
} }
} }

View File

@@ -29,6 +29,6 @@ return [
'max_age' => 0, 'max_age' => 0,
'supports_credentials' => false, 'supports_credentials' => true,
]; ];

View File

@@ -0,0 +1,28 @@
<?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::table('pbg_task_retributions', function (Blueprint $table) {
$table->decimal('skrd_amount',20,2)->nullable()->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('pbg_task_retributions', function (Blueprint $table) {
$table->decimal('skrd_amount', 20,2)->nullable()->change();
});
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,60 @@
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";
class UsersTable {
init() {
this.initTableUsers();
}
initTableUsers() {
new Grid({
columns: [
"ID",
"Name",
"Email",
"Firstname",
"Lastname",
"Position",
],
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/users`,
credentials: "include",
headers: {
Authorization: `Bearer ${localStorage.getItem("token")}`,
"Content-Type": "application/json",
},
then: (data) =>
data.data.map((item) => [
item.id,
item.name,
item.email,
item.firstname,
item.lastname,
item.position,
]),
total: (data) => data.meta.total,
},
}).render(document.getElementById("table-users"));
}
}
document.addEventListener("DOMContentLoaded", function (e) {
new UsersTable().init();
});

View File

@@ -0,0 +1,67 @@
import { Grid } from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../global-config";
class RequestAssignment {
init() {
this.initTableRequestAssignment();
}
initTableRequestAssignment() {
new Grid({
columns: [
"ID",
"Name",
"Condition",
"Registration Number",
"Document Number",
"Address",
"Status",
"Function Type",
"Consultation Type",
"Due Date",
],
search: {
server: {
url: (prev, keyword) => `${prev}?search=${keyword}`,
},
},
pagination: {
limit: 15,
server: {
url: (prev, page) =>
`${prev}${prev.includes("?") ? "&" : "?"}page=${
page + 1
}`,
},
},
sort: true,
server: {
url: `${GlobalConfig.apiHost}/api/request-assignments`,
credentials: "include",
headers: {
Authorization: `Bearer ${localStorage.getItem("token")}`,
"Content-Type": "application/json",
},
then: (data) =>
data.data.map((item) => [
item.id,
item.name,
item.condition,
item.registration_number,
item.document_number,
item.address,
item.status_name,
item.function_type,
item.consultation_type,
item.due_date,
]),
total: (data) => data.meta.total,
},
}).render(document.getElementById("table-request-assignment"));
}
}
document.addEventListener("DOMContentLoaded", function (e) {
new RequestAssignment().init();
});

View File

@@ -29,24 +29,26 @@ class SyncronizeTask {
}, },
}, },
], ],
search: {
server: {
url: (prev, keyword) => `${prev}?search=${keyword}`,
},
},
pagination: { pagination: {
limit: 15, limit: 15,
server: { server: {
url: (prev, page, limit) => `${prev}?page=${page}`, url: (prev, page) =>
`${prev}${prev.includes("?") ? "&" : "?"}page=${
page + 1
}`,
}, },
}, },
sort: true, sort: true,
search: {
server: {
url: (prev, page, keyword) =>
`${prev}?page=${page}&search=${keyword}`,
},
},
server: { server: {
url: `${GlobalConfig.apiHost}/api/global-settings`, url: `${GlobalConfig.apiHost}/api/global-settings`,
headers: { headers: {
Authorization: `Bearer ${document Authorization: `Bearer ${document
.querySelector('meta[name="csrf-token"]') .querySelector('meta[name="api-token"]')
.getAttribute("content")}`, .getAttribute("content")}`,
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
@@ -59,6 +61,7 @@ class SyncronizeTask {
item.created_at, item.created_at,
item.id, item.id,
]), ]),
total: (data) => data.meta.total,
}, },
}); });
table.render(document.getElementById("general-setting-table")); table.render(document.getElementById("general-setting-table"));
@@ -100,9 +103,6 @@ class SyncronizeTask {
} }
} }
} }
document.addEventListener("click", function (e) {
handleDelete(e); // Call the function on click event
});
document.addEventListener("DOMContentLoaded", function (e) { document.addEventListener("DOMContentLoaded", function (e) {
new SyncronizeTask().init(); new SyncronizeTask().init();
}); });

View File

@@ -1,52 +1,67 @@
import { Grid } from "gridjs/dist/gridjs.umd.js"; import { Grid } from "gridjs/dist/gridjs.umd.js";
import gridjs from 'gridjs/dist/gridjs.umd.js' import gridjs from "gridjs/dist/gridjs.umd.js";
import 'gridjs/dist/gridjs.umd.js' import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../../global-config.js"; import GlobalConfig from "../../global-config.js";
class SyncronizeTask { class SyncronizeTask {
init(){ init() {
this.initTableImportDatasources(); this.initTableImportDatasources();
this.onSyncSubmit(); this.onSyncSubmit();
} }
initTableImportDatasources(){ initTableImportDatasources() {
new Grid({ new Grid({
columns: [ columns: ["ID", "Message", "Response", "Status", "Created"],
"ID", "Message", "Response", "Status", "Created", search: {
], server: {
pagination: { url: (prev, keyword) => `${prev}?search=${keyword}`,
limit: 15, },
server: { },
url: (prev, page, limit) => `${prev}?page=${page}` pagination: {
} limit: 15,
}, server: {
sort: true, url: (prev, page) =>
search: { `${prev}${prev.includes("?") ? "&" : "?"}page=${
server: { page + 1
url: (prev, page, keyword) => `${prev}?page=${page}&search=${keyword}` }`,
} },
}, },
server: { sort: true,
url: `${GlobalConfig.apiHost}/api/import-datasource`, server: {
then: data => data.data.map((item) => [item.id, item.message, item.response_body, item.status, item.created_at]) url: `${GlobalConfig.apiHost}/api/import-datasource`,
} headers: {
}).render(document.getElementById("table-import-datasources")); Authorization: `Bearer ${document
} .querySelector('meta[name="api-token"]')
onSyncSubmit(){ .getAttribute("content")}`,
const form = document.getElementById("sync-form"); "Content-Type": "application/json",
if(form){ },
form.addEventListener("submit", function (event) { then: (data) =>
event.preventDefault(); // Prevent the default form submission data.data.map((item) => [
item.id,
const button = document.getElementById("btn-sync-submit"); item.message,
if (button) { item.response_body,
button.disabled = true; item.status,
button.innerText = "Processing..."; item.created_at,
} ]),
form.submit(); total: (data) => data.meta.total,
}); },
}).render(document.getElementById("table-import-datasources"));
}
onSyncSubmit() {
const form = document.getElementById("sync-form");
if (form) {
form.addEventListener("submit", function (event) {
event.preventDefault(); // Prevent the default form submission
const button = document.getElementById("btn-sync-submit");
if (button) {
button.disabled = true;
button.innerText = "Processing...";
}
form.submit();
});
}
} }
}
} }
document.addEventListener('DOMContentLoaded', function (e) { document.addEventListener("DOMContentLoaded", function (e) {
new SyncronizeTask().init(); new SyncronizeTask().init();
}); });

View File

@@ -1,128 +1,70 @@
import { Grid } from "gridjs/dist/gridjs.umd.js"; import { Grid } from "gridjs/dist/gridjs.umd.js";
import gridjs from 'gridjs/dist/gridjs.umd.js' import gridjs from "gridjs/dist/gridjs.umd.js";
import 'gridjs/dist/gridjs.umd.js' import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../global-config"; import GlobalConfig from "../global-config";
class CommonTable { class CommonTable {
init() { init() {
// this.CommonTableInit(); // this.CommonTableInit();
this.CommonTableInitWithFetchApi(); this.CommonTableInitWithFetchApi();
} }
CommonTableInit() { CommonTableInitWithFetchApi() {
new Grid({ fetch(`${GlobalConfig.apiHost}/api/users`)
columns: [ .then((response) => response.json())
{ .then((data) => {
name: 'ID', console.log("check log response");
formatter: (function (cell) { console.log(data.data);
return gridjs.html('<span class="fw-semibold">' + cell + '</span>'); new Grid({
}) columns: [
}, {
"Name", name: "id",
{ formatter: function (cell) {
name: 'Email', return gridjs.html(
formatter: (function (cell) { '<span class="fw-semibold">' +
return gridjs.html('<a href="">' + cell + '</a>'); cell +
}) "</span>"
}, );
"Position", "Company", "Country", },
{ },
name: 'Actions', "name",
width: '120px', {
formatter: (function (cell) { name: "email",
return gridjs.html(` formatter: function (cell) {
return gridjs.html(
'<a href="">' + cell + "</a>"
);
},
},
"position",
"firstname",
"lastname",
{
name: "Actions",
width: "120px",
formatter: function (cell) {
return gridjs.html(`
<div class="d-flex justify-items-end gap-10"> <div class="d-flex justify-items-end gap-10">
<a href="#" class="text-primary text-decoration-underline me-2">Details</a> <a href="#" class="text-primary text-decoration-underline me-2">Details</a>
<a href="#" class="text-warning text-decoration-underline me-2">Update</a> <a href="#" class="text-warning text-decoration-underline me-2">Update</a>
<a href="#" class="text-danger text-decoration-underline">Delete</a> <a href="#" class="text-danger text-decoration-underline">Delete</a>
</div> </div>
`); `);
}) },
}, },
], ],
pagination: { pagination: {
limit: 10 limit: 10,
}, },
sort: true, sort: true,
search: true, search: true,
data: [ data: data,
["11", "Alice", "alice@example.com", "Software Engineer", "ABC Company", "United States"], }).render(document.getElementById("common-table"));
["12", "Bob", "bob@example.com", "Product Manager", "XYZ Inc", "Canada"],
["13", "Charlie", "charlie@example.com", "Data Analyst", "123 Corp", "Australia"],
["14", "David", "david@example.com", "UI/UX Designer", "456 Ltd", "United Kingdom"],
["15", "Eve", "eve@example.com", "Marketing Specialist", "789 Enterprises", "France"],
["11", "Alice", "alice@example.com", "Software Engineer", "ABC Company", "United States"],
["12", "Bob", "bob@example.com", "Product Manager", "XYZ Inc", "Canada"],
["13", "Charlie", "charlie@example.com", "Data Analyst", "123 Corp", "Australia"],
["14", "David", "david@example.com", "UI/UX Designer", "456 Ltd", "United Kingdom"],
["15", "Eve", "eve@example.com", "Marketing Specialist", "789 Enterprises", "France"],
["11", "Alice", "alice@example.com", "Software Engineer", "ABC Company", "United States"],
["12", "Bob", "bob@example.com", "Product Manager", "XYZ Inc", "Canada"],
["13", "Charlie", "charlie@example.com", "Data Analyst", "123 Corp", "Australia"],
["14", "David", "david@example.com", "UI/UX Designer", "456 Ltd", "United Kingdom"],
["15", "Eve", "eve@example.com", "Marketing Specialist", "789 Enterprises", "France"],
["11", "Alice", "alice@example.com", "Software Engineer", "ABC Company", "United States"],
["12", "Bob", "bob@example.com", "Product Manager", "XYZ Inc", "Canada"],
["13", "Charlie", "charlie@example.com", "Data Analyst", "123 Corp", "Australia"],
["14", "David", "david@example.com", "UI/UX Designer", "456 Ltd", "United Kingdom"],
["15", "Eve", "eve@example.com", "Marketing Specialist", "789 Enterprises", "France"],
["16", "Frank", "frank@example.com", "HR Manager", "ABC Company", "Germany"],
["17", "Grace", "grace@example.com", "Financial Analyst", "XYZ Inc", "Japan"],
["18", "Hannah", "hannah@example.com", "Sales Representative", "123 Corp", "Brazil"],
["19", "Ian", "ian@example.com", "Software Developer", "456 Ltd", "India"],
["20", "Jane", "jane@example.com", "Operations Manager", "789 Enterprises", "China"]
]
}).render(document.getElementById("common-table"));
}
CommonTableInitWithFetchApi(){
fetch(`${GlobalConfig.apiHost}/api/users`)
.then((response) => response.json())
.then((data) => {
console.log("check log response");
console.log(data.data);
new Grid({
columns: [
{
name: 'id',
formatter: (function (cell) {
return gridjs.html('<span class="fw-semibold">' + cell + '</span>');
}) })
}, .catch((error) => console.error("Error fetching data: " + error));
"name", }
{
name: 'email',
formatter: (function (cell) {
return gridjs.html('<a href="">' + cell + '</a>');
})
},
"position", "firstname", "lastname",
{
name: 'Actions',
width: '120px',
formatter: (function (cell) {
return gridjs.html(`
<div class="d-flex justify-items-end gap-10">
<a href="#" class="text-primary text-decoration-underline me-2">Details</a>
<a href="#" class="text-warning text-decoration-underline me-2">Update</a>
<a href="#" class="text-danger text-decoration-underline">Delete</a>
</div>
`);
})
},
],
pagination: {
limit: 10
},
sort: true,
search: true,
data: data
}).render(document.getElementById("common-table"));
})
.catch((error) => console.error("Error fetching data: " + error));
}
} }
document.addEventListener('DOMContentLoaded', function (e) { document.addEventListener("DOMContentLoaded", function (e) {
new CommonTable().init(); new CommonTable().init();
}); });

View File

@@ -39,25 +39,25 @@ class="authentication-bg"
<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" value="user@demo.com" placeholder="Enter your email">
</div> </div>
<div class="mb-3"> <div class="mb-3">
<div class="d-flex justify-content-between align-items-center"> {{-- <div class="d-flex justify-content-between align-items-center">
<label for="password" class="form-label">Password</label> <label for="password" class="form-label">Password</label>
<a href="{{ route ('password.request') }}" class="text-decoration-none small text-muted">Forgot password?</a> <a href="{{ route ('password.request') }}" class="text-decoration-none small text-muted">Forgot password?</a>
</div> </div> --}}
<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" value="password" placeholder="Enter your password">
</div> </div>
<div class="form-check mb-3"> {{-- <div class="form-check mb-3">
<input type="checkbox" class="form-check-input" id="remember-me"> <input type="checkbox" class="form-check-input" id="remember-me">
<label class="form-check-label" for="remember-me">Remember me</label> <label class="form-check-label" for="remember-me">Remember me</label>
</div> </div> --}}
<div class="d-grid"> <div class="d-grid">
<button class="btn btn-dark btn-lg fw-medium" type="submit">Sign In</button> <button class="btn btn-dark btn-lg fw-medium" type="submit">Sign In</button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<p class="text-center mt-4 text-white text-opacity-50">Don't have an account? {{-- <p class="text-center mt-4 text-white text-opacity-50">Don't have an account?
<a href="{{ route ('register') }}" class="text-decoration-none text-white fw-bold">Sign Up</a> <a href="{{ route ('register') }}" class="text-decoration-none text-white fw-bold">Sign Up</a>
</p> </p> --}}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -29,7 +29,7 @@
<div class="collapse" id="sidebarDashboard"> <div class="collapse" id="sidebarDashboard">
<ul class="nav sub-navbar-nav"> <ul class="nav sub-navbar-nav">
<li class="sub-nav-item"> <li class="sub-nav-item">
<a class="sub-nav-link" href="{{ route ('dashboards.bigdata' ) }}">SIBEDAS</a> <a class="sub-nav-link" href="{{ route ('home' ) }}">SIBEDAS</a>
</li> </li>
<li class="sub-nav-item"> <li class="sub-nav-item">
<a class="sub-nav-link" href="{{ route ('home' ) }}">Dashboard 2</a> <a class="sub-nav-link" href="{{ route ('home' ) }}">Dashboard 2</a>
@@ -52,7 +52,7 @@
<div class="collapse" id="sidebarDataMaster"> <div class="collapse" id="sidebarDataMaster">
<ul class="nav sub-navbar-nav"> <ul class="nav sub-navbar-nav">
<li class="sub-nav-item"> <li class="sub-nav-item">
<a class="sub-nav-link" href="{{ route ('master.users' ) }}">Users</a> <a class="sub-nav-link" href="{{ route ('users.index' ) }}">Users</a>
</li> </li>
</ul> </ul>
</div> </div>
@@ -79,14 +79,14 @@
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link menu-arrow" href="#sidebarSettings" data-bs-toggle="collapse" role="button" <a class="nav-link menu-arrow" href="#requestAssignment" data-bs-toggle="collapse" role="button"
aria-expanded="false" aria-controls="sidebarSettings"> aria-expanded="false" aria-controls="requestAssignment">
<span class="nav-icon"> <span class="nav-icon">
<iconify-icon icon="mingcute:task-line"></iconify-icon> <iconify-icon icon="mingcute:task-line"></iconify-icon>
</span> </span>
<span class="nav-text">Request Assignment</span> <span class="nav-text">Request Assignment</span>
</a> </a>
<div class="collapse" id="sidebarSettings"> <div class="collapse" id="requestAssignment">
<ul class="nav sub-navbar-nav"> <ul class="nav sub-navbar-nav">
<li class="sub-nav-item"> <li class="sub-nav-item">
<a class="sub-nav-link" href="{{ route ('request-assignments.index' ) }}">Task</a> <a class="sub-nav-link" href="{{ route ('request-assignments.index' ) }}">Task</a>

View File

@@ -9,6 +9,7 @@
<meta name="robots" content="index, follow" /> <meta name="robots" content="index, follow" />
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
<meta name="csrf-token" content="{{ csrf_token() }}"> <meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="api-token" content="{{ session('api_token') }}">
<!-- App favicon --> <!-- App favicon -->
<link rel="shortcut icon" href="/images/dputr.ico"> <link rel="shortcut icon" href="/images/dputr.ico">

View File

@@ -183,7 +183,7 @@
<form id="logout-form" action="{{route('logout')}}" method="POST" style="display: none;"> <form id="logout-form" action="{{route('logout')}}" method="POST" style="display: none;">
@csrf @csrf
</form> </form>
<a class="dropdown-item text-danger" href="#" onclick="event.preventDefault(); document.getElementById('logout-form').submit();"> <a class="dropdown-item text-danger" href="#" onclick="event.preventDefault(); logoutUser();">
<iconify-icon icon="solar:logout-3-outline" <iconify-icon icon="solar:logout-3-outline"
class="align-middle me-2 fs-18"></iconify-icon><span class="align-middle me-2 fs-18"></iconify-icon><span
class="align-middle">Logout</span> class="align-middle">Logout</span>
@@ -194,3 +194,12 @@
</div> </div>
</div> </div>
</header> </header>
<script>
function logoutUser() {
// Hapus token dari localStorage
localStorage.removeItem('token');
// Submit form logout Laravel
document.getElementById('logout-form').submit();
}
</script>

View File

@@ -10,16 +10,16 @@
<div class="row"> <div class="row">
<div class="d-flex justify-content-end pb-3"> <div class="d-flex justify-content-end pb-3">
<a href="{{ route('master.users.create')}}" class="btn btn-outline-success width-lg">Create</a> <a href="{{ route('users.create')}}" class="btn btn-outline-success width-lg">Create</a>
</div> </div>
{{$users}} {{$users}}
<div> <div>
<div id="common-table"></div> <div id="table-users"></div>
</div> </div>
</div> </div>
@endsection @endsection
@section('scripts') @section('scripts')
@vite(['resources/js/tables/common-table.js']) @vite(['resources/js/master/users/users.js'])
@endsection @endsection

View File

@@ -10,14 +10,12 @@
<div class="row"> <div class="row">
<div> <div>
<h1>Request Assignment Page</h1> <div id="table-request-assignment"></div>
</div>
<div>
<div id="table-import-datasources"></div>
</div> </div>
</div> </div>
@endsection @endsection
@section('scripts') @section('scripts')
@vite(['resources/js/request-assignment/request-assignment.js'])
@endsection @endsection

View File

@@ -1,4 +1,4 @@
@extends('layouts.vertical', ['subtitle' => 'Syncronize']) @extends('layouts.vertical', ['subtitle' => 'General'])
@section('css') @section('css')
@vite(['node_modules/gridjs/dist/theme/mermaid.min.css']) @vite(['node_modules/gridjs/dist/theme/mermaid.min.css'])
@@ -6,7 +6,7 @@
@section('content') @section('content')
@include('layouts.partials/page-title', ['title' => 'Settings', 'subtitle' => 'Syncronize']) @include('layouts.partials/page-title', ['title' => 'Settings', 'subtitle' => 'General'])
<div class="row"> <div class="row">
<div class="d-flex justify-content-end pb-3"> <div class="d-flex justify-content-end pb-3">

View File

@@ -11,12 +11,24 @@ use App\Models\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::get('/user', function (Request $request) { // Route::get('/user', function (Request $request) {
return $request->user(); // return $request->user();
})->middleware('auth:sanctum'); // })->middleware('auth:sanctum');
Route::group(['middleware' => 'auth:scantum'], function (){ 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');
// global settings
Route::apiResource('global-settings', GlobalSettingsController::class); Route::apiResource('global-settings', GlobalSettingsController::class);
// import datasource
Route::apiResource('import-datasource',ImportDatasourceController::class);
// request assignments
Route::apiResource('request-assignments',RequestAssignmentController::class);
}); });
Route::controller(DashboardController::class)->group(function(){ Route::controller(DashboardController::class)->group(function(){
Route::get('/business-documents','businnessDocument'); Route::get('/business-documents','businnessDocument');
@@ -24,19 +36,8 @@ Route::controller(DashboardController::class)->group(function(){
Route::get('/all-task-documents', 'allTaskDocuments'); Route::get('/all-task-documents', 'allTaskDocuments');
}); });
Route::get('/users', [UsersController::class, 'index'])->name('users');
Route::post('/login', [UsersController::class, 'login'])->name('api.user.login');
Route::get('/sync-task', [SyncronizeController::class, 'syncPbgTask'])->name('api.task'); Route::get('/sync-task', [SyncronizeController::class, 'syncPbgTask'])->name('api.task');
Route::get('/get-user-token', [SyncronizeController::class, 'getUserToken'])->name('api.task.token'); Route::get('/get-user-token', [SyncronizeController::class, 'getUserToken'])->name('api.task.token');
Route::get('/get-index-integration-retribution/{uuid}', [SyncronizeController::class, 'syncIndexIntegration'])->name('api.task.inntegration'); Route::get('/get-index-integration-retribution/{uuid}', [SyncronizeController::class, 'syncIndexIntegration'])->name('api.task.inntegration');
Route::get('/sync-task-submit/{uuid}', [SyncronizeController::class, 'syncTaskDetailSubmit'])->name('api.task.submit'); Route::get('/sync-task-submit/{uuid}', [SyncronizeController::class, 'syncTaskDetailSubmit'])->name('api.task.submit');
// import datasource
Route::apiResource('import-datasource',ImportDatasourceController::class);
// global setting
// request assignment
Route::apiResource('request-assignments',RequestAssignmentController::class);

View File

@@ -10,52 +10,28 @@ use Illuminate\Support\Facades\Route;
require __DIR__ . '/auth.php'; require __DIR__ . '/auth.php';
// Route::group(['prefix' => '/', 'middleware' => 'auth'], function () {
// // Route::get('', [RoutingController::class, 'index'])->name('root');
// Route::get('{first}/{second}/{third}', [RoutingController::class, 'thirdLevel'])->name('third');
// Route::get('{first}/{second}', [RoutingController::class, 'secondLevel'])->name('second');
// // Route::get('{any}', [RoutingController::class, 'root'])->name('any');
// });
// auth // auth
Route::group(['middleware' => 'auth'], function(){ Route::group(['middleware' => 'auth'], function(){
// landing page
Route::get('', [HomeController::class, 'index'])->name('home');
//dashboards //dashboards
Route::group(['prefix' => '/dashboards'], function(){ Route::group(['prefix' => '/dashboards'], function(){
Route::get('/bigdata', [BigDataController::class, 'index'])->name('dashboards.bigdata'); Route::get('/bigdata', [BigDataController::class, 'index'])->name('home');
}); });
// settings // settings
Route::group(['prefix' => '/settings'], function(){ Route::group(['prefix' => '/settings'], function(){
Route::resource('/general', SettingsController::class); Route::resource('/general', SettingsController::class);
Route::get('/syncronize', [SyncronizeController::class, 'index'])->name('settings.syncronize'); Route::get('/syncronize', [SyncronizeController::class, 'index'])->name('settings.syncronize');
// Route::get('/general', [SettingsController::class, 'index'])->name('settings.general');
Route::post('/syncronize', [SyncronizeController::class, 'syncronizeTask'])->name('settings.sync'); Route::post('/syncronize', [SyncronizeController::class, 'syncronizeTask'])->name('settings.sync');
}); });
// masters // masters
Route::group(['prefix' => '/master'], function (){ Route::group(['prefix' => '/master'], function (){
// Route::controller(UsersController::class)->group(function(){ Route::resource('/users', UsersController::class);
// Route::get('/users', 'index')->name('master.users'); Route::get('/all-users', [UsersController::class, 'allUsers'])->name('users.all');
// Route::get('/users/create', 'create')->name('master.users.create');
// Route::post('/users/store', 'store')->name('master.users.store');
// Route::get('/users/edit/{id}', 'edit')->name('master.users.edit');
// Route::put('/users/update/{id}', 'edit')->name('master.users.edit');
// });
Route::get('/users', [UsersController::class, 'index'])->name('master.users');
Route::get('/users/create', [UsersController::class, 'create'])->name('master.users.create');
Route::post('/users/store', [UsersController::class, 'store'])->name('master.users.store');
Route::get('/users/edit/{id}', [UsersController::class, 'edit'])->name('master.users.edit');
Route::put('/users/update', [UsersController::class, 'update'])->name('master.users.update');
Route::delete('/users/delete/{id}', [UsersController::class, 'delete'])->name('master.users.delete');
Route::delete('/users/show/{id}', [UsersController::class, 'show'])->name('master.users.show');
}); });
// request assignments // request assignments
Route::group(['prefix' => '/request-assignments'], function(){ Route::group(['prefix' => '/request-assignments'], function(){
Route::controller(PbgTaskController::class)->group(function(){ Route::controller(PbgTaskController::class)->group(function(){
Route::get('/index', 'index')->name('request-assignments.index'); Route::get('/index', 'index')->name('request-assignments.index');