From efa92313919afbcc3b8030c20be240b9799df60d Mon Sep 17 00:00:00 2001 From: Subash Date: Fri, 1 Aug 2025 18:00:15 +0545 Subject: [PATCH] feat: Implement Document Module with Dropzone file upload functionality - Added DocumentController for handling document uploads and management. - Created Document model with necessary attributes and relationships. - Implemented DocumentService for business logic related to documents. - Set up routes for document management in both web and API contexts. - Developed views for document upload using Dropzone for file handling. - Included necessary assets and styles for the Document module. - Created migration for documents table with appropriate fields. - Added configuration and service provider for the Document module. --- Modules/CCMS/app/Models/Country.php | 6 + Modules/CCMS/app/Models/Service.php | 6 + Modules/CCMS/app/Models/Test.php | 7 + .../Document/app/Http/Controllers/.gitkeep | 0 .../Http/Controllers/DocumentController.php | 71 ++ Modules/Document/app/Models/Document.php | 69 ++ Modules/Document/app/Models/Scopes/.gitkeep | 0 Modules/Document/app/Providers/.gitkeep | 0 .../app/Providers/DocumentServiceProvider.php | 135 +++ .../app/Providers/EventServiceProvider.php | 30 + .../app/Providers/RouteServiceProvider.php | 50 + Modules/Document/app/Services/.gitkeep | 0 .../Document/app/Services/DocumentService.php | 49 + Modules/Document/composer.json | 30 + Modules/Document/config/.gitkeep | 0 Modules/Document/config/config.php | 5 + Modules/Document/database/factories/.gitkeep | 0 Modules/Document/database/migrations/.gitkeep | 0 ...25_08_01_053627_create_documents_table.php | 32 + Modules/Document/database/seeders/.gitkeep | 0 .../seeders/DocumentDatabaseSeeder.php | 16 + Modules/Document/module.json | 11 + Modules/Document/package.json | 15 + Modules/Document/resources/assets/js/app.js | 0 .../Document/resources/assets/sass/app.scss | 0 Modules/Document/resources/views/.gitkeep | 0 .../views/components/file-upload.blade.php | 45 + .../resources/views/document/form.blade.php | 88 ++ .../resources/views/document/index.blade.php | 50 + .../Document/resources/views/index.blade.php | 7 + .../resources/views/layouts/master.blade.php | 29 + Modules/Document/routes/.gitkeep | 0 Modules/Document/routes/api.php | 19 + Modules/Document/routes/web.php | 20 + Modules/Document/vite.config.js | 57 + config/sidebar.php | 7 + modules_statuses.json | 3 +- .../pages/resources-template.blade.php | 1040 +++++++++++++++-- resources/views/layouts/app.blade.php | 3 + 39 files changed, 1831 insertions(+), 69 deletions(-) create mode 100644 Modules/Document/app/Http/Controllers/.gitkeep create mode 100644 Modules/Document/app/Http/Controllers/DocumentController.php create mode 100644 Modules/Document/app/Models/Document.php create mode 100644 Modules/Document/app/Models/Scopes/.gitkeep create mode 100644 Modules/Document/app/Providers/.gitkeep create mode 100644 Modules/Document/app/Providers/DocumentServiceProvider.php create mode 100644 Modules/Document/app/Providers/EventServiceProvider.php create mode 100644 Modules/Document/app/Providers/RouteServiceProvider.php create mode 100644 Modules/Document/app/Services/.gitkeep create mode 100644 Modules/Document/app/Services/DocumentService.php create mode 100644 Modules/Document/composer.json create mode 100644 Modules/Document/config/.gitkeep create mode 100644 Modules/Document/config/config.php create mode 100644 Modules/Document/database/factories/.gitkeep create mode 100644 Modules/Document/database/migrations/.gitkeep create mode 100644 Modules/Document/database/migrations/2025_08_01_053627_create_documents_table.php create mode 100644 Modules/Document/database/seeders/.gitkeep create mode 100644 Modules/Document/database/seeders/DocumentDatabaseSeeder.php create mode 100644 Modules/Document/module.json create mode 100644 Modules/Document/package.json create mode 100644 Modules/Document/resources/assets/js/app.js create mode 100644 Modules/Document/resources/assets/sass/app.scss create mode 100644 Modules/Document/resources/views/.gitkeep create mode 100644 Modules/Document/resources/views/components/file-upload.blade.php create mode 100644 Modules/Document/resources/views/document/form.blade.php create mode 100644 Modules/Document/resources/views/document/index.blade.php create mode 100644 Modules/Document/resources/views/index.blade.php create mode 100644 Modules/Document/resources/views/layouts/master.blade.php create mode 100644 Modules/Document/routes/.gitkeep create mode 100644 Modules/Document/routes/api.php create mode 100644 Modules/Document/routes/web.php create mode 100644 Modules/Document/vite.config.js diff --git a/Modules/CCMS/app/Models/Country.php b/Modules/CCMS/app/Models/Country.php index bf47964..76ddb86 100644 --- a/Modules/CCMS/app/Models/Country.php +++ b/Modules/CCMS/app/Models/Country.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Modules\CCMS\Traits\UpdateCustomFields; +use Modules\Document\Models\Document; class Country extends Model { @@ -96,4 +97,9 @@ class Country extends Model { return $this->hasMany(Country::class, 'parent_id'); } + + public function documents() + { + return $this->morphMany(Document::class, 'documentable'); + } } diff --git a/Modules/CCMS/app/Models/Service.php b/Modules/CCMS/app/Models/Service.php index f8d1e90..786b884 100644 --- a/Modules/CCMS/app/Models/Service.php +++ b/Modules/CCMS/app/Models/Service.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Modules\CCMS\Traits\UpdateCustomFields; +use Modules\Document\Models\Document; class Service extends Model { @@ -100,4 +101,9 @@ class Service extends Model { return $this->belongsTo(Service::class, 'parent_id'); } + + public function documents() + { + return $this->morphMany(Document::class, 'documentable'); + } } diff --git a/Modules/CCMS/app/Models/Test.php b/Modules/CCMS/app/Models/Test.php index 4f830c1..3c0bda3 100644 --- a/Modules/CCMS/app/Models/Test.php +++ b/Modules/CCMS/app/Models/Test.php @@ -7,6 +7,8 @@ use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; use Modules\CCMS\Traits\UpdateCustomFields; +use Modules\Document\Models\Document; + // use Modules\CCMS\Database\Factories\TestFactory; class Test extends Model @@ -92,4 +94,9 @@ class Test extends Model { return $this->belongsTo(Test::class, 'parent_id'); } + + public function documents() + { + return $this->morphMany(Document::class, 'documentable'); + } } diff --git a/Modules/Document/app/Http/Controllers/.gitkeep b/Modules/Document/app/Http/Controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/app/Http/Controllers/DocumentController.php b/Modules/Document/app/Http/Controllers/DocumentController.php new file mode 100644 index 0000000..eddc41b --- /dev/null +++ b/Modules/Document/app/Http/Controllers/DocumentController.php @@ -0,0 +1,71 @@ +documentService = $documentService; + } + + public function index() + { + $title = 'Upload Documents'; + $countryOptions = Country::whereNull('parent_id')->pluck('title', 'id')->mapWithKeys(fn($title, $id) => ["Country:$id" => "Country - $title"]); + $serviceOptions = Service::whereNull('parent_id')->pluck('title', 'id')->mapWithKeys(fn($title, $id) => ["Service:$id" => "Service - $title"]); + $testOptions = Test::whereNull('parent_id')->pluck('title', 'id')->mapWithKeys(fn($title, $id) => ["Test:$id" => "Test - $title"]); + + $modelOptions = $countryOptions->merge($serviceOptions)->merge($testOptions); + + return view('document::document.index', compact('modelOptions', 'title')); + } + + + public function dropzoneUpload(Request $request) + { + $request->validate([ + 'model' => 'required|string', + 'file' => 'required|array', + 'file.*' => 'file|mimes:pdf,doc,docx,jpg,png|max:5120', + 'title' => 'nullable|string', + ]); + + $parts = explode(':', $request->model); + + if (count($parts) !== 2) { + return response()->json(['error' => 'Invalid model format.'], 422); + } + + [$modelType, $modelId] = $parts; + $modelClass = "App\\Models\\$modelType"; + + if (!class_exists($modelClass)) { + return response()->json(['error' => 'Invalid model selected.'], 422); + } + + $model = $modelClass::findOrFail($modelId); + + foreach ($request->file('file') as $uploadedFile) { + $path = $uploadedFile->store('documents'); + + $model->documents()->create([ + 'title' => $request->title ?? 'Untitled', + 'file_path' => $path, + ]); + } + + return response()->json(['success' => 'Files uploaded successfully']); + } +} diff --git a/Modules/Document/app/Models/Document.php b/Modules/Document/app/Models/Document.php new file mode 100644 index 0000000..4d121c4 --- /dev/null +++ b/Modules/Document/app/Models/Document.php @@ -0,0 +1,69 @@ +morphTo(); + } + + public function getUrl() + { + $path = $this->document_path; + return Storage::disk('public')->url($path); + } + + public function getSize() + { + $path = $this->document_path; + + if (Storage::disk('public')->exists($path)) { + $sizeInBytes = Storage::disk('public')->size($path); + return round($sizeInBytes / 1024, 2) . " KB"; + } + return 0; + } + + + public function getExtension() + { + return pathinfo($this->document_path, PATHINFO_EXTENSION); + } + + public function isImageFile() + { + $imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp', 'tiff', 'tif', 'ico']; + $extension = pathinfo($this->document_path, PATHINFO_EXTENSION); + return in_array(Str::lower($extension), $imageExtensions); + } + + protected function documentPath(): Attribute + { + return Attribute::make( + get: function (mixed $value, array $attributes) { + $collectionName = $attributes['collection_name']; + $path = $attributes['document_path']; + return "{$collectionName}/{$path}"; + } + ); + } + + public function scopeActive($query, int $status = 1) + { + return $query->where('status', $status); + } +} diff --git a/Modules/Document/app/Models/Scopes/.gitkeep b/Modules/Document/app/Models/Scopes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/app/Providers/.gitkeep b/Modules/Document/app/Providers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/app/Providers/DocumentServiceProvider.php b/Modules/Document/app/Providers/DocumentServiceProvider.php new file mode 100644 index 0000000..00dff8c --- /dev/null +++ b/Modules/Document/app/Providers/DocumentServiceProvider.php @@ -0,0 +1,135 @@ +registerCommands(); + $this->registerCommandSchedules(); + $this->registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->loadMigrationsFrom(module_path($this->name, 'database/migrations')); + } + + /** + * Register the service provider. + */ + public function register(): void + { + $this->app->register(EventServiceProvider::class); + $this->app->register(RouteServiceProvider::class); + } + + /** + * Register commands in the format of Command::class + */ + protected function registerCommands(): void + { + // $this->commands([]); + } + + /** + * Register command Schedules. + */ + protected function registerCommandSchedules(): void + { + // $this->app->booted(function () { + // $schedule = $this->app->make(Schedule::class); + // $schedule->command('inspire')->hourly(); + // }); + } + + /** + * Register translations. + */ + public function registerTranslations(): void + { + $langPath = resource_path('lang/modules/'.$this->nameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->nameLower); + $this->loadJsonTranslationsFrom($langPath); + } else { + $this->loadTranslationsFrom(module_path($this->name, 'lang'), $this->nameLower); + $this->loadJsonTranslationsFrom(module_path($this->name, 'lang')); + } + } + + /** + * Register config. + */ + protected function registerConfig(): void + { + $relativeConfigPath = config('modules.paths.generator.config.path'); + $configPath = module_path($this->name, $relativeConfigPath); + + if (is_dir($configPath)) { + $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($configPath)); + + foreach ($iterator as $file) { + if ($file->isFile() && $file->getExtension() === 'php') { + $relativePath = str_replace($configPath . DIRECTORY_SEPARATOR, '', $file->getPathname()); + $configKey = $this->nameLower . '.' . str_replace([DIRECTORY_SEPARATOR, '.php'], ['.', ''], $relativePath); + $key = ($relativePath === 'config.php') ? $this->nameLower : $configKey; + + $this->publishes([$file->getPathname() => config_path($relativePath)], 'config'); + $this->mergeConfigFrom($file->getPathname(), $key); + } + } + } + } + + /** + * Register views. + */ + public function registerViews(): void + { + $viewPath = resource_path('views/modules/'.$this->nameLower); + $sourcePath = module_path($this->name, 'resources/views'); + + $this->publishes([$sourcePath => $viewPath], ['views', $this->nameLower.'-module-views']); + + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->nameLower); + + $componentNamespace = $this->module_namespace($this->name, $this->app_path(config('modules.paths.generator.component-class.path'))); + Blade::componentNamespace($componentNamespace, $this->nameLower); + } + + /** + * Get the services provided by the provider. + */ + public function provides(): array + { + return []; + } + + private function getPublishableViewPaths(): array + { + $paths = []; + foreach (config('view.paths') as $path) { + if (is_dir($path.'/modules/'.$this->nameLower)) { + $paths[] = $path.'/modules/'.$this->nameLower; + } + } + + return $paths; + } +} diff --git a/Modules/Document/app/Providers/EventServiceProvider.php b/Modules/Document/app/Providers/EventServiceProvider.php new file mode 100644 index 0000000..56fbe9c --- /dev/null +++ b/Modules/Document/app/Providers/EventServiceProvider.php @@ -0,0 +1,30 @@ +> + */ + protected $listen = []; + + /** + * Indicates if events should be discovered. + * + * @var bool + */ + protected static $shouldDiscoverEvents = true; + + /** + * Configure the proper event listeners for email verification. + */ + protected function configureEmailVerification(): void + { + // + } +} diff --git a/Modules/Document/app/Providers/RouteServiceProvider.php b/Modules/Document/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..bdc20ea --- /dev/null +++ b/Modules/Document/app/Providers/RouteServiceProvider.php @@ -0,0 +1,50 @@ +mapApiRoutes(); + $this->mapWebRoutes(); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + */ + protected function mapWebRoutes(): void + { + Route::middleware('web')->group(module_path($this->name, '/routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + */ + protected function mapApiRoutes(): void + { + Route::middleware('api')->prefix('api')->name('api.')->group(module_path($this->name, '/routes/api.php')); + } +} diff --git a/Modules/Document/app/Services/.gitkeep b/Modules/Document/app/Services/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/app/Services/DocumentService.php b/Modules/Document/app/Services/DocumentService.php new file mode 100644 index 0000000..7f5dfed --- /dev/null +++ b/Modules/Document/app/Services/DocumentService.php @@ -0,0 +1,49 @@ +get(); + } + + public function storeDocument(array $documentData): Document + { + return DB::transaction(function () use ($documentData) { + $document = Document::create($documentData); + + return $document; + }); + } + + public function getDocumentById(int $id) + { + return Document::findOrFail($id); + } + + public function updateDocument(int $id, array $documentData) + { + $document = $this->getDocumentById($id); + + return DB::transaction(function () use ($document, $documentData) { + $document->update($documentData); + return $document; + }); + } + + public function deleteDocument(int $id) + { + return DB::transaction(function () use ($id) { + $document = $this->getDocumentById($id); + $document->delete(); + return true; + }); + } +} diff --git a/Modules/Document/composer.json b/Modules/Document/composer.json new file mode 100644 index 0000000..62e5d59 --- /dev/null +++ b/Modules/Document/composer.json @@ -0,0 +1,30 @@ +{ + "name": "nwidart/document", + "description": "", + "authors": [ + { + "name": "Nicolas Widart", + "email": "n.widart@gmail.com" + } + ], + "extra": { + "laravel": { + "providers": [], + "aliases": { + + } + } + }, + "autoload": { + "psr-4": { + "Modules\\Document\\": "app/", + "Modules\\Document\\Database\\Factories\\": "database/factories/", + "Modules\\Document\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Modules\\Document\\Tests\\": "tests/" + } + } +} diff --git a/Modules/Document/config/.gitkeep b/Modules/Document/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/config/config.php b/Modules/Document/config/config.php new file mode 100644 index 0000000..3c0d0de --- /dev/null +++ b/Modules/Document/config/config.php @@ -0,0 +1,5 @@ + 'Document', +]; diff --git a/Modules/Document/database/factories/.gitkeep b/Modules/Document/database/factories/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/database/migrations/.gitkeep b/Modules/Document/database/migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/database/migrations/2025_08_01_053627_create_documents_table.php b/Modules/Document/database/migrations/2025_08_01_053627_create_documents_table.php new file mode 100644 index 0000000..be9235c --- /dev/null +++ b/Modules/Document/database/migrations/2025_08_01_053627_create_documents_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('title'); + $table->string('file_path'); + $table->unsignedBigInteger('documentable_id'); + $table->string('documentable_type'); + $table->index(['documentable_type', 'documentable_id']); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('documents'); + } +}; diff --git a/Modules/Document/database/seeders/.gitkeep b/Modules/Document/database/seeders/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/database/seeders/DocumentDatabaseSeeder.php b/Modules/Document/database/seeders/DocumentDatabaseSeeder.php new file mode 100644 index 0000000..f18b8be --- /dev/null +++ b/Modules/Document/database/seeders/DocumentDatabaseSeeder.php @@ -0,0 +1,16 @@ +call([]); + } +} diff --git a/Modules/Document/module.json b/Modules/Document/module.json new file mode 100644 index 0000000..33a2645 --- /dev/null +++ b/Modules/Document/module.json @@ -0,0 +1,11 @@ +{ + "name": "Document", + "alias": "document", + "description": "", + "keywords": [], + "priority": 0, + "providers": [ + "Modules\\Document\\Providers\\DocumentServiceProvider" + ], + "files": [] +} diff --git a/Modules/Document/package.json b/Modules/Document/package.json new file mode 100644 index 0000000..d6fbfc8 --- /dev/null +++ b/Modules/Document/package.json @@ -0,0 +1,15 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "axios": "^1.1.2", + "laravel-vite-plugin": "^0.7.5", + "sass": "^1.69.5", + "postcss": "^8.3.7", + "vite": "^4.0.0" + } +} diff --git a/Modules/Document/resources/assets/js/app.js b/Modules/Document/resources/assets/js/app.js new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/resources/assets/sass/app.scss b/Modules/Document/resources/assets/sass/app.scss new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/resources/views/.gitkeep b/Modules/Document/resources/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/resources/views/components/file-upload.blade.php b/Modules/Document/resources/views/components/file-upload.blade.php new file mode 100644 index 0000000..cdf9ab5 --- /dev/null +++ b/Modules/Document/resources/views/components/file-upload.blade.php @@ -0,0 +1,45 @@ +@props(['dropzoneId', 'uploadUrl', 'inputName', 'message' => 'Drop files here or click to upload.', 'formId']) +
+
+
+
+
+ +
+ +

