kurang export import

pull/2/head
ajikamaludin 2 years ago
parent 767612179a
commit 04c97952c1

@ -72,7 +72,6 @@ class CompanyController extends Controller
*/
public function destroy(Company $company)
{
$company->users()->delete();
$company->delete();
}
}

@ -3,8 +3,10 @@
namespace App\Http\Controllers;
use App\Models\Category;
use App\Models\Company;
use App\Models\Document;
use App\Models\Type;
use App\Models\User;
use Illuminate\Http\Request;
class DocumentController extends Controller
@ -13,6 +15,15 @@ class DocumentController extends Controller
{
$query = Document::with(['variety', 'category']);
if ($request->has('status')) {
if($request->status == 1) {
$query->whereDate('due_date', '<', now()->toDateString());
}
if($request->status == 2) {
$query->closeToExpired();
}
}
if ($request->has('sortBy') && $request->has('sortRule')) {
$query->orderBy($request->sortBy, $request->sortRule);
} else {
@ -37,7 +48,15 @@ class DocumentController extends Controller
public function create()
{
$user = User::find(auth()->user()->id);
if ($user->is_admin) {
$companies = Company::all();
} else {
$companies = Company::where('region_id', $user->region_id)->get();
}
return inertia('Document/Form', [
'companies' => $companies,
'types' => Type::all(),
'categories' => Category::all(),
]);
@ -48,7 +67,6 @@ class DocumentController extends Controller
$request->validate([
"no_doc" => "nullable|string",
"name" => "required|string",
"company_name" => "required|string",
"type_id" => "required|exists:types,id",
"category_id" => "required|exists:categories,id",
"publisher" => "required|string",
@ -57,8 +75,7 @@ class DocumentController extends Controller
"due_date" => "required_if:type,0",
"status" => "required|in:0,1",
"type" => "required|in:0,1",
"group" => "required|string",
"region" => "required|string",
"company_id" => "required|exists:companies,id",
"document" => "required|file",
]);
@ -79,7 +96,6 @@ class DocumentController extends Controller
"no" => Document::count() + 1,
"no_doc" => $request->no_doc,
"name" => $request->name,
"company_name" => $request->company_name,
"type_id" => $request->type_id,
"category_id" => $request->category_id,
"publisher" => $request->publisher,
@ -88,8 +104,7 @@ class DocumentController extends Controller
"due_date" => $request->due_date,
"status" => $request->status,
"type" => $request->type,
"group" => $request->group,
"region" => $request->region,
"company_id" => $request->company_id,
"user_id" => auth()->user()->id,
]);
@ -105,7 +120,15 @@ class DocumentController extends Controller
public function edit(Document $doc)
{
$user = User::find(auth()->user()->id);
if ($user->is_admin) {
$companies = Company::all();
} else {
$companies = Company::where('region_id', $user->region_id)->get();
}
return inertia('Document/Form', [
'companies' => $companies,
'types' => Type::all(),
'categories' => Category::all(),
'doc' => $doc->load(['variety', 'category'])
@ -117,7 +140,6 @@ class DocumentController extends Controller
$request->validate([
"no_doc" => "nullable|string",
"name" => "required|string",
"company_name" => "required|string",
"type_id" => "required|exists:types,id",
"category_id" => "required|exists:categories,id",
"publisher" => "required|string",
@ -126,8 +148,7 @@ class DocumentController extends Controller
"due_date" => "required_if:type,1",
"status" => "required|in:0,1",
"type" => "required|in:0,1",
"group" => "required|string",
"region" => "required|string",
"company_id" => "required|exists:companies,id",
"document" => "nullable|file",
]);
@ -148,7 +169,6 @@ class DocumentController extends Controller
"no" => Document::count() + 1,
"no_doc" => $request->no_doc,
"name" => $request->name,
"company_name" => $request->company_name,
"type_id" => $request->type_id,
"category_id" => $request->category_id,
"publisher" => $request->publisher,
@ -157,8 +177,7 @@ class DocumentController extends Controller
"due_date" => $request->due_date,
"status" => $request->status,
"type" => $request->type,
"group" => $request->group,
"region" => $request->region,
"company_id" => $request->company_id,
"user_id" => auth()->user()->id,
]);
@ -177,7 +196,7 @@ class DocumentController extends Controller
public function show(Document $doc)
{
return inertia('Document/Detail', [
'doc' => $doc->load(['variety', 'category']),
'doc' => $doc->load(['variety', 'category', 'company.region.group']),
'doc_url' => asset('documents/'.$doc->document),
]);
}

@ -58,13 +58,6 @@ class GroupController extends Controller
*/
public function destroy(Group $group)
{
$group->regions()->each(function ($region) {
$region->companies()->each(function($company) {
$company->users()->delete();
});
$region->companies()->delete();
});
$group->regions()->delete();
$group->delete();
}
}

@ -68,11 +68,6 @@ class RegionController extends Controller
*/
public function destroy(Region $region)
{
$region->companies()->each(function($company) {
$company->users()->delete();
});
$region->companies()->delete();
$region->delete();
}
}

