diff --git a/Modules/CircleApps/App/Http/Middleware/CheckAccountAppAccess.php b/Modules/CircleApps/App/Http/Middleware/CheckAccountAppAccess.php new file mode 100644 index 0000000..72cdbd3 --- /dev/null +++ b/Modules/CircleApps/App/Http/Middleware/CheckAccountAppAccess.php @@ -0,0 +1,22 @@ +user() && (!has_app($app))) { + abort(403, 'Unauthorized'); + } + + return $next($request); + } +} diff --git a/Modules/CircleApps/App/Providers/CircleAppsServiceProvider.php b/Modules/CircleApps/App/Providers/CircleAppsServiceProvider.php index 2d3a5b8..f179a1d 100644 --- a/Modules/CircleApps/App/Providers/CircleAppsServiceProvider.php +++ b/Modules/CircleApps/App/Providers/CircleAppsServiceProvider.php @@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Blade; use Illuminate\Support\ServiceProvider; +use Modules\CircleApps\App\Http\Middleware\CheckAccountAppAccess; use Modules\TomatoCategory\App\Facades\TomatoCategory; use Modules\TomatoCategory\App\Models\Category; @@ -43,6 +44,8 @@ public function boot(): void $this->app->bind('circle-apps-menu', function () { return new \Modules\CircleApps\App\Services\CircleAppsMenuServices(); }); + + $this->app['router']->aliasMiddleware('app', CheckAccountAppAccess::class); } public function registerComponents(): void diff --git a/Modules/CircleApps/App/Providers/helpers.php b/Modules/CircleApps/App/Providers/helpers.php index 3c9ee95..5a76730 100644 --- a/Modules/CircleApps/App/Providers/helpers.php +++ b/Modules/CircleApps/App/Providers/helpers.php @@ -1,12 +1,21 @@ user()){ $hasApp = auth('accounts')->user()->apps()->where('key', $key)->first(); if($hasApp){ - return true; + if($account){ + if($account == auth('accounts')->user()->id){ + return true; + } + else { + return false; + } + } + + return true; } } diff --git a/Modules/CircleApps/resources/views/show.blade.php b/Modules/CircleApps/resources/views/show.blade.php index 5fbed6d..2d0ba79 100644 --- a/Modules/CircleApps/resources/views/show.blade.php +++ b/Modules/CircleApps/resources/views/show.blade.php @@ -161,5 +161,6 @@ + diff --git a/Modules/CircleApps/routes/web.php b/Modules/CircleApps/routes/web.php index dd78f36..ff78cfa 100644 --- a/Modules/CircleApps/routes/web.php +++ b/Modules/CircleApps/routes/web.php @@ -14,15 +14,15 @@ | */ -//Route::middleware(['web', 'splade'])->prefix('apps')->name('apps.')->group(function () { -// Route::get('/', [CircleAppsController::class, 'index'])->name('index'); -// Route::get('/{app}', [CircleAppsController::class, 'show'])->name('show'); -//}); -// -//Route::middleware(['web', 'splade', 'auth:accounts'])->prefix('apps')->name('apps.')->group(function () { -// Route::post('/{app}/install', [CircleAppsController::class, 'install'])->name('install'); -// Route::post('/{app}/uninstall', [CircleAppsController::class, 'uninstall'])->name('uninstall'); -//}); +Route::middleware(['web', 'splade'])->prefix('apps')->name('apps.')->group(function () { + Route::get('/', [CircleAppsController::class, 'index'])->name('index'); + Route::get('/{app}', [CircleAppsController::class, 'show'])->name('show'); +}); + +Route::middleware(['web', 'splade', 'auth:accounts'])->prefix('apps')->name('apps.')->group(function () { + Route::post('/{app}/install', [CircleAppsController::class, 'install'])->name('install'); + Route::post('/{app}/uninstall', [CircleAppsController::class, 'uninstall'])->name('uninstall'); +}); Route::middleware(['auth', 'splade', 'verified'])->name('admin.')->group(function () { Route::get('admin/apps', [\Modules\CircleApps\App\Http\Controllers\AppController::class, 'index'])->name('apps.index'); diff --git a/Modules/CircleContacts/App/Forms/.gitkeep b/Modules/CircleContacts/App/Forms/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Http/Controllers/.gitkeep b/Modules/CircleContacts/App/Http/Controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Http/Controllers/CircleContactsController.php b/Modules/CircleContacts/App/Http/Controllers/CircleContactsController.php new file mode 100644 index 0000000..a87ae95 --- /dev/null +++ b/Modules/CircleContacts/App/Http/Controllers/CircleContactsController.php @@ -0,0 +1,67 @@ +model = \Modules\CircleContacts\App\Models\CircleXoContact::class; + } + + /** + * @param Request $request + * @return View|JsonResponse + */ + public function index(Request $request): View|JsonResponse + { + $query = CircleXoContact::query(); + $query->where('account_id', auth('accounts')->user()->id); + if($request->has('group_id')){ + $query->whereHas('groups', function ($query) use ($request){ + $query->where('id', $request->get('group_id')); + }); + } + + return Tomato::index( + request: $request, + model: $this->model, + view: 'circle-contacts::contacts.index', + table: \Modules\CircleContacts\App\Tables\CircleXoContactTable::class, + query: $query + ); + } + + /** + * @param Request $request + * @return JsonResponse + */ + public function api(Request $request): JsonResponse + { + $query = CircleXoContact::query(); + $query->where('account_id', auth('accounts')->user()->id); + return Tomato::json( + request: $request, + model: \Modules\CircleContacts\App\Models\CircleXoContact::class, + query: $query + ); + } + + /** + * @return View + */ + public function create(): View + { + return Tomato::create( + view: 'circle-contacts::contacts.create', + ); + } + + /** + * @param CircleXoContactStoreRequest $request + * @return RedirectResponse|JsonResponse + */ + public function store(CircleXoContactStoreRequest $request): RedirectResponse|JsonResponse + { + $request->merge([ + "account_id" => auth('accounts')->user()->id + ]); + $response = Tomato::store( + request: $request, + model: \Modules\CircleContacts\App\Models\CircleXoContact::class, + message: __('Contact saved successfully'), + redirect: 'profile.contacts.index', + hasMedia: true, + collection: [ + 'avatar' => false, + ] + ); + + $response->record->groups()->sync($request->get('groups')); + + if($response instanceof JsonResponse){ + return $response; + } + + return back(); + } + + /** + * @param \Modules\CircleContacts\App\Models\CircleXoContact $model + * @return View|JsonResponse + */ + public function show(\Modules\CircleContacts\App\Models\CircleXoContact $model): View|JsonResponse + { + if(!has_app('circle-contacts', $model->account_id)){ + abort(403); + } + + return Tomato::get( + model: $model, + view: 'circle-contacts::contacts.show', + hasMedia: true, + collection: [ + 'avatar' => false, + ] + ); + } + + /** + * @param \Modules\CircleContacts\App\Models\CircleXoContact $model + * @return View + */ + public function edit(\Modules\CircleContacts\App\Models\CircleXoContact $model): View + { + if(!has_app('circle-contacts', $model->account_id)){ + abort(403); + } + + $model->groups = $model->groups->pluck('id')->toArray(); + return Tomato::get( + model: $model, + view: 'circle-contacts::contacts.edit', + hasMedia: true, + collection: [ + 'avatar' => false, + ] + ); + } + + /** + * @param CircleXoContactUpdateRequest $request + * @param \Modules\CircleContacts\App\Models\CircleXoContact $model + * @return RedirectResponse|JsonResponse + */ + public function update(CircleXoContactUpdateRequest $request, \Modules\CircleContacts\App\Models\CircleXoContact $model): RedirectResponse|JsonResponse + { + $response = Tomato::update( + request: $request, + model: $model, + message: __('Contact updated successfully'), + redirect: 'profile.contacts.index', + hasMedia: true, + collection: [ + 'avatar' => false, + ] + ); + + $response->record->groups()->sync($request->get('groups')); + + if($response instanceof JsonResponse){ + return $response; + } + + return back(); + } + + /** + * @param \Modules\CircleContacts\App\Models\CircleXoContact $model + * @return RedirectResponse|JsonResponse + */ + public function destroy(\Modules\CircleContacts\App\Models\CircleXoContact $model): RedirectResponse|JsonResponse + { + if(!has_app('circle-contacts', $model->account_id)){ + abort(403); + } + + $model->groups()->detach(); + $model->contactMeta()->delete(); + $response = Tomato::destroy( + model: $model, + message: __('Contact deleted successfully'), + redirect: 'profile.contacts.index', + hasMedia: true, + collection: [ + 'avatar' => false, + ] + ); + + if($response instanceof JsonResponse){ + return $response; + } + + return redirect()->route('profile.contacts.index'); + } +} diff --git a/Modules/CircleContacts/App/Http/Controllers/CircleXoContactsGroupController.php b/Modules/CircleContacts/App/Http/Controllers/CircleXoContactsGroupController.php new file mode 100644 index 0000000..8a1f723 --- /dev/null +++ b/Modules/CircleContacts/App/Http/Controllers/CircleXoContactsGroupController.php @@ -0,0 +1,144 @@ +model = \Modules\CircleContacts\App\Models\CircleXoContactsGroup::class; + } + + /** + * @param Request $request + * @return View|JsonResponse + */ + public function index(Request $request): View|JsonResponse + { + return Tomato::index( + request: $request, + model: $this->model, + view: 'circle-contacts::groups.index', + table: \Modules\CircleContacts\App\Tables\CircleXoContactsGroupTable::class + ); + } + + /** + * @param Request $request + * @return JsonResponse + */ + public function api(Request $request): JsonResponse + { + return Tomato::json( + request: $request, + model: \Modules\CircleContacts\App\Models\CircleXoContactsGroup::class, + ); + } + + /** + * @return View + */ + public function create(): View + { + return Tomato::create( + view: 'circle-contacts::groups.create', + ); + } + + /** + * @param \Modules\CircleContacts\App\Http\Requests\CircleXoContactsGroup\CircleXoContactsGroupStoreRequest $request + * @return RedirectResponse|JsonResponse + */ + public function store(\Modules\CircleContacts\App\Http\Requests\CircleXoContactsGroup\CircleXoContactsGroupStoreRequest $request): RedirectResponse|JsonResponse + { + $request->merge([ + "account_id" => auth('accounts')->user()->id + ]); + + $response = Tomato::store( + request: $request, + model: \Modules\CircleContacts\App\Models\CircleXoContactsGroup::class, + message: __('Group saved successfully'), + redirect: 'profile.groups.index', + ); + + if($response instanceof JsonResponse){ + return $response; + } + + return back(); + } + + /** + * @param \Modules\CircleContacts\App\Models\CircleXoContactsGroup $model + * @return View|JsonResponse + */ + public function show(\Modules\CircleContacts\App\Models\CircleXoContactsGroup $model): View|JsonResponse + { + return Tomato::get( + model: $model, + view: 'circle-contacts::groups.show', + ); + } + + /** + * @param \Modules\CircleContacts\App\Models\CircleXoContactsGroup $model + * @return View + */ + public function edit(\Modules\CircleContacts\App\Models\CircleXoContactsGroup $model): View + { + return Tomato::get( + model: $model, + view: 'circle-contacts::groups.edit', + ); + } + + /** + * @param \Modules\CircleContacts\App\Http\Requests\CircleXoContactsGroup\CircleXoContactsGroupUpdateRequest $request + * @param \Modules\CircleContacts\App\Models\CircleXoContactsGroup $model + * @return RedirectResponse|JsonResponse + */ + public function update(\Modules\CircleContacts\App\Http\Requests\CircleXoContactsGroup\CircleXoContactsGroupUpdateRequest $request, \Modules\CircleContacts\App\Models\CircleXoContactsGroup $model): RedirectResponse|JsonResponse + { + $response = Tomato::update( + request: $request, + model: $model, + message: __('Group updated successfully'), + redirect: 'profile.groups.index', + ); + + if($response instanceof JsonResponse){ + return $response; + } + + return back(); + } + + /** + * @param \Modules\CircleContacts\App\Models\CircleXoContactsGroup $model + * @return RedirectResponse|JsonResponse + */ + public function destroy(\Modules\CircleContacts\App\Models\CircleXoContactsGroup $model): RedirectResponse|JsonResponse + { + $response = Tomato::destroy( + model: $model, + message: __('Group deleted successfully'), + redirect: 'profile.groups.index', + ); + + if($response instanceof JsonResponse){ + return $response; + } + + return redirect()->route('profile.contacts.index'); + } +} diff --git a/Modules/CircleContacts/App/Http/Controllers/CircleXoContactsMetaController.php b/Modules/CircleContacts/App/Http/Controllers/CircleXoContactsMetaController.php new file mode 100644 index 0000000..41c0968 --- /dev/null +++ b/Modules/CircleContacts/App/Http/Controllers/CircleXoContactsMetaController.php @@ -0,0 +1,140 @@ +model = \Modules\CircleContacts\App\Models\CircleXoContactsMeta::class; + } + + /** + * @return View + */ + public function create(CircleXoContact $account): View + { + if(!has_app('circle-contacts', $account->id)){ + abort(403); + } + + return Tomato::create( + view: 'circle-contacts::contacts.meta.create', + data: [ + 'account' => $account, + ] + ); + } + + /** + * @param Request $request + * @return RedirectResponse|JsonResponse + */ + public function store(Request $request, CircleXoContact $account): RedirectResponse|JsonResponse + { + if(!has_app('circle-contacts', $account->id)){ + abort(403); + } + + $request->merge([ + 'contact_id' => $account->id, + ]); + + $response = Tomato::store( + request: $request, + model: \Modules\CircleContacts\App\Models\CircleXoContactsMeta::class, + validation: [ + 'key' => 'required|max:255|string', + 'value' => 'nullable', + ], + message: __('Details saved successfully'), + redirect: 'profile.contacts.index', + ); + + if($response instanceof JsonResponse){ + return $response; + } + + return back(); + } + + /** + * @param \Modules\CircleContacts\App\Models\CircleXoContactsMeta $model + * @return View + */ + public function edit(CircleXoContact $account, \Modules\CircleContacts\App\Models\CircleXoContactsMeta $model): View + { + if(!has_app('circle-contacts', $account->id)){ + abort(403); + } + return Tomato::get( + model: $model, + view: 'circle-contacts::contacts.meta.edit', + data: [ + 'account' => $account, + ] + ); + } + + /** + * @param Request $request + * @param \Modules\CircleContacts\App\Models\CircleXoContactsMeta $model + * @return RedirectResponse|JsonResponse + */ + public function update(CircleXoContact $account, Request $request, \Modules\CircleContacts\App\Models\CircleXoContactsMeta $model): RedirectResponse|JsonResponse + { + if(!has_app('circle-contacts', $account->id)){ + abort(403); + } + + $response = Tomato::update( + request: $request, + model: $model, + validation: [ + 'key' => 'sometimes|max:255|string', + 'value' => 'nullable', + ], + message: __('Details updated successfully'), + redirect: 'profile.contacts.index', + ); + + if($response instanceof JsonResponse){ + return $response; + } + + return back(); + } + + /** + * @param \Modules\CircleContacts\App\Models\CircleXoContactsMeta $model + * @return RedirectResponse|JsonResponse + */ + public function destroy(CircleXoContact $account, \Modules\CircleContacts\App\Models\CircleXoContactsMeta $model): RedirectResponse|JsonResponse + { + if(!has_app('circle-contacts', $account->id)){ + abort(403); + } + + $response = Tomato::destroy( + model: $model, + message: __('Details deleted successfully'), + redirect: 'profile.contacts.index', + ); + + if($response instanceof JsonResponse){ + return $response; + } + + return back(); + } +} diff --git a/Modules/CircleContacts/App/Http/Requests/.gitkeep b/Modules/CircleContacts/App/Http/Requests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Http/Requests/CircleXoContact/.gitkeep b/Modules/CircleContacts/App/Http/Requests/CircleXoContact/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Http/Requests/CircleXoContact/CircleXoContactStoreRequest.php b/Modules/CircleContacts/App/Http/Requests/CircleXoContact/CircleXoContactStoreRequest.php new file mode 100644 index 0000000..b4bfeb4 --- /dev/null +++ b/Modules/CircleContacts/App/Http/Requests/CircleXoContact/CircleXoContactStoreRequest.php @@ -0,0 +1,35 @@ + + */ + public function rules() + { + return [ + 'avatar' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg,webp|max:2048', + 'name' => 'required|max:255|string', + 'email' => 'nullable|max:255|string|email', + 'phone' => 'required|max:255|string|min:12', + 'address' => 'nullable', + 'company' => 'nullable|max:255|string' + ]; + } +} diff --git a/Modules/CircleContacts/App/Http/Requests/CircleXoContact/CircleXoContactUpdateRequest.php b/Modules/CircleContacts/App/Http/Requests/CircleXoContact/CircleXoContactUpdateRequest.php new file mode 100644 index 0000000..4a4bbc7 --- /dev/null +++ b/Modules/CircleContacts/App/Http/Requests/CircleXoContact/CircleXoContactUpdateRequest.php @@ -0,0 +1,35 @@ +model['account_id']); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'avatar' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg,webp|max:2048', + 'email' => 'nullable|max:255|string|email', + 'phone' => 'sometimes|max:255|string|min:12', + 'address' => 'nullable', + 'company' => 'nullable|max:255|string' + ]; + } +} diff --git a/Modules/CircleContacts/App/Http/Requests/CircleXoContactsGroup/.gitkeep b/Modules/CircleContacts/App/Http/Requests/CircleXoContactsGroup/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Http/Requests/CircleXoContactsGroup/CircleXoContactsGroupStoreRequest.php b/Modules/CircleContacts/App/Http/Requests/CircleXoContactsGroup/CircleXoContactsGroupStoreRequest.php new file mode 100644 index 0000000..506b883 --- /dev/null +++ b/Modules/CircleContacts/App/Http/Requests/CircleXoContactsGroup/CircleXoContactsGroupStoreRequest.php @@ -0,0 +1,33 @@ + + */ + public function rules() + { + return [ + 'name' => 'required|max:255|string', + 'description' => 'required', + 'icon' => 'nullable|max:255|string', + 'color' => 'nullable|max:255|string' + ]; + } +} diff --git a/Modules/CircleContacts/App/Http/Requests/CircleXoContactsGroup/CircleXoContactsGroupUpdateRequest.php b/Modules/CircleContacts/App/Http/Requests/CircleXoContactsGroup/CircleXoContactsGroupUpdateRequest.php new file mode 100644 index 0000000..2f4fe97 --- /dev/null +++ b/Modules/CircleContacts/App/Http/Requests/CircleXoContactsGroup/CircleXoContactsGroupUpdateRequest.php @@ -0,0 +1,33 @@ + + */ + public function rules() + { + return [ + 'name' => 'sometimes|max:255|string', + 'description' => 'sometimes', + 'icon' => 'nullable|max:255|string', + 'color' => 'nullable|max:255|string' + ]; + } +} diff --git a/Modules/CircleContacts/App/Http/Requests/CircleXoContactsMeta/.gitkeep b/Modules/CircleContacts/App/Http/Requests/CircleXoContactsMeta/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Models/.gitkeep b/Modules/CircleContacts/App/Models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Models/CircleXoContact.php b/Modules/CircleContacts/App/Models/CircleXoContact.php new file mode 100644 index 0000000..023c3e3 --- /dev/null +++ b/Modules/CircleContacts/App/Models/CircleXoContact.php @@ -0,0 +1,50 @@ +belongsTo(\App\Models\Account::class); + } + + public function groups() + { + return $this->belongsToMany('Modules\CircleContacts\App\Models\CircleXoContactsGroup', 'circle_xo_contacts_has_groups', 'contact_id', 'group_id'); + } + + public function contactMeta() + { + return $this->hasMany('Modules\CircleContacts\App\Models\CircleXoContactsMeta', 'contact_id', 'id'); + } +} diff --git a/Modules/CircleContacts/App/Models/CircleXoContactsGroup.php b/Modules/CircleContacts/App/Models/CircleXoContactsGroup.php new file mode 100644 index 0000000..60cd1cb --- /dev/null +++ b/Modules/CircleContacts/App/Models/CircleXoContactsGroup.php @@ -0,0 +1,33 @@ +belongsTo(\App\Models\Account::class); + } +} diff --git a/Modules/CircleContacts/App/Models/CircleXoContactsMeta.php b/Modules/CircleContacts/App/Models/CircleXoContactsMeta.php new file mode 100644 index 0000000..c78cdf4 --- /dev/null +++ b/Modules/CircleContacts/App/Models/CircleXoContactsMeta.php @@ -0,0 +1,35 @@ + 'json' + ]; + + + + public function contact() + { + return $this->belongsTo(\Modules\CircleContacts\App\Models\CircleXoContact::class); + } +} diff --git a/Modules/CircleContacts/App/Providers/.gitkeep b/Modules/CircleContacts/App/Providers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Providers/CircleContactsServiceProvider.php b/Modules/CircleContacts/App/Providers/CircleContactsServiceProvider.php new file mode 100644 index 0000000..6ace35f --- /dev/null +++ b/Modules/CircleContacts/App/Providers/CircleContactsServiceProvider.php @@ -0,0 +1,125 @@ +registerCommands(); + $this->registerCommandSchedules(); + $this->registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/migrations')); + + + CircleAppsMenu::register([ + Menu::make() + ->group('circle-contacts') + ->label(__('Contacts')) + ->icon('bx bxs-group') + ->route('profile.contacts.index') + ]); + } + + /** + * Register the service provider. + */ + public function register(): void + { + $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->moduleNameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->moduleNameLower); + $this->loadJsonTranslationsFrom($langPath); + } else { + $this->loadTranslationsFrom(module_path($this->moduleName, 'lang'), $this->moduleNameLower); + $this->loadJsonTranslationsFrom(module_path($this->moduleName, 'lang')); + } + } + + /** + * Register config. + */ + protected function registerConfig(): void + { + $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. + */ + public function registerViews(): void + { + $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); + + $componentNamespace = str_replace('/', '\\', config('modules.namespace').'\\'.$this->moduleName.'\\'.config('modules.paths.generator.component-class.path')); + Blade::componentNamespace($componentNamespace, $this->moduleNameLower); + } + + /** + * 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->moduleNameLower)) { + $paths[] = $path.'/modules/'.$this->moduleNameLower; + } + } + + return $paths; + } +} diff --git a/Modules/CircleContacts/App/Providers/RouteServiceProvider.php b/Modules/CircleContacts/App/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..2fb83f7 --- /dev/null +++ b/Modules/CircleContacts/App/Providers/RouteServiceProvider.php @@ -0,0 +1,59 @@ +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') + ->namespace($this->moduleNamespace) + ->group(module_path('CircleContacts', '/routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + */ + protected function mapApiRoutes(): void + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->moduleNamespace) + ->group(module_path('CircleContacts', '/routes/api.php')); + } +} diff --git a/Modules/CircleContacts/App/Tables/.gitkeep b/Modules/CircleContacts/App/Tables/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/App/Tables/CircleXoContactTable.php b/Modules/CircleContacts/App/Tables/CircleXoContactTable.php new file mode 100644 index 0000000..23ddb14 --- /dev/null +++ b/Modules/CircleContacts/App/Tables/CircleXoContactTable.php @@ -0,0 +1,115 @@ +query = \Modules\CircleContacts\App\Models\CircleXoContact::query(); + } + } + + /** + * Determine if the user is authorized to perform bulk actions and exports. + * + * @return bool + */ + public function authorize(Request $request) + { + return true; + } + + /** + * The resource or query builder. + * + * @return mixed + */ + public function for() + { + return $this->query; + } + + /** + * Configure the given SpladeTable. + * + * @param \ProtoneMedia\Splade\SpladeTable $table + * @return void + */ + public function configure(SpladeTable $table) + { + $table + ->withGlobalSearch( + label: trans('tomato-admin::global.search'), + columns: ['id','name','email','phone'] + ) + ->bulkAction( + label: trans('tomato-admin::global.crud.delete'), + each: function(\Modules\CircleContacts\App\Models\CircleXoContact $model){ + $model->contactMeta()->delete(); + $model->groups()->detach(); + $model->delete(); + }, + after: fn () => Toast::danger(__('Contact Has Been Deleted'))->autoDismiss(2), + confirm: true + ) + ->defaultSort('id', 'desc') + ->column( + key: 'id', + label: __('Id'), + canBeHidden: false, + sortable: true, + + ) + ->column( + key: 'name', + label: __('Name'), + canBeHidden: false, + sortable: true, + ) + ->column( + key: 'email', + label: __('Email'), + canBeHidden: false, + sortable: true + ) + ->column( + key: 'phone', + label: __('Phone'), + canBeHidden: false, + sortable: true + ) + ->column( + key: 'address', + label: __('Address'), + canBeHidden: false, + sortable: true + ) + ->column( + key: 'company', + label: __('Company'), + canBeHidden: false, + sortable: true + ) + ->column( + key: 'type', + label: __('Type'), + canBeHidden: false, + sortable: true + ) + ->export() + ->paginate(8); + } +} diff --git a/Modules/CircleContacts/App/Tables/CircleXoContactsGroupTable.php b/Modules/CircleContacts/App/Tables/CircleXoContactsGroupTable.php new file mode 100644 index 0000000..91563e5 --- /dev/null +++ b/Modules/CircleContacts/App/Tables/CircleXoContactsGroupTable.php @@ -0,0 +1,94 @@ +query = \Modules\CircleContacts\App\Models\CircleXoContactsGroup::query(); + } + } + + /** + * Determine if the user is authorized to perform bulk actions and exports. + * + * @return bool + */ + public function authorize(Request $request) + { + return true; + } + + /** + * The resource or query builder. + * + * @return mixed + */ + public function for() + { + return $this->query; + } + + /** + * Configure the given SpladeTable. + * + * @param \ProtoneMedia\Splade\SpladeTable $table + * @return void + */ + public function configure(SpladeTable $table) + { + $table + ->withGlobalSearch( + label: trans('tomato-admin::global.search'), + columns: ['id','name',] + ) + ->bulkAction( + label: trans('tomato-admin::global.crud.delete'), + each: fn (\Modules\CircleContacts\App\Models\CircleXoContactsGroup $model) => $model->delete(), + after: fn () => Toast::danger(__('CircleXoContactsGroup Has Been Deleted'))->autoDismiss(2), + confirm: true + ) + ->defaultSort('id', 'desc') + ->column( + key: 'id', + label: __('Id'), + sortable: true + ) + ->column( + key: 'name', + label: __('Name'), + sortable: true + ) + ->column( + key: 'description', + label: __('Description'), + sortable: true + ) + ->column( + key: 'icon', + label: __('Icon'), + sortable: true + ) + ->column( + key: 'color', + label: __('Color'), + sortable: true + ) + ->column(key: 'actions',label: trans('tomato-admin::global.crud.actions')) + ->export() + ->paginate(10); + } +} diff --git a/Modules/CircleContacts/App/resources/.gitkeep b/Modules/CircleContacts/App/resources/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/CHANGELOG.md b/Modules/CircleContacts/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/Database/Seeders/.gitkeep b/Modules/CircleContacts/Database/Seeders/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/Database/Seeders/CircleContactsDatabaseSeeder.php b/Modules/CircleContacts/Database/Seeders/CircleContactsDatabaseSeeder.php new file mode 100644 index 0000000..0f35710 --- /dev/null +++ b/Modules/CircleContacts/Database/Seeders/CircleContactsDatabaseSeeder.php @@ -0,0 +1,16 @@ +call([]); + } +} diff --git a/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3232_create_circle_xo_contacts_table.php b/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3232_create_circle_xo_contacts_table.php new file mode 100644 index 0000000..1006687 --- /dev/null +++ b/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3232_create_circle_xo_contacts_table.php @@ -0,0 +1,34 @@ +id(); + $table->string("name")->index(); + $table->string("email")->nullable(); + $table->string("phone")->unique()->index(); + $table->text("address")->nullable(); + $table->string("company")->nullable(); + $table->string("type")->default('customer')->nullable(); + $table->foreignId("account_id")->references('id')->on('accounts')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('circle_xo_contacts'); + } +}; diff --git a/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3535_create_circle_xo_contacts_metas_table.php b/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3535_create_circle_xo_contacts_metas_table.php new file mode 100644 index 0000000..9ba3cad --- /dev/null +++ b/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3535_create_circle_xo_contacts_metas_table.php @@ -0,0 +1,31 @@ +id(); + $table->string("key")->index(); + $table->json("value")->nullable(); + $table->foreignId("contact_id")->references('id')->on('circle_xo_contacts')->onDelete('cascade'); + $table->timestamps(); + + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('circle_xo_contacts_metas'); + } +}; diff --git a/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3737_create_circle_xo_contacts_groups_table.php b/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3737_create_circle_xo_contacts_groups_table.php new file mode 100644 index 0000000..2d22756 --- /dev/null +++ b/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3737_create_circle_xo_contacts_groups_table.php @@ -0,0 +1,33 @@ +id(); + $table->foreignId("account_id")->references('id')->on('accounts')->onDelete('cascade'); + $table->string("name")->unique()->index(); + $table->text("description"); + $table->string("icon")->nullable(); + $table->string("color")->nullable(); + $table->timestamps(); + + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('circle_xo_contacts_groups'); + } +}; diff --git a/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3939_create_circle_xo_contacts_has_groups_table.php b/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3939_create_circle_xo_contacts_has_groups_table.php new file mode 100644 index 0000000..8add261 --- /dev/null +++ b/Modules/CircleContacts/Database/migrations/2024_03_30_06_0303_3939_create_circle_xo_contacts_has_groups_table.php @@ -0,0 +1,29 @@ +foreignId("contact_id")->references('id')->on('circle_xo_contacts')->primary(); + $table->foreignId("group_id")->references('id')->on('circle_xo_contacts_groups'); + $table->timestamps(); + + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('circle_xo_contacts_has_groups'); + } +}; diff --git a/Modules/CircleContacts/LICENSE.md b/Modules/CircleContacts/LICENSE.md new file mode 100644 index 0000000..a77082f --- /dev/null +++ b/Modules/CircleContacts/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Fady Mondy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Modules/CircleContacts/README.md b/Modules/CircleContacts/README.md new file mode 100644 index 0000000..b51ec36 --- /dev/null +++ b/Modules/CircleContacts/README.md @@ -0,0 +1,29 @@ +# Circle Contacts + +Manage your contacts and customers from your profile + +## Installation + +```bash +composer require tomatophp/CircleContacts +``` + +## Support + +you can join our discord server to get support [TomatoPHP](https://discord.gg/Xqmt35Uh) + +## Docs + +you can check docs of this package on [Docs](https://docs.tomatophp.com/plugins/tomato-themes) + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. + +## Security + +Please see [SECURITY](SECURITY.md) for more information about security. + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. diff --git a/Modules/CircleContacts/SECURITY.md b/Modules/CircleContacts/SECURITY.md new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/composer.json b/Modules/CircleContacts/composer.json new file mode 100644 index 0000000..e2d0915 --- /dev/null +++ b/Modules/CircleContacts/composer.json @@ -0,0 +1,31 @@ +{ + "name": "nwidart/circlecontacts", + "description": "", + "authors": [ + { + "name": "Nicolas Widart", + "email": "n.widart@gmail.com" + } + ], + "extra": { + "laravel": { + "providers": [], + "aliases": { + + } + } + }, + "autoload": { + "psr-4": { + "Modules\\CircleContacts\\": "", + "Modules\\CircleContacts\\App\\": "app/", + "Modules\\CircleContacts\\Database\\Factories\\": "database/factories/", + "Modules\\CircleContacts\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Modules\\CircleContacts\\Tests\\": "tests/" + } + } +} diff --git a/Modules/CircleContacts/config/.gitkeep b/Modules/CircleContacts/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/config/config.php b/Modules/CircleContacts/config/config.php new file mode 100644 index 0000000..007053d --- /dev/null +++ b/Modules/CircleContacts/config/config.php @@ -0,0 +1,5 @@ + 'CircleContacts', +]; diff --git a/Modules/CircleContacts/module.json b/Modules/CircleContacts/module.json new file mode 100644 index 0000000..ebfe8ac --- /dev/null +++ b/Modules/CircleContacts/module.json @@ -0,0 +1,27 @@ +{ + "name": "CircleContacts", + "alias": "circle-contacts", + "description": { + "ar": "Manage your contacts and customers from your profile", + "en": "Manage your contacts and customers from your profile", + "gr": "Manage your contacts and customers from your profile", + "sp": "Manage your contacts and customers from your profile" + }, + "keywords": [], + "priority": 0, + "providers": [ + "Modules\\CircleContacts\\App\\Providers\\CircleContactsServiceProvider" + ], + "files": [], + "title": { + "ar": "Circle Contacts", + "en": "Circle Contacts", + "gr": "Circle Contacts", + "sp": "Circle Contacts" + }, + "color": "#E84B3C", + "icon": "bx bxs-user", + "placeholder": "placeholder.webp", + "type": "plugin", + "version": "v1.0" +} diff --git a/Modules/CircleContacts/package.json b/Modules/CircleContacts/package.json new file mode 100644 index 0000000..d6fbfc8 --- /dev/null +++ b/Modules/CircleContacts/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/CircleContacts/resources/assets/js/app.js b/Modules/CircleContacts/resources/assets/js/app.js new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/resources/assets/sass/app.scss b/Modules/CircleContacts/resources/assets/sass/app.scss new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/resources/views/.gitkeep b/Modules/CircleContacts/resources/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/resources/views/circle-xo-contacts-groups/.gitkeep b/Modules/CircleContacts/resources/views/circle-xo-contacts-groups/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/resources/views/contacts/.gitkeep b/Modules/CircleContacts/resources/views/contacts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/resources/views/contacts/create.blade.php b/Modules/CircleContacts/resources/views/contacts/create.blade.php new file mode 100644 index 0000000..c891d82 --- /dev/null +++ b/Modules/CircleContacts/resources/views/contacts/create.blade.php @@ -0,0 +1,29 @@ + + + {{__('New Contact')}} + + + @php $groups = \Modules\CircleContacts\App\Models\CircleXoContactsGroup::all() @endphp + + @foreach($groups as $group) + + @endforeach + + + + + + + + + + +
+ + +
+
+
diff --git a/Modules/CircleContacts/resources/views/contacts/edit.blade.php b/Modules/CircleContacts/resources/views/contacts/edit.blade.php new file mode 100644 index 0000000..c8db24f --- /dev/null +++ b/Modules/CircleContacts/resources/views/contacts/edit.blade.php @@ -0,0 +1,34 @@ + + + {{__('Edit Contact')}} #{{$model->id}} + + + @php $groups = \Modules\CircleContacts\App\Models\CircleXoContactsGroup::all() @endphp + + @foreach($groups as $group) + + @endforeach + + + + + + + + + +
+ + + +
+
+
diff --git a/Modules/CircleContacts/resources/views/contacts/index.blade.php b/Modules/CircleContacts/resources/views/contacts/index.blade.php new file mode 100644 index 0000000..75be1c3 --- /dev/null +++ b/Modules/CircleContacts/resources/views/contacts/index.blade.php @@ -0,0 +1,67 @@ +@extends('circle-contacts::layout.contact') + +@section('content') + @if(\Modules\CircleContacts\App\Models\CircleXoContactsGroup::query()->count() < 0) +
+
+ +

