diff --git a/Modules/Product/Database/Migrations/2021_07_14_145047_create_products_table.php b/Modules/Product/Database/Migrations/2021_07_14_145047_create_products_table.php index 2fca1017..d8beafb2 100644 --- a/Modules/Product/Database/Migrations/2021_07_14_145047_create_products_table.php +++ b/Modules/Product/Database/Migrations/2021_07_14_145047_create_products_table.php @@ -16,7 +16,6 @@ class CreateProductsTable extends Migration Schema::create('products', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('category_id'); - $table->string('product_image')->nullable(); $table->string('product_name'); $table->string('product_code')->unique()->nullable(); $table->string('product_barcode_symbology')->nullable(); diff --git a/Modules/Product/Entities/Product.php b/Modules/Product/Entities/Product.php index 7368dc8e..56dfa03d 100644 --- a/Modules/Product/Entities/Product.php +++ b/Modules/Product/Entities/Product.php @@ -9,6 +9,7 @@ use Spatie\MediaLibrary\InteractsWithMedia; class Product extends Model implements HasMedia { + use HasFactory, InteractsWithMedia; protected $guarded = []; @@ -18,4 +19,9 @@ class Product extends Model implements HasMedia public function category() { return $this->belongsTo(Category::class, 'category_id', 'id'); } + + public function registerMediaCollections(): void { + $this->addMediaCollection('default') + ->useFallbackUrl('/images/fallback_product_image.png'); + } } diff --git a/Modules/Product/Http/Controllers/CategoriesController.php b/Modules/Product/Http/Controllers/CategoriesController.php index e6ebf1e8..84518a31 100644 --- a/Modules/Product/Http/Controllers/CategoriesController.php +++ b/Modules/Product/Http/Controllers/CategoriesController.php @@ -5,26 +5,23 @@ namespace Modules\Product\Http\Controllers; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Gate; use Modules\Product\Entities\Category; use App\DataTables\ProductCategoriesDataTable; class CategoriesController extends Controller { - /** - * Display a listing of the resource. - * @return Renderable - */ public function index(ProductCategoriesDataTable $dataTable) { + abort_if(Gate::denies('access_product_categories'), 403); + return $dataTable->render('product::categories.index'); } - /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable - */ + public function store(Request $request) { + abort_if(Gate::denies('access_product_categories'), 403); + $request->validate([ 'category_code' => 'required|unique:categories,category_code', 'category_name' => 'required' @@ -40,24 +37,19 @@ class CategoriesController extends Controller return redirect()->back(); } - /** - * Show the form for editing the specified resource. - * @param int $id - * @return Renderable - */ + public function edit($id) { + abort_if(Gate::denies('access_product_categories'), 403); + $category = Category::findOrFail($id); return view('product::categories.edit', compact('category')); } - /** - * Update the specified resource in storage. - * @param Request $request - * @param int $id - * @return Renderable - */ + public function update(Request $request, $id) { + abort_if(Gate::denies('access_product_categories'), 403); + $request->validate([ 'category_code' => 'required|unique:categories,category_code,' . $id, 'category_name' => 'required' @@ -73,12 +65,10 @@ class CategoriesController extends Controller return redirect()->route('product-categories.index'); } - /** - * Remove the specified resource from storage. - * @param int $id - * @return Renderable - */ + public function destroy($id) { + abort_if(Gate::denies('access_product_categories'), 403); + $category = Category::findOrFail($id); if ($category->products->isNotEmpty()) { diff --git a/Modules/Product/Http/Controllers/ProductController.php b/Modules/Product/Http/Controllers/ProductController.php index 7e1b337a..4d5ba8e5 100644 --- a/Modules/Product/Http/Controllers/ProductController.php +++ b/Modules/Product/Http/Controllers/ProductController.php @@ -6,6 +6,7 @@ use App\DataTables\ProductDataTable; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Storage; use Modules\Product\Entities\Product; use Modules\Product\Http\Requests\ProductCreateRequest; @@ -15,27 +16,20 @@ use Modules\Upload\Entities\Upload; class ProductController extends Controller { - /** - * Display a listing of the resource. - * @return Renderable - */ public function index(ProductDataTable $dataTable) { + abort_if(Gate::denies('access_products'), 403); + return $dataTable->render('product::products.index'); } - /** - * Show the form for creating a new resource. - * @return Renderable - */ + public function create() { + abort_if(Gate::denies('create_products'), 403); + return view('product::products.create'); } - /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable - */ + public function store(ProductCreateRequest $request) { $product = Product::create($request->except('image')); @@ -55,38 +49,30 @@ class ProductController extends Controller return redirect()->route('products.index'); } - /** - * Show the details for the specified resource. - * @param int $id - * @return Renderable - */ + public function show(Product $product) { + abort_if(Gate::denies('show_products'), 403); + return view('product::products.show', compact('product')); } - /** - * Show the form for editing the specified resource. - * @param int $id - * @return Renderable - */ + public function edit(Product $product) { + abort_if(Gate::denies('edit_products'), 403); + return view('product::products.edit', compact('product')); } - /** - * Update the specified resource in storage. - * @param Request $request - * @param int $id - * @return Renderable - */ + public function update(ProductUpdateRequest $request, Product $product) { $product->update($request->except('image')); if ($request->has('image')) { $tempFile = Upload::where('folder', $request->image)->first(); - $media = $product->getMedia(); - $media[0]->delete(); + if ($product->getFirstMedia()) { + $product->getFirstMedia()->delete(); + } if ($tempFile) { $product->addMedia(Storage::path('public/temp/' . $request->image . '/' . $tempFile->filename))->toMediaCollection(); @@ -101,12 +87,10 @@ class ProductController extends Controller return redirect()->route('products.index'); } - /** - * Remove the specified resource from storage. - * @param int $id - * @return Renderable - */ + public function destroy(Product $product) { + abort_if(Gate::denies('delete_products'), 403); + $product->delete(); toast('Product Deleted!', 'warning'); diff --git a/Modules/Product/Http/Requests/ProductCreateRequest.php b/Modules/Product/Http/Requests/ProductCreateRequest.php index 5e2bf672..5b8d8f4e 100644 --- a/Modules/Product/Http/Requests/ProductCreateRequest.php +++ b/Modules/Product/Http/Requests/ProductCreateRequest.php @@ -3,6 +3,7 @@ namespace Modules\Product\Http\Requests; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Gate; class ProductCreateRequest extends FormRequest { @@ -35,6 +36,6 @@ class ProductCreateRequest extends FormRequest */ public function authorize() { - return true; + return Gate::allows('create_products'); } } diff --git a/Modules/Product/Http/Requests/ProductUpdateRequest.php b/Modules/Product/Http/Requests/ProductUpdateRequest.php index 14dbcb73..b220a6ae 100644 --- a/Modules/Product/Http/Requests/ProductUpdateRequest.php +++ b/Modules/Product/Http/Requests/ProductUpdateRequest.php @@ -3,6 +3,7 @@ namespace Modules\Product\Http\Requests; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Gate; use Illuminate\Validation\Rule; class ProductUpdateRequest extends FormRequest @@ -36,6 +37,6 @@ class ProductUpdateRequest extends FormRequest */ public function authorize() { - return true; + return Gate::allows('edit_products'); } } diff --git a/Modules/Product/Resources/views/categories/edit.blade.php b/Modules/Product/Resources/views/categories/edit.blade.php index d673c204..6ff49164 100644 --- a/Modules/Product/Resources/views/categories/edit.blade.php +++ b/Modules/Product/Resources/views/categories/edit.blade.php @@ -15,6 +15,7 @@
+ @include('utils.alerts')
diff --git a/Modules/Product/Resources/views/categories/index.blade.php b/Modules/Product/Resources/views/categories/index.blade.php index 8b8fc808..dc2bdc0d 100644 --- a/Modules/Product/Resources/views/categories/index.blade.php +++ b/Modules/Product/Resources/views/categories/index.blade.php @@ -18,6 +18,7 @@
+ @include('utils.alerts')
diff --git a/Modules/Product/Resources/views/products/partials/actions.blade.php b/Modules/Product/Resources/views/products/partials/actions.blade.php index 79100d30..a36e3c35 100644 --- a/Modules/Product/Resources/views/products/partials/actions.blade.php +++ b/Modules/Product/Resources/views/products/partials/actions.blade.php @@ -1,9 +1,14 @@ +@can('edit_products') +@endcan +@can('show_products') +@endcan +@can('delete_products') +
+ +
+
+
+
+
+
+
+ @csrf + @method('patch') +
+ + + @error('current_password') +

{{ $message }}

+ @enderror +
+
+ + + @error('password') +

{{ $message }}

+ @enderror +
+
+ + + @error('password_confirmation') +

{{ $message }}

+ @enderror +
+
+ +
+
+
+
+
+
+
+@endsection + +@push('page_scripts') + @include('includes.filepond-js') +@endpush + + diff --git a/Modules/User/Resources/views/roles/create.blade.php b/Modules/User/Resources/views/roles/create.blade.php index fb214903..eb276392 100644 --- a/Modules/User/Resources/views/roles/create.blade.php +++ b/Modules/User/Resources/views/roles/create.blade.php @@ -14,6 +14,7 @@
+ @include('utils.alerts')
@csrf
diff --git a/Modules/User/Resources/views/roles/edit.blade.php b/Modules/User/Resources/views/roles/edit.blade.php index 29087e53..73f17f00 100644 --- a/Modules/User/Resources/views/roles/edit.blade.php +++ b/Modules/User/Resources/views/roles/edit.blade.php @@ -22,6 +22,7 @@
+ @include('utils.alerts') @csrf @method('patch') diff --git a/Modules/User/Resources/views/users/create.blade.php b/Modules/User/Resources/views/users/create.blade.php index e69de29b..14f4dbb1 100644 --- a/Modules/User/Resources/views/users/create.blade.php +++ b/Modules/User/Resources/views/users/create.blade.php @@ -0,0 +1,130 @@ +@extends('layouts.app') + +@section('title', 'Create User') + +@section('third_party_stylesheets') + + +@endsection + +@section('breadcrumb') + +@endsection + +@section('content') +
+ + @csrf +
+
+ @include('utils.alerts') +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+ +
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+ +
+@endsection + +@section('third_party_scripts') + + + + +@endsection + +@push('page_scripts') + +@endpush + + diff --git a/Modules/User/Resources/views/users/edit.blade.php b/Modules/User/Resources/views/users/edit.blade.php index e69de29b..406b5384 100644 --- a/Modules/User/Resources/views/users/edit.blade.php +++ b/Modules/User/Resources/views/users/edit.blade.php @@ -0,0 +1,115 @@ +@extends('layouts.app') + +@section('title', 'Edit User') + +@section('third_party_stylesheets') + + +@endsection + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+ @csrf + @method('patch') +
+
+ @include('utils.alerts') +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+ + +
+ +
+ + +
+
+
+
+
+
+
+
+ + Profile Image + +
+
+
+
+
+
+
+@endsection + +@section('third_party_scripts') + + + + +@endsection + +@push('page_scripts') + +@endpush + + diff --git a/Modules/User/Resources/views/users/index.blade.php b/Modules/User/Resources/views/users/index.blade.php index e69de29b..585f17d7 100644 --- a/Modules/User/Resources/views/users/index.blade.php +++ b/Modules/User/Resources/views/users/index.blade.php @@ -0,0 +1,41 @@ +@extends('layouts.app') + +@section('title', 'Users') + +@section('third_party_stylesheets') + +@endsection + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+
+
+
+ + + Add User + + +
+ +
+ {!! $dataTable->table() !!} +
+
+
+
+
+
+@endsection + +@push('page_scripts') + {!! $dataTable->scripts() !!} +@endpush diff --git a/Modules/User/Resources/views/users/partials/actions.blade.php b/Modules/User/Resources/views/users/partials/actions.blade.php index e69de29b..fbad9298 100644 --- a/Modules/User/Resources/views/users/partials/actions.blade.php +++ b/Modules/User/Resources/views/users/partials/actions.blade.php @@ -0,0 +1,15 @@ + + + + diff --git a/Modules/User/Resources/views/users/partials/roles.blade.php b/Modules/User/Resources/views/users/partials/roles.blade.php new file mode 100644 index 00000000..d1c2f75d --- /dev/null +++ b/Modules/User/Resources/views/users/partials/roles.blade.php @@ -0,0 +1,3 @@ +@foreach($roles as $role) + {{ $role }} +@endforeach diff --git a/Modules/User/Resources/views/users/show.blade.php b/Modules/User/Resources/views/users/show.blade.php deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/User/Routes/web.php b/Modules/User/Routes/web.php index 3f3e557e..cd176486 100644 --- a/Modules/User/Routes/web.php +++ b/Modules/User/Routes/web.php @@ -8,8 +8,12 @@ Route::group(['middleware' => 'auth'], function () { + //User Profile + Route::get('/user/profile', 'ProfileController@edit')->name('profile.edit'); + Route::patch('/user/profile', 'ProfileController@update')->name('profile.update'); + Route::patch('/user/password', 'ProfileController@updatePassword')->name('profile.update.password'); //Users - Route::resource('users', 'UsersController'); + Route::resource('users', 'UsersController')->except('show'); //Roles Route::resource('roles', 'RolesController')->except('show'); diff --git a/Modules/User/Rules/MatchCurrentPassword.php b/Modules/User/Rules/MatchCurrentPassword.php new file mode 100644 index 00000000..45ad28da --- /dev/null +++ b/Modules/User/Rules/MatchCurrentPassword.php @@ -0,0 +1,41 @@ +user()->password); + } + + /** + * Get the validation error message. + * + * @return string + */ + public function message() + { + return __('validation.current_password'); + } +} diff --git a/app/DataTables/RolesDataTable.php b/app/DataTables/RolesDataTable.php index ad05fc86..0a68da37 100644 --- a/app/DataTables/RolesDataTable.php +++ b/app/DataTables/RolesDataTable.php @@ -42,7 +42,7 @@ class RolesDataTable extends DataTable { return $model->newQuery()->with(['permissions' => function($query) { $query->select('name')->get(); - }]); + }])->where('name', '!=', 'Super Admin'); } /** diff --git a/app/DataTables/UsersDataTable.php b/app/DataTables/UsersDataTable.php index 1372751c..429d6cf3 100644 --- a/app/DataTables/UsersDataTable.php +++ b/app/DataTables/UsersDataTable.php @@ -21,9 +21,27 @@ class UsersDataTable extends DataTable { return datatables() ->eloquent($query) + ->addColumn('role', function ($data) { + return view('user::users.partials.roles', [ + 'roles' => $data->getRoleNames() + ]); + }) ->addColumn('action', function ($data) { return view('user::users.partials.actions', compact('data')); - }); + }) + ->addColumn('status', function ($data) { + if ($data->is_active == 1) { + $html = 'Active'; + } else { + $html = 'Deactivated'; + } + return $html; + }) + ->addColumn('image', function ($data) { + $url = $data->getFirstMediaUrl('avatars'); + return ''; + }) + ->rawColumns(['image', 'status']); } /** @@ -34,7 +52,11 @@ class UsersDataTable extends DataTable */ public function query(User $model) { - return $model->newQuery(); + return $model->newQuery() + ->with(['roles' => function ($query) { + $query->select('name')->get(); + }]) + ->where('id', '!=', auth()->id()); } /** @@ -72,13 +94,25 @@ class UsersDataTable extends DataTable protected function getColumns() { return [ - Column::make('id'), - Column::make('created_at'), - Column::make('updated_at'), + Column::computed('image') + ->className('text-center align-middle'), + + Column::make('name') + ->className('text-center align-middle'), + + Column::make('email') + ->className('text-center align-middle'), + + Column::computed('role') + ->className('text-center align-middle'), + + Column::computed('status') + ->className('text-center align-middle'), + Column::computed('action') ->exportable(false) ->printable(false) - ->addClass('text-center'), + ->className('text-center align-middle'), ]; } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 18a0d088..32b68b3a 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class LoginController extends Controller { @@ -37,4 +39,16 @@ class LoginController extends Controller { $this->middleware('guest')->except('logout'); } + + protected function authenticated(Request $request, $user) { + if ($user->is_active != 1) { + Auth::logout(); + + return back()->with([ + 'account_deactivated' => 'Your account is deactivated! Please contact with Super Admin.' + ]); + } + + return next($request); + } } diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index ed1a5e07..4383ffce 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -64,10 +64,15 @@ class RegisterController extends Controller */ protected function create(array $data) { - return User::create([ + $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), + 'is_active' => 1 ]); + + $user->assignRole('Admin'); + + return $user; } } diff --git a/app/Models/User.php b/app/Models/User.php index 804799ba..4145c7ab 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -3,13 +3,18 @@ namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Spatie\MediaLibrary\HasMedia; +use Spatie\MediaLibrary\InteractsWithMedia; +use Spatie\MediaLibrary\MediaCollections\File; +use Spatie\Permission\Traits\HasRoles; -class User extends Authenticatable +class User extends Authenticatable implements HasMedia { - use HasFactory, Notifiable; + use HasFactory, Notifiable, HasRoles, InteractsWithMedia; /** * The attributes that are mass assignable. @@ -20,6 +25,7 @@ class User extends Authenticatable 'name', 'email', 'password', + 'is_active' ]; /** @@ -40,4 +46,16 @@ class User extends Authenticatable protected $casts = [ 'email_verified_at' => 'datetime', ]; + + protected $with = ['media']; + + public function registerMediaCollections(): void + { + $this->addMediaCollection('avatars') + ->useFallbackUrl('/images/fallback_profile_image.png'); + } + + public function scopeIsActive(Builder $builder) { + return $builder->where('is_active', 1); + } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index ce744916..8dc6265d 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -25,6 +25,8 @@ class AuthServiceProvider extends ServiceProvider { $this->registerPolicies(); - // + Gate::before(function ($user, $ability) { + return $user->hasRole('Super Admin') ? true : null; + }); } } diff --git a/config/datatables-html.php b/config/datatables-html.php new file mode 100644 index 00000000..a7f0fd4c --- /dev/null +++ b/config/datatables-html.php @@ -0,0 +1,33 @@ + 'LaravelDataTables', + + /* + * Default table attributes when generating the table. + */ + 'table' => [ + 'class' => 'table table-bordered', + 'id' => 'dataTableBuilder', + ], + + /* + * Default condition to determine if a parameter is a callback or not. + * Callbacks needs to start by those terms or they will be casted to string. + */ + 'callback' => ['$', '$.', 'function'], + + /* + * Html builder script template. + */ + 'script' => 'datatables::script', + + /* + * Html builder script template for DataTables Editor integration. + */ + 'editor' => 'datatables::editor', +]; diff --git a/config/datatables.php b/config/datatables.php new file mode 100644 index 00000000..ed2e36f7 --- /dev/null +++ b/config/datatables.php @@ -0,0 +1,122 @@ + [ + /* + * Smart search will enclose search keyword with wildcard string "%keyword%". + * SQL: column LIKE "%keyword%" + */ + 'smart' => true, + + /* + * Multi-term search will explode search keyword using spaces resulting into multiple term search. + */ + 'multi_term' => true, + + /* + * Case insensitive will search the keyword in lower case format. + * SQL: LOWER(column) LIKE LOWER(keyword) + */ + 'case_insensitive' => true, + + /* + * Wild card will add "%" in between every characters of the keyword. + * SQL: column LIKE "%k%e%y%w%o%r%d%" + */ + 'use_wildcards' => false, + + /* + * Perform a search which starts with the given keyword. + * SQL: column LIKE "keyword%" + */ + 'starts_with' => false, + ], + + /* + * DataTables internal index id response column name. + */ + 'index_column' => 'DT_RowIndex', + + /* + * List of available builders for DataTables. + * This is where you can register your custom dataTables builder. + */ + 'engines' => [ + 'eloquent' => Yajra\DataTables\EloquentDataTable::class, + 'query' => Yajra\DataTables\QueryDataTable::class, + 'collection' => Yajra\DataTables\CollectionDataTable::class, + 'resource' => Yajra\DataTables\ApiResourceDataTable::class, + ], + + /* + * DataTables accepted builder to engine mapping. + * This is where you can override which engine a builder should use + * Note, only change this if you know what you are doing! + */ + 'builders' => [ + //Illuminate\Database\Eloquent\Relations\Relation::class => 'eloquent', + //Illuminate\Database\Eloquent\Builder::class => 'eloquent', + //Illuminate\Database\Query\Builder::class => 'query', + //Illuminate\Support\Collection::class => 'collection', + ], + + /* + * Nulls last sql pattern for PostgreSQL & Oracle. + * For MySQL, use 'CASE WHEN :column IS NULL THEN 1 ELSE 0 END, :column :direction' + */ + 'nulls_last_sql' => ':column :direction NULLS LAST', + + /* + * User friendly message to be displayed on user if error occurs. + * Possible values: + * null - The exception message will be used on error response. + * 'throw' - Throws a \Yajra\DataTables\Exceptions\Exception. Use your custom error handler if needed. + * 'custom message' - Any friendly message to be displayed to the user. You can also use translation key. + */ + 'error' => env('DATATABLES_ERROR', null), + + /* + * Default columns definition of dataTable utility functions. + */ + 'columns' => [ + /* + * List of columns hidden/removed on json response. + */ + 'excess' => ['rn', 'row_num'], + + /* + * List of columns to be escaped. If set to *, all columns are escape. + * Note: You can set the value to empty array to disable XSS protection. + */ + 'escape' => '*', + + /* + * List of columns that are allowed to display html content. + * Note: Adding columns to list will make us available to XSS attacks. + */ + 'raw' => ['action'], + + /* + * List of columns are are forbidden from being searched/sorted. + */ + 'blacklist' => ['password', 'remember_token'], + + /* + * List of columns that are only allowed fo search/sort. + * If set to *, all columns are allowed. + */ + 'whitelist' => '*', + ], + + /* + * JsonResponse header and options config. + */ + 'json' => [ + 'header' => [], + 'options' => 0, + ], + +]; diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 621a24eb..30a5ba7a 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -19,6 +19,7 @@ class CreateUsersTable extends Migration $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); + $table->boolean('is_active'); $table->rememberToken(); $table->timestamps(); }); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 57b73b54..cf46b540 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -3,6 +3,7 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; +use Modules\User\Database\Seeders\PermissionsTableSeeder; class DatabaseSeeder extends Seeder { @@ -13,6 +14,7 @@ class DatabaseSeeder extends Seeder */ public function run() { - // \App\Models\User::factory(10)->create(); + $this->call(PermissionsTableSeeder::class); + $this->call(SuperUserSeeder::class); } } diff --git a/database/seeders/SuperUserSeeder.php b/database/seeders/SuperUserSeeder.php new file mode 100644 index 00000000..b52858e5 --- /dev/null +++ b/database/seeders/SuperUserSeeder.php @@ -0,0 +1,31 @@ + 'Administrator', + 'email' => 'admin@gmail.com', + 'password' => Hash::make(12345678) + ]); + + $superAdmin = Role::create([ + 'name' => 'Super Admin' + ]); + + $user->assignRole($superAdmin); + } +} diff --git a/public/images/fallback_product_image.png b/public/images/fallback_product_image.png new file mode 100644 index 00000000..8b0461a8 Binary files /dev/null and b/public/images/fallback_product_image.png differ diff --git a/public/images/fallback_profile_image.png b/public/images/fallback_profile_image.png new file mode 100644 index 00000000..80b56402 Binary files /dev/null and b/public/images/fallback_profile_image.png differ diff --git a/public/js/filepond-upload.js b/public/js/filepond-upload.js new file mode 100644 index 00000000..697d5c29 --- /dev/null +++ b/public/js/filepond-upload.js @@ -0,0 +1,6 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ +/******/ +/******/ })() +; \ No newline at end of file diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index bb08f5f8..9b3d7fdb 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -11,18 +11,19 @@ - - - - + +
+ @if(Session::has('account_deactivated')) + + @endif
@@ -33,7 +34,7 @@
- +
- +
- - - + +
@@ -30,7 +27,7 @@
- +
- +
- +
- +
- - I already have a membership + + I already have a membership.
diff --git a/resources/views/includes/filepond-css.blade.php b/resources/views/includes/filepond-css.blade.php new file mode 100644 index 00000000..9846f35b --- /dev/null +++ b/resources/views/includes/filepond-css.blade.php @@ -0,0 +1,2 @@ + + diff --git a/resources/views/includes/filepond-js.blade.php b/resources/views/includes/filepond-js.blade.php new file mode 100644 index 00000000..4d77f94f --- /dev/null +++ b/resources/views/includes/filepond-js.blade.php @@ -0,0 +1,25 @@ + + + + + + diff --git a/resources/views/layouts/footer.blade.php b/resources/views/layouts/footer.blade.php index cad89df5..0a67a0ae 100644 --- a/resources/views/layouts/footer.blade.php +++ b/resources/views/layouts/footer.blade.php @@ -1,4 +1,4 @@ diff --git a/resources/views/layouts/header.blade.php b/resources/views/layouts/header.blade.php index b1a74fb6..eb3035dc 100644 --- a/resources/views/layouts/header.blade.php +++ b/resources/views/layouts/header.blade.php @@ -21,12 +21,12 @@ aria-haspopup="true" aria-expanded="false"> {{ auth()->user()->name }}
- + Profile Image