Skip to content

Commit a22f0c6

Browse files
AllanKoderCopilot
andcommitted
Resource Edits, and Errors Flash (#59)
* changes * Apply automatic changes * Update app/Http/Controllers/ResourceEditsController.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 2748442 commit a22f0c6

11 files changed

Lines changed: 74 additions & 45 deletions

File tree

app/Http/Controllers/ResourceEditsController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public function store(ComputerScienceResource $computerScienceResource, StoreRes
6767
'data' => $validatedData,
6868
]);
6969

70-
return redirect()->back()->withErrors(['error' => 'Failed to create resource edit. Please try again.']);
70+
return redirect()->back()->with('error', 'Failed to create resource edit. Please try again.');
7171
}
7272
}
7373

@@ -137,7 +137,7 @@ public function merge(ResourceEdits $resourceEdits)
137137
'user_id' => Auth::id(),
138138
]);
139139

140-
return redirect()->back()->withErrors(['error' => 'Failed to merge resource edits. Please try again.']);
140+
return redirect()->back()->with('error', 'Failed to merge resource edits. Please try again.');
141141
}
142142
}
143143
}

app/Http/Middleware/HandleInertiaRequests.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public function share(Request $request): array
3939
'flash' => [
4040
'success' => $request->session()->get('success'),
4141
'warning' => $request->session()->get('warning'),
42+
'error' => $request->session()->get('error'),
4243
],
4344
'config' => [
4445
'COMMENT_MAX_DEPTH' => config('comment.max_depth'),

app/Models/ResourceEdits.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public function sluggable(): array
6060
{
6161
return [
6262
'slug' => [
63-
'source' => ['edit_title', 'id'],
63+
'source' => ['edit_title'],
6464
'unique' => true,
6565
],
6666
];

app/Services/ComputerScienceResourceService.php

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
class ComputerScienceResourceService
2020
{
21+
// TODO: Make a service for ComputerScienceResources
2122
public function __construct(
2223
protected CommentService $commentService,
2324
protected UpvoteService $upvoteService,
@@ -36,19 +37,21 @@ public function __construct(
3637
*/
3738
public function getIndexData(Request $request): array
3839
{
39-
$query = ComputerScienceResource::query();
40+
$resources_query = ComputerScienceResource::query();
4041

4142
// Apply filters and sorting through the dedicated filter service
4243
$filters = $request->query();
43-
$query = $this->filterService->applyFilters($query, $filters);
44+
$resources_query = $this->filterService->applyFilters($resources_query, $filters);
4445

45-
$resources = $query->paginate(20)->appends($request->query());
46+
$resources = $resources_query->paginate(20)->appends($request->query());
4647

47-
$news = NewsPost::limit(10)->get();
48+
// TODO (TEMP): will replace with user activity or something
4849

50+
$hot_resources_query = ComputerScienceResource::query()->with(['tags', 'votes', 'upvoteSummary', 'reviewSummary', 'commentsCountRelationship']);
51+
$hot_resources = $this->resourceSortingManager->applySort($hot_resources_query, 'hot')->limit(10)->get();
4952
return [
5053
'resources' => $resources,
51-
'news_posts' => $news,
54+
'hot_resources' => $hot_resources,
5255
];
5356
}
5457

@@ -152,7 +155,7 @@ function () use ($computerScienceResource, $sortBy, $request) {
152155
function () use ($computerScienceResource, $sortBy, $request) {
153156
try {
154157
$query = ResourceEdits::whereBelongsTo($computerScienceResource);
155-
$query = $this->resourceSortingManager->applySort($query, $sortBy, ResourceEdits::class);
158+
$query = $this->resourceSortingManager->applySort($query, $sortBy);
156159

157160
return $query->with('user')->paginate(10)->appends($request->query());
158161
} catch (Throwable $e) {

resources/js/Components/Navigation/BackButton.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ const props = defineProps({
1818
<slot />
1919
</div>
2020
</Link>
21-
<div class="mt-2 border-t border-gray-200 dark:border-gray-700"></div>
21+
<div class="my-2 border-t border-gray-200 dark:border-gray-700"></div>
2222
</div>
2323
</template>

resources/js/Components/News/NewsDialog.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ defineProps({
88
type: Boolean,
99
required: true
1010
},
11-
newsItems: {
11+
resourceItems: {
1212
type: Array,
1313
required: true
1414
}
@@ -21,18 +21,18 @@ defineEmits(['close']);
2121
<DialogModal :show="show" @close="$emit('close')" max-width="lg">
2222
<template #title>
2323
<div class="bg-secondary dark:bg-gray-700 -m-6 p-6 mb-0 flex items-center gap-2">
24-
<Icon icon="mdi:newspaper" class="w-6 h-6 text-primary dark:text-white" />
25-
<h2 class="text-xl font-bold text-primary dark:text-white">Latest News</h2>
24+
<Icon icon="mdi:trending-up" class="w-6 h-6 text-primary dark:text-white" />
25+
<h2 class="text-xl font-bold text-primary dark:text-white">Trending Resources</h2>
2626
</div>
2727
</template>
2828

2929
<template #content>
3030
<div class="divide-y divide-secondary dark:divide-gray-700 -mx-6">
3131
<div class="space-y-0 max-h-[60vh] overflow-y-auto">
3232
<NewsItem
33-
v-for="(news, index) in newsItems"
33+
v-for="(resource, index) in resourceItems"
3434
:key="index"
35-
:news="news"
35+
:resource="resource"
3636
class="px-6 hover:bg-secondary/50 dark:hover:bg-gray-700/50 transition-colors duration-200"
3737
/>
3838
</div>

resources/js/Components/News/NewsSection.vue

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Icon } from "@iconify/vue";
66
import EmptyState from "../EmptyState.vue";
77
88
const props = defineProps({
9-
newsPosts: {
9+
hotResources: {
1010
type: Array,
1111
required: true,
1212
},
@@ -16,41 +16,41 @@ const showNewsDialog = ref(false);
1616
</script>
1717

1818
<template>
19-
<!-- News Section - Desktop -->
19+
<!-- Trending Resources Section - Desktop -->
2020
<aside
2121
class="hidden h-fit lg:block w-1/4 bg-white dark:bg-gray-800 overflow-hidden shadow-xl sm:rounded-lg p-6"
2222
>
2323
<div
2424
class="bg-secondary dark:bg-gray-700 -m-6 p-4 mb-0 flex items-center gap-2"
2525
>
2626
<Icon
27-
icon="mdi:newspaper"
27+
icon="mdi:trending-up"
2828
class="w-6 h-6 text-primary dark:text-white"
2929
/>
30-
<h2 class="font-bold text-primary dark:text-white">Latest News</h2>
30+
<h2 class="font-bold text-primary dark:text-white">Trending Resources</h2>
3131
</div>
32-
<div class="space-y-4" v-if="newsPosts.length > 0">
32+
<div class="space-y-4" v-if="hotResources.length > 0">
3333
<NewsItem
34-
v-for="(news, index) in newsPosts"
34+
v-for="(resource, index) in hotResources"
3535
:key="index"
36-
:news="news"
36+
:resource="resource"
3737
/>
3838
</div>
39-
<EmptyState class="mt-6" v-else icon="mdi-newspaper" title="No Recent News" />
39+
<EmptyState class="mt-6" v-else icon="mdi:trending-up" title="No Trending Resources" />
4040
</aside>
4141

42-
<!-- News Button - Mobile -->
42+
<!-- Trending Resources Button - Mobile -->
4343
<button
4444
class="fixed bottom-4 right-4 lg:hidden bg-primary text-white rounded-full p-4 shadow-lg hover:bg-primaryDark focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary z-50"
4545
@click="showNewsDialog = true"
4646
>
47-
<Icon icon="mdi:newspaper" class="w-6 h-6" />
47+
<Icon icon="mdi:trending-up" class="w-6 h-6" />
4848
</button>
4949

50-
<!-- News Dialog for Mobile -->
50+
<!-- Trending Resources Dialog for Mobile -->
5151
<NewsDialog
5252
:show="showNewsDialog"
53-
:news-items="newsPosts"
53+
:resource-items="hotResources"
5454
@close="showNewsDialog = false"
5555
/>
5656
</template>
Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,41 @@
11
<script setup>
2+
import { Link } from '@inertiajs/vue3';
3+
24
defineProps({
3-
news: {
5+
resource: {
46
type: Object,
57
required: true,
68
},
79
});
810
</script>
911

1012
<template>
11-
<div class="my-4">
12-
<h3 class="font-bold mb-2 text-lg">
13-
{{ news.title }}
14-
</h3>
13+
<Link :href="route('resources.show', { slug: resource.slug }) || '#'" target="_blank" rel="noopener noreferrer">
14+
<div class="my-4 border hover:bg-gray-50 dark:hover:bg-gray-700 p-2 rounded-sm transition-colors cursor-pointer">
15+
<div class="flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400 mb-1">
16+
<span v-if="resource.upvotes_count || resource.vote_score" class="flex items-center gap-1">
17+
<svg class="w-4 h-4 text-orange-500" fill="currentColor" viewBox="0 0 20 20">
18+
<path d="M2 10.5a1.5 1.5 0 113 0v6a1.5 1.5 0 01-3 0v-6zM6 10.333v5.43a2 2 0 001.106 1.79l.05.025A4 4 0 008.943 18h5.416a2 2 0 001.962-1.608l1.2-6A2 2 0 0015.56 8H12V4a2 2 0 00-2-2 1 1 0 00-1 1v.667a4 4 0 01-.8 2.4L6.8 7.933a4 4 0 00-.8 2.4z" />
19+
</svg>
20+
{{ resource.upvotes_count || resource.vote_score }}
21+
</span>
22+
</div>
23+
24+
<h3 class="font-bold mb-2 text-md dark:text-white line-clamp-2">
25+
{{ resource.name }}
26+
</h3>
27+
28+
<img
29+
v-if="resource.image_url "
30+
:src="resource.image_url"
31+
:alt="resource.name"
32+
class="w-full h-32 object-cover rounded mb-2"
33+
/>
1534

16-
<img
17-
v-if="news.thumbnail_url"
18-
:src="news.thumbnail_url"
19-
:alt="news.title"
20-
class="w-full h-48 object-cover rounded mb-2"
21-
/>
35+
<p class="text-sm text-gray-600 dark:text-gray-300 line-clamp-3 mb-2">
36+
{{ resource.excerpt || resource.description }}
37+
</p>
2238

23-
<p class="text-sm text-gray-600">
24-
{{ news.excerpt }}
25-
</p>
26-
</div>
39+
</div>
40+
</Link>
2741
</template>

resources/js/Components/ToastHandler.vue

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ watch(
2828
detail: flash.warning,
2929
life: TOAST_LIFETIME,
3030
});
31+
32+
} else if (flash.error) {
33+
toast.add({
34+
severity: "error",
35+
summary: "Error",
36+
detail: flash.error,
37+
life: TOAST_LIFETIME,
38+
});
3139
}
3240
},
3341
{ deep: true },

resources/js/Pages/ResourceEdits/Create.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ const submit = async () => {
155155
tab: 'edits',
156156
})
157157
"
158-
/>
158+
>
159+
<span class="my-auto">Back to {{ props.resource.name }}</span>
160+
</BackButton>
159161
<FormSaverChip
160162
:is-saved="isSavedToLocalStorage"
161163
:has-content="hasFormContent"

0 commit comments

Comments
 (0)