@ -89,10 +89,6 @@ class RoleController extends Controller
*/
public function destroy(Role $role)
{
$role->rolePermissions()->delete();
$role->users()->delete();
$role->delete();
}
}

@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use App\Models\Region;
use App\Models\Role;
use App\Models\User;
use Illuminate\Http\Request;
@ -15,7 +16,7 @@ class UserController extends Controller
*/
public function index(Request $request)
{
$query = User::with('role')->orderBy('id');
$query = User::with(['role', 'region.group'])->orderBy('id');
if ($request->q != null) {
$query->where('name', 'like', '%'.$request->q.'%');
@ -24,6 +25,7 @@ class UserController extends Controller
return inertia('User/Index', [
'users' => $query->paginate(10),
'roles' => Role::all(),
'regions' => Region::all(),
]);
}
@ -39,7 +41,8 @@ class UserController extends Controller
'name' => 'required|string',
'email' => 'required|email|unique:users,email',
'password' => 'required|string|min:6',
'role_id' => 'required|exists:roles,id'
'role_id' => 'required|exists:roles,id',
'region_id' => 'required|exists:regions,id',
]);
User::create([
@ -47,8 +50,7 @@ class UserController extends Controller
'email' => $request->email,
'password' => bcrypt($request->password),
'role_id' => $request->role_id,
'group' => $request->group,
'region' => $request->region
'region_id' => $request->region_id
]);
return redirect()->route('users.index');
@ -71,11 +73,12 @@ class UserController extends Controller
if ($user->is_admin == 0) {
$request->validate([
'role_id' => 'required|exists:roles,id'
'role_id' => 'required|exists:roles,id',
'region_id' => 'required|exists:regions,id',
]);
}
$user->update($request->only(['name', 'email', 'role_id', 'group', 'region']));
$user->update($request->only(['name', 'email', 'role_id', 'region_id']));
if ($request->password != null) {
$user->update(['password' => bcrypt($request->password)]);
}
@ -92,6 +95,5 @@ class UserController extends Controller
public function destroy(User $user)
{
$user->delete();
return redirect()->back();
}
}