{{__("You don't have any groups please add a group to add one")}}

+
+ + {{__('Create Group')}} + +
+
+
+ @else +
+ + + +
+ @endif +@endsection + +{{----}} +{{-- {{ __('CircleXoContact') }}--}} + +{{-- --}} +{{-- {{trans('tomato-admin::global.crud.create-new')}} {{__('CircleXoContact')}}--}} +{{-- --}} + +{{--
--}} +{{--
--}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} + +{{-- --}} +{{--
--}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{--
--}} +{{--
--}} +{{--
--}} +{{--
--}} +{{--
--}} +{{--
--}} diff --git a/Modules/CircleContacts/resources/views/contacts/list.blade.php b/Modules/CircleContacts/resources/views/contacts/list.blade.php new file mode 100644 index 0000000..d2505cc --- /dev/null +++ b/Modules/CircleContacts/resources/views/contacts/list.blade.php @@ -0,0 +1,113 @@ +@if($table->resource->count() > 0) +
+ @if(!request()->has('page') || (request()->has('page') && request()->get('page') == 1)) +
+ +
+ +

{{__('Add Contact')}}

+
+
+ @if(request()->has('group_id')) +
+ +
+ +

{{__('Add Group')}}

+
+
+
+ +
+ +

{{__('Edit Group')}}