{{ $message }}

+
+
+
+
+ +@push('js') + +@endpush diff --git a/Modules/Document/resources/views/document/form.blade.php b/Modules/Document/resources/views/document/form.blade.php new file mode 100644 index 0000000..6ee54d8 --- /dev/null +++ b/Modules/Document/resources/views/document/form.blade.php @@ -0,0 +1,88 @@ +
+
+
+ +
+ @csrf + +
+ {{ html()->label('Title')->for('title') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->text('title')->id('docTitle')->class('form-control')->placeholder('Enter Title')->required() }} +
+ +
+ {{ html()->label('Select Model')->class('form-label')->for('model') }} + {{ html()->span('*')->class('text-danger') }} + {{ html()->select('model')->id('modelSelect')->class('form-select')->required()->options(['' => '-- Select --'] + $modelOptions->toArray()) }} +
+ +
+ +
+

Drop files here or click to upload.

+
+ + +
+ +
+
+
+ @push('js') + + @endpush diff --git a/Modules/Document/resources/views/document/index.blade.php b/Modules/Document/resources/views/document/index.blade.php new file mode 100644 index 0000000..282c859 --- /dev/null +++ b/Modules/Document/resources/views/document/index.blade.php @@ -0,0 +1,50 @@ +@extends('layouts.app') + +@section('content') +
+ + @if ($errors->any()) + + @endif + +
+
+
+ @include('document::document.form') +
+
+ + {{--
+
+
+ @php + $columns = [ + [ + 'title' => '', + 'data' => 'checkbox', + 'name' => 'checkbox', + 'orderable' => false, + 'searchable' => false, + 'printable' => false, + 'exportable' => false, + ], + ['title' => 'Document', 'data' => 'name', 'name' => 'name'], + ['title' => 'Type', 'data' => 'type', 'name' => 'type'], + ['title' => 'Size', 'data' => 'size', 'name' => 'size'], + ['title' => 'Upload Date', 'data' => 'created_at', 'name' => 'created_at'], + [ + 'title' => 'Action', + 'data' => 'action', + 'orderable' => false, + 'searchable' => false, + ], + ]; + @endphp + + +
+
+
--}} +
+
+@endsection diff --git a/Modules/Document/resources/views/index.blade.php b/Modules/Document/resources/views/index.blade.php new file mode 100644 index 0000000..84ead92 --- /dev/null +++ b/Modules/Document/resources/views/index.blade.php @@ -0,0 +1,7 @@ +@extends('document::layouts.master') + +@section('content') +

