commit 6ada208dd3de64d8e1734b8f70460d13aa43ad8e Author: daeng.deni@dharma.or.id Date: Sat Jun 10 21:58:01 2023 +0700 Initial Module Warehouse diff --git a/Config/.gitkeep b/Config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Config/config.php b/Config/config.php new file mode 100644 index 0000000..c40521f --- /dev/null +++ b/Config/config.php @@ -0,0 +1,5 @@ + 'Warehouse' +]; diff --git a/Console/.gitkeep b/Console/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/DataTables/WarehouseDataTable.php b/DataTables/WarehouseDataTable.php new file mode 100644 index 0000000..c599322 --- /dev/null +++ b/DataTables/WarehouseDataTable.php @@ -0,0 +1,106 @@ +eloquent($query) + ->filter(function ($query) { + $search = request()->get('search'); + if ($search['value'] !== "") { + $query->where('name', 'like', "%" . $search['value'] . "%"); + $query->orWhere('address', 'like', "%" . $search['value'] . "%"); + $query->orWhere('kapasitas', 'like', "%" . $search['value'] . "%"); + } + }) + ->addIndexColumn() + ->addColumn('status', function ($model) { + return view('warehouse::_status', compact('model')); + }) + ->addColumn('action', function ($model) { + return view('warehouse::_action', compact('model')); + }) + ->rawColumns(['status', 'action']); + } + + /** + * Get query source of dataTable. + * + * @param \Modules\Product\Entities\Product $model + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function query(Warehouse $model) + { + return $model->newQuery(); + } + + /** + * Optional method if you want to use html builder. + * + * @return \Yajra\DataTables\Html\Builder + */ + public function html() + { + return $this->builder() + ->setTableId('warehouse-table') + ->columns($this->getColumns()) + ->minifiedAjax() + ->orderBy(1, 'asc') + ->stateSave(false) + ->responsive() + ->autoWidth(false) + ->parameters([ + 'scrollX' => false, + 'drawCallback' => 'function() { KTMenu.createInstances(); }', + ]) + ->addTableClass('align-middle table-row-dashed fs-6 gy-5'); + } + + /** + * Get columns. + * + * @return array + */ + protected function getColumns() + { + return [ + Column::make('DT_RowIndex')->title('No')->orderable(false)->searchable(false), + Column::make('name')->title(__('Name')), + Column::make('address')->title(__('Address')), + Column::make('kapasitas')->title(__('Capacity')), + Column::computed('status')->title(__('Status'))->width(50)->addClass('text-center')->exportable(false), + Column::computed('action') + ->exportable(false) + ->printable(false) + ->width(100) + ->addClass('text-center') + ->responsivePriority(-1), + ]; + } + + /** + * Get filename for export. + * + * @return string + */ + protected function filename() + : string + { + return 'Product_' . date('YmdHis'); + } + } diff --git a/Database/Migrations/.gitkeep b/Database/Migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Database/Migrations/2023_06_10_142243_create_warehouses_table.php b/Database/Migrations/2023_06_10_142243_create_warehouses_table.php new file mode 100644 index 0000000..7517fae --- /dev/null +++ b/Database/Migrations/2023_06_10_142243_create_warehouses_table.php @@ -0,0 +1,40 @@ +id(); + $table->string('name', 100); + $table->string('address', 100); + $table->string('kapasitas', 100); + $table->string('status', 1)->default(1); + $table->timestamps(); + $table->softDeletes(); + + $table->foreignId("created_by")->nullable()->constrained("users"); + $table->foreignId("updated_by")->nullable()->constrained("users"); + $table->foreignId("deleted_by")->nullable()->constrained("users"); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('warehouses'); + } +}; diff --git a/Database/Seeders/.gitkeep b/Database/Seeders/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Database/Seeders/WarehouseDatabaseSeeder.php b/Database/Seeders/WarehouseDatabaseSeeder.php new file mode 100644 index 0000000..d520a89 --- /dev/null +++ b/Database/Seeders/WarehouseDatabaseSeeder.php @@ -0,0 +1,67 @@ +forgetCachedPermissions(); + + $data = $this->data(); + foreach ($data as $value) { + $permission = Permission::updateOrCreate([ + 'name' => $value['name'], + 'guard_name' => 'web' + ], [ + 'permission_group_id' => $value['group'], + ]); + + $role = Role::find(1); + $role->givePermissionTo($permission); + } + } + + public function data() + { + $data = []; + // list of model permission + $model = ['warehouse']; + + foreach ($model as $value) { + $permissionGroup = PermissionGroup::updateOrCreate([ + 'name' => $value + ]); + + foreach ($this->crudActions($value) as $action) { + $data[] = ['name' => $action, 'group' => $permissionGroup->id]; + } + } + + return $data; + } + + public function crudActions($name) + { + $actions = []; + // list of permission actions + $crud = ['create', 'read', 'update', 'delete']; + + foreach ($crud as $value) { + $actions[] = $name . '.' . $value; + } + + return $actions; + } + } diff --git a/Database/factories/.gitkeep b/Database/factories/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Entities/.gitkeep b/Entities/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Entities/Warehouse.php b/Entities/Warehouse.php new file mode 100644 index 0000000..319f0e0 --- /dev/null +++ b/Entities/Warehouse.php @@ -0,0 +1,15 @@ +middleware(function ($request, $next) { + $this->user = Auth::guard('web')->user(); + return $next($request); + }); + + $module = file_get_contents(dirname(__FILE__, 3) . '/module.json'); + $this->module = json_decode($module); + } + + /** + * Display a listing of the resource. + * + * @return Renderable + */ + public function index(WarehouseDataTable $dataTable) + { + if (is_null($this->user) || !$this->user->can($this->module->alias . '.read')) { + abort(403, 'Sorry !! You are Unauthorized to view any ' . $this->module->alias . ' !'); + } + + return $dataTable->render($this->module->alias . '::index'); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Renderable + */ + public function store(StoreWarehouseRequest $request) + { + if (is_null($this->user) || !$this->user->can($this->module->alias . '.create')) { + abort(403, 'Sorry !! You are Unauthorized to create any ' . $this->module->alias . ' !'); + } + + //Validate the request + $validated = $request->validated(); + + // Store the Warehouse... + if ($validated) { + try { + $this->model::create($validated); + echo json_encode(['status' => 'success', 'message' => $this->module->name . ' created successfully.']); + } catch (Exception $e) { + echo json_encode(['status' => 'error', 'message' => $this->module->name . ' created failed.']); + } + return; + } + + echo json_encode(['status' => 'error', 'message' => $this->module->name . ' created failed.']); + } + + /** + * Show the form for creating a new resource. + * + * @return Renderable + */ + public function create() + { + if (is_null($this->user) || !$this->user->can($this->module->alias . '.create')) { + abort(403, 'Sorry !! You are Unauthorized to create any ' . $this->module->alias . ' !'); + } + + abort(404); + } + + /** + * Show the specified resource. + * + * @param int $id + * + * @return Renderable + */ + public function show($id) + { + if (is_null($this->user) || !$this->user->can($this->module->alias . '.read')) { + abort(403, 'Sorry !! You are Unauthorized to view any ' . $this->module->alias . ' !'); + } + + abort(404); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * + * @return Renderable + */ + public function edit($id) + { + if (is_null($this->user) || !$this->user->can($this->module->alias . '.update')) { + abort(403, 'Sorry !! You are Unauthorized to update any ' . $this->module->alias . ' !'); + } + + $data = $this->model::find($id); + echo json_encode($data); + } + + /** + * Update the specified resource in storage. + * + * @param Request $request + * @param int $id + * + * @return Renderable + */ + public function update(UpdateWarehouseRequest $request, Warehouse $warehouse) + { + if (is_null($this->user) || !$this->user->can($this->module->alias . '.update')) { + abort(403, 'Sorry !! You are Unauthorized to update any ' . $this->module->alias . ' !'); + } + + //Validate the request + $validated = $request->validated(); + + // Update the Warehouse... + if ($validated) { + try { + $warehouse->update($validated); + echo json_encode(['status' => 'success', 'message' => $this->module->name . ' updated successfully.']); + } catch (Exception $e) { + echo json_encode(['status' => 'error', 'message' => $this->module->name . ' updated failed.']); + } + return; + } + + echo json_encode(['status' => 'error', 'message' => $this->module->name . ' updated failed.']); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * + * @return Renderable + */ + public function destroy(Warehouse $warehouse) + { + if (is_null($this->user) || !$this->user->can($this->module->alias . '.delete')) { + abort(403, 'Sorry !! You are Unauthorized to delete any ' . $this->module->alias . ' !'); + } + + try { + $warehouse->delete(); + echo json_encode(['status' => 'success', 'message' => $this->module->name . ' deleted successfully.']); + } catch (Exception $e) { + echo json_encode(['status' => 'error', 'message' => $this->module->name . ' deleted failed.']); + } + } + } diff --git a/Http/Middleware/.gitkeep b/Http/Middleware/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Http/Requests/.gitkeep b/Http/Requests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Http/Requests/StoreWarehouseRequest.php b/Http/Requests/StoreWarehouseRequest.php new file mode 100644 index 0000000..fc969c0 --- /dev/null +++ b/Http/Requests/StoreWarehouseRequest.php @@ -0,0 +1,67 @@ + + */ + public function rules() + : array + { + return [ + 'name' => 'required|string|max:50|unique:warehouses,name', + 'kapasitas' => 'required|string|max:255', + 'address' => 'nullable|string|max:255', + 'status' => 'nullable|integer|max:1', + ]; + } + + /** + * Configure the validator instance. + */ + public function withValidator(Validator $validator) + : void + { + $validator->after(function (Validator $validator) { + if ($validator->errors()->any()) { + $errors = json_decode($validator->errors()->toJson(), true); + + foreach ($errors as $key => $value) { + flash($value[0]); + } + return redirect()->route('warehouse.index')->with('error', 'Warehouse created failed.'); + } + + }); + } + + protected function failedValidation(Validator|\Illuminate\Contracts\Validation\Validator $validator) + : JsonResponse + { + $errors = (new ValidationException($validator))->errors(); + + throw new HttpResponseException(response()->json([ + 'success' => false, + 'errors' => $errors, + 'messages' => 'Warehouse created failed.' + ], JsonResponse::HTTP_UNPROCESSABLE_ENTITY)); + } + } diff --git a/Http/Requests/UpdateWarehouseRequest.php b/Http/Requests/UpdateWarehouseRequest.php new file mode 100644 index 0000000..865845e --- /dev/null +++ b/Http/Requests/UpdateWarehouseRequest.php @@ -0,0 +1,67 @@ + + */ + public function rules() + : array + { + return [ + 'name' => 'required|string|max:50|unique:warehouses,name,' . $this->warehouse->id, + 'address' => 'required|string|max:255', + 'kapasitas' => 'required|string|max:255', + 'status' => 'nullable|integer|max:1', + ]; + } + + /** + * Configure the validator instance. + */ + public function withValidator(Validator $validator) + : void + { + $validator->after(function (Validator $validator) { + if ($validator->errors()->any()) { + $errors = json_decode($validator->errors()->toJson(), true); + + foreach ($errors as $key => $value) { + flash($value[0]); + } + return redirect()->route('warehouse.index')->with('error', 'Warehouse created failed.'); + } + + }); + } + + protected function failedValidation(Validator|\Illuminate\Contracts\Validation\Validator $validator) + : JsonResponse + { + $errors = (new ValidationException($validator))->errors(); + + throw new HttpResponseException(response()->json([ + 'success' => false, + 'errors' => $errors, + 'messages' => 'Warehouse created failed.' + ], JsonResponse::HTTP_UNPROCESSABLE_ENTITY)); + } + } diff --git a/Http/Requests/WarehouseRequest.php b/Http/Requests/WarehouseRequest.php new file mode 100644 index 0000000..88c63da --- /dev/null +++ b/Http/Requests/WarehouseRequest.php @@ -0,0 +1,19 @@ +status == "on") { + $status = 1; + } + $this->merge([ + 'status' => $status + ]); + } + } diff --git a/Providers/.gitkeep b/Providers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Providers/RouteServiceProvider.php b/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..5b22439 --- /dev/null +++ b/Providers/RouteServiceProvider.php @@ -0,0 +1,69 @@ +mapApiRoutes(); + + $this->mapWebRoutes(); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::middleware('web') + ->namespace($this->moduleNamespace) + ->group(module_path('Warehouse', '/Routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApiRoutes() + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->moduleNamespace) + ->group(module_path('Warehouse', '/Routes/api.php')); + } +} diff --git a/Providers/WarehouseServiceProvider.php b/Providers/WarehouseServiceProvider.php new file mode 100644 index 0000000..af1b6a4 --- /dev/null +++ b/Providers/WarehouseServiceProvider.php @@ -0,0 +1,114 @@ +registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations')); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->register(RouteServiceProvider::class); + } + + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'), + ], 'config'); + $this->mergeConfigFrom( + module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower + ); + } + + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = resource_path('views/modules/' . $this->moduleNameLower); + + $sourcePath = module_path($this->moduleName, 'Resources/views'); + + $this->publishes([ + $sourcePath => $viewPath + ], ['views', $this->moduleNameLower . '-module-views']); + + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); + } + + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $langPath = resource_path('lang/modules/' . $this->moduleNameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->moduleNameLower); + $this->loadJsonTranslationsFrom($langPath); + } else { + $this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower); + $this->loadJsonTranslationsFrom(module_path($this->moduleName, 'Resources/lang')); + } + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } + + private function getPublishableViewPaths(): array + { + $paths = []; + foreach (\Config::get('view.paths') as $path) { + if (is_dir($path . '/modules/' . $this->moduleNameLower)) { + $paths[] = $path . '/modules/' . $this->moduleNameLower; + } + } + return $paths; + } +} diff --git a/Resources/assets/.gitkeep b/Resources/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Resources/assets/js/app.js b/Resources/assets/js/app.js new file mode 100644 index 0000000..e69de29 diff --git a/Resources/assets/sass/app.scss b/Resources/assets/sass/app.scss new file mode 100644 index 0000000..e69de29 diff --git a/Resources/lang/.gitkeep b/Resources/lang/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Resources/views/.gitkeep b/Resources/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Resources/views/_action.blade.php b/Resources/views/_action.blade.php new file mode 100644 index 0000000..d1cd396 --- /dev/null +++ b/Resources/views/_action.blade.php @@ -0,0 +1,17 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp +
+ @can('warehouse.update') + + {!! getIcon("pencil", "fs-1 text-info","duotune") !!} + + @endcan + + @can('warehouse.delete') + {!! Form::open(['method' => 'DELETE','route' => [$route[0].'.destroy', $model->id],'class'=>'']) !!} + {{ Form::button(getIcon("trash", "fs-1 text-danger","duotune"), ['type' => 'submit', 'class' => 'delete btn btn-icon btn-bg-light btn-active-light-danger btn-sm'] ) }} + {!! Form::close() !!} + @endcan +
diff --git a/Resources/views/_form.blade.php b/Resources/views/_form.blade.php new file mode 100644 index 0000000..26a98bf --- /dev/null +++ b/Resources/views/_form.blade.php @@ -0,0 +1,94 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + + + + diff --git a/Resources/views/_status.blade.php b/Resources/views/_status.blade.php new file mode 100644 index 0000000..be67c63 --- /dev/null +++ b/Resources/views/_status.blade.php @@ -0,0 +1,12 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + +{!! Form::open(['method' => 'PUT','route' => [$route[0].'.update', $model->id],'class'=>'']) !!} +
+ status==1 ? 'checked' : '' }} type="checkbox" name="status" id="status"/> + + + +
+{!! Form::close() !!} diff --git a/Resources/views/_table.blade.php b/Resources/views/_table.blade.php new file mode 100644 index 0000000..c03ab95 --- /dev/null +++ b/Resources/views/_table.blade.php @@ -0,0 +1,117 @@ + +{{ $dataTable->table() }} + + +{{-- Inject Scripts --}} +@section('scripts') + {{ $dataTable->scripts() }} +@endsection + +@push('customscript') + @php + $route = explode('.', Route::currentRouteName()); + @endphp + + +@endpush + +@section('styles') + +@endsection diff --git a/Resources/views/index.blade.php b/Resources/views/index.blade.php new file mode 100644 index 0000000..d530a17 --- /dev/null +++ b/Resources/views/index.blade.php @@ -0,0 +1,135 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + + + +
+ +
+
+
+ + + + + + + + + +
+ + +
+ + +
+ +
+ + + + + + + +
+ + +
+
+
+ @include('warehouse::_table') + @include('warehouse::_form') +
+ +
+ + @push('customscript') + + @endpush +
diff --git a/Resources/views/partials/menu/_app.blade.php b/Resources/views/partials/menu/_app.blade.php new file mode 100644 index 0000000..b6f7bac --- /dev/null +++ b/Resources/views/partials/menu/_app.blade.php @@ -0,0 +1,12 @@ +@canany(['warehouse.read','warehouse.create','warehouse.update','warehouse.delete']) + + + +@endcanany diff --git a/Routes/.gitkeep b/Routes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Routes/api.php b/Routes/api.php new file mode 100644 index 0000000..cca1ab4 --- /dev/null +++ b/Routes/api.php @@ -0,0 +1,18 @@ +get('/warehouse', function (Request $request) { + return $request->user(); +}); \ No newline at end of file diff --git a/Routes/web.php b/Routes/web.php new file mode 100644 index 0000000..92f6988 --- /dev/null +++ b/Routes/web.php @@ -0,0 +1,18 @@ +group(function () { + Route::resource('warehouse', WarehouseController::class); + }); diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..29130cd --- /dev/null +++ b/composer.json @@ -0,0 +1,24 @@ +{ + "name": "putrakuningan/warehouse-module", + "type": "laravel-module", + "description": "", + "authors": [ + { + "name": "Daeng Deni Mardaeni", + "email": "ddeni05@gmail.com" + } + ], + "extra": { + "laravel": { + "providers": [], + "aliases": { + + } + } + }, + "autoload": { + "psr-4": { + "Modules\\Warehouse\\": "" + } + } +} diff --git a/module.json b/module.json new file mode 100644 index 0000000..81b7c87 --- /dev/null +++ b/module.json @@ -0,0 +1,13 @@ +{ + "name": "Warehouse", + "alias": "warehouse", + "database": "", + "domain": "", + "description": "", + "keywords": [], + "priority": 0, + "providers": [ + "Modules\\Warehouse\\Providers\\WarehouseServiceProvider" + ], + "files": [] +}