+
+
+ +
+ +

{{__('Delete Group')}}

+
+
+
+
+ @else + +
+ +

{{__('Add Group')}}

+
+
+ @endif +
+ @endif + + @foreach($table->resource as $itemKey => $item) + @php $itemPrimaryKey = $table->findPrimaryKey($item) @endphp +
+
+ + +

{{ $item->name }}

+ @if($item->groups) + @foreach($item->groups as $group) +
+ +
+ +
+
+
+ @endforeach + @endif +
+
{{$item->phone}}
+ @if($item->address) +

+ {{$item->address}} +

+ @endif +
+ + + + + + + + + + +
+
+ {{__('Created')}} {{ $item->created_at->diffForHumans() }} +
+
+
+ @endforeach +
+@else +
+
+ +

{{__("You don't have any contact please add one")}}

+
+ + {{__('Create Contact')}} + +
+
+
+@endif diff --git a/Modules/CircleContacts/resources/views/contacts/meta/create.blade.php b/Modules/CircleContacts/resources/views/contacts/meta/create.blade.php new file mode 100644 index 0000000..f540acb --- /dev/null +++ b/Modules/CircleContacts/resources/views/contacts/meta/create.blade.php @@ -0,0 +1,14 @@ + + + {{__('Add More Details')}} + + + + + +
+ + +
+
+
diff --git a/Modules/CircleContacts/resources/views/contacts/meta/edit.blade.php b/Modules/CircleContacts/resources/views/contacts/meta/edit.blade.php new file mode 100644 index 0000000..16d3984 --- /dev/null +++ b/Modules/CircleContacts/resources/views/contacts/meta/edit.blade.php @@ -0,0 +1,14 @@ + + + {{__('Edit More Details')}} + + + + + +
+ + +
+
+
diff --git a/Modules/CircleContacts/resources/views/contacts/show.blade.php b/Modules/CircleContacts/resources/views/contacts/show.blade.php new file mode 100644 index 0000000..d079df3 --- /dev/null +++ b/Modules/CircleContacts/resources/views/contacts/show.blade.php @@ -0,0 +1,91 @@ +@extends('circle-contacts::layout.contact') + +@section('content') + + +
+
+