@ -4,10 +4,11 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use ShiftOneLabs\LaravelCascadeDeletes\CascadesDeletes;
class Category extends Model
{
use HasFactory;
use HasFactory, CascadesDeletes;
protected $fillable = [
"name",
@ -15,6 +16,8 @@ class Category extends Model
"duration",
];
protected $cascadeDeletes = ['documents'];
public function documents()
{
return $this->hasMany(Document::class);

@ -4,10 +4,11 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use ShiftOneLabs\LaravelCascadeDeletes\CascadesDeletes;
class Company extends Model
{
use HasFactory;
use HasFactory, CascadesDeletes;
protected $fillable = [
"region_id",
@ -15,13 +16,15 @@ class Company extends Model
"short"
];
protected $cascadeDeletes = ['documents'];
public function region()
{
return $this->belongsTo(Region::class);
}
public function users()
public function documents()
{
return $this->hasMany(User::class);
return $this->hasMany(Document::class);
}
}

@ -1,18 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Department extends Model
{
use HasFactory;
protected $fillable = ['name'];
public function documents()
{
$this->hasMany(Document::class, 'document_id');
}
}

@ -49,6 +49,11 @@ class Document extends Model
return $this->belongsTo(User::class, 'user_id');
}
public function company()
{
return $this->belongsTo(Company::class);
}
public function variety()
{
return $this->belongsTo(Type::class, 'type_id');
@ -111,4 +116,18 @@ class Document extends Model
},
);
}
public function scopeCloseToExpired($query) {
$ids = collect();
$categories = Category::all();
foreach($categories as $category) {
foreach($category->documents as $docs) {
if ($docs->is_close_due != 0) {
$ids->add($docs->id);
}
}
}
$query->whereIn("id", $ids->toArray());
}
}

