diff --git a/app/Http/Controllers/Emoji/EmojiAliasController.php b/app/Http/Controllers/Admin/Emoji/EmojiAliasController.php similarity index 50% rename from app/Http/Controllers/Emoji/EmojiAliasController.php rename to app/Http/Controllers/Admin/Emoji/EmojiAliasController.php index 32e661349..ca5069368 100644 --- a/app/Http/Controllers/Emoji/EmojiAliasController.php +++ b/app/Http/Controllers/Admin/Emoji/EmojiAliasController.php @@ -1,11 +1,12 @@ validated()); + + return back()->with('success', 'Alias added successfully.'); } /** * Display the specified resource. */ - public function show(EmojiAlias $emojiAlias) + public function show(EmojiAlias $alias) { - // + // Not needed } /** * Show the form for editing the specified resource. */ - public function edit(EmojiAlias $emojiAlias) + public function edit(EmojiAlias $alias) { - // + // Not needed for Inertia - handled in frontend } /** * Update the specified resource in storage. */ - public function update(UpdateEmojiAliasRequest $request, EmojiAlias $emojiAlias) + public function update(UpdateEmojiAliasRequest $request, EmojiAlias $alias): RedirectResponse { - // + $alias->update($request->validated()); + + return back()->with('success', 'Alias updated successfully.'); } /** * Remove the specified resource from storage. */ - public function destroy(EmojiAlias $emojiAlias) + public function destroy(EmojiAlias $alias): RedirectResponse { - // + $alias->delete(); + + return back()->with('success', 'Alias removed successfully.'); } } diff --git a/app/Http/Controllers/Admin/Emoji/EmojiCategoryController.php b/app/Http/Controllers/Admin/Emoji/EmojiCategoryController.php new file mode 100644 index 000000000..3bf1b62ac --- /dev/null +++ b/app/Http/Controllers/Admin/Emoji/EmojiCategoryController.php @@ -0,0 +1,93 @@ +orderBy('display_order') + ->get(); + + return response()->json($categories); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // Not needed for Inertia - handled in frontend + } + + /** + * Store a newly created resource in storage. + */ + public function store(StoreEmojiCategoryRequest $request): JsonResponse + { + $category = EmojiCategory::create($request->validated()); + + return response()->json([ + 'message' => 'Category created successfully.', + 'category' => $category, + ], 201); + } + + /** + * Display the specified resource. + */ + public function show(EmojiCategory $category) + { + return response()->json($category->load('emojis')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(EmojiCategory $category) + { + // Not needed for Inertia - handled in frontend + } + + /** + * Update the specified resource in storage. + */ + public function update(UpdateEmojiCategoryRequest $request, EmojiCategory $category): JsonResponse + { + $category->update($request->validated()); + + return response()->json([ + 'message' => 'Category updated successfully.', + 'category' => $category, + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(EmojiCategory $category): JsonResponse + { + if ($category->emojis()->count() > 0) { + return response()->json([ + 'message' => 'Cannot delete category with existing emojis.', + ], 422); + } + + $category->delete(); + + return response()->json([ + 'message' => 'Category deleted successfully.', + ]); + } +} diff --git a/app/Http/Controllers/Admin/Emoji/EmojiController.php b/app/Http/Controllers/Admin/Emoji/EmojiController.php new file mode 100644 index 000000000..31eb30679 --- /dev/null +++ b/app/Http/Controllers/Admin/Emoji/EmojiController.php @@ -0,0 +1,142 @@ +orderBy('created_at', 'desc'); + + // Search functionality + if ($search = $request->get('search')) { + $query->where(function ($q) use ($search) { + $q->where('emoji_shortcode', 'like', "%{$search}%") + ->orWhere('emoji_text', 'like', "%{$search}%") + ->orWhere('title', 'like', "%{$search}%"); + }); + } + + // Category filter + if ($categoryId = $request->get('category_id')) { + $query->where('emoji_category_id', $categoryId); + } + + $emojis = $query->paginate(20)->withQueryString(); + $categories = EmojiCategory::withCount('emojis')->orderBy('display_order')->get(); + + return Inertia::render('admin/emojis/index', [ + 'emojis' => $emojis, + 'categories' => $categories, + 'filters' => $request->only(['search', 'category_id']), + ]); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): Response + { + $categories = EmojiCategory::withCount('emojis')->orderBy('display_order')->get(); + + return Inertia::render('admin/emojis/form', [ + 'categories' => $categories, + 'emoji' => null, + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(StoreEmojiRequest $request): RedirectResponse + { + $data = $request->validated(); + + // Handle image upload if present + if ($request->hasFile('image')) { + $path = $request->file('image')->store('emojis', 'public'); + $data['image_url'] = $path; + } + + // Set sprite_mode based on sprite_params + if (isset($data['sprite_params']) && !empty($data['sprite_params'])) { + $data['sprite_mode'] = true; + } + + Emoji::create($data); + + return redirect()->route('admin.emojis.index') + ->with('success', 'Emoji created successfully.'); + } + + /** + * Display the specified resource. + */ + public function show(Emoji $emoji): Response + { + return redirect()->route('admin.emojis.edit', $emoji); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Emoji $emoji): Response + { + $categories = EmojiCategory::withCount('emojis')->orderBy('display_order')->get(); + $emoji->load('aliases'); + + return Inertia::render('admin/emojis/form', [ + 'categories' => $categories, + 'emoji' => $emoji, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(UpdateEmojiRequest $request, Emoji $emoji): RedirectResponse + { + $data = $request->validated(); + + // Handle image upload if present + if ($request->hasFile('image')) { + $path = $request->file('image')->store('emojis', 'public'); + $data['image_url'] = $path; + } + + // Set sprite_mode based on sprite_params + if (isset($data['sprite_params']) && !empty($data['sprite_params'])) { + $data['sprite_mode'] = true; + } + + $emoji->update($data); + + return redirect()->route('admin.emojis.index') + ->with('success', 'Emoji updated successfully.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Emoji $emoji): RedirectResponse + { + $emoji->delete(); + + return redirect()->route('admin.emojis.index') + ->with('success', 'Emoji deleted successfully.'); + } +} diff --git a/app/Http/Controllers/Emoji/EmojiCategoryController.php b/app/Http/Controllers/Emoji/EmojiCategoryController.php deleted file mode 100644 index dd275edba..000000000 --- a/app/Http/Controllers/Emoji/EmojiCategoryController.php +++ /dev/null @@ -1,67 +0,0 @@ -toArray()), ], + 'image' => 'nullable|image|max:2048|mimes:png,jpg,jpeg,gif,webp', 'image_url' => 'nullable|string|max:500', 'sprite_mode' => 'boolean', 'sprite_params' => 'nullable|array', @@ -55,6 +56,7 @@ class StoreEmojiRequest extends FormRequest 'emoji_shortcode.regex' => 'The emoji shortcode must be in the format :name: (e.g., :smile:)', 'emoji_shortcode.unique' => 'This shortcode is already taken.', 'emoji_shortcode.not_in' => 'This shortcode conflicts with an existing alias.', + 'image.max' => 'The image must not be larger than 2MB.', ]; } } diff --git a/app/Http/Requests/Emoji/UpdateEmojiRequest.php b/app/Http/Requests/Emoji/UpdateEmojiRequest.php index d4b0c3958..ae966bf09 100644 --- a/app/Http/Requests/Emoji/UpdateEmojiRequest.php +++ b/app/Http/Requests/Emoji/UpdateEmojiRequest.php @@ -35,6 +35,7 @@ class UpdateEmojiRequest extends FormRequest Rule::unique('emojis', 'emoji_shortcode')->ignore($emojiId), Rule::notIn(\App\Models\EmojiAlias::pluck('alias')->toArray()), ], + 'image' => 'nullable|image|max:2048|mimes:png,jpg,jpeg,gif,webp', 'image_url' => 'nullable|string|max:500', 'sprite_mode' => 'sometimes|boolean', 'sprite_params' => 'nullable|array', @@ -57,6 +58,7 @@ class UpdateEmojiRequest extends FormRequest 'emoji_shortcode.regex' => 'The emoji shortcode must be in the format :name: (e.g., :smile:)', 'emoji_shortcode.unique' => 'This shortcode is already taken.', 'emoji_shortcode.not_in' => 'This shortcode conflicts with an existing alias.', + 'image.max' => 'The image must not be larger than 2MB.', ]; } } diff --git a/composer.lock b/composer.lock index 52e46f6fc..c71c95775 100644 --- a/composer.lock +++ b/composer.lock @@ -7990,16 +7990,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.1.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8", + "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8", "shasum": "" }, "require": { @@ -8031,9 +8031,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.2.0" }, - "time": "2025-02-19T13:28:12+00:00" + "time": "2025-07-13T07:04:09+00:00" }, { "name": "phpunit/php-code-coverage", @@ -9645,12 +9645,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.4" }, - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/legacy/data/avatars/gallery/bot.gif b/legacy/data/avatars/gallery/bot.gif deleted file mode 100644 index c426414f1..000000000 Binary files a/legacy/data/avatars/gallery/bot.gif and /dev/null differ diff --git a/legacy/data/avatars/gallery/noavatar.png b/legacy/data/avatars/gallery/noavatar.png deleted file mode 100644 index acbe7c294..000000000 Binary files a/legacy/data/avatars/gallery/noavatar.png and /dev/null differ diff --git a/legacy/styles/images/ranks/admin.png b/legacy/styles/images/ranks/admin.png deleted file mode 100644 index 0f26e4177..000000000 Binary files a/legacy/styles/images/ranks/admin.png and /dev/null differ diff --git a/legacy/styles/images/ranks/user.png b/legacy/styles/images/ranks/user.png deleted file mode 100644 index 1ec271e67..000000000 Binary files a/legacy/styles/images/ranks/user.png and /dev/null differ diff --git a/legacy/styles/templates/posting_tpl.tpl b/legacy/styles/templates/posting_tpl.tpl deleted file mode 100644 index 1bd379ba2..000000000 --- a/legacy/styles/templates/posting_tpl.tpl +++ /dev/null @@ -1,5176 +0,0 @@ - - - - -
Правила оформления | -
---|
- {TPL_RULES_HTML}
-
- |
-
Создание шаблона для релиза | -|||
---|---|---|---|
-
-
- |
-|||
-
-
|
-|||
- - | -
-
-
-
-
- сообщение: [?] - - - |
-||
результат [ скрыть ] | |||
-
-
-
-
-
-
-
-
- |
-|||
- |
-|||
- [ Инструкция ]
-
- |
-
Administrative emoji management - full control over emoji properties
+Total emojis
+Categories
+Total aliases
+Sprite emojis
+