Hello World

+ +

Module: {!! config('document.name') !!}

+@endsection diff --git a/Modules/Document/resources/views/layouts/master.blade.php b/Modules/Document/resources/views/layouts/master.blade.php new file mode 100644 index 0000000..6de1220 --- /dev/null +++ b/Modules/Document/resources/views/layouts/master.blade.php @@ -0,0 +1,29 @@ + + + + + + + + + + Document Module - {{ config('app.name', 'Laravel') }} + + + + + + + + + + {{-- Vite CSS --}} + {{-- {{ module_vite('build-document', 'resources/assets/sass/app.scss', storage_path('vite.hot')) }} --}} + + + + @yield('content') + + {{-- Vite JS --}} + {{-- {{ module_vite('build-document', 'resources/assets/js/app.js', storage_path('vite.hot')) }} --}} + diff --git a/Modules/Document/routes/.gitkeep b/Modules/Document/routes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/Document/routes/api.php b/Modules/Document/routes/api.php new file mode 100644 index 0000000..620cf45 --- /dev/null +++ b/Modules/Document/routes/api.php @@ -0,0 +1,19 @@ +prefix('v1')->group(function () { + Route::apiResource('document', DocumentController::class)->names('document'); +}); diff --git a/Modules/Document/routes/web.php b/Modules/Document/routes/web.php new file mode 100644 index 0000000..a64f256 --- /dev/null +++ b/Modules/Document/routes/web.php @@ -0,0 +1,20 @@ + ['web', 'auth', 'permission'], 'prefix' => 'admin/'], function () { + Route::get('/documents', [DocumentController::class, 'index'])->name('documents.index'); + Route::post('/documents/dropzone-upload', [DocumentController::class, 'dropzoneUpload'])->name('documents.dropzone.upload'); +}); diff --git a/Modules/Document/vite.config.js b/Modules/Document/vite.config.js new file mode 100644 index 0000000..e87bc90 --- /dev/null +++ b/Modules/Document/vite.config.js @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; +import { readdirSync, statSync } from 'fs'; +import { join,relative,dirname } from 'path'; +import { fileURLToPath } from 'url'; + +export default defineConfig({ + build: { + outDir: '../../public/build-document', + emptyOutDir: true, + manifest: true, + }, + plugins: [ + laravel({ + publicDirectory: '../../public', + buildDirectory: 'build-document', + input: [ + __dirname + '/resources/assets/sass/app.scss', + __dirname + '/resources/assets/js/app.js' + ], + refresh: true, + }), + ], +}); +// Scen all resources for assets file. Return array +//function getFilePaths(dir) { +// const filePaths = []; +// +// function walkDirectory(currentPath) { +// const files = readdirSync(currentPath); +// for (const file of files) { +// const filePath = join(currentPath, file); +// const stats = statSync(filePath); +// if (stats.isFile() && !file.startsWith('.')) { +// const relativePath = 'Modules/Document/'+relative(__dirname, filePath); +// filePaths.push(relativePath); +// } else if (stats.isDirectory()) { +// walkDirectory(filePath); +// } +// } +// } +// +// walkDirectory(dir); +// return filePaths; +//} + +//const __filename = fileURLToPath(import.meta.url); +//const __dirname = dirname(__filename); + +//const assetsDir = join(__dirname, 'resources/assets'); +//export const paths = getFilePaths(assetsDir); + + +//export const paths = [ +// 'Modules/Document/resources/assets/sass/app.scss', +// 'Modules/Document/resources/assets/js/app.js', +//]; diff --git a/config/sidebar.php b/config/sidebar.php index f7da344..273a139 100644 --- a/config/sidebar.php +++ b/config/sidebar.php @@ -226,6 +226,13 @@ return [ ], ], + [ + 'text' => 'Documents', + 'url' => 'admin/document', + 'icon' => 'ri-file-text-line', + 'module' => 'Document', + 'can' => ['document.index'], + ], [ 'text' => 'Resume Builder', 'url' => 'admin/resume', diff --git a/modules_statuses.json b/modules_statuses.json index ee7112e..87133bc 100644 --- a/modules_statuses.json +++ b/modules_statuses.json @@ -16,5 +16,6 @@ "Template": true, "Admin": true, "Drive": true, - "Sitemap": true + "Sitemap": true, + "Document": true } \ No newline at end of file diff --git a/resources/views/client/raffles/pages/resources-template.blade.php b/resources/views/client/raffles/pages/resources-template.blade.php index 25e0211..6cd75df 100644 --- a/resources/views/client/raffles/pages/resources-template.blade.php +++ b/resources/views/client/raffles/pages/resources-template.blade.php @@ -1,8 +1,8 @@ @extends('client.raffles.layouts.app') @section('content') +
-