@ -4,15 +4,18 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use ShiftOneLabs\LaravelCascadeDeletes\CascadesDeletes;
class Group extends Model
{
use HasFactory;
use HasFactory, CascadesDeletes;
protected $fillable = [
"name"
];
protected $cascadeDeletes = ['regions'];
public function regions()
{
return $this->hasMany(Region::class);

@ -4,16 +4,19 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use ShiftOneLabs\LaravelCascadeDeletes\CascadesDeletes;
class Region extends Model
{
use HasFactory;
use HasFactory, CascadesDeletes;
protected $fillable = [
"name",
"group_id",
];
protected $cascadeDeletes = ['companies', 'users'];
public function group()
{
return $this->belongsTo(Group::class);
@ -23,4 +26,9 @@ class Region extends Model
{
return $this->hasMany(Company::class);
}
public function users()
{
return $this->hasMany(User::class);
}
}

@ -4,12 +4,21 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use ShiftOneLabs\LaravelCascadeDeletes\CascadesDeletes;
class Type extends Model
{
use HasFactory;
use HasFactory, CascadesDeletes;
protected $fillable = [
"name",
];
protected $cascadeDeletes = ['documents'];
public function documents()
{
return $this->hasMany(Document::class);
}
}

@ -1,18 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class TypeDoc extends Model
{
use HasFactory;
protected $fillable = ['name'];
public function documents()
{
$this->hasMany(Document::class, 'document_id');
}
}

@ -25,8 +25,7 @@ class User extends Authenticatable
'password',
'is_admin',
'role_id',
'group',
'region'
'region_id'
];
/**
@ -52,4 +51,9 @@ class User extends Authenticatable
{
return $this->belongsTo(Role::class);
}
public function region()
{
return $this->belongsTo(Region::class);
}
}

@ -12,6 +12,7 @@
"laravel/sanctum": "^2.8",
"laravel/tinker": "^2.7",
"rap2hpoutre/fast-excel": "^4.1",
"shiftonelabs/laravel-cascade-deletes": "^1.0",
"tightenco/ziggy": "^1.0"
},
"require-dev": {

59
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "c0ad82cf8d1291dec2720bce2cd0b887",
"content-hash": "6ea3a91a17dd8ccd5fa4886bcef58ef8",
"packages": [
{
"name": "brick/math",
@ -3079,6 +3079,63 @@
],
"time": "2022-07-21T14:21:25+00:00"
},
{
"name": "shiftonelabs/laravel-cascade-deletes",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/shiftonelabs/laravel-cascade-deletes.git",
"reference": "af256e3796f997b5f66d34c7ec25c2a1c560e36f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/shiftonelabs/laravel-cascade-deletes/zipball/af256e3796f997b5f66d34c7ec25c2a1c560e36f",
"reference": "af256e3796f997b5f66d34c7ec25c2a1c560e36f",
"shasum": ""
},
"require": {
"illuminate/database": ">=4.1",
"illuminate/events": ">=4.1",
"php": ">=5.5.0"
},
"require-dev": {
"mockery/mockery": "~0.9",
"phpunit/phpunit": "~4.0",
"shiftonelabs/codesniffer-standard": "0.*",
"squizlabs/php_codesniffer": "2.*"
},
"type": "library",
"autoload": {
"psr-4": {
"ShiftOneLabs\\LaravelCascadeDeletes\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Patrick Carlo-Hickman",
"email": "patrick@shiftonelabs.com"
}
],
"description": "Adds application level cascading deletes to Eloquent Models.",
"homepage": "https://github.com/shiftonelabs/laravel-cascade-deletes",
"keywords": [
"cascade",
"deletes",
"eloquent",
"laravel",
"lumen",
"model"
],
"support": {
"issues": "https://github.com/shiftonelabs/laravel-cascade-deletes/issues",
"source": "https://github.com/shiftonelabs/laravel-cascade-deletes"
},
"time": "2020-04-02T07:31:25+00:00"
},
{
"name": "symfony/console",
"version": "v6.2.5",

@ -22,7 +22,8 @@ return new class extends Migration {
$table->bigInteger('role_id')->nullable();
// $table->string('group')->nullable();
// $table->string('region')->nullable();
$table->bigInteger("company_id")->nullable();
// $table->bigInteger("company_id")->nullable();
$table->bigInteger("region_id")->nullable();
$table->rememberToken();
$table->timestamps();
});

@ -1,31 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('departments', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('departments');
}
};

@ -1,31 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('type_docs', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('type_docs');
}
};

@ -27,7 +27,6 @@ return new class extends Migration {
$table->smallInteger("type")->default(1); //only 1 tetap/ 0tidak tetap
$table->string("document")->nullable();
$table->foreignId("user_id")->constrained();
$table->foreignId("company_id")->constrained();
// ?
// $table->string("group")->nullable();

@ -4,9 +4,16 @@ namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use App\Models\Category;
use App\Models\Company;
use App\Models\Department;
use App\Models\Group;
use App\Models\Permission;
use App\Models\Region;
use App\Models\Role;
use App\Models\RolePermission;
use App\Models\Setting;
use App\Models\Type;
use App\Models\TypeDoc;
use App\Models\User;
use Illuminate\Database\Seeder;
@ -41,6 +48,8 @@ class DatabaseSeeder extends Seeder
['name' => 'update-document', 'label' => 'Edit Dokumen'],
['name' => 'create-document', 'label' => 'Buat Dokumen'],
['name' => 'delete-document', 'label' => 'Hapus Dokumen'],
['name' => 'import-document', 'label' => 'Import Dokumen'],
['name' => 'export-document', 'label' => 'Export Dokumen'],
['name' => 'view-category', 'label' => 'Lihat Kategori'],
['name' => 'update-category', 'label' => 'Edit Kategori'],
['name' => 'create-category', 'label' => 'Buat Kategori'],
@ -86,9 +95,80 @@ class DatabaseSeeder extends Seeder
'is_admin' => 1, // admin user
]);
Type::create(['name' => 'Type 1']);
Category::create(['name' => 'Category 1', 'short' => 'C1', 'duration' => 3]);
Setting::create([
'key' => 'DESTINATION_MAIL',
'value' => 'aji19kamaludin@gmail.com'
]);
// role
$role = Role::create(['name' => 'admin']);
$permissions = Permission::all()->map(function ($item) use($role) {
return [
'role_id' => $role->id,
'permission_id' => $item->id,
];
})->toArray();
RolePermission::insert($permissions);
// 1
$group = Group::create(['name' => 'G1']);
$region = Region::create([
'group_id' => $group->id,
'name' => 'R1'
]);
Company::create([
'region_id' => $region->id,
'name' => 'Company 1',
'short' => 'C1',
]);
Company::create([
'region_id' => $region->id,
'name' => 'Company 2',
'short' => 'C2',
]);
User::create([
'name' => 'User Administrator',
'email' => 'user@admin.com',
'password' => bcrypt('password'),
'is_admin' => 0, // admin user,
'role_id' => $role->id,
'region_id' => $region->id
]);
// 2
$group = Group::create(['name' => 'G2']);
$region = Region::create([
'group_id' => $group->id,
'name' => 'R2'
]);
Company::create([
'region_id' => $region->id,
'name' => 'Company 3',
'short' => 'C3',
]);
Company::create([
'region_id' => $region->id,
'name' => 'Company 4',
'short' => 'C4',
]);
User::create([
'name' => 'User2 Administrator',
'email' => 'user2@admin.com',
'password' => bcrypt('password'),
'is_admin' => 0, // admin user,
'role_id' => $role->id,
'region_id' => $region->id
]);
}
}

@ -1,34 +1,11 @@
import React from 'react';
import "@fullcalendar/react/dist/vdom";
import FullCalendar from '@fullcalendar/react' // must go before plugins
import dayGridPlugin from '@fullcalendar/daygrid' // a plugin!
import interactionPlugin from "@fullcalendar/interaction" // needed for dayClick
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout';
import { Head } from '@inertiajs/react';
import { router } from '@inertiajs/react'
import { Head,Link } from '@inertiajs/react';
export default function Dashboard(props) {
const { count_active, count_update, count_expired, count_total, events } = props
// const calenderEvents = events.map(e => {
// return {
// title: `${e.document.type.name} - ${e.document.name}`,
// date: e.date,
// id : e.id,
// url: route('docs.show', e.document)
// }
// })
const handleEventClick = (arg) => {
// console.log(arg.event)
}
const handleDateClick = (arg) => { // bind with an arrow function
// apa yang harus di handle: tampilkan saja modal yang ada event pada date ini kemudian bisa tambah reminder atau hapus reminder pada data ini,
// untuk tambah reminder pilih form doc id saja kemudian tambah , untuk delete cukup confirm kemudian hilang
alert(arg.dateStr)
}
const { count_active, count_update } = props
return (
<AuthenticatedLayout
@ -43,37 +20,16 @@ export default function Dashboard(props) {
<div className="stats bg-base-100 shadow-md w-full overflow-hidden">
<div className="stat">
<div className="stat-title">Dokumen Mendekati Jatuh Tempo</div>
<div className="stat-value">{count_active}</div>
<Link className="stat-value" href={route("docs.index", {status: 2})}>{count_active}</Link>
</div>
</div>
<div className="stats bg-base-100 shadow-md w-full overflow-hidden">
<div className="stat">
<div className="stat-title">Dokumen Jatuh Tempo</div>
<div className="stat-value">{count_update}</div>
</div>
</div>
{/* <div className="stats bg-base-100 shadow-md w-full">
<div className="stat">
<div className="stat-title">Dokumen Berakhir</div>
<div className="stat-value">{count_expired}</div>
<Link className="stat-value" href={route("docs.index", {status: 1})}>{count_update}</Link>
</div>
</div>
<div className="stats bg-base-100 shadow-md w-full">
<div className="stat">
<div className="stat-title">Total Dokumen</div>
<div className="stat-value">{count_total}</div>
</div>
</div> */}
</div>
{/* <div className='bg-base-100 mx-2 md:mx-8 mt-4 p-2 md:p-4 lg:p-8 h-auto'>
<FullCalendar
plugins={[ dayGridPlugin, interactionPlugin ]}
initialView="dayGridMonth"
dateClick={handleDateClick}
eventClick={handleEventClick}
events={calenderEvents}
/>
</div> */}
</AuthenticatedLayout>
);
}

