diff --git a/app/Http/Controllers/Admin/CategoryController.php b/app/Http/Controllers/Admin/CategoryController.php new file mode 100644 index 0000000..20c3d28 --- /dev/null +++ b/app/Http/Controllers/Admin/CategoryController.php @@ -0,0 +1,126 @@ +middleware('can:category list', ['only' => ['index', 'show']]); + $this->middleware('can:category create', ['only' => ['create', 'store']]); + $this->middleware('can:category edit', ['only' => ['edit', 'update']]); + $this->middleware('can:category delete', ['only' => ['destroy']]); + } + + /** + * Display a listing of the resource. + * + * @return \Inertia\Response + */ + public function index(CategoryType $type) + { + $items = (new Category)->toTree($type->id, true); + + return Inertia::render('Admin/Category/Item/Index', [ + 'categoryType' => $type, + 'items' => $items, + 'can' => [ + 'create' => Auth::user()->can('category create'), + 'edit' => Auth::user()->can('category edit'), + 'delete' => Auth::user()->can('category delete'), + ] + ]); + } + + /** + * Show the form for creating a new resource. + * + * @return \Inertia\Response + */ + public function create(CategoryType $type) + { + $itemOptions = Category::selectOptions($type->id, null, true); + return Inertia::render('Admin/Category/Item/Create', [ + 'categoryType' => $type, + 'itemOptions' => $itemOptions + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param StoreCategoryRequest $request + * @param \BalajiDharma\LaravelCategory\Models\CategoryType $type + * @return \Illuminate\Http\RedirectResponse + */ + public function store(StoreCategoryRequest $request, CategoryType $type) + { + if(!$request->has('enabled')) { + $request['enabled'] = false; + } + + $type->categories()->create($request->all()); + + return redirect()->route('category.type.item.index', $type->id) + ->with('message', 'Category created successfully.'); + } + + /** + * Show the form for editing the specified resource. + * + * @param \BalajiDharma\LaravelCategory\Models\CategoryType $type + * @return \Inertia\Response + */ + public function edit(CategoryType $type, Category $item) + { + $itemOptions = Category::selectOptions($type->id, $item->parent_id ?? $item->id); + return Inertia::render('Admin/Category/Item/Edit', [ + 'categoryType' => $type, + 'item' => $item, + 'itemOptions' => $itemOptions + ]); + } + + /** + * Update the specified resource in storage. + * + * @param UpdateCategoryRequest $request + * @param \BalajiDharma\LaravelCategory\Models\CategoryType $type + * @param \BalajiDharma\LaravelCategory\Models\Category $item + * @return \Illuminate\Http\RedirectResponse + */ + public function update(UpdateCategoryRequest $request, CategoryType $type, Category $item) + { + if(!$request->has('enabled')) { + $request['enabled'] = false; + } + + $item->update($request->all()); + + return redirect()->route('category.type.item.index', $type->id) + ->with('message', 'Category updated successfully.'); + } + + /** + * Remove the specified resource from storage. + * + * @param \BalajiDharma\LaravelCategory\Models\CategoryType $type + * @param \BalajiDharma\LaravelCategory\Models\Category $typeItem + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(CategoryType $type, Category $item) + { + $item->delete(); + + return redirect()->route('category.type.item.index', $type->id) + ->with('message', __('Category deleted successfully')); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/CategoryTypeController.php b/app/Http/Controllers/Admin/CategoryTypeController.php new file mode 100644 index 0000000..474f867 --- /dev/null +++ b/app/Http/Controllers/Admin/CategoryTypeController.php @@ -0,0 +1,139 @@ +middleware('can:category.type list', ['only' => ['index']]); + $this->middleware('can:category.type create', ['only' => ['create', 'store']]); + $this->middleware('can:category.type edit', ['only' => ['edit', 'update']]); + $this->middleware('can:category.type delete', ['only' => ['destroy']]); + } + + /** + * Display a listing of the resource. + * + * @return \Inertia\Response + */ + public function index() + { + $categoryTypes = (new CategoryType)->newQuery(); + + if (request()->has('search')) { + $categoryTypes->where('name', 'Like', '%'.request()->input('search').'%'); + } + + if (request()->query('sort')) { + $attribute = request()->query('sort'); + $sort_order = 'ASC'; + if (strncmp($attribute, '-', 1) === 0) { + $sort_order = 'DESC'; + $attribute = substr($attribute, 1); + } + $categoryTypes->orderBy($attribute, $sort_order); + } else { + $categoryTypes->latest(); + } + + $categoryTypes = $categoryTypes->paginate(5)->onEachSide(2); + + return Inertia::render('Admin/Category/Type/Index', [ + 'categoryTypes' => $categoryTypes, + 'filters' => request()->all('search'), + 'can' => [ + 'create' => Auth::user()->can('category.type create'), + 'edit' => Auth::user()->can('category.type edit'), + 'delete' => Auth::user()->can('category.type delete'), + 'manage' => Auth::user()->can('category index'), + ] + ]); + } + + /** + * Show the form for creating a new resource. + * + * @return \Inertia\Response + */ + public function create() + { + return Inertia::render('Admin/Category/Type/Create'); + } + + /** + * Store a newly created resource in storage. + * + * @param StoreCategoryTypeRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(StoreCategoryTypeRequest $request) + { + if(!$request->has('is_flat')) { + $request['is_flat'] = false; + } + + CategoryType::create([ + 'name' => $request->name, + 'machine_name' => $request->machine_name, + 'description' => $request->description, + 'is_flat' => $request->is_flat, + ]); + + return redirect()->route('category.type.index') + ->with('message', 'Category type created successfully.'); + } + + /** + * Show the form for editing the specified resource. + * + * @param \BalajiDharma\LaravelCategory\Models\CategoryType $categoryType + * @return \Inertia\Response + */ + public function edit(CategoryType $type) + { + return Inertia::render('Admin/Category/Type/Edit', [ + 'categoryType' => $type, + ]); + } + + /** + * Update the specified resource in storage. + * + * @param UpdateCategoryTypeRequest $request + * @param \BalajiDharma\LaravelCategory\Models\CategoryType $categoryType + * @return \Illuminate\Http\RedirectResponse + */ + public function update(UpdateCategoryTypeRequest $request, CategoryType $type) + { + if(!$request->has('is_flat')) { + $request['is_flat'] = false; + } + + $type->update($request->all()); + + return redirect()->route('category.type.index') + ->with('message', 'Category type updated successfully.'); + } + + /** + * Remove the specified resource from storage. + * + * @param \BalajiDharma\LaravelCategory\Models\CategoryType $categoryType + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(CategoryType $type) + { + $type->delete(); + + return redirect()->route('category.type.index') + ->with('message', __('Category type deleted successfully')); + } +} diff --git a/resources/js/Components/Admin/CategoryItemList.vue b/resources/js/Components/Admin/CategoryItemList.vue new file mode 100644 index 0000000..5ebe6c6 --- /dev/null +++ b/resources/js/Components/Admin/CategoryItemList.vue @@ -0,0 +1,66 @@ + + + \ No newline at end of file diff --git a/resources/js/Pages/Admin/Category/Item/Create.vue b/resources/js/Pages/Admin/Category/Item/Create.vue new file mode 100644 index 0000000..ba73858 --- /dev/null +++ b/resources/js/Pages/Admin/Category/Item/Create.vue @@ -0,0 +1,143 @@ + + + diff --git a/resources/js/Pages/Admin/Category/Item/Edit.vue b/resources/js/Pages/Admin/Category/Item/Edit.vue new file mode 100644 index 0000000..94fb567 --- /dev/null +++ b/resources/js/Pages/Admin/Category/Item/Edit.vue @@ -0,0 +1,148 @@ + + + diff --git a/resources/js/Pages/Admin/Category/Item/Index.vue b/resources/js/Pages/Admin/Category/Item/Index.vue new file mode 100644 index 0000000..d573752 --- /dev/null +++ b/resources/js/Pages/Admin/Category/Item/Index.vue @@ -0,0 +1,144 @@ + + + diff --git a/resources/js/Pages/Admin/Category/Type/Create.vue b/resources/js/Pages/Admin/Category/Type/Create.vue new file mode 100644 index 0000000..f76b28b --- /dev/null +++ b/resources/js/Pages/Admin/Category/Type/Create.vue @@ -0,0 +1,105 @@ + + + diff --git a/resources/js/Pages/Admin/Category/Type/Edit.vue b/resources/js/Pages/Admin/Category/Type/Edit.vue new file mode 100644 index 0000000..d340b69 --- /dev/null +++ b/resources/js/Pages/Admin/Category/Type/Edit.vue @@ -0,0 +1,101 @@ + + + diff --git a/resources/js/Pages/Admin/Category/Type/Index.vue b/resources/js/Pages/Admin/Category/Type/Index.vue new file mode 100644 index 0000000..ed06581 --- /dev/null +++ b/resources/js/Pages/Admin/Category/Type/Index.vue @@ -0,0 +1,163 @@ + + + diff --git a/routes/admin.php b/routes/admin.php index 0a54196..b6de05d 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -12,6 +12,15 @@ 'show' ]); Route::resource('menu.item', 'MenuItemController'); + Route::group([ + 'prefix' => 'category', + "as"=>"category." + ], function () { + Route::resource('type', 'CategoryTypeController')->except([ + 'show' + ]); + Route::resource('type.item', 'CategoryController'); + }); Route::get('edit-account-info', 'UserController@accountInfo')->name('admin.account.info'); Route::post('edit-account-info', 'UserController@accountInfoStore')->name('admin.account.info.store'); Route::post('change-password', 'UserController@changePasswordStore')->name('admin.account.password.store');