diff --git a/.env.example b/.env.example index e8286b0..a0a680a 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -DOCKER_APP_PORT=8080 +DOCKER_WEB_PORT=8080 DOCKER_CAPTCHA_PORT=8081 DOCKER_CAPTCHA_WEBSOCKET_PORT=8082 DOCKER_DB_PORT=3306 diff --git a/app/application/app/Dto/Service/Admin/Project/Translation/Translations.php b/app/application/app/Dto/Service/Admin/Project/Translation/Translations.php index f7831bb..3b72245 100644 --- a/app/application/app/Dto/Service/Admin/Project/Translation/Translations.php +++ b/app/application/app/Dto/Service/Admin/Project/Translation/Translations.php @@ -44,6 +44,7 @@ final class Translations 'site.Choose version', 'site.alert-status-not-supported', 'site.alert-status-future', + 'Home', ]; foreach (DocumentationVersionStatus::cases() as $status) { diff --git a/app/application/app/Http/Controllers/Admin/Controller.php b/app/application/app/Http/Controllers/Admin/Controller.php index 35c90d7..8ca4bb3 100644 --- a/app/application/app/Http/Controllers/Admin/Controller.php +++ b/app/application/app/Http/Controllers/Admin/Controller.php @@ -3,8 +3,12 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller as BaseController; +use Illuminate\Support\Facades\Config; abstract class Controller extends BaseController { - + public function __construct() + { + Config::set('breadcrumbs.view', 'breadcrumbs.admin'); + } } diff --git a/app/application/app/Http/Controllers/Admin/LanguagesController.php b/app/application/app/Http/Controllers/Admin/LanguagesController.php index 4726f7c..c57e32a 100644 --- a/app/application/app/Http/Controllers/Admin/LanguagesController.php +++ b/app/application/app/Http/Controllers/Admin/LanguagesController.php @@ -11,7 +11,9 @@ final class LanguagesController extends Controller { public function __construct( private readonly LanguageService $languageService, - ) { } + ) { + parent::__construct(); + } public function newLanguage(NewLanguageRequest $request): JsonResponse { diff --git a/app/application/app/Http/Controllers/Admin/Projects/AboutController.php b/app/application/app/Http/Controllers/Admin/Projects/AboutController.php index d315844..5a90704 100644 --- a/app/application/app/Http/Controllers/Admin/Projects/AboutController.php +++ b/app/application/app/Http/Controllers/Admin/Projects/AboutController.php @@ -13,7 +13,9 @@ final class AboutController extends Controller { public function __construct( private readonly AboutService $aboutService, - ) { } + ) { + parent::__construct(); + } public function languages(int $project, Request $request): View { diff --git a/app/application/app/Http/Controllers/Admin/Projects/DocumentationCategoriesController.php b/app/application/app/Http/Controllers/Admin/Projects/DocumentationCategoriesController.php index 554984a..0bb6912 100644 --- a/app/application/app/Http/Controllers/Admin/Projects/DocumentationCategoriesController.php +++ b/app/application/app/Http/Controllers/Admin/Projects/DocumentationCategoriesController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin\Projects; use App\Dto\QuerySettingsDto; use App\Http\Controllers\Admin\Controller; +use App\Http\Requests\Admin\Projects\DocumentationCategories\CreateRequest; use App\Http\Requests\Admin\Projects\DocumentationCategories\IndexRequest; use App\Http\Requests\Admin\Projects\DocumentationCategories\StoreUpdateRequest; use App\Services\Admin\Project\DocumentationCategoryService; @@ -15,7 +16,9 @@ final class DocumentationCategoriesController extends Controller { public function __construct( private readonly DocumentationCategoryService $documentationCategoryService, - ) { } + ) { + parent::__construct(); + } public function index(int $projectId, int $versionId, IndexRequest $request): View { @@ -32,18 +35,23 @@ final class DocumentationCategoriesController extends Controller $this->errors($result); } - return view('admin/projects/documentation-categories/index', $result->getData()); + return view('admin/projects/documentation-versions/documentation-categories/index', $result->getData()); } - public function create(int $projectId, int $versionId, Request $request): View + public function create(int $projectId, int $versionId, CreateRequest $request): View { + $parentId = null; + if ($request->has('category')) { + $parentId = (int) $request->input('category'); + } + $user = $request->user(); - $result = $this->documentationCategoryService->create($projectId, $versionId, $user); + $result = $this->documentationCategoryService->create($projectId, $versionId, $user, $parentId); if ($result->isError()) { $this->errors($result); } - return view('admin/projects/documentation-categories/create', $result->getData()); + return view('admin/projects/documentation-versions/documentation-categories/create', $result->getData()); } public function edit(int $projectId, int $versionId, int $id, Request $request): View @@ -54,7 +62,7 @@ final class DocumentationCategoriesController extends Controller $this->errors($result); } - return view('admin/projects/documentation-categories/edit', $result->getData()); + return view('admin/projects/documentation-versions/documentation-categories/edit', $result->getData()); } public function store(int $projectId, int $versionId, StoreUpdateRequest $request): RedirectResponse diff --git a/app/application/app/Http/Controllers/Admin/Projects/DocumentationVersionController.php b/app/application/app/Http/Controllers/Admin/Projects/DocumentationVersionController.php index 36f1374..370ddfb 100644 --- a/app/application/app/Http/Controllers/Admin/Projects/DocumentationVersionController.php +++ b/app/application/app/Http/Controllers/Admin/Projects/DocumentationVersionController.php @@ -15,7 +15,9 @@ final class DocumentationVersionController extends Controller { public function __construct( private readonly DocumentationVersionService $documentationVersionService, - ) { } + ) { + parent::__construct(); + } public function index(int $projectId, IndexRequest $request): View { @@ -35,10 +37,10 @@ final class DocumentationVersionController extends Controller return view('admin/projects/documentation-versions/index', $result->getData()); } - public function show(int $projectId, int $id, Request $request): View + public function show(int $projectId, int $id, Request $request, ?int $category = null): View { $user = $request->user(); - $result = $this->documentationVersionService->show($projectId, $id, $user); + $result = $this->documentationVersionService->show($projectId, $id, $category, $user); if ($result->isError()) { $this->errors($result); } diff --git a/app/application/app/Http/Controllers/Admin/Projects/DocumentationsController.php b/app/application/app/Http/Controllers/Admin/Projects/DocumentationsController.php index 3dee28c..4e042d9 100644 --- a/app/application/app/Http/Controllers/Admin/Projects/DocumentationsController.php +++ b/app/application/app/Http/Controllers/Admin/Projects/DocumentationsController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin\Projects; use App\Dto\QuerySettingsDto; use App\Http\Controllers\Admin\Controller; +use App\Http\Requests\Admin\Projects\Documentations\CreateRequest; use App\Http\Requests\Admin\Projects\Documentations\IndexRequest; use App\Http\Requests\Admin\Projects\Documentations\StoreUpdateRequest; use App\Services\Admin\Project\DocumentationService; @@ -15,7 +16,9 @@ final class DocumentationsController extends Controller { public function __construct( private readonly DocumentationService $documentationService, - ) { } + ) { + parent::__construct(); + } public function index(int $projectId, int $versionId, IndexRequest $request): View { @@ -32,18 +35,23 @@ final class DocumentationsController extends Controller $this->errors($result); } - return view('admin/projects/documentations/index', $result->getData()); + return view('admin/projects/documentation-versions/documentations/index', $result->getData()); } - public function create(int $projectId, int $versionId, Request $request): View + public function create(int $projectId, int $versionId, CreateRequest $request): View { + $categoryId = null; + if ($request->has('category')) { + $categoryId = (int) $request->input('category'); + } + $user = $request->user(); - $result = $this->documentationService->create($projectId, $versionId, $user); + $result = $this->documentationService->create($projectId, $versionId, $user, $categoryId); if ($result->isError()) { $this->errors($result); } - return view('admin/projects/documentations/create', $result->getData()); + return view('admin/projects/documentation-versions/documentations/create', $result->getData()); } public function edit(int $projectId, int $versionId, int $id, Request $request): View @@ -54,7 +62,7 @@ final class DocumentationsController extends Controller $this->errors($result); } - return view('admin/projects/documentations/edit', $result->getData()); + return view('admin/projects/documentation-versions/documentations/edit', $result->getData()); } public function store(int $projectId, int $versionId, StoreUpdateRequest $request): RedirectResponse diff --git a/app/application/app/Http/Controllers/Admin/Projects/FeedbacksController.php b/app/application/app/Http/Controllers/Admin/Projects/FeedbacksController.php index 370c3ac..9427ef4 100644 --- a/app/application/app/Http/Controllers/Admin/Projects/FeedbacksController.php +++ b/app/application/app/Http/Controllers/Admin/Projects/FeedbacksController.php @@ -12,7 +12,9 @@ final class FeedbacksController extends Controller { public function __construct( private readonly FeedbackService $feedbackService, - ) { } + ) { + parent::__construct(); + } public function index(IndexRequest $request): View { diff --git a/app/application/app/Http/Controllers/Admin/Projects/LinksController.php b/app/application/app/Http/Controllers/Admin/Projects/LinksController.php index c937267..039dd43 100644 --- a/app/application/app/Http/Controllers/Admin/Projects/LinksController.php +++ b/app/application/app/Http/Controllers/Admin/Projects/LinksController.php @@ -15,7 +15,9 @@ final class LinksController extends Controller { public function __construct( private readonly LinkService $linkService - ) { } + ) { + parent::__construct(); + } public function index(int $projectId, IndexRequest $request): View { diff --git a/app/application/app/Http/Controllers/Admin/Projects/ServiceTranslateController.php b/app/application/app/Http/Controllers/Admin/Projects/ServiceTranslateController.php index 5b33722..074f65c 100644 --- a/app/application/app/Http/Controllers/Admin/Projects/ServiceTranslateController.php +++ b/app/application/app/Http/Controllers/Admin/Projects/ServiceTranslateController.php @@ -13,7 +13,9 @@ final class ServiceTranslateController extends Controller { public function __construct( private readonly ServiceTranslateService $serviceTranslateService, - ) { } + ) { + parent::__construct(); + } public function view(int $projectId, Request $request): View { diff --git a/app/application/app/Http/Controllers/Admin/Projects/TranslationsController.php b/app/application/app/Http/Controllers/Admin/Projects/TranslationsController.php index 560c640..b50fd27 100644 --- a/app/application/app/Http/Controllers/Admin/Projects/TranslationsController.php +++ b/app/application/app/Http/Controllers/Admin/Projects/TranslationsController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\Admin\Projects; -use App\Http\Controllers\Controller; +use App\Http\Controllers\Admin\Controller; use App\Http\Requests\Admin\Projects\Translations\UpdateRequest; use App\Services\Admin\Project\TranslationService; use Illuminate\Http\RedirectResponse; @@ -13,7 +13,9 @@ final class TranslationsController extends Controller { public function __construct( private readonly TranslationService $translationService, - ) { } + ) { + parent::__construct(); + } public function languages(int $projectId, Request $request): View { diff --git a/app/application/app/Http/Controllers/Admin/ProjectsController.php b/app/application/app/Http/Controllers/Admin/ProjectsController.php index 3ab7a46..8a315f3 100644 --- a/app/application/app/Http/Controllers/Admin/ProjectsController.php +++ b/app/application/app/Http/Controllers/Admin/ProjectsController.php @@ -14,7 +14,9 @@ final class ProjectsController extends Controller { public function __construct( private readonly ProjectService $projectService - ) { } + ) { + parent::__construct(); + } public function index(IndexRequest $request): View { diff --git a/app/application/app/Http/Controllers/Admin/RolesController.php b/app/application/app/Http/Controllers/Admin/RolesController.php index 9632ea5..c713068 100644 --- a/app/application/app/Http/Controllers/Admin/RolesController.php +++ b/app/application/app/Http/Controllers/Admin/RolesController.php @@ -14,7 +14,9 @@ final class RolesController extends Controller { public function __construct( private readonly RoleService $roleService - ) { } + ) { + parent::__construct(); + } public function index(IndexRequest $request): View { $user = $request->user(); diff --git a/app/application/app/Http/Controllers/Admin/UsersController.php b/app/application/app/Http/Controllers/Admin/UsersController.php index 4d13ec1..0577d3e 100644 --- a/app/application/app/Http/Controllers/Admin/UsersController.php +++ b/app/application/app/Http/Controllers/Admin/UsersController.php @@ -15,7 +15,9 @@ final class UsersController extends Controller { public function __construct( private readonly UserService $userService - ) { } + ) { + parent::__construct(); + } public function index(IndexRequest $request): View { diff --git a/app/application/app/Http/Controllers/Site/DocumentationController.php b/app/application/app/Http/Controllers/Site/DocumentationController.php index feb935e..00c16b8 100644 --- a/app/application/app/Http/Controllers/Site/DocumentationController.php +++ b/app/application/app/Http/Controllers/Site/DocumentationController.php @@ -16,8 +16,8 @@ final class DocumentationController extends Controller public function defaultVersion(Request $request): RedirectResponse | View { - $project = $request->get('project'); - $websiteTranslations = $request->get('websiteTranslations'); + $project = $request->attributes->get('project'); + $websiteTranslations = $request->attributes->get('websiteTranslations'); $result = $this->documentationService->defaultVersion($project, $request->user()); if ($result->isError()) { @@ -40,9 +40,9 @@ final class DocumentationController extends Controller public function index(Request $request): View { $documentation = new Documentation( - project: $request->get('project'), - version: $request->get('version'), - websiteTranslations: $request->get('websiteTranslations'), + project: $request->attributes->get('project'), + version: $request->attributes->get('version'), + websiteTranslations: $request->attributes->get('websiteTranslations'), user: $request->user(), ); $result = $this->documentationService->index($documentation); @@ -57,9 +57,9 @@ final class DocumentationController extends Controller public function category(string $slug, Request $request): View { $documentation = new Documentation( - project: $request->get('project'), - version: $request->get('version'), - websiteTranslations: $request->get('websiteTranslations'), + project: $request->attributes->get('project'), + version: $request->attributes->get('version'), + websiteTranslations: $request->attributes->get('websiteTranslations'), user: $request->user(), ); $result = $this->documentationService->category($slug, $documentation); @@ -77,9 +77,9 @@ final class DocumentationController extends Controller public function view(string $slug, Request $request): View { $documentation = new Documentation( - project: $request->get('project'), - version: $request->get('version'), - websiteTranslations: $request->get('websiteTranslations'), + project: $request->attributes->get('project'), + version: $request->attributes->get('version'), + websiteTranslations: $request->attributes->get('websiteTranslations'), user: $request->user(), ); $result = $this->documentationService->view($slug, $documentation); diff --git a/app/application/app/Http/Controllers/Site/FeedbackController.php b/app/application/app/Http/Controllers/Site/FeedbackController.php index dec9747..7344e73 100644 --- a/app/application/app/Http/Controllers/Site/FeedbackController.php +++ b/app/application/app/Http/Controllers/Site/FeedbackController.php @@ -17,16 +17,16 @@ final class FeedbackController extends Controller public function index(Request $request): View { return view('site.feedback.index', [ - 'project' => $request->get('project'), - 'websiteTranslations' => $request->get('websiteTranslations'), + 'project' => $request->attributes->get('project'), + 'websiteTranslations' => $request->attributes->get('websiteTranslations'), 'captcha' => config('app.captcha', false), ]); } public function send(SendRequest $request): RedirectResponse { - $project = $request->get('project'); - $websiteTranslations = $request->get('websiteTranslations'); + $project = $request->attributes->get('project'); + $websiteTranslations = $request->attributes->get('websiteTranslations'); $user = $request->user(); $data = $request->getDto(); diff --git a/app/application/app/Http/Controllers/Site/ProjectsController.php b/app/application/app/Http/Controllers/Site/ProjectsController.php index 8db8737..1209029 100644 --- a/app/application/app/Http/Controllers/Site/ProjectsController.php +++ b/app/application/app/Http/Controllers/Site/ProjectsController.php @@ -15,7 +15,7 @@ final class ProjectsController extends Controller public function index(Request $request): View { $user = $request->user(); - $project = $request->get('project'); + $project = $request->attributes->get('project'); if (\is_null($project)) { $with = ['storage']; @@ -27,7 +27,7 @@ final class ProjectsController extends Controller return \view('site.projects.index', $result->getData()); } - $websiteTranslations = $request->get('websiteTranslations'); + $websiteTranslations = $request->attributes->get('websiteTranslations'); $result = $this->projectService->getAboutByProject($project, $websiteTranslations, $user); if ($result->isError()) { $this->errors($result); diff --git a/app/application/app/Http/Middleware/DocumentationVersion.php b/app/application/app/Http/Middleware/DocumentationVersion.php index 8f951dc..2c37a2a 100644 --- a/app/application/app/Http/Middleware/DocumentationVersion.php +++ b/app/application/app/Http/Middleware/DocumentationVersion.php @@ -10,7 +10,7 @@ final readonly class DocumentationVersion { public function handle(Request $request, \Closure $next): Response { - $project = $request->get('project'); + $project = $request->attributes->get('project'); $versionSlug = $request->route()?->parameter('version'); if ($versionSlug === null || $project === null) { \abort(Response::HTTP_NOT_FOUND); diff --git a/app/application/app/Http/Middleware/IsProject.php b/app/application/app/Http/Middleware/IsProject.php index 8b6ca5b..f745296 100644 --- a/app/application/app/Http/Middleware/IsProject.php +++ b/app/application/app/Http/Middleware/IsProject.php @@ -10,7 +10,7 @@ final class IsProject { public function handle(Request $request, \Closure $next): Response { - $project = $request->get('project'); + $project = $request->attributes->get('project'); if (\is_null($project)) { \abort(Response::HTTP_NOT_FOUND); } diff --git a/app/application/app/Http/Middleware/IsWebsiteTranslations.php b/app/application/app/Http/Middleware/IsWebsiteTranslations.php index 261af69..0dac065 100644 --- a/app/application/app/Http/Middleware/IsWebsiteTranslations.php +++ b/app/application/app/Http/Middleware/IsWebsiteTranslations.php @@ -10,7 +10,7 @@ final class IsWebsiteTranslations { public function handle(Request $request, \Closure $next): Response { - $websiteTranslations = $request->get('websiteTranslations'); + $websiteTranslations = $request->attributes->get('websiteTranslations'); if (\is_null($websiteTranslations)) { \abort(Response::HTTP_NOT_FOUND); } diff --git a/app/application/app/Http/Requests/Admin/Projects/DocumentationCategories/CreateRequest.php b/app/application/app/Http/Requests/Admin/Projects/DocumentationCategories/CreateRequest.php new file mode 100644 index 0000000..1e89fb3 --- /dev/null +++ b/app/application/app/Http/Requests/Admin/Projects/DocumentationCategories/CreateRequest.php @@ -0,0 +1,18 @@ + ['nullable', 'integer', 'min:1'], + ]; + } +} diff --git a/app/application/app/Http/Requests/Admin/Projects/Documentations/CreateRequest.php b/app/application/app/Http/Requests/Admin/Projects/Documentations/CreateRequest.php new file mode 100644 index 0000000..f1b3831 --- /dev/null +++ b/app/application/app/Http/Requests/Admin/Projects/Documentations/CreateRequest.php @@ -0,0 +1,18 @@ + ['nullable', 'integer', 'min:1'], + ]; + } +} diff --git a/app/application/app/Repositories/DocumentationCategoryRepository.php b/app/application/app/Repositories/DocumentationCategoryRepository.php index 1f013aa..1c70a1c 100644 --- a/app/application/app/Repositories/DocumentationCategoryRepository.php +++ b/app/application/app/Repositories/DocumentationCategoryRepository.php @@ -11,6 +11,9 @@ use App\Services\Search\CreateSearchInstanceCommand; use App\Dto\Builder\DocumentationCategory as DocumentationCategoryBuilderDto; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; final readonly class DocumentationCategoryRepository @@ -93,4 +96,52 @@ final readonly class DocumentationCategoryRepository ->pluck('title', 'id') ->toArray(); } + + public function getPathFromRoot(int $categoryId, ?ProjectLanguage $projectLanguage): Collection + { + $seconds = 3600; + return Cache::remember(self::class . $categoryId . '_' . $projectLanguage->id ?? 0, $seconds, function () use ($categoryId, $projectLanguage) { + $rows = DB::select( + <<pluck('id')->all(); + + $with = [ + 'content' => function (HasOne $hasOne) use ($projectLanguage) { + /** @var ?ProjectLanguage $projectLanguage */ + $hasOne->when($projectLanguage, function (Builder $query, ProjectLanguage $projectLanguage) { + $query->where('language_id', $projectLanguage->id); + }); + } + ]; + + $categories = DocumentationCategory::query() + ->whereIn('id', $idsInOrder) + ->with($with) + ->get() + ->keyBy('id'); + + return collect($idsInOrder) + ->map(fn (int $id) => $categories->get($id)) + ->filter() + ->values(); + }); + } } diff --git a/app/application/app/Services/Admin/Project/DocumentationCategoryService.php b/app/application/app/Services/Admin/Project/DocumentationCategoryService.php index 7abce3d..ec994e7 100644 --- a/app/application/app/Services/Admin/Project/DocumentationCategoryService.php +++ b/app/application/app/Services/Admin/Project/DocumentationCategoryService.php @@ -20,6 +20,7 @@ use App\ServiceResults\ServiceResultArray; use App\ServiceResults\ServiceResultError; use App\ServiceResults\ServiceResultSuccess; use App\ServiceResults\StoreUpdateResult; +use App\Services\ClearCacheCommandHandler; use App\Services\DocumentationCategory\DocumentationCategoryCommandHandler; use App\Services\DocumentationCategoryContent\ModelSyncCommand; use App\Services\Service; @@ -34,6 +35,7 @@ final class DocumentationCategoryService extends Service private readonly DocumentationCategoryRepository $documentationCategoryRepository, private readonly DocumentationCategoryCommandHandler $categoryCommandHandler, private readonly ModelSyncCommand $contentSaveCommand, + private readonly ClearCacheCommandHandler $clearCacheCommandHandler, ) { } public function index(int $projectId, int $versionId, DocumentationCategoryBuilderDto $documentationCategoryBuilderDto, QuerySettingsDto $querySettingsDto, User $user): ServiceResultError | ServiceResultArray @@ -75,7 +77,7 @@ final class DocumentationCategoryService extends Service ]); } - public function create(int $projectId, int $versionId, User $user): ServiceResultError | ServiceResultArray + public function create(int $projectId, int $versionId, User $user, ?int $parentId = null): ServiceResultError | ServiceResultArray { $version = $this->documentationVersionRepository->getVersionById($versionId); $project = $version?->project; @@ -88,12 +90,20 @@ final class DocumentationCategoryService extends Service } $defaultLanguage = $project->languages->where('is_default', 1)->first(); + $category = new DocumentationCategory(); + $categoryPath = null; + if ($parentId !== null) { + $category->parent_id = $parentId; + $categoryPath = $this->documentationCategoryRepository->getPathFromRoot($parentId, $defaultLanguage); + } + return $this->result([ 'version' => $version, 'project' => $project, - 'category' => new DocumentationCategory(), + 'category' => $category, 'categories' => $this->documentationCategoryRepository->getForSelect($version, $defaultLanguage), 'serviceTranslationEnable' => config('translation_service.enable', false), + 'categoryPath' => $categoryPath, ]); } @@ -114,17 +124,20 @@ final class DocumentationCategoryService extends Service return $this->errFobidden(__('Access is denied')); } + $defaultLanguage = $project->languages->where('is_default', 1)->first(); $withCategories = []; + $categoryPath = null; if ($category->parent_id) { $withCategories[] = $category->parent_id; + $categoryPath = $this->documentationCategoryRepository->getPathFromRoot($category->parent_id, $defaultLanguage); } - $defaultLanguage = $project->languages->where('is_default', 1)->first(); return $this->result([ 'version' => $version, 'project' => $project, 'category' => $category, 'categories' => $this->documentationCategoryRepository->getForSelect($version, $defaultLanguage, $category, $withCategories), 'serviceTranslationEnable' => config('translation_service.enable', false), + 'categoryPath' => $categoryPath, ]); } @@ -160,6 +173,8 @@ final class DocumentationCategoryService extends Service if (\config('translation_service.enable', false)) { $this->translateContent($category, $data->getContents()); } + + $this->clearCacheCommandHandler->all(); } catch (ServiceException $e) { return $e->getServiceResultError(); } catch (\Throwable $e) { @@ -214,6 +229,8 @@ final class DocumentationCategoryService extends Service if (\config('translation_service.enable', false)) { $this->translateContent($category, $data->getContents()); } + + $this->clearCacheCommandHandler->all(); } catch (ServiceException $e) { return $e->getServiceResultError(); } catch (ParentException $e) { @@ -250,6 +267,8 @@ final class DocumentationCategoryService extends Service DB::transaction(function () use ($category) { $this->categoryCommandHandler->handleDestroy($category); }); + + $this->clearCacheCommandHandler->all(); } catch (\Throwable $e) { report($e); return $this->errService(__('Server Error')); diff --git a/app/application/app/Services/Admin/Project/DocumentationService.php b/app/application/app/Services/Admin/Project/DocumentationService.php index 4a1313c..0f7cd1d 100644 --- a/app/application/app/Services/Admin/Project/DocumentationService.php +++ b/app/application/app/Services/Admin/Project/DocumentationService.php @@ -75,7 +75,7 @@ final class DocumentationService extends Service ]); } - public function create(int $projectId, int $versionId, User $user): ServiceResultError | ServiceResultArray + public function create(int $projectId, int $versionId, User $user, ?int $categoryId = null): ServiceResultError | ServiceResultArray { $version = $this->documentationVersionRepository->getVersionById($versionId); $project = $version?->project; @@ -88,12 +88,20 @@ final class DocumentationService extends Service } $defaultLanguage = $project->languages->where('is_default', 1)->first(); + $documentation = new Documentation(); + $categoryPath = null; + if ($categoryId !== null) { + $documentation->category_id = $categoryId; + $categoryPath = $this->documentationCategoryRepository->getPathFromRoot($categoryId, $defaultLanguage); + } + return $this->result([ 'version' => $version, 'project' => $project, - 'documentation' => new Documentation(), + 'documentation' => $documentation, 'categories' => $this->documentationCategoryRepository->getForSelect($version, $defaultLanguage), 'serviceTranslationEnable' => config('translation_service.enable', false), + 'categoryPath' => $categoryPath, ]); } @@ -114,17 +122,20 @@ final class DocumentationService extends Service return $this->errFobidden(__('Access is denied')); } + $defaultLanguage = $project->languages->where('is_default', 1)->first(); $withCategories = []; + $categoryPath = null; if ($documentation->category_id) { $withCategories[] = $documentation->category_id; + $categoryPath = $this->documentationCategoryRepository->getPathFromRoot($documentation->category_id, $defaultLanguage); } - $defaultLanguage = $project->languages->where('is_default', 1)->first(); return $this->result([ 'version' => $version, 'project' => $project, 'documentation' => $documentation, 'categories' => $this->documentationCategoryRepository->getForSelect($version, $defaultLanguage, null, $withCategories), 'serviceTranslationEnable' => config('translation_service.enable', false), + 'categoryPath' => $categoryPath, ]); } diff --git a/app/application/app/Services/Admin/Project/DocumentationVersionService.php b/app/application/app/Services/Admin/Project/DocumentationVersionService.php index 768bbc8..7afb898 100644 --- a/app/application/app/Services/Admin/Project/DocumentationVersionService.php +++ b/app/application/app/Services/Admin/Project/DocumentationVersionService.php @@ -2,12 +2,17 @@ namespace App\Services\Admin\Project; +use App\Dto\Builder\Documentation as DocumentationBuilderDto; +use App\Dto\Builder\DocumentationCategory as DocumentationCategoryBuilderDto; use App\Dto\QuerySettingsDto; use App\Dto\Builder\DocumentationVersion as DocumentationVersionBuilderDto; use App\Dto\Service\Admin\Project\DocumentationVersion\StoreUpdate; use App\Enums\DocumentationVersionStatus; use App\Models\DocumentationVersion; +use App\Models\ProjectLanguage; use App\Models\User; +use App\Repositories\DocumentationCategoryRepository; +use App\Repositories\DocumentationRepository; use App\Repositories\DocumentationVersionRepository; use App\Repositories\ProjectRepository; use App\ServiceResults\ServiceResultArray; @@ -17,6 +22,8 @@ use App\ServiceResults\StoreUpdateResult; use App\Services\ClearCacheCommandHandler; use App\Services\DocumentationVersion\DocumentationVersionCommandHandler; use App\Services\Service; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Support\Facades\DB; final class DocumentationVersionService extends Service @@ -26,6 +33,9 @@ final class DocumentationVersionService extends Service private readonly DocumentationVersionRepository $documentationVersionRepository, private readonly DocumentationVersionCommandHandler $documentationVersionCommandHandler, private readonly ClearCacheCommandHandler $clearCacheCommandHandler, + + private readonly DocumentationCategoryRepository $documentationCategoryRepository, + private readonly DocumentationRepository $documentationRepository ) { } public function index(int $projectId, DocumentationVersionBuilderDto $documentationVersionBuilderDto, QuerySettingsDto $querySettingsDto, User $user): ServiceResultError | ServiceResultArray @@ -54,7 +64,7 @@ final class DocumentationVersionService extends Service ]); } - public function show(int $projectId, int $versionId, User $user): ServiceResultError | ServiceResultArray + public function show(int $projectId, int $versionId, ?int $categoryId, User $user): ServiceResultError | ServiceResultArray { $project = $this->projectRepository->getProjectById($projectId); if (\is_null($project)) { @@ -70,9 +80,52 @@ final class DocumentationVersionService extends Service return $this->errFobidden(__('Access is denied')); } + $defaultLanguage = $project->languages()->where('is_default', 1)->first(); + + $category = null; + $categoryPath = null; + if (!\is_null($categoryId)) { + $category = $this->documentationCategoryRepository->getCategoryById($categoryId); + if (\is_null($category) || $category->version_id !== $version->id) { + return $this->errNotFound(__('Not Found')); + } + if ($user->cannot('view', $category)) { + return $this->errFobidden(__('Access is denied')); + } + $categoryPath = $this->documentationCategoryRepository->getPathFromRoot($category->id, $defaultLanguage); + } + + $with = [ + 'content' => function (HasOne $hasOne) use ($defaultLanguage) { + /** @var ?ProjectLanguage $defaultLanguage */ + $hasOne->when($defaultLanguage, function (Builder $query, ProjectLanguage $defaultLanguage) { + $query->where('language_id', $defaultLanguage->id); + }); + } + ]; + + $categoryDto = new DocumentationCategoryBuilderDto\Category($category->id ?? null); + $categories = $this->documentationCategoryRepository + ->getCategories( + $version->id, + new DocumentationCategoryBuilderDto(parentId: $categoryDto), + $with + )->all(); + $documents = $this->documentationRepository + ->getDocumentations( + $version->id, + new DocumentationBuilderDto(categoryId: $categoryDto), + $with + )->all(); + return $this->result([ 'version' => $version, 'project' => $project, + + 'category' => $category, + 'categoryPath' => $categoryPath, + 'categories' => $categories, + 'documentations' => $documents, ]); } diff --git a/app/application/app/Services/Site/DocumentationService.php b/app/application/app/Services/Site/DocumentationService.php index 5cbe96f..fa89288 100644 --- a/app/application/app/Services/Site/DocumentationService.php +++ b/app/application/app/Services/Site/DocumentationService.php @@ -77,10 +77,16 @@ final class DocumentationService extends Service return $this->errFobidden(__('Access is denied')); } + $categoryPath = null; + if ($category->parent_id) { + $categoryPath = $this->documentationCategoryRepository->getPathFromRoot($category->parent_id, $documentation->getWebsiteTranslations()->getLanguage()); + } + $data = array_merge($documentation->toArray(), [ 'category' => $category, 'categories' => $this->getCategories($documentation, $category->id), 'documentations' => $this->getDocumentations($documentation, $category->id), + 'categoryPath' => $categoryPath, ]); return $this->resultSitePage($documentation->getProject(), $documentation->getWebsiteTranslations(), $data, \is_null($category->content?->title)); } @@ -98,8 +104,14 @@ final class DocumentationService extends Service return $this->errFobidden(__('Access is denied')); } + $categoryPath = null; + if ($document->category_id) { + $categoryPath = $this->documentationCategoryRepository->getPathFromRoot($document->category_id, $documentation->getWebsiteTranslations()->getLanguage()); + } + $data = array_merge($documentation->toArray(), [ 'documentation' => $document, + 'categoryPath' => $categoryPath, ]); return $this->resultSitePage($documentation->getProject(), $documentation->getWebsiteTranslations(), $data, \is_null($document->content?->title)); } diff --git a/app/application/breadcrumbs/admin.php b/app/application/breadcrumbs/admin.php new file mode 100644 index 0000000..ccc05f8 --- /dev/null +++ b/app/application/breadcrumbs/admin.php @@ -0,0 +1,262 @@ +push(__('Home'), route('admin.home'), ['icon' => '']); +}); + +// Roles +Breadcrumbs::for('admin.roles.index', function ($trail) { + $trail->parent('admin.home'); + + $trail->push(__('admin-sections.User group'), route('admin.roles.index')); +}); + +Breadcrumbs::for('admin.roles.create', function ($trail) { + $trail->parent('admin.roles.index'); + + $trail->push(__('Create'), route('admin.roles.create')); +}); + +Breadcrumbs::for('admin.roles.edit', function ($trail, \App\Models\Role $role) { + $trail->parent('admin.roles.index'); + + $trail->push(__('Edit'), route('admin.roles.edit', $role)); +}); +// End Roles + +// Users +Breadcrumbs::for('admin.users.index', function ($trail) { + $trail->parent('admin.home'); + + $trail->push(__('admin-sections.Users'), route('admin.users.index')); +}); + +Breadcrumbs::for('admin.users.create', function ($trail) { + $trail->parent('admin.users.index'); + + $trail->push(__('Create'), route('admin.users.create')); +}); + +Breadcrumbs::for('admin.users.edit', function ($trail, \App\Models\User $user) { + $trail->parent('admin.users.index'); + + $trail->push(__('Edit'), route('admin.users.edit', $user)); +}); +// End Users + +Breadcrumbs::for('admin.feedbacks.index', function ($trail) { + $trail->parent('admin.home'); + + $trail->push(__('admin-sections.Feedback'), route('admin.feedbacks.index')); +}); + +// Projects +Breadcrumbs::for('admin.projects.index', function ($trail) { + $trail->parent('admin.home'); + + $trail->push(__('admin-sections.Projects'), route('admin.projects.index')); +}); + +Breadcrumbs::for('admin.projects.create', function ($trail) { + $trail->parent('admin.projects.index'); + + $trail->push(__('Create'), route('admin.projects.create')); +}); + +Breadcrumbs::for('admin.projects.edit', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.index'); + + $trail->push(__('Edit'), route('admin.projects.edit', $project)); +}); + +Breadcrumbs::for('admin.projects.show', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.index'); + + $trail->push($project->name, route('admin.projects.show', $project)); +}); + +Breadcrumbs::for('admin.projects.feedbacks.index', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.show', $project); + + $trail->push(__('admin-sections.Feedback'), route('admin.projects.feedbacks.index', $project)); +}); +// End Projects + +// Projects translations +Breadcrumbs::for('admin.projects.translations.languages', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.show', $project); + + $trail->push(__('admin-sections.Translations'), route('admin.projects.translations.languages', $project)); +}); + +Breadcrumbs::for('admin.projects.translations.edit', function ($trail, \App\Models\Project $project, \App\Models\ProjectLanguage $language) { + $trail->parent('admin.projects.translations.languages', $project); + + $trail->push($language->title, route('admin.projects.translations.edit', ['project' => $project->id, 'language' => $language->id])); +}); + +Breadcrumbs::for('admin.projects.service-translate.view', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.show', $project); + + $trail->push(__('admin-sections.Setting up automatic translation'), route('admin.projects.service-translate.view', $project)); +}); +// End Projects translations + +// Projects links +Breadcrumbs::for('admin.projects.links.index', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.show', $project); + + $trail->push(__('admin-sections.Links project'), route('admin.projects.links.index', $project)); +}); + +Breadcrumbs::for('admin.projects.links.create', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.links.index', $project); + + $trail->push(__('Create'), route('admin.projects.links.create', $project)); +}); + +Breadcrumbs::for('admin.projects.links.edit', function ($trail, \App\Models\Project $project, \App\Models\ProjectLink $link) { + $trail->parent('admin.projects.links.index', $project); + + $trail->push(__('Edit'), route('admin.projects.links.edit', ['project' => $project->id, 'link' => $link->id])); +}); +// End Projects links + +// Projects about +Breadcrumbs::for('admin.projects.about.languages', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.show', $project); + + $trail->push(__('admin-sections.About project'), route('admin.projects.about.languages', $project)); +}); + +Breadcrumbs::for('admin.projects.about.edit', function ($trail, \App\Models\Project $project, \App\Models\ProjectLanguage $language) { + $trail->parent('admin.projects.about.languages', $project); + + $trail->push($language->title, route('admin.projects.about.edit', ['project' => $project->id, 'language' => $language->id])); +}); +// End Projects about + +// Projects documentation-versions +Breadcrumbs::for('admin.projects.documentation-versions.index', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.show', $project); + + $trail->push(__('admin-sections.Documentation version'), route('admin.projects.documentation-versions.index', $project)); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.create', function ($trail, \App\Models\Project $project) { + $trail->parent('admin.projects.documentation-versions.index', $project); + + $trail->push(__('Create'), route('admin.projects.documentation-versions.create', $project)); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.edit', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version) { + $trail->parent('admin.projects.documentation-versions.index', $project); + + $trail->push(__('Edit'), route('admin.projects.documentation-versions.edit', ['project' => $project->id, 'documentation_version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.show', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version) { + $trail->parent('admin.projects.documentation-versions.index', $project); + + $trail->push($version->title, route('admin.projects.documentation-versions.show', ['project' => $project->id, 'documentation_version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.category-path', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \Illuminate\Support\Collection $categoryPath) { + $trail->parent('admin.projects.documentation-versions.show', $project, $version); + + foreach ($categoryPath as $pathItem) { + $trail->push( + $pathItem->content->title, + route('admin.projects.documentation-versions.category.show', [ + 'project' => $project->id, + 'version' => $version->id, + 'category' => $pathItem->id, + ]) + ); + } +}); + +Breadcrumbs::for('admin.projects.documentation-versions.show.category', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \App\Models\DocumentationCategory $category, ?\Illuminate\Support\Collection $categoryPath) { + $path = $categoryPath ?? collect([$category]); + + $trail->parent('admin.projects.documentation-versions.category-path', $project, $version, $path); +}); +// End Projects documentation-versions + +// Projects documentation-versions documentations +Breadcrumbs::for('admin.projects.documentation-versions.documentations.index', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version) { + $trail->parent('admin.projects.documentation-versions.show', $project, $version); + + $trail->push(__('admin-sections.Documentation'), route('admin.projects.documentation-versions.documentations.index', ['project' => $project->id, 'version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.documentations.create', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version) { + $trail->parent('admin.projects.documentation-versions.documentations.index', $project, $version); + + $trail->push(__('Create'), route('admin.projects.documentation-versions.documentations.create', ['project' => $project->id, 'version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.category-path.documentations', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \Illuminate\Support\Collection $categoryPath) { + $trail->parent('admin.projects.documentation-versions.category-path', $project, $version, $categoryPath); + + $trail->push(__('admin-sections.Documentation'), route('admin.projects.documentation-versions.documentations.index', ['project' => $project->id, 'version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.category-path.documentations.create', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \Illuminate\Support\Collection $categoryPath) { + $trail->parent('admin.projects.documentation-versions.category-path.documentations', $project, $version, $categoryPath); + + $trail->push(__('Create'), route('admin.projects.documentation-versions.documentations.create', ['project' => $project->id, 'version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.documentations.edit', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \App\Models\Documentation $documentation) { + $trail->parent('admin.projects.documentation-versions.documentations.index', $project, $version); + + $trail->push(__('Edit'), route('admin.projects.documentation-versions.documentations.edit', ['project' => $project->id, 'version' => $version->id, 'documentation' => $documentation->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.category-path.documentations.edit', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \App\Models\Documentation $documentation, \Illuminate\Support\Collection $categoryPath) { + $trail->parent('admin.projects.documentation-versions.category-path.documentations', $project, $version, $categoryPath); + + $trail->push(__('Edit'), route('admin.projects.documentation-versions.documentations.edit', ['project' => $project->id, 'version' => $version->id, 'documentation' => $documentation->id])); +}); +// End Projects documentation-versions documentations + +// Projects documentation-versions categories +Breadcrumbs::for('admin.projects.documentation-versions.categories.index', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version) { + $trail->parent('admin.projects.documentation-versions.show', $project, $version); + + $trail->push(__('admin-sections.Categories'), route('admin.projects.documentation-versions.categories.index', ['project' => $project->id, 'version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.categories.create', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version) { + $trail->parent('admin.projects.documentation-versions.categories.index', $project, $version); + + $trail->push(__('Create'), route('admin.projects.documentation-versions.categories.create', ['project' => $project->id, 'version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.category-path.categories', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \Illuminate\Support\Collection $categoryPath) { + $trail->parent('admin.projects.documentation-versions.category-path', $project, $version, $categoryPath); + + $trail->push(__('admin-sections.Categories'), route('admin.projects.documentation-versions.categories.index', ['project' => $project->id, 'version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.category-path.categories.create', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \Illuminate\Support\Collection $categoryPath) { + $trail->parent('admin.projects.documentation-versions.category-path.categories', $project, $version, $categoryPath); + + $trail->push(__('Create'), route('admin.projects.documentation-versions.categories.create', ['project' => $project->id, 'version' => $version->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.categories.edit', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \App\Models\DocumentationCategory $category) { + $trail->parent('admin.projects.documentation-versions.categories.index', $project, $version); + + $trail->push(__('Edit'), route('admin.projects.documentation-versions.categories.edit', ['project' => $project->id, 'version' => $version->id, 'category' => $category->id])); +}); + +Breadcrumbs::for('admin.projects.documentation-versions.category-path.categories.edit', function ($trail, \App\Models\Project $project, \App\Models\DocumentationVersion $version, \App\Models\DocumentationCategory $category, \Illuminate\Support\Collection $categoryPath) { + $trail->parent('admin.projects.documentation-versions.category-path.categories', $project, $version, $categoryPath); + + $trail->push(__('Edit'), route('admin.projects.documentation-versions.categories.edit', ['project' => $project->id, 'version' => $version->id, 'category' => $category->id])); +}); +// End Projects documentation-versions categories diff --git a/app/application/breadcrumbs/site.php b/app/application/breadcrumbs/site.php new file mode 100644 index 0000000..0648a3c --- /dev/null +++ b/app/application/breadcrumbs/site.php @@ -0,0 +1,60 @@ +push($websiteTranslations->translate('Home'), ProjectSection::Home->url($project, $websiteTranslations->getLanguage())); +}); + +Breadcrumbs::for('feedbacks.index', function ($trail, Project $project, WebsiteTranslations $websiteTranslations) { + $trail->parent('home', $project, $websiteTranslations); + + $trail->push($websiteTranslations->translate('site.Feedback'), ProjectSection::Feedback->url($project, $websiteTranslations->getLanguage())); +}); + +// Documentation +Breadcrumbs::for('documentation.no-default-version', function ($trail, Project $project, WebsiteTranslations $websiteTranslations) { + $trail->parent('home', $project, $websiteTranslations); + + $trail->push($websiteTranslations->translate('site.Documentation'), ProjectSection::Documentation->url($project, $websiteTranslations->getLanguage())); +}); + +Breadcrumbs::for('documentation.index', function ($trail, Project $project, WebsiteTranslations $websiteTranslations, DocumentationVersion $version) { + $trail->parent('home', $project, $websiteTranslations); + + $trail->push($websiteTranslations->translate('site.Documentation'), ProjectSection::DocumentationVersion->url($project, $websiteTranslations->getLanguage(), ['version' => $version->slug])); +}); + +Breadcrumbs::for('documentation.category-path', function ($trail, Project $project, WebsiteTranslations $websiteTranslations, DocumentationVersion $version, Collection $categoryPath) { + $trail->parent('documentation.index', $project, $websiteTranslations, $version); + foreach ($categoryPath as $pathItem) { + $trail->push( + $pathItem->content->title, + ProjectSection::DocumentationCategory->url($project, $websiteTranslations->getLanguage(), ['version' => $version->slug, 'slug' => $pathItem->slug]) + ); + } +}); + +Breadcrumbs::for('documentation.category', function ($trail, Project $project, WebsiteTranslations $websiteTranslations, DocumentationVersion $version, DocumentationCategory $category, ?Collection $categoryPath) { + $trail->parent('documentation.category-path', $project, $websiteTranslations, $version, $categoryPath ?? collect()); + $trail->push( + $category->content->title, + ProjectSection::DocumentationCategory->url($project, $websiteTranslations->getLanguage(), ['version' => $version->slug, 'slug' => $category->slug]) + ); +}); + +Breadcrumbs::for('documentation.view', function ($trail, Project $project, WebsiteTranslations $websiteTranslations, DocumentationVersion $version, Documentation $documentation, ?Collection $categoryPath) { + $trail->parent('documentation.category-path', $project, $websiteTranslations, $version, $categoryPath ?? collect()); + $trail->push( + $documentation->content->title, + ProjectSection::Documentation->url($project, $websiteTranslations->getLanguage(), ['version' => $version->slug, 'slug' => $documentation->slug]) + ); +}); +// End Documentation diff --git a/app/application/composer.json b/app/application/composer.json index e4dc362..5cdc34f 100644 --- a/app/application/composer.json +++ b/app/application/composer.json @@ -7,6 +7,7 @@ "license": "MIT", "require": { "php": "^8.3", + "diglactic/laravel-breadcrumbs": "^10.1", "intervention/image-laravel": "^4.0", "kor-elf/captcha-rule-for-laravel": "^1.0", "kor-elf/translate-laravel": "^2.0", diff --git a/app/application/composer.lock b/app/application/composer.lock index b1003cd..39aff29 100644 --- a/app/application/composer.lock +++ b/app/application/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a920317eed14f3d09c7ed37a87c65ec1", + "content-hash": "497caf2eb305e80d19ee6e7fbeffd7b7", "packages": [ { "name": "brick/math", @@ -209,6 +209,76 @@ }, "time": "2024-07-08T12:26:09+00:00" }, + { + "name": "diglactic/laravel-breadcrumbs", + "version": "v10.1.0", + "source": { + "type": "git", + "url": "https://github.com/diglactic/laravel-breadcrumbs.git", + "reference": "64245821155ccfe721832898840408ee6136db31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/diglactic/laravel-breadcrumbs/zipball/64245821155ccfe721832898840408ee6136db31", + "reference": "64245821155ccfe721832898840408ee6136db31", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "laravel/framework": "^10.0 || ^11.0 || ^12.0 || ^13.0", + "php": "^8.1" + }, + "conflict": { + "davejamesmiller/laravel-breadcrumbs": "*" + }, + "require-dev": { + "orchestra/testbench": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "phpunit/phpunit": "^10.5 || ^11.5 || ^12.5", + "spatie/phpunit-snapshot-assertions": "^5.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Breadcrumbs": "Diglactic\\Breadcrumbs\\Breadcrumbs" + }, + "providers": [ + "Diglactic\\Breadcrumbs\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Diglactic\\Breadcrumbs\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sheng Slogar", + "email": "sheng@diglactic.com", + "role": "Maintainer" + }, + { + "name": "Dave James Miller", + "email": "dave@davejamesmiller.com", + "role": "Original Creator" + } + ], + "description": "A simple Laravel-style way to create breadcrumbs.", + "homepage": "https://github.com/diglactic/laravel-breadcrumbs", + "keywords": [ + "laravel" + ], + "support": { + "issues": "https://github.com/diglactic/laravel-breadcrumbs/issues", + "source": "https://github.com/diglactic/laravel-breadcrumbs/tree/v10.1.0" + }, + "time": "2026-03-30T05:25:07+00:00" + }, { "name": "doctrine/inflector", "version": "2.1.0", @@ -507,6 +577,59 @@ ], "time": "2025-03-06T22:45:56+00:00" }, + { + "name": "facade/ignition-contracts", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v2.15.8", + "phpunit/phpunit": "^9.3.11", + "vimeo/psalm": "^3.17.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "support": { + "issues": "https://github.com/facade/ignition-contracts/issues", + "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" + }, + "time": "2020-10-16T08:27:54+00:00" + }, { "name": "fruitcake/php-cors", "version": "v1.4.0", @@ -9789,5 +9912,5 @@ "php": "^8.3" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/app/application/config/breadcrumbs.php b/app/application/config/breadcrumbs.php new file mode 100644 index 0000000..41dc41b --- /dev/null +++ b/app/application/config/breadcrumbs.php @@ -0,0 +1,78 @@ + 'breadcrumbs.site', + + /* + |-------------------------------------------------------------------------- + | Breadcrumbs File(s) + |-------------------------------------------------------------------------- + | + | The file(s) where breadcrumbs are defined. e.g. + | + | - base_path('routes/breadcrumbs.php') + | - glob(base_path('breadcrumbs/*.php')) + | + */ + + 'files' => [ + base_path('breadcrumbs/site.php'), + base_path('breadcrumbs/admin.php'), + ], + + /* + |-------------------------------------------------------------------------- + | Exceptions + |-------------------------------------------------------------------------- + | + | Determine when to throw an exception. + | + */ + + // When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException) + 'unnamed-route-exception' => true, + + // When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException) + 'missing-route-bound-breadcrumb-exception' => true, + + // When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException) + 'invalid-named-breadcrumb-exception' => true, + + /* + |-------------------------------------------------------------------------- + | Classes + |-------------------------------------------------------------------------- + | + | Subclass the default classes for more advanced customisations. + | + */ + + // Manager + 'manager-class' => Diglactic\Breadcrumbs\Manager::class, + + // Generator + 'generator-class' => Diglactic\Breadcrumbs\Generator::class, + +]; diff --git a/app/application/lang/en.json b/app/application/lang/en.json index d976cca..8ee4b02 100644 --- a/app/application/lang/en.json +++ b/app/application/lang/en.json @@ -38,6 +38,9 @@ "Connection Timed Out": "Connection Timed Out", "Continue": "Continue", "Create": "Create", + "Create documentation": "Create documentation", + "Create category": "Create category", + "Create version documentation": "Create a version of the documentation", "Create :name": "Create :name", "Created": "Created", "Delete": "Delete", diff --git a/app/application/lang/en/admin-sections.php b/app/application/lang/en/admin-sections.php index 69871f4..7309220 100644 --- a/app/application/lang/en/admin-sections.php +++ b/app/application/lang/en/admin-sections.php @@ -17,4 +17,6 @@ return [ 'Documentation' => 'Documentation', 'Categories' => 'Categories', 'Setting up automatic translation' => 'Setting up automatic translation', + 'Documentation not found' => 'Documentation not found', + 'No categories found' => 'No categories found', ]; diff --git a/app/application/lang/ru.json b/app/application/lang/ru.json index 0d55c4b..36c2e67 100644 --- a/app/application/lang/ru.json +++ b/app/application/lang/ru.json @@ -38,6 +38,9 @@ "Connection Timed Out": "Соединение не отвечает", "Continue": "Продолжай", "Create": "Создать", + "Create documentation": "Создать документацию", + "Create category": "Создать категорию", + "Create version documentation": "Создать версию документации", "Create :name": "Создать :name", "Created": "Создано", "Delete": "Удалить", diff --git a/app/application/lang/ru/admin-sections.php b/app/application/lang/ru/admin-sections.php index 09c6504..454ccd4 100644 --- a/app/application/lang/ru/admin-sections.php +++ b/app/application/lang/ru/admin-sections.php @@ -17,4 +17,6 @@ return [ 'Documentation' => 'Документация', 'Categories' => 'Категории', 'Setting up automatic translation' => 'Настройка автоматического перевода', + 'Documentation not found' => 'Документация не найдена', + 'No categories found' => 'Категории не найдены', ]; diff --git a/app/application/resources/site/scss/app.scss b/app/application/resources/site/scss/app.scss index c1e24ad..dc85f25 100644 --- a/app/application/resources/site/scss/app.scss +++ b/app/application/resources/site/scss/app.scss @@ -1,6 +1,7 @@ @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,700;1,400;1,700&display=swap'); @import "reset"; @import "forms"; +@import "breadcrumb"; html, body { diff --git a/app/application/resources/site/scss/breadcrumb.scss b/app/application/resources/site/scss/breadcrumb.scss new file mode 100644 index 0000000..20aeaf6 --- /dev/null +++ b/app/application/resources/site/scss/breadcrumb.scss @@ -0,0 +1,45 @@ +.breadcrumb-container { + display: flex; + flex-wrap: wrap; + padding: .5rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #eee; + border-radius: .5rem; +} + +.breadcrumb-item+.breadcrumb-item { + padding-left: .5rem +} + +.breadcrumb-item+.breadcrumb-item:before { + float: left; + padding-right: .5rem; + color: #4b5563; + content: "/"; +} + +.breadcrumb-item.active { + color: #4b5563; + font-weight: 400; +} + +.breadcrumb-item { + font-size: .75rem +} + +.breadcrumb-item,.breadcrumb-item a { + color: #374151; + font-weight: 400; + font-size: .75rem; +} +.breadcrumb-item a:hover { + color: #00040b; + text-decoration: none; +} + +@media (min-width: 576px) { + .breadcrumb-item,.breadcrumb-item a { + font-size:.875rem + } +} diff --git a/app/application/resources/views/admin/layout/_navigation.blade.php b/app/application/resources/views/admin/layout/_navigation.blade.php index 2312c1b..18d79e9 100644 --- a/app/application/resources/views/admin/layout/_navigation.blade.php +++ b/app/application/resources/views/admin/layout/_navigation.blade.php @@ -69,3 +69,25 @@ @endcan + +
  • + + +
  • diff --git a/app/application/resources/views/admin/projects/about/edit.blade.php b/app/application/resources/views/admin/projects/about/edit.blade.php index bfd057d..2386885 100644 --- a/app/application/resources/views/admin/projects/about/edit.blade.php +++ b/app/application/resources/views/admin/projects/about/edit.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Project') . ': ' . $project->name) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.about.edit', $project, $language))
    diff --git a/app/application/resources/views/admin/projects/about/languages.blade.php b/app/application/resources/views/admin/projects/about/languages.blade.php index 8ee9395..6fb1d3e 100644 --- a/app/application/resources/views/admin/projects/about/languages.blade.php +++ b/app/application/resources/views/admin/projects/about/languages.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Project') . ': ' . $project->name) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.about.languages', $project)) @php $contents = $project->contents; @endphp diff --git a/app/application/resources/views/admin/projects/create.blade.php b/app/application/resources/views/admin/projects/create.blade.php index ce44758..265d57d 100644 --- a/app/application/resources/views/admin/projects/create.blade.php +++ b/app/application/resources/views/admin/projects/create.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Projects')) @section('h1', __('admin-sections.Projects')) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.create')) @include('admin.projects._top')
    diff --git a/app/application/resources/views/admin/projects/documentation-categories/edit.blade.php b/app/application/resources/views/admin/projects/documentation-categories/edit.blade.php deleted file mode 100644 index 925ee69..0000000 --- a/app/application/resources/views/admin/projects/documentation-categories/edit.blade.php +++ /dev/null @@ -1,20 +0,0 @@ -@section('meta_title', __('admin-sections.Categories')) -@section('h1') - {{ __('admin-sections.Project') . ': ' . $project->name . ' (' . $version->title . ')' }} -@endsection - - @include('admin.projects.documentation-categories._top') -
    -
    -
    -
    -

    {{ __('admin-sections.Categories') }}

    -
    - @method('PUT') - @include('admin.projects.documentation-categories._from') -
    -
    -
    -
    -
    -
    diff --git a/app/application/resources/views/admin/projects/documentation-versions/_top.blade.php b/app/application/resources/views/admin/projects/documentation-versions/_top.blade.php index 6010f38..d9d038b 100644 --- a/app/application/resources/views/admin/projects/documentation-versions/_top.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/_top.blade.php @@ -1,18 +1,34 @@ - -
    +
    @can('create', \App\Models\DocumentationVersion::class) - + - {{ __('Create') }} + {{ __('Create version documentation') }} @endcan @can('viewAny', \App\Models\DocumentationVersion::class) - + - {{ __('List') }} + {{ __('admin-sections.Documentation version') }} @endcan + @if(!empty($version) && $version->id) + @can('viewAny', \App\Models\Documentation::class) + + + {{ __('admin-sections.Documentation') }} + + @endcan + @can('viewAny', \App\Models\DocumentationCategory::class) + + + {{ __('admin-sections.Categories') }} + + @endcan + @endif
    - diff --git a/app/application/resources/views/admin/projects/documentation-versions/create.blade.php b/app/application/resources/views/admin/projects/documentation-versions/create.blade.php index bfd8739..0caa0e0 100644 --- a/app/application/resources/views/admin/projects/documentation-versions/create.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/create.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Documentation version')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.create', $project)) @include('admin.projects.documentation-versions._top')
    diff --git a/app/application/resources/views/admin/projects/documentation-categories/_from.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/_from.blade.php similarity index 100% rename from app/application/resources/views/admin/projects/documentation-categories/_from.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentation-categories/_from.blade.php diff --git a/app/application/resources/views/admin/projects/documentation-categories/_top.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/_top.blade.php similarity index 68% rename from app/application/resources/views/admin/projects/documentation-categories/_top.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentation-categories/_top.blade.php index 068a81f..a85ff29 100644 --- a/app/application/resources/views/admin/projects/documentation-categories/_top.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/_top.blade.php @@ -1,12 +1,12 @@ -
    +
    @can('create', \App\Models\DocumentationCategory::class) - + {{ __('Create') }} @endcan @can('viewAny', \App\Models\DocumentationCategory::class) - + @@ -14,12 +14,20 @@ @endcan @can('viewAny', \App\Models\Documentation::class) - + {{ __('admin-sections.Documentation') }} @endcan + @can('viewAny', \App\Models\DocumentationVersion::class) + + + {{ __('admin-sections.Documentation version') }} + + @endcan
    diff --git a/app/application/resources/views/admin/projects/documentation-categories/create.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/create.blade.php similarity index 59% rename from app/application/resources/views/admin/projects/documentation-categories/create.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentation-categories/create.blade.php index 83a2b01..32915a5 100644 --- a/app/application/resources/views/admin/projects/documentation-categories/create.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/create.blade.php @@ -2,15 +2,20 @@ @section('h1') {{ __('admin-sections.Project') . ': ' . $project->name . ' (' . $version->title . ')' }} @endsection +@if(!empty($categoryPath)) + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.category-path.categories.create', $project, $version, $categoryPath)) +@else + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.categories.create', $project, $version)) +@endif - @include('admin.projects.documentation-categories._top') + @include('admin.projects.documentation-versions.documentation-categories._top')

    {{ __('admin-sections.Categories') }}

    - @include('admin.projects.documentation-categories._from') + @include('admin.projects.documentation-versions.documentation-categories._from')
    diff --git a/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/edit.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/edit.blade.php new file mode 100644 index 0000000..debe66b --- /dev/null +++ b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/edit.blade.php @@ -0,0 +1,26 @@ +@section('meta_title', __('admin-sections.Categories')) +@section('h1') + {{ __('admin-sections.Project') . ': ' . $project->name . ' (' . $version->title . ')' }} +@endsection +@if(!empty($categoryPath)) + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.category-path.categories.edit', $project, $version, $category, $categoryPath)) +@else + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.categories.edit', $project, $version, $category)) +@endif + + @include('admin.projects.documentation-versions.documentation-categories._top') +
    +
    +
    +
    +

    {{ __('admin-sections.Categories') }}

    +
    + @method('PUT') + @include('admin.projects.documentation-versions.documentation-categories._from') +
    +
    +
    +
    +
    +
    diff --git a/app/application/resources/views/admin/projects/documentation-categories/index.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/index.blade.php similarity index 95% rename from app/application/resources/views/admin/projects/documentation-categories/index.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentation-categories/index.blade.php index 564c747..ccd2458 100644 --- a/app/application/resources/views/admin/projects/documentation-categories/index.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/documentation-categories/index.blade.php @@ -2,8 +2,9 @@ @section('h1') {{ __('admin-sections.Project') . ': ' . $project->name . ' (' . $version->title . ')' }} @endsection +@section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.categories.index', $project, $version)) - @include('admin.projects.documentation-categories._top') + @include('admin.projects.documentation-versions.documentation-categories._top')

    {{ __('admin-sections.Categories') }}

    diff --git a/app/application/resources/views/admin/projects/documentations/_from.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentations/_from.blade.php similarity index 100% rename from app/application/resources/views/admin/projects/documentations/_from.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentations/_from.blade.php diff --git a/app/application/resources/views/admin/projects/documentations/_top.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentations/_top.blade.php similarity index 68% rename from app/application/resources/views/admin/projects/documentations/_top.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentations/_top.blade.php index 9ee8ee1..2856bc4 100644 --- a/app/application/resources/views/admin/projects/documentations/_top.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/documentations/_top.blade.php @@ -1,12 +1,12 @@ -
    +
    @can('create', \App\Models\Documentation::class) - + {{ __('Create') }} @endcan @can('viewAny', \App\Models\Documentation::class) - + @@ -14,12 +14,20 @@ @endcan @can('viewAny', \App\Models\DocumentationCategory::class) - + {{ __('admin-sections.Categories') }} @endcan + @can('viewAny', \App\Models\DocumentationVersion::class) + + + {{ __('admin-sections.Documentation version') }} + + @endcan
    diff --git a/app/application/resources/views/admin/projects/documentations/create.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentations/create.blade.php similarity index 59% rename from app/application/resources/views/admin/projects/documentations/create.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentations/create.blade.php index b03d0d5..af2dc10 100644 --- a/app/application/resources/views/admin/projects/documentations/create.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/documentations/create.blade.php @@ -2,15 +2,20 @@ @section('h1') {{ __('admin-sections.Project') . ': ' . $project->name . ' (' . $version->title . ')' }} @endsection +@if(!empty($categoryPath)) + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.category-path.documentations.create', $project, $version, $categoryPath)) +@else + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.documentations.create', $project, $version)) +@endif - @include('admin.projects.documentations._top') + @include('admin.projects.documentation-versions.documentations._top')

    {{ __('admin-sections.Documentation') }}

    - @include('admin.projects.documentations._from') + @include('admin.projects.documentation-versions.documentations._from')
    diff --git a/app/application/resources/views/admin/projects/documentations/edit.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentations/edit.blade.php similarity index 61% rename from app/application/resources/views/admin/projects/documentations/edit.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentations/edit.blade.php index b7c9be3..d07909c 100644 --- a/app/application/resources/views/admin/projects/documentations/edit.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/documentations/edit.blade.php @@ -2,8 +2,13 @@ @section('h1') {{ __('admin-sections.Project') . ': ' . $project->name . ' (' . $version->title . ')' }} @endsection +@if(!empty($categoryPath)) + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.category-path.documentations.edit', $project, $version, $documentation, $categoryPath)) +@else + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.documentations.edit', $project, $version, $documentation)) +@endif - @include('admin.projects.documentations._top') + @include('admin.projects.documentation-versions.documentations._top')
    @@ -11,7 +16,7 @@

    {{ __('admin-sections.Documentation') }}

    @method('PUT') - @include('admin.projects.documentations._from') + @include('admin.projects.documentation-versions.documentations._from')
    diff --git a/app/application/resources/views/admin/projects/documentations/index.blade.php b/app/application/resources/views/admin/projects/documentation-versions/documentations/index.blade.php similarity index 95% rename from app/application/resources/views/admin/projects/documentations/index.blade.php rename to app/application/resources/views/admin/projects/documentation-versions/documentations/index.blade.php index 3bbeb85..2c56b39 100644 --- a/app/application/resources/views/admin/projects/documentations/index.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/documentations/index.blade.php @@ -2,8 +2,9 @@ @section('h1') {{ __('admin-sections.Project') . ': ' . $project->name . ' (' . $version->title . ')' }} @endsection +@section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.documentations.index', $project, $version)) - @include('admin.projects.documentations._top') + @include('admin.projects.documentation-versions.documentations._top')

    {{ __('admin-sections.Documentation') }}

    diff --git a/app/application/resources/views/admin/projects/documentation-versions/edit.blade.php b/app/application/resources/views/admin/projects/documentation-versions/edit.blade.php index 00d86af..1c9576e 100644 --- a/app/application/resources/views/admin/projects/documentation-versions/edit.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/edit.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Documentation version')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.edit', $project, $version)) @include('admin.projects.documentation-versions._top')
    diff --git a/app/application/resources/views/admin/projects/documentation-versions/index.blade.php b/app/application/resources/views/admin/projects/documentation-versions/index.blade.php index f442bee..f94a0f8 100644 --- a/app/application/resources/views/admin/projects/documentation-versions/index.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/index.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Documentation version')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.index', $project)) @include('admin.projects.documentation-versions._top')
    @@ -41,7 +42,7 @@ @endif - + diff --git a/app/application/resources/views/admin/projects/documentation-versions/show.blade.php b/app/application/resources/views/admin/projects/documentation-versions/show.blade.php index 2100a7d..74b2548 100644 --- a/app/application/resources/views/admin/projects/documentation-versions/show.blade.php +++ b/app/application/resources/views/admin/projects/documentation-versions/show.blade.php @@ -1,45 +1,160 @@ @section('meta_title', __('admin-sections.Documentation version')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@if(!empty($category)) + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.show.category', $project, $version, $category, $categoryPath ?? null)) +@else + @section('breadcrumbs', Breadcrumbs::render('admin.projects.documentation-versions.show', $project, $version)) +@endif +@php + $categoryId = null; + if (!empty($category) && $category->id) { + $categoryId = $category->id; + } +@endphp @include('admin.projects.documentation-versions._top')
    -

    {{ __('admin-sections.Documentation version') }}: {{ $version->title }}

    +

    + {{ __('admin-sections.Documentation version') }}: {{ $version->title }} +

    + @if(!empty($category)) +

    + {{ __('admin-sections.Categories') }}: {{ $category->content?->title }} +

    + @endif + @can('create', \App\Models\Documentation::class) +
    + + {{ __('Create documentation') }} + + @endcan + @can('create', \App\Models\DocumentationCategory::class) + + + {{ __('Create category') }} + + @endcan
    - + + + + + - @can('viewAny', \App\Models\Documentation::class) - - + + - - @endcan - @can('viewAny', \App\Models\DocumentationCategory::class) - - + + + - - @endcan + @endcan + @can('delete', $category) + + @csrf + @method('DELETE') + + + @endcan + + + @empty + + + + @endforelse + @forelse($documentations as $documentation) + + + + + + + + @empty + + + + @endforelse
    {{ __('admin-sections.Sections') }}{{ __('validation.attributes.type') }}{{ __('validation.attributes.title') }}{{ __('validation.attributes.slug') }}{{ __('validation.attributes.is_public') }}
    - - - {{ __('admin-sections.Documentation') }} + @forelse($categories as $category) +
    + {{ __('admin-sections.Categories') }} + + @can('view', $category) + + {{ $category->content?->title }} -
    - - + {{ $category->slug }} + + @if($category->is_public) + {{ __('Yes') }} + @else + {{ __('No') }} + @endif + + @can('update', $category) + + + - {{ __('admin-sections.Categories') }} -
    +
    + {{ __('admin-sections.No categories found') }} +
    +
    + {{ __('admin-sections.Documentation') }} + + {{ $documentation->content?->title }} + + {{ $documentation->slug }} + + @if($documentation->is_public) + {{ __('Yes') }} + @else + {{ __('No') }} + @endif + + @can('update', $documentation) + + + + + + @endcan + @can('delete', $documentation) +
    + @csrf + @method('DELETE') + +
    + @endcan +
    +
    + {{ __('admin-sections.Documentation not found') }} +
    +
    + @push('scripts') + @include('admin._scripts._click-confirm', ['alert' => __('Do you want to delete?')]) + @endpush diff --git a/app/application/resources/views/admin/projects/edit.blade.php b/app/application/resources/views/admin/projects/edit.blade.php index eee7180..08f82b3 100644 --- a/app/application/resources/views/admin/projects/edit.blade.php +++ b/app/application/resources/views/admin/projects/edit.blade.php @@ -1,11 +1,13 @@ @section('meta_title', __('admin-sections.Projects')) @section('h1', __('admin-sections.Projects')) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.edit', $project)) @include('admin.projects._top')
    +

    {{ __('admin-sections.Project') . ': ' . $project->name }}

    @method('PUT') @include('admin.projects._from') diff --git a/app/application/resources/views/admin/projects/feedbacks/index.blade.php b/app/application/resources/views/admin/projects/feedbacks/index.blade.php index 366fd74..617bc33 100644 --- a/app/application/resources/views/admin/projects/feedbacks/index.blade.php +++ b/app/application/resources/views/admin/projects/feedbacks/index.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Feedback')) @section('h1', __('admin-sections.Feedback')) +@section('breadcrumbs', Breadcrumbs::render('admin.feedbacks.index'))
    diff --git a/app/application/resources/views/admin/projects/feedbacks/project.blade.php b/app/application/resources/views/admin/projects/feedbacks/project.blade.php index 871056e..e24cd3a 100644 --- a/app/application/resources/views/admin/projects/feedbacks/project.blade.php +++ b/app/application/resources/views/admin/projects/feedbacks/project.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Project') . ': ' . $project->name . ' - ' . __('admin-sections.Feedback')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.feedbacks.index', $project))
    diff --git a/app/application/resources/views/admin/projects/index.blade.php b/app/application/resources/views/admin/projects/index.blade.php index f903382..efc1ec0 100644 --- a/app/application/resources/views/admin/projects/index.blade.php +++ b/app/application/resources/views/admin/projects/index.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Projects')) @section('h1', __('admin-sections.Projects')) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.index')) @include('admin.projects._top')
    diff --git a/app/application/resources/views/admin/projects/links/create.blade.php b/app/application/resources/views/admin/projects/links/create.blade.php index 196e3f5..bea1024 100644 --- a/app/application/resources/views/admin/projects/links/create.blade.php +++ b/app/application/resources/views/admin/projects/links/create.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Links project')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.links.create', $project)) @include('admin.projects.links._top')
    diff --git a/app/application/resources/views/admin/projects/links/edit.blade.php b/app/application/resources/views/admin/projects/links/edit.blade.php index 189a52a..8434c6e 100644 --- a/app/application/resources/views/admin/projects/links/edit.blade.php +++ b/app/application/resources/views/admin/projects/links/edit.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Links project')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.links.edit', $project, $link)) @include('admin.projects.links._top')
    diff --git a/app/application/resources/views/admin/projects/links/index.blade.php b/app/application/resources/views/admin/projects/links/index.blade.php index fb2419a..fea2018 100644 --- a/app/application/resources/views/admin/projects/links/index.blade.php +++ b/app/application/resources/views/admin/projects/links/index.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Links project')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.links.index', $project)) @include('admin.projects.links._top')
    diff --git a/app/application/resources/views/admin/projects/service-translate/view.blade.php b/app/application/resources/views/admin/projects/service-translate/view.blade.php index 70c101a..7b41135 100644 --- a/app/application/resources/views/admin/projects/service-translate/view.blade.php +++ b/app/application/resources/views/admin/projects/service-translate/view.blade.php @@ -1,10 +1,12 @@ @section('meta_title', __('admin-sections.Setting up automatic translation') . '. ' . __('admin-sections.Project') . ': ' . $project->name) -@section('h1', __('admin-sections.Setting up automatic translation') . '. ' . __('admin-sections.Project') . ': ' . $project->name) +@section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.service-translate.view', $project))
    +

    {{ __('admin-sections.Setting up automatic translation') }}

    @csrf
    diff --git a/app/application/resources/views/admin/projects/show.blade.php b/app/application/resources/views/admin/projects/show.blade.php index 73a2608..3719017 100644 --- a/app/application/resources/views/admin/projects/show.blade.php +++ b/app/application/resources/views/admin/projects/show.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Project') . ': ' . $project->name) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.show', $project)) @include('admin.projects._top')
    diff --git a/app/application/resources/views/admin/projects/translations/edit.blade.php b/app/application/resources/views/admin/projects/translations/edit.blade.php index 679b2ee..51c1d5b 100644 --- a/app/application/resources/views/admin/projects/translations/edit.blade.php +++ b/app/application/resources/views/admin/projects/translations/edit.blade.php @@ -1,11 +1,12 @@ @section('meta_title', __('admin-sections.Translations')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.translations.edit', $project, $language))
    -

    {{ __('admin-sections.Translations') }}

    +

    {{ __('admin-sections.Translations') . ': ' . $language->title }}

    @if($serviceTranslationEnable) diff --git a/app/application/resources/views/admin/projects/translations/languages.blade.php b/app/application/resources/views/admin/projects/translations/languages.blade.php index d14db7e..e9ded61 100644 --- a/app/application/resources/views/admin/projects/translations/languages.blade.php +++ b/app/application/resources/views/admin/projects/translations/languages.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Translations')) @section('h1', __('admin-sections.Project') . ': ' . $project->name) +@section('breadcrumbs', Breadcrumbs::render('admin.projects.translations.languages', $project))
    diff --git a/app/application/resources/views/admin/roles/create.blade.php b/app/application/resources/views/admin/roles/create.blade.php index 6623ca9..ad97aed 100644 --- a/app/application/resources/views/admin/roles/create.blade.php +++ b/app/application/resources/views/admin/roles/create.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.User group')) @section('h1', __('admin-sections.User group')) +@section('breadcrumbs', Breadcrumbs::render('admin.roles.create')) @include('admin.roles._top')
    diff --git a/app/application/resources/views/admin/roles/edit.blade.php b/app/application/resources/views/admin/roles/edit.blade.php index 13b8ecd..12060d9 100644 --- a/app/application/resources/views/admin/roles/edit.blade.php +++ b/app/application/resources/views/admin/roles/edit.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.User group')) @section('h1', __('admin-sections.User group')) +@section('breadcrumbs', Breadcrumbs::render('admin.roles.edit', $role)) @include('admin.roles._top')
    diff --git a/app/application/resources/views/admin/roles/index.blade.php b/app/application/resources/views/admin/roles/index.blade.php index 27ca4c0..088a935 100644 --- a/app/application/resources/views/admin/roles/index.blade.php +++ b/app/application/resources/views/admin/roles/index.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.User group')) @section('h1', __('admin-sections.User group')) +@section('breadcrumbs', Breadcrumbs::render('admin.roles.index')) @include('admin.roles._top')
    diff --git a/app/application/resources/views/admin/users/create.blade.php b/app/application/resources/views/admin/users/create.blade.php index 85d3261..f4cf89c 100644 --- a/app/application/resources/views/admin/users/create.blade.php +++ b/app/application/resources/views/admin/users/create.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Users')) @section('h1', __('admin-sections.Users')) +@section('breadcrumbs', Breadcrumbs::render('admin.users.create')) @include('admin.users._top')
    diff --git a/app/application/resources/views/admin/users/edit.blade.php b/app/application/resources/views/admin/users/edit.blade.php index 94bbefa..65adc5c 100644 --- a/app/application/resources/views/admin/users/edit.blade.php +++ b/app/application/resources/views/admin/users/edit.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Users')) @section('h1', __('admin-sections.Users')) +@section('breadcrumbs', Breadcrumbs::render('admin.users.edit', $user)) @include('admin.users._top')
    diff --git a/app/application/resources/views/admin/users/index.blade.php b/app/application/resources/views/admin/users/index.blade.php index 85fed0d..92804e4 100644 --- a/app/application/resources/views/admin/users/index.blade.php +++ b/app/application/resources/views/admin/users/index.blade.php @@ -1,5 +1,6 @@ @section('meta_title', __('admin-sections.Users')) @section('h1', __('admin-sections.Users')) +@section('breadcrumbs', Breadcrumbs::render('admin.users.index')) @include('admin.users._top')
    diff --git a/app/application/resources/views/breadcrumbs/admin.blade.php b/app/application/resources/views/breadcrumbs/admin.blade.php new file mode 100644 index 0000000..2abcd3e --- /dev/null +++ b/app/application/resources/views/breadcrumbs/admin.blade.php @@ -0,0 +1,25 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/app/application/resources/views/breadcrumbs/site.blade.php b/app/application/resources/views/breadcrumbs/site.blade.php new file mode 100644 index 0000000..72f74c1 --- /dev/null +++ b/app/application/resources/views/breadcrumbs/site.blade.php @@ -0,0 +1,13 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/app/application/resources/views/components/volt/forms/textarea-wysiwyg.blade.php b/app/application/resources/views/components/volt/forms/textarea-wysiwyg.blade.php index b63bddf..6d83d70 100644 --- a/app/application/resources/views/components/volt/forms/textarea-wysiwyg.blade.php +++ b/app/application/resources/views/components/volt/forms/textarea-wysiwyg.blade.php @@ -12,7 +12,7 @@ @endphp
    - + @foreach($images as $image) @continue( empty($image['file']) ) diff --git a/app/application/resources/views/layout/private.blade.php b/app/application/resources/views/layout/private.blade.php index 995457e..580a1ac 100644 --- a/app/application/resources/views/layout/private.blade.php +++ b/app/application/resources/views/layout/private.blade.php @@ -69,11 +69,12 @@