@ -8,7 +8,6 @@ import TextInput from '@/Components/TextInput'
import { formatDate } from '@/utils'
import { useModalState } from '@/Hooks'
export default function FormDocument(props) {
const { doc, doc_url }= props
@ -27,23 +26,34 @@ export default function FormDocument(props) {
<p className='font-bold text-2xl mb-4'>Dokumen</p>
<div className="overflow-x-auto">
<div>
<div className='mt-4'>
<InputLabel forInput="group" value="Group" />
<TextInput
type="text"
name="group"
value={doc.company?.region?.group?.name}
className="mt-1 block w-full"
autoComplete={"false"}
readOnly={true}
/>
</div>
<div className='mt-4'>
<InputLabel forInput="region" value="Region" />
<TextInput
type="text"
name="region"
value={doc.region}
value={doc.company?.region?.name}
className="mt-1 block w-full"
autoComplete={"false"}
readOnly={true}
/>
</div>
<div className='mt-4'>
<InputLabel forInput="group" value="Group" />
<InputLabel forInput="company_name" value="Nama Perusahaan" />
<TextInput
type="text"
name="group"
value={doc.group}
name="company_name"
value={doc.company?.name}
className="mt-1 block w-full"
autoComplete={"false"}
readOnly={true}
@ -71,7 +81,7 @@ export default function FormDocument(props) {
readOnly={true}
/>
</div>
<div>
<div className='mt-4'>
<InputLabel forInput="no_doc" value="No Dokumen" />
<TextInput
type="text"
@ -82,7 +92,7 @@ export default function FormDocument(props) {
readOnly={true}
/>
</div>
<div>
<div className='mt-4'>
<InputLabel forInput="name" value="Nama Dokumen" />
<TextInput
type="text"
@ -93,7 +103,7 @@ export default function FormDocument(props) {
readOnly={true}
/>
</div>
<div>
<div className='mt-4'>
<InputLabel forInput="publisher" value="Penerbit" />
<TextInput
type="text"
@ -104,17 +114,6 @@ export default function FormDocument(props) {
readOnly={true}
/>
</div>
<div className='mt-4'>
<InputLabel forInput="company_name" value="Nama Perusahaan" />
<TextInput
type="text"
name="company_name"
value={doc.company_name}
className="mt-1 block w-full"
autoComplete={"false"}
readOnly={true}
/>
</div>
<div className='mt-4'>
<div className="flex w-80 justify-between items-center">
<InputLabel value="Tipe" />

@ -11,13 +11,11 @@ import InputFile from '@/Components/InputFile'
export default function FormDocument(props) {
const inputDocument = useRef()
const { types, categories, doc }= props
const { props: {auth: { user }} } = usePage()
const { types, categories, companies, doc }= props
const { data, setData, post, processing, errors } = useForm({
no_doc: '',
name: '',
company_name: '',
type_id: '',
category_id: '',
publisher: '',
@ -26,8 +24,7 @@ export default function FormDocument(props) {
due_date: '',
status: 0,
type: 0,
group: user.group,
region: user.region,
company_id: '',
document: null,
document_name: '',
});
@ -37,7 +34,6 @@ export default function FormDocument(props) {
setData({
no_doc: doc.no_doc,
name: doc.name,
company_name: doc.company_name,
type_id: doc.type_id,
category_id: doc.category_id,
publisher: doc.publisher,
@ -46,8 +42,7 @@ export default function FormDocument(props) {
due_date: doc.due_date,
status: doc.status,
type: doc.type,
group: doc.group,
region: doc.region,
company_id: doc.company_id,
document: null,
document_name: doc.document,
})
@ -87,32 +82,6 @@ export default function FormDocument(props) {
<p className='font-bold text-2xl mb-4'>Dokumen</p>
<div className="overflow-x-auto">
<form onSubmit={submit}>
<div className='mt-4'>
<InputLabel forInput="region" value="Region" />
<TextInput
type="text"
name="region"
value={data.region}
className="mt-1 block w-full"
autoComplete={"false"}
handleChange={onHandleChange}
isError={errors.region}
/>
<InputError message={errors.region}/>
</div>
<div className='mt-4'>
<InputLabel forInput="group" value="Group" />
<TextInput
type="text"
name="group"
value={data.group}
className="mt-1 block w-full"
autoComplete={"false"}
handleChange={onHandleChange}
isError={errors.group}
/>
<InputError message={errors.group}/>
</div>
<div className='mt-4 pl-1'>
<InputLabel forInput="type" value="Jenis" />
<select
@ -143,6 +112,21 @@ export default function FormDocument(props) {
</select>
<InputError message={errors.category_id}/>
</div>
<div className='mt-4 pl-1'>
<InputLabel forInput="company" value="Nama Perusahaan" />
<select
className="mt-1 select select-bordered w-full"
name="company_id"
onChange={onHandleChange}
value={data.company_id}
>
<option selected disabled></option>
{companies.map(company => (
<option key={company.id} value={company.id}>{company.name}</option>
))}
</select>
<InputError message={errors.company_id}/>
</div>
<div className='mt-4'>
<InputLabel forInput="no_doc" value="No Dokumen" />
<TextInput
@ -182,19 +166,6 @@ export default function FormDocument(props) {
/>
<InputError message={errors.publisher}/>
</div>
<div className='mt-4'>
<InputLabel forInput="company_name" value="Nama Perusahaan" />
<TextInput
type="text"
name="company_name"
value={data.company_name}
className="mt-1 block w-full"
autoComplete={"false"}
handleChange={onHandleChange}
isError={errors.company_name}
/>
<InputError message={errors.company_name}/>
</div>
<div className='mt-4'>
<div className="flex w-80 justify-between items-center">
<InputLabel value="Tipe" />

@ -12,10 +12,9 @@ import { IconMenu } from '@/Icons'
import { formatDate, hasPermission } from '@/utils'
export default function Document(props) {
const { types, departments } = props
const { data: docs, links } = props.docs
const [search, setSearch] = useState({q: ''})
const [search, setSearch] = useState({q: '', status: 0})
const preValue = usePrevious(search)
const confirmModal = useModalState(false)
@ -64,6 +63,8 @@ export default function Document(props) {
const canCreate = hasPermission('create-document', props.auth.user)
const canUpdate = hasPermission('update-document', props.auth.user)
const canDelete = hasPermission('delete-document', props.auth.user)
const canImport = hasPermission('import-document', props.auth.user)
const canExport = hasPermission('export-document', props.auth.user)
return (
<AuthenticatedLayout
@ -77,6 +78,7 @@ export default function Document(props) {
<div className="card bg-base-100 w-full">
<div className="card-body">
<div className="flex flex-col md:flex-row w-full mb-4 justify-between space-y-1 md:space-y-0">
<div className='flex flex-row gap-2'>
{canCreate && (
<Link
className="btn btn-neutral"
@ -85,7 +87,13 @@ export default function Document(props) {
Tambah
</Link>
)}
<div className='flex flex-row'>
{canImport && (
<div className='btn btn-outline'>
Import
</div>
)}
</div>
<div className='flex md:flex-row flex-col gap-2'>
<div className="form-control w-full">
<input
type="text"
@ -97,6 +105,25 @@ export default function Document(props) {
placeholder="Search"
/>
</div>
<div className='flex flex-row gap-2'>
<div className="dropdown dropdown-end">
<label tabIndex={0} className="btn btn-outline">Filter</label>
<ul tabIndex={0} className="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52">
<li><div onClick={() => handleFilter({status: 0})}>Semua</div></li>
<li><div onClick={() => handleFilter({status: 1})}>Jatuh Tempo</div></li>
<li><div onClick={() => handleFilter({status: 2})}>Mendekati Jatuh Tempo</div></li>
</ul>
</div>
{canExport && (
<div className="dropdown dropdown-end">
<label tabIndex={0} className="btn btn-outline">Export</label>
<ul tabIndex={0} className="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-52">
<li><a>XLSX</a></li>
<li><a>PDF</a></li>
</ul>
</div>
)}
</div>
</div>
</div>
<div className="overflow-x-auto pb-44">

@ -108,8 +108,8 @@ export default function Users(props) {
<td>{user.name}</td>
<td>{user.email}</td>
<td>{user?.role?.name}</td>
<td>{user.group}</td>
<td>{user.region}</td>
<td>{user?.region?.group?.name}</td>
<td>{user?.region?.name}</td>
<td className="text-right">
{canUpdate && (
<div

@ -4,7 +4,7 @@ import { toast } from 'react-toastify'
export default function UserFormModal(props) {
const { isOpen, toggle = () => {} , user = null } = props
const { props: { roles }} = usePage()
const { props: { roles, regions }} = usePage()
const { data, setData, post, put, processing, errors, reset, clearErrors } = useForm({
name: '',
@ -12,8 +12,7 @@ export default function UserFormModal(props) {
password: '',
role_id: '',
is_admin: '0',
group: '',
region: ''
region_id: ''
})
const handleOnChange = (event) => {
@ -58,8 +57,7 @@ export default function UserFormModal(props) {
email: user?.email,
role_id: user?.role_id,
is_admin: user?.is_admin,
group: user?.group,
region: user?.region
region_id: user?.region_id
})
}, [user])
@ -135,43 +133,31 @@ export default function UserFormModal(props) {
</span>
</label>
</div>
<div className="form-control">
<label className="label">
<span className="label-text">Group</span>
</label>
<input
type="text"
placeholder="group"
className={`input input-bordered ${
errors.name && 'input-error'
}`}
name="group"
value={data.group}
onChange={handleOnChange}
/>
<label className="label">
<span className="label-text-alt">{errors.group}</span>
</label>
</div>
<div className="form-control">
<label className="label">
<span className="label-text">Region</span>
</label>
<input
type="text"
placeholder="region"
className={`input input-bordered ${
errors.name && 'input-error'
}`}
name="region"
value={data.region}
onChange={handleOnChange}
/>
<label className="label">
<span className="label-text-alt">{errors.region}</span>
</label>
</div>
{(user === null || +user?.is_admin === 0) && (
<>
<div className="form-control">
<label className="label">
<span className="label-text">Region</span>
</label>
<select
className={`select select-bordered w-full ${
errors.region_id && 'select-error'
}`}
name='region_id'
value={data.region_id}
onChange={handleOnChange}
>
<option disabled value=""></option>
{regions.map(region => (
<option key={region.id} value={region.id}>{region.name}</option>
))}
</select>
<label className="label">
<span className="label-text-alt">
{errors.region_id}
</span>
</label>
</div>
<div className="form-control">
<label className="label">
<span className="label-text">Role</span>
@ -195,6 +181,7 @@ export default function UserFormModal(props) {
</span>
</label>
</div>
</>
)}
<div className="modal-action">
<div

@ -74,7 +74,7 @@ Route::middleware(['auth'])->group(function () {
Route::delete('/docs/{doc}', [DocumentController::class, 'destroy'])->name('docs.destroy');
Route::get('/docs/{doc}', [DocumentController::class, 'edit'])->name('docs.edit');
Route::post('/docs/{doc}', [DocumentController::class, 'update'])->name('docs.update');
Route::post('/docs/{doc}', [DocumentController::class, 'show'])->name('docs.show');
Route::get('/docs/{doc}/show', [DocumentController::class, 'show'])->name('docs.show');
Route::get('/notification/{notification}', [NotificationController::class, 'redirect'])->name('notification.redirect');

Loading…
Cancel
Save