From d37cd82db053bbbf3370d6df3bbdb62f80298ae8 Mon Sep 17 00:00:00 2001 From: DanyaLozhkin Date: Mon, 20 May 2024 21:04:40 +0400 Subject: [PATCH 1/5] =?UTF-8?q?CRUD=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BD=D0=BE=D1=88=D0=B5=D0=BD=D0=B8=D0=B9,=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/RelationTypeController.php | 65 ++++++++++++++++--- app/Models/User.php | 2 + app/Providers/AppServiceProvider.php | 9 +++ .../2024_04_02_153622_create_all_tables.php | 4 +- .../2024_05_20_135318_user_roles.php | 29 +++++++++ lang/ru/entities.php | 8 +++ lang/ru/relation-type-page.php | 34 ++++++++++ .../navigation/navbar-items.blade.php | 3 + resources/views/components/table.blade.php | 23 +++++-- .../views/relation-type/create.blade.php | 44 +++++++++++++ resources/views/relation-type/edit.blade.php | 49 ++++++++++++++ resources/views/relation-type/index.blade.php | 52 +++++++++++++++ routes/web.php | 13 ++++ 13 files changed, 319 insertions(+), 16 deletions(-) create mode 100644 database/migrations/2024_05_20_135318_user_roles.php create mode 100644 lang/ru/relation-type-page.php create mode 100644 resources/views/relation-type/create.blade.php create mode 100644 resources/views/relation-type/edit.blade.php create mode 100644 resources/views/relation-type/index.blade.php diff --git a/app/Http/Controllers/RelationTypeController.php b/app/Http/Controllers/RelationTypeController.php index 05b524b..bdf8a84 100644 --- a/app/Http/Controllers/RelationTypeController.php +++ b/app/Http/Controllers/RelationTypeController.php @@ -5,6 +5,8 @@ use App\Models\RelationType; use App\Http\Requests\StoreRelationTypeRequest; use App\Http\Requests\UpdateRelationTypeRequest; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Gate; class RelationTypeController extends Controller { @@ -13,7 +15,14 @@ class RelationTypeController extends Controller */ public function index() { - // + $query = RelationType::query(); + if (request('search')) { + $query->where('name', 'ilike', '%' . request('search') . '%'); + } + + $relationTypes = $query->paginate(15); + + return view("relation-type.index", compact('relationTypes')); } /** @@ -21,15 +30,30 @@ public function index() */ public function create() { - // + Gate::authorize('redactor'); + + return view('relation-type.create'); } /** * Store a newly created resource in storage. */ - public function store(StoreRelationTypeRequest $request) + public function store(Request $request) { - // + Gate::authorize('redactor'); + + $validated = $this->validate($request, [ + 'name' => 'required|string|unique:relation_types,name', + 'description' => 'nullable|string', + ]); + + RelationType::create($validated); + + return redirect()->route('relation-type.index') + ->with( + 'success', + __('relation-type-page.messages.created') + ); } /** @@ -43,24 +67,45 @@ public function show(RelationType $relationType) /** * Show the form for editing the specified resource. */ - public function edit(RelationType $relationType) + public function edit(string $relationType) { - // + Gate::authorize('redactor'); + $relationType = RelationType::findOrFail($relationType); + + return view('relation-type.edit', compact('relationType')); } /** * Update the specified resource in storage. */ - public function update(UpdateRelationTypeRequest $request, RelationType $relationType) + public function update(Request $request, string $relationType) { - // + Gate::authorize('redactor'); + $validated = $this->validate($request, [ + 'name' => 'required|string|unique:relation_types,name,' . $relationType, + 'description' => 'nullable|string', + ]); + + RelationType::findOrFail($relationType)->update($validated); + + return redirect()->route('relation-type.index') + ->with( + 'success', + __('relation-type-page.messages.updated') + ); } /** * Remove the specified resource from storage. */ - public function destroy(RelationType $relationType) + public function destroy(string $relationType) { - // + Gate::authorize('admin'); + RelationType::findOrFail($relationType)->delete(); + return redirect()->route('relation-type.index') + ->with( + 'success', + __('relation-type-page.messages.deleted') + ); } } diff --git a/app/Models/User.php b/app/Models/User.php index 5b6e81c..411ab9f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -15,6 +15,8 @@ * @property string $id * @property string $name * @property string $email + * @property bool $is_admin + * @property bool $is_redactor */ class User extends Authenticatable { diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index f1a4d93..965518b 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -57,6 +57,15 @@ public function boot(): void Gate::define('must-be-owner', function (User $user, Dictionary $dictionary) { return $user->id === $dictionary->fk_user_id; }); + + Gate::define('redactor', function (User $user) { + return $user->is_redactor || $user->is_admin; + }); + + Gate::define('admin', function (User $user) { + return $user->is_admin; + }); + #endregion } } diff --git a/database/migrations/2024_04_02_153622_create_all_tables.php b/database/migrations/2024_04_02_153622_create_all_tables.php index cbc0665..74874e6 100644 --- a/database/migrations/2024_04_02_153622_create_all_tables.php +++ b/database/migrations/2024_04_02_153622_create_all_tables.php @@ -17,7 +17,7 @@ public function up(): void $table->uuid('id')->primary(); $table->foreignUuid('fk_dictionary_id')->references('id')->on('dictionaries')->cascadeOnDelete(); $table->string('name', 255); - $table->string('definition', 1000); + $table->string('definition', 1000)->nullable(); $table->timestampsTz(); $table->unique(['fk_dictionary_id','name']); @@ -28,7 +28,7 @@ public function up(): void Schema::create('relation_types', function (Blueprint $table) { $table->uuid('id')->primary(); $table->string('name', 255); - $table->string('description', 1000); + $table->string('description', 1000)->nullable(); $table->timestampsTz(); $table->unique('name'); diff --git a/database/migrations/2024_05_20_135318_user_roles.php b/database/migrations/2024_05_20_135318_user_roles.php new file mode 100644 index 0000000..52d5254 --- /dev/null +++ b/database/migrations/2024_05_20_135318_user_roles.php @@ -0,0 +1,29 @@ +boolean('is_admin')->default(false); + $table->boolean('is_redactor')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn(['is_admin', 'is_redactor']); + }); + } +}; diff --git a/lang/ru/entities.php b/lang/ru/entities.php index 4006daf..f559738 100644 --- a/lang/ru/entities.php +++ b/lang/ru/entities.php @@ -25,4 +25,12 @@ 'singular' => 'Вложение', 'plural' => 'Вложения', ], + 'relation-types' => [ + 'singular' => 'Тип отношения', + 'plural' => 'Типы отношений', + 'props' => [ + 'name' => 'Название', + 'description' => 'Описание', + ], + ], ]; diff --git a/lang/ru/relation-type-page.php b/lang/ru/relation-type-page.php new file mode 100644 index 0000000..106b9c8 --- /dev/null +++ b/lang/ru/relation-type-page.php @@ -0,0 +1,34 @@ + 'Отношения', + 'create' => [ + 'title' => 'Создание нового отношения', + 'form-title' => 'Создание нового отношения', + 'name' => [ + 'label' => 'Название отношения', + 'placeholder' => 'Название отношения', + ], + 'description' => [ + 'label' => 'Описание отношения', + 'placeholder' => 'Описание отношения', + ], + ], + 'edit' => [ + 'title' => 'Редактирование отношения', + 'form-title' => 'Редактирование отношения', + 'name' => [ + 'label' => 'Название отношения', + 'placeholder' => 'Название отношения', + ], + 'description' => [ + 'label' => 'Описание отношения', + 'placeholder' => 'Описание отношения', + ], + ], + 'messages' => [ + 'deleted' => 'Отношение успешно удалено', + 'updated' => 'Отношение успешно обновлено', + 'created' => 'Отношение успешно создано', + ], +]; diff --git a/resources/views/components/navigation/navbar-items.blade.php b/resources/views/components/navigation/navbar-items.blade.php index 0d6d9c2..cee4a57 100644 --- a/resources/views/components/navigation/navbar-items.blade.php +++ b/resources/views/components/navigation/navbar-items.blade.php @@ -25,6 +25,9 @@ {{ __('Теги') }} + + {{ __('Отношения') }} +
diff --git a/resources/views/components/table.blade.php b/resources/views/components/table.blade.php index 89a70fd..f6ff354 100644 --- a/resources/views/components/table.blade.php +++ b/resources/views/components/table.blade.php @@ -1,4 +1,14 @@ -@props(['headers', 'rows', 'names', 'editRouteName', 'deleteRouteName', 'isPaginated' => true, 'entityName']) +@props([ + 'headers', + 'rows', + 'names', + 'editRouteName', + 'deleteRouteName', + 'isPaginated' => true, + 'entityName', + 'deleteGateName' => 'admin', + 'editGateName' => 'redactor', +])
@@ -21,14 +31,18 @@ @foreach ($rows as $row) @foreach ($names as $name) - @endforeach - + @can($editGateName) + @endcan + @can($deleteGateName) + @endcan @endforeach diff --git a/resources/views/relation-type/create.blade.php b/resources/views/relation-type/create.blade.php new file mode 100644 index 0000000..d0260c0 --- /dev/null +++ b/resources/views/relation-type/create.blade.php @@ -0,0 +1,44 @@ + + + {{ __('relation-type-page.create.title') }} + +
+
+
+
+

+ {{ __('relation-type-page.create.form-title') }} +

+ + + {{ __('screen-reader.modal.close')}} + +
+ + @csrf +
+
+ + + +
+
+ + + +
+
+ + +
+
+
+ +
diff --git a/resources/views/relation-type/edit.blade.php b/resources/views/relation-type/edit.blade.php new file mode 100644 index 0000000..7529023 --- /dev/null +++ b/resources/views/relation-type/edit.blade.php @@ -0,0 +1,49 @@ +@props(['relationType']) + + + + {{ __('relation-type-page.edit.title') }} + +
+
+
+
+

+ {{ __('relation-type-page.edit.form-title') }} +

+ + + {{ __('screen-reader.modal.close')}} + +
+
+ @csrf + @method('PUT') +
+
+ + + +
+
+
+ + + +
+
+
+ + +
+
+
+ +
diff --git a/resources/views/relation-type/index.blade.php b/resources/views/relation-type/index.blade.php new file mode 100644 index 0000000..d0b1669 --- /dev/null +++ b/resources/views/relation-type/index.blade.php @@ -0,0 +1,52 @@ +@props(['relationTypes']) + +@php +$names = ['name', 'description']; +@endphp + + + + {{ __('attribute-page.title') }} +
+
+
+
+
+
+ +
+
+ +
+ + +
+ +
+ @can('redactor') + + @endcan +
+ +
+ @if ($relationTypes->isEmpty()) +
+ {{ __('shared.empty-records') }} +
+ @else + + @endif +
+
+
+
+
diff --git a/routes/web.php b/routes/web.php index 74178eb..0aabbc5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,10 +5,14 @@ use App\Http\Controllers\ConceptAttributeController; use App\Http\Controllers\ConceptAttributeValueController; use App\Http\Controllers\ConceptController; +use App\Http\Controllers\ConceptRelationController; use App\Http\Controllers\DictionaryController; use App\Http\Controllers\ProfileController; +use App\Http\Controllers\RelationTypeController; use App\Http\Controllers\TagController; use App\Models\Concept; +use App\Models\ConceptRelation; +use App\Models\RelationType; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; @@ -154,6 +158,15 @@ ]) ->middleware(['auth', 'verified']); +Route::resource('relations', RelationTypeController::class)->names([ + 'create' => 'relation-type.create', + 'store' => 'relation-type.store', + 'destroy' => 'relation-type.destroy', + 'update'=> 'relation-type.update', + 'edit'=> 'relation-type.edit', + 'index' => 'relation-type.index', +])->middleware('auth'); + Route::fallback(function () { return view('errors.404'); From 9229bc8ab915cc703ba0f205af0b6b418c104543 Mon Sep 17 00:00:00 2001 From: DanyaLozhkin Date: Tue, 21 May 2024 12:17:44 +0400 Subject: [PATCH 2/5] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=80=D0=BE=D0=BB=D0=B5=D0=B9=20=D0=B2=20?= =?UTF-8?q?=D0=B0=D1=82=D1=80=D0=B8=D0=B1=D1=83=D1=82=D0=B0=D1=85=20=D0=B8?= =?UTF-8?q?=20=D1=82=D0=B5=D0=B3=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/AttributeController.php | 6 ++++++ app/Http/Controllers/TagController.php | 6 ++++++ .../views/components/navigation/navbar-items.blade.php | 6 +++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/AttributeController.php b/app/Http/Controllers/AttributeController.php index 6501094..394bfd3 100644 --- a/app/Http/Controllers/AttributeController.php +++ b/app/Http/Controllers/AttributeController.php @@ -7,6 +7,7 @@ use App\Http\Requests\StoreAttributeRequest; use App\Http\Requests\UpdateAttributeRequest; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Gate; use Illuminate\Validation\Rule; use Illuminate\Validation\Rules\Enum; @@ -61,6 +62,7 @@ public function store(Request $request) */ public function edit(Attribute $attribute) { + Gate::authorize('redactor'); return view('attribute.edit', compact('attribute')); } @@ -69,6 +71,8 @@ public function edit(Attribute $attribute) */ public function update(Request $request, Attribute $attribute) { + Gate::authorize('redactor'); + $validated = $request->validate([ 'name' => ['required', 'max:255', Rule::unique('attributes')->ignore($attribute->id)], 'type' => [new Enum(DataType::class)], @@ -83,6 +87,8 @@ public function update(Request $request, Attribute $attribute) */ public function destroy(Attribute $attribute) { + Gate::authorize('admin'); + if ($attribute->concepts()->count() > 0) { return redirect()->back()->with('attribute.delete.error', 'Атрибут не может быть удален, так как он используется в словарях. Удалите его из словарей'); } diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 2917600..bada593 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -4,6 +4,7 @@ use App\Models\Tag; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Gate; class TagController extends Controller { @@ -54,6 +55,7 @@ public function store(Request $request) */ public function edit(Tag $tag) { + Gate::authorize('redactor'); return view('tag.edit', compact('tag')); } @@ -62,6 +64,8 @@ public function edit(Tag $tag) */ public function update(Request $request, Tag $tag) { + Gate::authorize('redactor'); + $validated = $request->validate([ 'name' => 'required|unique:tags,name,' . $tag->id . '|max:50', ]); @@ -80,6 +84,8 @@ public function update(Request $request, Tag $tag) */ public function destroy(Tag $tag) { + Gate::authorize('admin'); + $tag->deleteOrFail(); return redirect()->back() diff --git a/resources/views/components/navigation/navbar-items.blade.php b/resources/views/components/navigation/navbar-items.blade.php index cee4a57..ab0d85c 100644 --- a/resources/views/components/navigation/navbar-items.blade.php +++ b/resources/views/components/navigation/navbar-items.blade.php @@ -20,13 +20,13 @@ {{ __('Настройки') }} - {{ __('Атрибуты') }} + {{ __('entities.attribute.plural') }} - {{ __('Теги') }} + {{ __('entities.tag.plural') }} - {{ __('Отношения') }} + {{ __('entities.relation-types.plural') }}
From 7eaed6c44051d5de092e7473d42f2c68937498b7 Mon Sep 17 00:00:00 2001 From: DanyaLozhkin Date: Tue, 21 May 2024 13:20:57 +0400 Subject: [PATCH 3/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=85=D0=BB=D0=B5=D0=B1=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BA=D1=80=D0=BE=D1=88=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/tabs/attachments.blade.php | 1 + .../dashboard/tabs/breadcrumbs.blade.php | 59 +++++++++++++++++++ .../dashboard/tabs/concept.blade.php | 1 + .../dashboard/tabs/examples.blade.php | 1 + 4 files changed, 62 insertions(+) create mode 100644 resources/views/components/dashboard/tabs/breadcrumbs.blade.php diff --git a/resources/views/components/dashboard/tabs/attachments.blade.php b/resources/views/components/dashboard/tabs/attachments.blade.php index 965768a..644c9c7 100644 --- a/resources/views/components/dashboard/tabs/attachments.blade.php +++ b/resources/views/components/dashboard/tabs/attachments.blade.php @@ -1,6 +1,7 @@ @props(['dictionary', 'concept', 'concepts', 'attachments']) + @include('components.dashboard.tabs.breadcrumbs', [$concept]) @include('components.dashboard.tabs.tabs')
diff --git a/resources/views/components/dashboard/tabs/breadcrumbs.blade.php b/resources/views/components/dashboard/tabs/breadcrumbs.blade.php new file mode 100644 index 0000000..d155442 --- /dev/null +++ b/resources/views/components/dashboard/tabs/breadcrumbs.blade.php @@ -0,0 +1,59 @@ +@props(['concept']) + +@php +$crumbs = []; +$temp = $concept; +while ($temp) { +$crumbs[$temp->id] = $temp; +$temp = $temp->parent; +} + +$crumbs = array_reverse($crumbs); +@endphp + + diff --git a/resources/views/components/dashboard/tabs/concept.blade.php b/resources/views/components/dashboard/tabs/concept.blade.php index 9f04950..f9ce6fd 100644 --- a/resources/views/components/dashboard/tabs/concept.blade.php +++ b/resources/views/components/dashboard/tabs/concept.blade.php @@ -1,6 +1,7 @@ @props(['dictionary', 'concepts', 'concept']) + @include('components.dashboard.tabs.breadcrumbs', [$concept]) @include('components.dashboard.tabs.tabs')
diff --git a/resources/views/components/dashboard/tabs/examples.blade.php b/resources/views/components/dashboard/tabs/examples.blade.php index c8a977f..bcf3cb7 100644 --- a/resources/views/components/dashboard/tabs/examples.blade.php +++ b/resources/views/components/dashboard/tabs/examples.blade.php @@ -1,6 +1,7 @@ @props(['dictionary', 'concepts', 'examples']) + @include('components.dashboard.tabs.breadcrumbs', [$concept]) @include('components.dashboard.tabs.tabs')

{{__('dashboard.examples.header', ['concept' => $concept->name])}}

From 04bbc0a55e9e16e7b58ed29c8de0480448c7905b Mon Sep 17 00:00:00 2001 From: DanyaLozhkin Date: Tue, 21 May 2024 21:03:07 +0400 Subject: [PATCH 4/5] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D1=80=D0=BE=D1=83=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/web.php | 182 ++++++++++++++++++------------------------------- 1 file changed, 66 insertions(+), 116 deletions(-) diff --git a/routes/web.php b/routes/web.php index 0aabbc5..5df5ca7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,32 +10,13 @@ use App\Http\Controllers\ProfileController; use App\Http\Controllers\RelationTypeController; use App\Http\Controllers\TagController; -use App\Models\Concept; -use App\Models\ConceptRelation; -use App\Models\RelationType; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; -/* -|-------------------------------------------------------------------------- -| Web Routes -|-------------------------------------------------------------------------- -| -| Here is where you can register web routes for your application. These -| routes are loaded by the RouteServiceProvider and all of them will -| be assigned to the "web" middleware group. Make something great! -| -*/ +Route::view('contact', 'components.pages.contact')->name('contact'); +Route::view('about', 'components.pages.about')->name('about'); -Route::get("contact", function () { - return view("components.pages.contact"); -})->name('contact'); - -Route::get("/about", function () { - return view("components.pages.about"); -})->name('about'); - -Route::redirect("/home", "/"); +Route::redirect('/home', '/'); Route::get('/', function (Request $request) { if (request('search')) { @@ -47,81 +28,57 @@ return view('components.pages.home', compact('dictionaries')); })->name('home'); - -// Route::get('/dashboard', function () { -// return view('dashboard'); -// })->middleware(['auth', 'verified'])->name('dashboard'); - -Route::middleware('auth')->group(function () { +Route::middleware(['auth'])->group(function () { Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); -}); - -Route::resource('/my', DictionaryController::class) - ->middleware(['auth', 'verified']) - ->names([ - 'index' => 'my', - 'create' => 'dictionary.create', - 'store' => 'dictionary.store', - 'edit' => 'dictionary.edit', - 'destroy' => 'dictionary.destroy', - 'update' => 'dictionary.update', - 'show' => 'dictionary.show', - ]); - -Route::get('/my/{dictionary}/dashboard', [DictionaryController::class, 'show']) - ->name('dictionary.show') - ->middleware(['auth', 'verified']); -Route::resource('/my/{dictionary}/concept/', ConceptController::class) - ->middleware(['auth', 'verified']) - ->names([ - 'create' => 'concept.create', - 'destroy' => 'concept.destroy', - 'store' => 'concept.store', - ]); -Route::put('/my/{dictionary}/concept/{concept}', [ConceptController::class, 'update']) - ->name('concept.update') - ->middleware(['auth', 'verified']); -Route::get('/my/{dictionary}/concept/{concept}', [ConceptController::class, 'edit']) - ->name('concept.edit') - ->middleware(['auth', 'verified']); - -Route::get('/my/{dictionary}/dashboard/{concept}/', [ConceptController::class, 'show']) - ->name('concept.show') - ->middleware(['auth', 'verified']); - -Route::delete('/my/{dictionary}/concept/{concept}', [ConceptController::class, 'destroy']) - ->middleware(['auth', 'verified']); - -Route::get('/my/{dictionary}/examples/{concept}', [ConceptController::class, 'examples'])->name('concept.examples') - ->middleware(['auth', 'verified']); - Route::get('/my/{dictionary}/attachments/{concept}', [ConceptController::class, 'attachments'])->name('concept.attachments') - ->middleware(['auth', 'verified']); - -// Attachments for concept -Route::post('/my/{dictionary}/attachments/{concept}', [AttachmentController::class, 'store'])->name('attachment.store') -->middleware(['auth', 'verified']); -Route::get('/my/{dictionary}/attachments/{concept}/create', [AttachmentController::class, 'create'])->name('attachment.create'); -Route::delete('/my/{dictionary}/attachments/{concept}/{attachment}', [AttachmentController::class, 'destroy'])->name('attachment.destroy'); - -Route::get('/tags', [TagController::class, 'index']); - - -Route::prefix('my/{dictionary}')->group(function () { - Route::get('/export', [DictionaryController::class, 'export'])->name('dictionary.export'); - - Route::resource('concept/{concept}/attributes', ConceptAttributeController::class)->only(['create', 'store', 'destroy']) - ->names([ - 'create' => 'concept.attribute.create', - 'store' => 'concept.attribute.store', - 'destroy' => 'concept.attribute.destroy', + Route::middleware(['verified'])->group(function () { + Route::resource('my', DictionaryController::class)->names([ + 'index' => 'my', + 'create' => 'dictionary.create', + 'store' => 'dictionary.store', + 'edit' => 'dictionary.edit', + 'destroy' => 'dictionary.destroy', + 'update' => 'dictionary.update', + 'show' => 'dictionary.show', ]); -}); -Route::resource('attributes', AttributeController::class) - ->names([ + Route::get('my/{dictionary}/dashboard', [DictionaryController::class, 'show'])->name('dictionary.show'); + + Route::prefix('my/{dictionary}')->group(function () { + Route::resource('concept', ConceptController::class)->only(['create', 'store', 'destroy'])->names([ + 'create' => 'concept.create', + 'store' => 'concept.store', + 'destroy' => 'concept.destroy', + ]); + Route::put('concept/{concept}', [ConceptController::class, 'update'])->name('concept.update'); + Route::get('concept/{concept}', [ConceptController::class, 'edit'])->name('concept.edit'); + Route::get('dashboard/{concept}', [ConceptController::class, 'show'])->name('concept.show'); + Route::delete('concept/{concept}', [ConceptController::class, 'destroy'])->name('concept.destroy'); + Route::get('examples/{concept}', [ConceptController::class, 'examples'])->name('concept.examples'); + Route::get('attachments/{concept}', [ConceptController::class, 'attachments'])->name('concept.attachments'); + + // Attachments for concept + Route::post('attachments/{concept}', [AttachmentController::class, 'store'])->name('attachment.store'); + Route::get('attachments/{concept}/create', [AttachmentController::class, 'create'])->name('attachment.create'); + Route::delete('attachments/{concept}/{attachment}', [AttachmentController::class, 'destroy'])->name('attachment.destroy'); + + Route::get('export', [DictionaryController::class, 'export'])->name('dictionary.export'); + + Route::resource('concept/{concept}/attributes', ConceptAttributeController::class)->only(['create', 'store', 'destroy'])->names([ + 'create' => 'concept.attribute.create', + 'store' => 'concept.attribute.store', + 'destroy' => 'concept.attribute.destroy', + ]); + Route::get('concept/{concept}/relation/create', [ConceptRelationController::class, 'create'])->name('concept.relation.create'); + Route::post('concept/{concept}/relation', [ConceptRelationController::class, 'store'])->name('concept.relation.store'); + Route::delete('concept/{concept}/relation/{relation}', [ConceptRelationController::class, 'destroy'])->name('concept.relation.destroy'); + Route::put('concept/{concept}/relation/{relation}', [ConceptRelationController::class, 'update'])->name('concept.relation.update'); + }); + }); + + Route::resource('attributes', AttributeController::class)->names([ 'create' => 'attribute.create', 'store' => 'attribute.store', 'destroy' => 'attribute.destroy', @@ -129,44 +86,37 @@ 'edit' => 'attribute.edit', 'show' => 'attribute.show', 'index' => 'attribute.index', - ]) - ->middleware(['auth', 'verified']); - -Route::delete('concept/{concept}/examples/{exampleNumber}', [ConceptAttributeValueController::class, 'destroy']) - ->name('concept.example.destroy')->middleware(['auth', 'verified']); -Route::get('concept/{concept}/examples/{exampleNumber}', [ConceptAttributeValueController::class, 'edit']) - ->name('concept.example.edit')->middleware(['auth', 'verified']); -Route::put('concept/{concept}/examples/{exampleNumber}', [ConceptAttributeValueController::class, 'edit']) - ->name('concept.example.update')->middleware(['auth', 'verified']); - -Route::resource('concept/{concept}/example', ConceptAttributeValueController::class)->only(['store', 'update', 'create'])->middleware(['auth', 'verified']) - ->names([ + ]); + + Route::delete('concept/{concept}/examples/{exampleNumber}', [ConceptAttributeValueController::class, 'destroy'])->name('concept.example.destroy'); + Route::get('concept/{concept}/examples/{exampleNumber}', [ConceptAttributeValueController::class, 'edit'])->name('concept.example.edit'); + Route::put('concept/{concept}/examples/{exampleNumber}', [ConceptAttributeValueController::class, 'edit'])->name('concept.example.update'); + + Route::resource('concept/{concept}/example', ConceptAttributeValueController::class)->only(['store', 'update', 'create'])->names([ 'create' => 'concept.example.create', 'store' => 'concept.example.store', 'update' => 'concept.example.update', 'edit' => 'concept.example.edit', ]); -Route::resource('tags', TagController::class) - ->names([ + Route::resource('tags', TagController::class)->names([ 'create' => 'tag.create', 'store' => 'tag.store', 'destroy' => 'tag.destroy', 'update' => 'tag.update', 'edit' => 'tag.edit', 'index' => 'tag.index', - ]) - ->middleware(['auth', 'verified']); - -Route::resource('relations', RelationTypeController::class)->names([ - 'create' => 'relation-type.create', - 'store' => 'relation-type.store', - 'destroy' => 'relation-type.destroy', - 'update'=> 'relation-type.update', - 'edit'=> 'relation-type.edit', - 'index' => 'relation-type.index', -])->middleware('auth'); + ]); + Route::resource('relations', RelationTypeController::class)->names([ + 'create' => 'relation-type.create', + 'store' => 'relation-type.store', + 'destroy' => 'relation-type.destroy', + 'update' => 'relation-type.update', + 'edit' => 'relation-type.edit', + 'index' => 'relation-type.index', + ]); +}); Route::fallback(function () { return view('errors.404'); From 84ba932cb5e5aa13f80e546d58ec1e2fda9febc4 Mon Sep 17 00:00:00 2001 From: DanyaLozhkin Date: Wed, 22 May 2024 22:26:14 +0400 Subject: [PATCH 5/5] =?UTF-8?q?=D0=9E=D1=82=D0=BD=D0=BE=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BD=D1=8F=D1=82=D0=B8=D1=8F=D0=BC=D0=B8,=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BB=D0=B8=D1=87=D0=BD=D1=8B=D0=B5=20=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/ConceptController.php | 51 +++++++- .../Controllers/ConceptRelationController.php | 88 ++++++++++--- .../Controllers/RelationTypeController.php | 10 +- app/Models/Concept.php | 10 ++ app/Models/ConceptRelation.php | 10 +- app/Models/RelationType.php | 6 + .../2024_05_22_090313_relation_plural.php | 30 +++++ lang/ru/dashboard.php | 29 +++++ lang/ru/entities.php | 9 ++ lang/ru/relation-type-page.php | 8 ++ .../dashboard/sidebar/menu.blade.php | 2 +- .../dashboard/sidebar/sidebar.blade.php | 1 + .../dashboard/tabs/concept.blade.php | 121 +++++++++++++++++- .../components/dashboard/tabs/tabs.blade.php | 2 +- .../components/layout/dashboard.blade.php | 2 +- .../components/tree-view/tree-item.blade.php | 4 +- .../views/concept-relation/create.blade.php | 56 ++++++++ .../views/concept-relation/edit.blade.php | 57 +++++++++ resources/views/dictionary/item.blade.php | 9 +- .../views/relation-type/create.blade.php | 5 + resources/views/relation-type/edit.blade.php | 5 +- resources/views/relation-type/index.blade.php | 2 +- routes/web.php | 1 + 23 files changed, 475 insertions(+), 43 deletions(-) create mode 100644 database/migrations/2024_05_22_090313_relation_plural.php create mode 100644 resources/views/concept-relation/create.blade.php create mode 100644 resources/views/concept-relation/edit.blade.php diff --git a/app/Http/Controllers/ConceptController.php b/app/Http/Controllers/ConceptController.php index e4a15b2..64a442e 100644 --- a/app/Http/Controllers/ConceptController.php +++ b/app/Http/Controllers/ConceptController.php @@ -3,9 +3,13 @@ namespace App\Http\Controllers; use App\Models\Concept; +use App\Models\ConceptRelation; use App\Models\Dictionary; +use App\Models\RelationType; +use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Gate; use Illuminate\Validation\Rule; @@ -68,7 +72,49 @@ public function show(string $dictionary, string $concept) $concept = Concept::findOrFail($concept); $dictionary = Dictionary::findOrFail($dictionary); $concepts = $dictionary->rootConcepts(); - return view('concept.show', compact('concept', 'dictionary', 'concepts')); + + $query = ConceptRelation::where('fk_concept_1_id', $concept->id)->orWhere('fk_concept_2_id', $concept->id); + $conceptRelationTypes = $query->distinct('fk_relation_type_id')->get('fk_relation_type_id')->pluck('fk_relation_type_id')->reverse(); + + $conceptRelations = []; + + foreach ($conceptRelationTypes as $conceptRelationType) { + + $relatedConcepts1 = DB::table('concept_relations') + ->join('concepts as concept_1', 'concept_relations.fk_concept_1_id', '=', 'concept_1.id') + ->join('concepts as concept_2', 'concept_relations.fk_concept_2_id', '=', 'concept_2.id') + ->join('relation_types', 'concept_relations.fk_relation_type_id', '=', 'relation_types.id') + ->select( + 'concept_relations.id as relation_id', + 'concept_2.id AS concept_id', + 'concept_2.name AS concept_name' + ) + ->where('concept_1.id', '=', $concept->id) + ->where('concept_relations.fk_relation_type_id', '=', $conceptRelationType) + ->get(); + + $relatedConcepts2 = DB::table('concept_relations') + ->join('concepts as concept_1', 'concept_relations.fk_concept_1_id', '=', 'concept_1.id') + ->join('concepts as concept_2', 'concept_relations.fk_concept_2_id', '=', 'concept_2.id') + ->join('relation_types', 'concept_relations.fk_relation_type_id', '=', 'relation_types.id') + ->select( + 'concept_relations.id as relation_id', + 'concept_1.id AS concept_id', + 'concept_1.name AS concept_name' + ) + ->where('concept_2.id', '=', $concept->id) + ->where('concept_relations.fk_relation_type_id', '=', $conceptRelationType) + ->get(); + + + $merged = array_merge($relatedConcepts1->toArray(), $relatedConcepts2->toArray()); + array_push($conceptRelations, [ + RelationType::find($conceptRelationType), + $merged + ]); + } + + return view('concept.show', compact('concept', 'dictionary', 'concepts', 'conceptRelations')); } /** @@ -143,7 +189,8 @@ public function examples(string $dictionary, string $concept) return view('concept.examples', compact('dictionary', 'concept', 'concepts')); } - public function attachments(string $dictionary, string $concept){ + public function attachments(string $dictionary, string $concept) + { $concepts = Dictionary::findOrFail($dictionary)->rootConcepts(); $concept = Concept::findOrFail($concept); $dictionary = Dictionary::findOrFail($dictionary); diff --git a/app/Http/Controllers/ConceptRelationController.php b/app/Http/Controllers/ConceptRelationController.php index 2c2cfa9..1c047dd 100644 --- a/app/Http/Controllers/ConceptRelationController.php +++ b/app/Http/Controllers/ConceptRelationController.php @@ -2,34 +2,50 @@ namespace App\Http\Controllers; +use App\Models\Concept; use App\Models\ConceptRelation; -use App\Http\Requests\StoreConceptRelationRequest; -use App\Http\Requests\UpdateConceptRelationRequest; +use App\Models\Dictionary; +use App\Models\RelationType; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; class ConceptRelationController extends Controller { - /** - * Display a listing of the resource. - */ - public function index() - { - // - } /** * Show the form for creating a new resource. */ - public function create() + public function create(Dictionary $dictionary, Concept $concept) { - // + $relationTypes = RelationType::all(); + $concepts = $dictionary->concepts()->orderBy('name')->get(); + return view('concept-relation.create', compact('dictionary','concept', 'relationTypes', 'concepts')); } /** * Store a newly created resource in storage. */ - public function store(StoreConceptRelationRequest $request) + public function store(Request $request, Dictionary $dictionary, Concept $concept) { - // + $validated = $request->validate([ + 'fk_concept_1_id' => 'required|uuid|exists:concepts,id', + 'fk_concept_2_id' => 'required|uuid|exists:concepts,id|different:fk_concept_1_id', + 'fk_relation_type_id'=> 'required|uuid|exists:relation_types,id', + ]); + $sameRelation = ConceptRelation::where('fk_relation_type_id', $validated['fk_relation_type_id'])->where('fk_concept_1_id', $validated['fk_concept_1_id']) + ->where('fk_concept_2_id', $validated['fk_concept_2_id']) + ->orWhere('fk_concept_2_id', $validated['fk_concept_1_id'])->where('fk_concept_1_id', $validated['fk_concept_2_id']); + if ($sameRelation->count() > 0) { + $messages = ['max' => __('dashboard.relation.create.errors.exist')]; + Validator::validate($request->all(), [ + 'fk_relation_type_id' => 'max:0' + ], $messages); + } + ConceptRelation::create($validated); + + return redirect()->route('concept.show', compact('dictionary', 'concept'))->with('success', __('dashboard.relation.messages.created')); } /** @@ -43,24 +59,58 @@ public function show(ConceptRelation $conceptRelation) /** * Show the form for editing the specified resource. */ - public function edit(ConceptRelation $conceptRelation) + public function edit(string $dictionary, string $concept, string $conceptRelation) { - // + $dictionary = Dictionary::findOrFail($dictionary); + Gate::authorize('must-be-owner', $dictionary); + + $relationTypes = RelationType::all(); + $concepts = $dictionary->concepts()->orderBy('name')->get(); + $conceptRelation = ConceptRelation::findOrFail($conceptRelation); + + return view('concept-relation.edit', compact('dictionary', 'concept', 'conceptRelation', 'relationTypes', 'concepts')); } /** * Update the specified resource in storage. */ - public function update(UpdateConceptRelationRequest $request, ConceptRelation $conceptRelation) + public function update(Request $request, string $dictionary, string $concept, string $conceptRelation) { - // + $dictionary = Dictionary::findOrFail($dictionary); + Gate::authorize('must-be-owner', $dictionary); + + $validated = $request->validate([ + 'fk_concept_1_id' => 'required|uuid|exists:concepts,id', + 'fk_concept_2_id' => 'required|uuid|exists:concepts,id|different:fk_concept_1_id', + 'fk_relation_type_id'=> 'required|uuid|exists:relation_types,id', + ]); + $sameRelation = ConceptRelation::where('fk_relation_type_id', $validated['fk_relation_type_id'])->where('fk_concept_1_id', $validated['fk_concept_1_id']) + ->where('fk_concept_2_id', $validated['fk_concept_2_id']) + ->orWhere('fk_concept_2_id', $validated['fk_concept_1_id'])->where('fk_concept_1_id', $validated['fk_concept_2_id']); + if ($sameRelation->count() > 1) { + $messages = ['max' => __('dashboard.relation.create.errors.exist')]; + Validator::validate($request->all(), [ + 'fk_relation_type_id' => 'max:0' + ], $messages); + } + + $conceptRelation = ConceptRelation::findOrFail($conceptRelation); + $conceptRelation->updateOrFail($validated); + return redirect()->route('concept.show', compact('dictionary', 'concept'))->with('success',__('dashboard.relation.messages.updated')); } /** * Remove the specified resource from storage. */ - public function destroy(ConceptRelation $conceptRelation) + public function destroy(string $dictionary, string $concept, string $conceptRelation) { - // + $dictionary = Dictionary::findOrFail($dictionary); + Gate::authorize('must-be-owner', $dictionary); + + $conceptRelation = ConceptRelation::findOrFail($conceptRelation); + + $conceptRelation->delete(); + + return redirect()->back()->with('error',__('dashboard.relation.messages.deleted')); } } diff --git a/app/Http/Controllers/RelationTypeController.php b/app/Http/Controllers/RelationTypeController.php index bdf8a84..1ecf844 100644 --- a/app/Http/Controllers/RelationTypeController.php +++ b/app/Http/Controllers/RelationTypeController.php @@ -43,10 +43,15 @@ public function store(Request $request) Gate::authorize('redactor'); $validated = $this->validate($request, [ - 'name' => 'required|string|unique:relation_types,name', + 'name' => 'required|string|unique:relation_types,name|unique:relation_types,name_plural', 'description' => 'nullable|string', + 'name_plural' => 'nullable|string|unique:relation_types,name|unique:relation_types,name_plural' ]); + if($validated['name_plural'] == null) { + $validated['name_plural'] = $validated['name']; + } + RelationType::create($validated); return redirect()->route('relation-type.index') @@ -82,8 +87,9 @@ public function update(Request $request, string $relationType) { Gate::authorize('redactor'); $validated = $this->validate($request, [ - 'name' => 'required|string|unique:relation_types,name,' . $relationType, + 'name' => 'required|string|unique:relation_types,name,' . $relationType.'|unique:relation_types,name_plural,'. $relationType, 'description' => 'nullable|string', + 'name_plural' => 'nullable|string|unique:relation_types,name_plural,'. $relationType.'|unique:relation_types,name,' . $relationType ]); RelationType::findOrFail($relationType)->update($validated); diff --git a/app/Models/Concept.php b/app/Models/Concept.php index 4343daa..820616e 100644 --- a/app/Models/Concept.php +++ b/app/Models/Concept.php @@ -69,6 +69,16 @@ public function conceptAttributes(): HasMany return $this->hasMany(ConceptAttribute::class, 'fk_concept_id'); } + public function relatedConcepts1(): BelongsToMany + { + return $this->belongsToMany(Concept::class, 'concept_relations', 'fk_concept_1_id', 'fk_concept_2_id'); + } + + public function relatedConcepts2(): BelongsToMany + { + return $this->belongsToMany(Concept::class, 'concept_relations', 'fk_concept_2_id', 'fk_concept_1_id'); + } + protected $fillable = [ 'name', 'definition', diff --git a/app/Models/ConceptRelation.php b/app/Models/ConceptRelation.php index a7d222f..be11f04 100644 --- a/app/Models/ConceptRelation.php +++ b/app/Models/ConceptRelation.php @@ -10,11 +10,11 @@ /** * @property string $id - * @property string $fkConcept1Id - * @property string $fkConcept2Id - * @property string $fkRelationTypeId - * @property Carbon $createdAt - * @property Carbon $updatedAt + * @property string $fk_concept_1_id + * @property string $fk_concept_2_id + * @property string $fk_relation_type_id + * @property Carbon $created_at + * @property Carbon $updated_at */ class ConceptRelation extends Model { diff --git a/app/Models/RelationType.php b/app/Models/RelationType.php index 65aa2b6..8e3ad7e 100644 --- a/app/Models/RelationType.php +++ b/app/Models/RelationType.php @@ -7,6 +7,11 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +/** + * @property string $name + * @property string $description + * @property mixed $name_plural + */ class RelationType extends Model { use HasFactory, HasUuids; @@ -19,5 +24,6 @@ public function relatedConcepts(): HasMany protected $fillable = [ 'name', 'description', + 'name_plural', ]; } diff --git a/database/migrations/2024_05_22_090313_relation_plural.php b/database/migrations/2024_05_22_090313_relation_plural.php new file mode 100644 index 0000000..e8ac684 --- /dev/null +++ b/database/migrations/2024_05_22_090313_relation_plural.php @@ -0,0 +1,30 @@ +string('name_plural', 255)->nullable(); + + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('relation_types', function (Blueprint $table) { + $table->dropColumn(['name_plural']); + }); + } +}; diff --git a/lang/ru/dashboard.php b/lang/ru/dashboard.php index 95bb6e9..e72e3e1 100644 --- a/lang/ru/dashboard.php +++ b/lang/ru/dashboard.php @@ -14,4 +14,33 @@ 'examples' => [ 'header' => 'Примеры ":concept"', ], + 'relation' => [ + 'create' => [ + 'title' => 'Добавление отношения', + 'form' => [ + 'title' => 'Добавление отношения понятию - :concept', + 'type' => 'Тип отношения', + 'concept' => 'Связанное понятие', + ], + 'errors' => [ + 'exist' => 'Такое отношение уже существует' + ] + ], + 'edit' => [ + 'title' => 'Редактирование отношения', + 'form' => [ + 'title' => 'Редактирование отношения понятия - :concept', + 'type' => 'Тип отношения', + 'concept' => 'Связанное понятие', + ], + 'errors' => [ + 'exist' => 'Такое отношение уже существует' + ] + ], + 'messages' => [ + 'deleted' => 'Отношение удалено', + 'created' => 'Отношение создано', + 'updated' => 'Отношение обновлено', + ] + ] ]; diff --git a/lang/ru/entities.php b/lang/ru/entities.php index f559738..7137ad1 100644 --- a/lang/ru/entities.php +++ b/lang/ru/entities.php @@ -30,7 +30,16 @@ 'plural' => 'Типы отношений', 'props' => [ 'name' => 'Название', + 'plural' => 'Название во мн.ч.', 'description' => 'Описание', ], ], + 'relation' => [ + 'singular' => 'Отношение', + 'plural' => 'Отношения', + ], + 'concept' => [ + 'singular' => 'Понятие', + 'plural' => 'Понятия', + ] ]; diff --git a/lang/ru/relation-type-page.php b/lang/ru/relation-type-page.php index 106b9c8..87a1b5f 100644 --- a/lang/ru/relation-type-page.php +++ b/lang/ru/relation-type-page.php @@ -9,6 +9,10 @@ 'label' => 'Название отношения', 'placeholder' => 'Название отношения', ], + 'plural' => [ + 'label' => 'Название отношения во множественном числе', + 'placeholder' => 'Название отношения во множественном числе', + ], 'description' => [ 'label' => 'Описание отношения', 'placeholder' => 'Описание отношения', @@ -21,6 +25,10 @@ 'label' => 'Название отношения', 'placeholder' => 'Название отношения', ], + 'plural' => [ + 'label' => 'Название отношения во множественном числе', + 'placeholder' => 'Название отношения во множественном числе', + ], 'description' => [ 'label' => 'Описание отношения', 'placeholder' => 'Описание отношения', diff --git a/resources/views/components/dashboard/sidebar/menu.blade.php b/resources/views/components/dashboard/sidebar/menu.blade.php index 753e942..5c8d64d 100644 --- a/resources/views/components/dashboard/sidebar/menu.blade.php +++ b/resources/views/components/dashboard/sidebar/menu.blade.php @@ -8,7 +8,7 @@ {{__('dashboard.sidebar.menu.create')}}
- + diff --git a/resources/views/components/dashboard/sidebar/sidebar.blade.php b/resources/views/components/dashboard/sidebar/sidebar.blade.php index c985705..19ba7b8 100644 --- a/resources/views/components/dashboard/sidebar/sidebar.blade.php +++ b/resources/views/components/dashboard/sidebar/sidebar.blade.php @@ -1,4 +1,5 @@
-
{!! $concept->definition !!}
-
+
+ {!! $concept->definition !!} +
+ +
+
+ + +
+

Отношения

+ + @can('must-be-owner', $concept->dictionary) + + {{__('shared.add')}} + + @endcan +
+ @if($conceptRelations) +
+
    + @foreach ($conceptRelations as $k => $conceptRelation) + + @endforeach +
+
+ @endif +
+ @foreach ($conceptRelations as $k => $conceptRelation) +
- {{ $row->$name }} + +

+ {{ $row->$name }} +

{{ __('shared.edit')}}
+ + + + + + + + @foreach ($conceptRelation[1] as $relatedConcept) + + + + + + + @endforeach + +
+ {{ __('entities.concept.singular')}} + + {{ __('shared.action')}} +
+ {{$relatedConcept->concept_name}} + + @can('must-be-owner', $concept->dictionary) + {{ __('shared.edit')}} + @endcan + @can('must-be-owner', $concept->dictionary) +
+ +
+ + + + @endcan +
+
+ + + @endif +
+ @endforeach + + diff --git a/resources/views/components/dashboard/tabs/tabs.blade.php b/resources/views/components/dashboard/tabs/tabs.blade.php index 0ccf9d1..57428f9 100644 --- a/resources/views/components/dashboard/tabs/tabs.blade.php +++ b/resources/views/components/dashboard/tabs/tabs.blade.php @@ -1,7 +1,7 @@
$dictionary, 'concept' => $concept->id])}}" class="hover:text-blue-600 dark:hover:text-blue-500 inline-flex items-center h-12 px-2 py-2 text-center text-gray-700 {{Route::currentRouteName() == 'concept.show' ? 'border border-b-0 rounded-t-md' : 'bg-transparent border-b'}} border-gray-300 sm:px-4 dark:border-gray-500 -px-1 dark:text-white whitespace-nowrap focus:outline-none"> - + diff --git a/resources/views/components/layout/dashboard.blade.php b/resources/views/components/layout/dashboard.blade.php index 443c992..2c5f34c 100644 --- a/resources/views/components/layout/dashboard.blade.php +++ b/resources/views/components/layout/dashboard.blade.php @@ -4,7 +4,7 @@ {{ $dictionary->name }} -
+
@include('components.dashboard.sidebar.sidebar')
{{ $slot }} diff --git a/resources/views/components/tree-view/tree-item.blade.php b/resources/views/components/tree-view/tree-item.blade.php index 23a8ba7..ee097a6 100644 --- a/resources/views/components/tree-view/tree-item.blade.php +++ b/resources/views/components/tree-view/tree-item.blade.php @@ -15,14 +15,14 @@ @if ($concept->fk_parent_concept_id) - @endif - {{$concept->name}} + {{$concept->name}}