Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f144d26
:sparkles: Queue Creator
CH3RVB Oct 16, 2025
2f390f5
:bug: fix notifications
CH3RVB Oct 16, 2025
4c2219d
Merge branch 'extension/queue-creator' of github.com:CH3RVB/lorekeepe…
AW0005 Oct 18, 2025
48a76c7
Small bug fixes
AW0005 Oct 18, 2025
d9e59b7
Merge pull request #10 from AW0005/extension-update/queue-creator
CH3RVB Oct 18, 2025
42b400c
:bug: Bugfixes
CH3RVB Oct 25, 2025
c6fba78
Merge branch 'extension/queue-creator' of https://github.com/CH3RVB/l…
CH3RVB Oct 25, 2025
39d052c
:sparkles: A Lot
CH3RVB Oct 30, 2025
fcb0fbf
:bug: Check for queue rewards
CH3RVB Oct 30, 2025
b9d734e
Merge branch 'extension/queue-creator' of github.com:CH3RVB/lorekeepe…
AW0005 Nov 3, 2025
ef5b076
Queue Creator Additions
AW0005 Nov 3, 2025
e136762
Guard queue submissions page against rank
AW0005 Nov 3, 2025
64063d7
Respect Active setting
AW0005 Nov 3, 2025
2bd05a0
Merge pull request #11 from AW0005/extension-update/queue-creator
CH3RVB Nov 3, 2025
64fc6e2
Fix for staff only queues showing to users
AW0005 Nov 19, 2025
4663f1a
Cleanup
AW0005 Nov 19, 2025
d518ea9
Merge pull request #12 from AW0005/extension-update/queue-creator
CH3RVB Nov 22, 2025
18b9cf5
Merge branch 'extension/queue-creator' of https://github.com/CH3RVB/l…
ScuffedNewt Jan 19, 2026
30474f2
refactor: fix blade formatting
ScuffedNewt Jan 19, 2026
691d518
refactor: fix PHP styling
ScuffedNewt Jan 19, 2026
10faab1
feat(wip): common submission manager
ScuffedNewt Jan 19, 2026
8f53a96
Merge branch 'develop' of https://github.com/corowne/lorekeeper into …
ScuffedNewt Jan 19, 2026
96745a6
feat(wip): make queues in line with updated submission requirements
ScuffedNewt Jan 19, 2026
52205bd
refactor: fix blade formatting
ScuffedNewt Jan 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/Console/Commands/AddSiteSettings.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ public function handle() {

$this->addSiteSetting('is_maintenance_mode', 0, '0: Site is normal, 1: Users without the Has Maintenance Access power will be redirected to the home page.');

$this->addSiteSetting('is_queue_open', 1, '0: New queue submissions cannot be made (mods can work on the queue still), 1: Queue is submittable.');

$this->addSiteSetting('deactivated_privacy', 0, 'Who can view the deactivated list? 0: Admin only, 1: Staff only, 2: Members only, 3: Public.');

$this->addSiteSetting('deactivated_link', 0, '0: No link to the deactivated list is displayed anywhere, 1: Link to the deactivated list is shown on the user list.');
Expand Down
2 changes: 0 additions & 2 deletions app/Http/Controllers/Admin/Data/PromptController.php
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,6 @@ public function getCreatePrompt() {
return view('admin.prompts.create_edit_prompt', [
'prompt' => new Prompt,
'categories' => ['none' => 'No category'] + PromptCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'limit_periods' => config('lorekeeper.extensions.limit_periods'),
]);
}

Expand All @@ -199,7 +198,6 @@ public function getEditPrompt($id) {
return view('admin.prompts.create_edit_prompt', [
'prompt' => $prompt,
'categories' => ['none' => 'No category'] + PromptCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'limit_periods' => config('lorekeeper.extensions.limit_periods'),
]);
}

Expand Down
304 changes: 304 additions & 0 deletions app/Http/Controllers/Admin/Data/QueueController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,304 @@
<?php

namespace App\Http\Controllers\Admin\Data;

use App\Http\Controllers\Controller;
use App\Models\Item\Item;
use App\Models\Queue\Queue;
use App\Models\Queue\QueueCategory;
use App\Models\Rank\Rank;
use App\Services\QueueService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class QueueController extends Controller {
/*
|--------------------------------------------------------------------------
| Admin / Queue Controller
|--------------------------------------------------------------------------
|
| Handles creation/editing of queue categories and queues.
|
*/

/**
* Shows the queue category index.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getIndex() {
return view('admin.queues.queue_categories', [
'categories' => QueueCategory::orderBy('sort', 'DESC')->get(),
]);
}

/**
* Shows the create queue category page.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getCreateQueueCategory() {
return view('admin.queues.create_edit_queue_category', [
'category' => new QueueCategory,
]);
}

/**
* Shows the edit queue category page.
*
* @param int $id
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getEditQueueCategory($id) {
$category = QueueCategory::find($id);
if (!$category) {
abort(404);
}

return view('admin.queues.create_edit_queue_category', [
'category' => $category,
]);
}

/**
* Creates or edits a queue category.
*
* @param App\Services\QueueService $service
* @param int|null $id
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postCreateEditQueueCategory(Request $request, QueueService $service, $id = null) {
$id ? $request->validate(QueueCategory::$updateRules) : $request->validate(QueueCategory::$createRules);
$data = $request->only([
'name', 'description', 'image', 'remove_image', 'key', 'limit', 'limit_period', 'limit_concurrent', 'display',
]);
if ($id && $service->updateQueueCategory(QueueCategory::find($id), $data, Auth::user())) {
flash('Category updated successfully.')->success();
} elseif (!$id && $category = $service->createQueueCategory($data, Auth::user())) {
flash('Category created successfully.')->success();

return redirect()->to('admin/data/queue-categories/edit/'.$category->id);
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
flash($error)->error();
}
}

return redirect()->back();
}

/**
* Gets the queue category deletion modal.
*
* @param int $id
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getDeleteQueueCategory($id) {
$category = QueueCategory::find($id);

return view('admin.queues._delete_queue_category', [
'category' => $category,
]);
}

/**
* Deletes a queue category.
*
* @param App\Services\QueueService $service
* @param int $id
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postDeleteQueueCategory(Request $request, QueueService $service, $id) {
if ($id && $service->deleteQueueCategory(QueueCategory::find($id))) {
flash('Category deleted successfully.')->success();
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
flash($error)->error();
}
}

return redirect()->to('admin/data/queue-categories');
}

/**
* Sorts queue categories.
*
* @param App\Services\QueueService $service
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postSortQueueCategory(Request $request, QueueService $service) {
if ($service->sortQueueCategory($request->get('sort'))) {
flash('Category order updated successfully.')->success();
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
flash($error)->error();
}
}

return redirect()->back();
}

/**********************************************************************************************

QUEUES

**********************************************************************************************/

/**
* Shows the queue category index.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getQueueIndex(Request $request) {
$query = Queue::query();
$data = $request->only(['queue_category_id', 'name']);
if (isset($data['queue_category_id']) && $data['queue_category_id'] != 'none') {
$query->where('queue_category_id', $data['queue_category_id']);
}
if (isset($data['name'])) {
$query->where('name', 'LIKE', '%'.$data['name'].'%');
}

return view('admin.queues.queues', [
'queues' => $query->paginate(20)->appends($request->query()),
'categories' => ['none' => 'Any Category'] + QueueCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
]);
}

/**
* Shows the create queue page.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getCreateQueue() {
$types = config('lorekeeper.queue_types');
$result = [];
foreach ($types as $type => $typeData) {
$result[$type] = $typeData['name'];
}

return view('admin.queues.create_edit_queue', [
'queue' => new Queue,
'categories' => ['none' => 'No category'] + QueueCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'types' => $result,
'ranks' => ['none' => 'All Staff with Submissions Power'] + Rank::pluck('name', 'id')->toArray(),
]);
}

/**
* Shows the edit queue page.
*
* @param int $id
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getEditQueue($id) {
$queue = Queue::find($id);
if (!$queue) {
abort(404);
}
$types = config('lorekeeper.queue_types');
$result = [];
foreach ($types as $type => $typeData) {
$result[$type] = $typeData['name'];
}

return view('admin.queues.create_edit_queue', [
'queue' => $queue,
'categories' => ['none' => 'No category'] + QueueCategory::orderBy('sort', 'DESC')->pluck('name', 'id')->toArray(),
'types' => $result,
'item_limits' => $queue->configSet('consume_items') ? Item::orderBy('name')->pluck('name', 'id') : [],
'ranks' => Rank::pluck('name', 'id')->toArray(),
] + ($queue->service?->getEditData() ?? []));
}

/**
* Creates or edits a queue.
*
* @param App\Services\QueueService $service
* @param int|null $id
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postCreateEditQueue(Request $request, QueueService $service, $id = null) {
$id ? $request->validate(Queue::$updateRules) : $request->validate(Queue::$createRules);
$data = $request->only(['name', 'queue_category_id', 'staff_rank_id', 'summary', 'description', 'start_at', 'end_at', 'hide_before_start', 'hide_after_end', 'is_active', 'image', 'remove_image', 'prefix', 'hide_submissions', 'staff_only', 'form', 'queue_type', 'limit', 'limit_period', 'check_text', 'user_rewardable_type', 'user_rewardable_id', 'user_quantity', 'character_rewardable_type', 'character_rewardable_id', 'character_quantity', 'limit_concurrent',
]);
if ($id && $service->updateQueue(Queue::find($id), $data, Auth::user())) {
flash('Queue updated successfully.')->success();
} elseif (!$id && $queue = $service->createQueue($data, Auth::user())) {
flash('Queue created successfully.')->success();

return redirect()->to('admin/data/queues/edit/'.$queue->id);
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
flash($error)->error();
}
}

return redirect()->back();
}

/**
* Gets the queue deletion modal.
*
* @param int $id
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function getDeleteQueue($id) {
$queue = Queue::find($id);

return view('admin.queues._delete_queue', [
'queue' => $queue,
]);
}

/**
* Deletes a queue.
*
* @param App\Services\QueueService $service
* @param int $id
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postDeleteQueue(Request $request, QueueService $service, $id) {
if ($id && $service->deleteQueue(Queue::find($id))) {
flash('Queue deleted successfully.')->success();
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
flash($error)->error();
}
}

return redirect()->to('admin/data/queues');
}

/**
* Edits a queue's type data.
*
* @param App\Services\QueueService $service
* @param int $id
*
* @return \Illuminate\Http\RedirectResponse
*/
public function postEditType(Request $request, QueueService $service, $id) {
$data = $request->all();
if ($service->updateType(Queue::find($id), $data)) {
flash('Queue type settings updated successfully.')->success();

return redirect()->back();
} else {
foreach ($service->errors()->getMessages()['error'] as $error) {
flash($error)->error();
}
}

return redirect()->back();
}
}
4 changes: 4 additions & 0 deletions app/Http/Controllers/Admin/HomeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
use App\Models\Character\CharacterTransfer;
use App\Models\Currency\Currency;
use App\Models\Gallery\GallerySubmission;
use App\Models\Queue\Queue;
use App\Models\Queue\QueueSubmission;
use App\Models\Report\Report;
use App\Models\Submission\Submission;
use App\Models\Trade\Trade;
Expand Down Expand Up @@ -44,6 +46,8 @@ public function getIndex() {
'galleryCurrencyAwards' => $galleryCurrencyAwards,
'gallerySubmissionCount' => GallerySubmission::collaboratorApproved()->where('status', 'Pending')->count(),
'galleryAwardCount' => GallerySubmission::requiresAward()->where('is_valued', 0)->count(),
'queueCount' => QueueSubmission::where('status', 'Pending')->whereNotNull('queue_id')->count(),
'queues' => Queue::query()->active()->get(),
]);
}

Expand Down
Loading