Free-Resources

@@ -13,19 +13,16 @@
@@ -136,18 +226,17 @@
-
- +
@@ -156,10 +245,13 @@
+ +
- {{--
+ +
@@ -201,41 +293,853 @@
-
--}} +
+ + + +
+
+ + +
+ +

USA

+ + + + + + + + + + + + + + + + + + +
1 Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ +
+ + +
+

Australia

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ + +
+ + +
+

Canada

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ +
+ + +
+

Denmark

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ +
+ + +
+

IELTS

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ +
+ +
+ + +
+

PTE

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ +
+ +
+ + +
+

Duolingo

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ +
+ + +
+

CAS Interview

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ +
+ + +
+

USA Interview

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ +
+ + +
+

Canada Interview

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ +
+ +
+ + +
+

Australia Interview

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ +
+
+ + +
+

UK Interview

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ +
+ +
+ + +
+

Denmark Interview

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ +
+ +
+ + +
+

Visa Assistance 1

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ +
+ + +
+

Visa Assistance 2

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ +
+ +
+ + +
+

Visa Assistance 3

+ + + + + + + + + + + + + + + + + + +
1Australia Documents Checklist + +
2Checklists for Canada + +
3Australia Documents Checklist + +
+
+
+
+ + +
+ +
+
+

Study Abroad

+ +

Let's Connect Quick

-
- @csrf + + + - - - -
+ +
+
+ + + + + + + + + + + + @endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index f47a4f0..9f9fe5a 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -29,6 +29,8 @@ + + @livewireStyles @@ -117,6 +119,7 @@ +