+ {{__('Show Contact')}} #{{$model->id}} +

+
+
+
+
+
+ @if($model->getMedia('avatar')->first()) +
+ avatar +
+ @else +
+
+ +
+
+ @endif +
+ +

{{ $model->name }}

+ @if($model->groups) + @foreach($model->groups as $group) +
+ +
+ +
+
+
+ @endforeach + @endif +
+
{{$model->phone}}
+ @if($model->address) +

+ {{$model->address}} +

+ @endif +
+
+
+
+

{{__('Email')}}

+

+ {{ $model->email }} +

+
+
+

{{__('Company')}}

+

+ {{ $model->company }} +

+
+ @foreach($model->contactMeta as $meta) +
+
+

{{str($meta->key)->title()}}

+ + + + + + +
+

+ {{ $meta->value }} +

+
+ @endforeach +
+
+
+ + +
+
+@endsection diff --git a/Modules/CircleContacts/resources/views/groups/.gitkeep b/Modules/CircleContacts/resources/views/groups/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/resources/views/groups/create.blade.php b/Modules/CircleContacts/resources/views/groups/create.blade.php new file mode 100644 index 0000000..fd8ccfd --- /dev/null +++ b/Modules/CircleContacts/resources/views/groups/create.blade.php @@ -0,0 +1,21 @@ + + + {{__('New Group')}} + + + + + +
+ + +
+ +
+ + +
+
+
+ + diff --git a/Modules/CircleContacts/resources/views/groups/edit.blade.php b/Modules/CircleContacts/resources/views/groups/edit.blade.php new file mode 100644 index 0000000..980ba2b --- /dev/null +++ b/Modules/CircleContacts/resources/views/groups/edit.blade.php @@ -0,0 +1,25 @@ + + + {{__('Edit Group')}} {{$model->name}} + + + + + +
+ + +
+ +
+ + + +
+
+
diff --git a/Modules/CircleContacts/resources/views/groups/index.blade.php b/Modules/CircleContacts/resources/views/groups/index.blade.php new file mode 100644 index 0000000..14d225c --- /dev/null +++ b/Modules/CircleContacts/resources/views/groups/index.blade.php @@ -0,0 +1,43 @@ + + + {{ __('CircleXoContactsGroup') }} + + + + {{trans('tomato-admin::global.crud.create-new')}} {{__('CircleXoContactsGroup')}} + + + +
+
+ + + + + + + + + +
+ + + + + + + + + +
+
+
+
+
+
diff --git a/Modules/CircleContacts/resources/views/groups/show.blade.php b/Modules/CircleContacts/resources/views/groups/show.blade.php new file mode 100644 index 0000000..3cc6260 --- /dev/null +++ b/Modules/CircleContacts/resources/views/groups/show.blade.php @@ -0,0 +1,27 @@ + + + {{__('Show Group')}} {{$model->name}} + + +
+ + + + + + + + + +
+
+ + + +
+
diff --git a/Modules/CircleContacts/resources/views/layout/contact.blade.php b/Modules/CircleContacts/resources/views/layout/contact.blade.php new file mode 100644 index 0000000..b460a2c --- /dev/null +++ b/Modules/CircleContacts/resources/views/layout/contact.blade.php @@ -0,0 +1,70 @@ + +
+
+ + +
+ +
+
+ +
+
+
+ {{ __('All Contacts') }} +
+ +
+
+ @php $groups = \Modules\CircleContacts\App\Models\CircleXoContactsGroup::all(); @endphp + @foreach($groups as $group) + +
+ +
+
+ @if($group->icon) + + @else + + @endif +
+
+
+ {{ $group->name }} +
+ +
+
+ @endforeach + +
+
+
+ @yield('content') +
+
+
diff --git a/Modules/CircleContacts/resources/views/layout/parts/sidebar.blade.php b/Modules/CircleContacts/resources/views/layout/parts/sidebar.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/routes/.gitkeep b/Modules/CircleContacts/routes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Modules/CircleContacts/routes/api.php b/Modules/CircleContacts/routes/api.php new file mode 100644 index 0000000..2ce6688 --- /dev/null +++ b/Modules/CircleContacts/routes/api.php @@ -0,0 +1,16 @@ +name('profile.')->group(function () { + Route::get('profile/contacts', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'index'])->name('contacts.index'); + Route::get('profile/contacts/api', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'api'])->name('contacts.api'); + Route::get('profile/contacts/api', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'api'])->name('contacts.api'); + Route::get('profile/contacts/create', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'create'])->name('contacts.create'); + Route::post('profile/contacts', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'store'])->name('contacts.store'); + Route::get('profile/contacts/{model}', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'show'])->name('contacts.show'); + Route::get('profile/contacts/{model}/edit', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'edit'])->name('contacts.edit'); + Route::post('profile/contacts/{model}', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'update'])->name('contacts.update'); + Route::delete('profile/contacts/{model}', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactController::class, 'destroy'])->name('contacts.destroy'); +}); + +Route::middleware(['auth:accounts','app:circle-contacts', 'splade', 'verified'])->prefix('/profile/contacts/{account}/meta')->name('profile.contacts.meta.')->group(function () { + Route::get('/create', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsMetaController::class, 'create'])->name('create'); + Route::post('/create', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsMetaController::class, 'store'])->name('store'); + Route::get('/{model}/edit', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsMetaController::class, 'edit'])->name('edit'); + Route::post('/{model}', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsMetaController::class, 'update'])->name('update'); + Route::delete('/{model}', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsMetaController::class, 'destroy'])->name('destroy'); +}); + +Route::middleware(['auth:accounts','app:circle-contacts', 'splade', 'verified'])->name('profile.')->group(function () { + Route::get('profile/groups', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsGroupController::class, 'index'])->name('groups.index'); + Route::get('profile/groups/api', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsGroupController::class, 'api'])->name('groups.api'); + Route::get('profile/groups/create', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsGroupController::class, 'create'])->name('groups.create'); + Route::post('profile/groups', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsGroupController::class, 'store'])->name('groups.store'); + Route::get('profile/groups/{model}', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsGroupController::class, 'show'])->name('groups.show'); + Route::get('profile/groups/{model}/edit', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsGroupController::class, 'edit'])->name('groups.edit'); + Route::post('profile/groups/{model}', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsGroupController::class, 'update'])->name('groups.update'); + Route::delete('profile/groups/{model}', [\Modules\CircleContacts\App\Http\Controllers\CircleXoContactsGroupController::class, 'destroy'])->name('groups.destroy'); +}); diff --git a/Modules/CircleContacts/vite.config.js b/Modules/CircleContacts/vite.config.js new file mode 100644 index 0000000..c5bf9b8 --- /dev/null +++ b/Modules/CircleContacts/vite.config.js @@ -0,0 +1,26 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + build: { + outDir: '../../public/build-circlecontacts', + emptyOutDir: true, + manifest: true, + }, + plugins: [ + laravel({ + publicDirectory: '../../public', + buildDirectory: 'build-circlecontacts', + input: [ + __dirname + '/resources/assets/sass/app.scss', + __dirname + '/resources/assets/js/app.js' + ], + refresh: true, + }), + ], +}); + +//export const paths = [ +// 'Modules/$STUDLY_NAME$/resources/assets/sass/app.scss', +// 'Modules/$STUDLY_NAME$/resources/assets/js/app.js', +//]; \ No newline at end of file diff --git a/Modules/CircleXO/resources/views/components/menu-items.blade.php b/Modules/CircleXO/resources/views/components/menu-items.blade.php index e2a7641..eb4df66 100644 --- a/Modules/CircleXO/resources/views/components/menu-items.blade.php +++ b/Modules/CircleXO/resources/views/components/menu-items.blade.php @@ -13,21 +13,10 @@ {{__('Blog')}} -@php $providerMenus = \Modules\CircleApps\App\Facades\CircleApps::menus(); @endphp - -@foreach($providerMenus as $item) - @if($item->group === 'profile' && auth('accounts')->user()) - - - {{$item->label}} - - @elseif($item->group !== 'profile') - - - {{$item->label}} - - @endif -@endforeach +{{----}} +{{-- --}} +{{-- {{__('Apps')}}--}} +{{----}} @foreach(menu('main') as $item) @@ -59,6 +48,16 @@ @endforeach @if(auth('accounts')->user()) + @php $providerMenus = \Modules\CircleApps\App\Facades\CircleApps::menus(); @endphp + + @foreach($providerMenus as $item) + @if(has_app($item->group)) + + + {{$item->label}} + + @endif + @endforeach {{__('Profile')}} diff --git a/lang/en.json b/lang/en.json index d50d413..1a3ffbe 100644 --- a/lang/en.json +++ b/lang/en.json @@ -57,8 +57,8 @@ "Resend Verification Email": "Resend Verification Email", "Log Out": "Log Out", "Pagination Navigation": "Pagination Navigation", - "pagination.previous": "pagination.previous", - "pagination.next": "pagination.next", + "pagination.previous": "Previous", + "pagination.next": "Next", "Showing": "Showing", "to": "to", "of": "of", @@ -238,4 +238,4 @@ "Date": "Date", "Home": "Home", "Documentation": "Documentation" -} \ No newline at end of file +} diff --git a/modules_statuses.json b/modules_statuses.json index b66bfc9..d14478b 100644 --- a/modules_statuses.json +++ b/modules_statuses.json @@ -13,5 +13,6 @@ "TomatoThemes": true, "TomatoSupport": true, "TomatoSections": true, - "TomatoMenus": true -} + "TomatoMenus": true, + "CircleContacts": true +} \ No newline at end of file