Skip to content

Commit d2a0719

Browse files
AllanKoderCopilotCopilot
authored
News temp trending (#60)
* 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> * Apply automatic changes * Update resources/js/Components/NewsItem.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update resources/js/Components/NewsItem.vue Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Initial plan (#62) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Initial plan (#63) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Rename NewsItem component to TrendingResourceItem (#61) * Initial plan * Rename NewsItem.vue to TrendingResourceItem.vue and update all references Co-authored-by: AllanKoder <74692833+AllanKoder@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: AllanKoder <74692833+AllanKoder@users.noreply.github.com> * Quick npm update --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
1 parent 24612c2 commit d2a0719

File tree

7 files changed

+81
-63
lines changed

7 files changed

+81
-63
lines changed

app/Services/ComputerScienceResourceService.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use App\Exceptions\Resources\ResourceAlreadyCreatedException;
66
use App\Exceptions\Resources\ResourceInvalidTabException;
77
use App\Models\ComputerScienceResource;
8-
use App\Models\NewsPost;
98
use App\Models\ResourceEdits;
109
use App\Models\ResourceReview;
1110
use App\Services\SortingManagers\ResourceSortingManager;
@@ -18,6 +17,7 @@
1817

1918
class ComputerScienceResourceService
2019
{
20+
// TODO: Make a service for ComputerScienceResources
2121
public function __construct(
2222
protected CommentService $commentService,
2323
protected UpvoteService $upvoteService,
@@ -36,19 +36,22 @@ public function __construct(
3636
*/
3737
public function getIndexData(Request $request): array
3838
{
39-
$query = ComputerScienceResource::query();
39+
$resources_query = ComputerScienceResource::query();
4040

4141
// Apply filters and sorting through the dedicated filter service
4242
$filters = $request->query();
43-
$query = $this->filterService->applyFilters($query, $filters);
43+
$resources_query = $this->filterService->applyFilters($resources_query, $filters);
4444

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

47-
$news = NewsPost::limit(10)->get();
47+
// TODO (TEMP): will replace with user activity or something
48+
49+
$hot_resources_query = ComputerScienceResource::query()->with(['tags', 'votes', 'upvoteSummary', 'reviewSummary', 'commentsCountRelationship']);
50+
$hot_resources = $this->resourceSortingManager->applySort($hot_resources_query, 'hot')->limit(10)->get();
4851

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) {

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/js/Components/News/NewsDialog.vue

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
<script setup>
22
import DialogModal from '@/Components/DialogModal.vue';
3-
import NewsItem from "@/Components/NewsItem.vue";
3+
import TrendingResourceItem from "@/Components/TrendingResourceItem.vue";
44
import { Icon } from "@iconify/vue";
55
66
defineProps({
77
show: {
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">
32-
<NewsItem
33-
v-for="(news, index) in newsItems"
32+
<TrendingResourceItem
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>
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<script setup>
22
import { ref } from "vue";
3-
import NewsItem from "@/Components/NewsItem.vue";
3+
import TrendingResourceItem from "@/Components/TrendingResourceItem.vue";
44
import NewsDialog from "@/Components/News/NewsDialog.vue";
55
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">
33-
<NewsItem
34-
v-for="(news, index) in newsPosts"
32+
<div class="space-y-4" v-if="hotResources.length > 0">
33+
<TrendingResourceItem
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 -->
51-
<NewsDialog
50+
<!-- Trending Resources Dialog for Mobile -->
51+
<!-- <NewsDialog
5252
:show="showNewsDialog"
53-
:news-items="newsPosts"
53+
:resource-items="hotResources"
5454
@close="showNewsDialog = false"
55-
/>
55+
/> -->
5656
</template>

resources/js/Components/NewsItem.vue

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<script setup>
2+
import { Link } from '@inertiajs/vue3';
3+
4+
defineProps({
5+
resource: {
6+
type: Object,
7+
required: true,
8+
},
9+
});
10+
</script>
11+
12+
<template>
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+
/>
34+
35+
<p class="text-sm text-gray-600 dark:text-gray-300 line-clamp-3 mb-2">
36+
{{ resource.excerpt || resource.description }}
37+
</p>
38+
39+
</div>
40+
</Link>
41+
</template>

resources/js/Pages/Resources/Index.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import ResourcesTable from "@/Components/Resources/ResourcesTable.vue";
77
import NewsSection from "@/Components/News/NewsSection.vue";
88
const props = defineProps({
99
resources: Object,
10-
news_posts: Array,
10+
hot_resources: Array,
1111
});
1212
1313
</script>
@@ -36,7 +36,8 @@ const props = defineProps({
3636
<ResourcesTable :resources="props.resources" />
3737
</section>
3838

39-
<NewsSection :news-posts="news_posts" />
39+
<!-- Trending Resources Section -->
40+
<NewsSection :hot-resources="props.hot_resources" />
4041
</div>
4142
</div>
4243
</AppLayout>

0 commit comments

Comments
 (0)