Skip to content

Commit

Permalink
Merge pull request #13 from openobserve/feature-blogdata
Browse files Browse the repository at this point in the history
Feature blogdata
  • Loading branch information
ktx-riddhi authored Feb 3, 2025
2 parents 30e47aa + 628aa29 commit dbf5f28
Show file tree
Hide file tree
Showing 17 changed files with 657 additions and 380 deletions.
25 changes: 12 additions & 13 deletions src/components/blogs/BlogListing.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ interface Blog {
description: string;
imageUrl: string;
link: string;
slug: string;
}
const props = defineProps({
sectionData: {
Expand Down Expand Up @@ -32,37 +33,35 @@ const props = defineProps({
<template>
<div class="min-h-screen">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 items-stretch">
<a
v-for="blog in sectionData"
:key="blog.title"
:href="blog.link"
target="_blank"
:href="`/blog/${blog.slug}`"
rel="noopener noreferrer"
:class="[
cardBgColor,
'max-w-sm rounded-xl overflow-hidden transition-transform block',
'flex flex-col rounded-xl overflow-hidden transition-transform h-[400px]',
]"
>
<div class="h-48 overflow-hidden">

<div class="h-48 w-full flex-shrink-0">
<img
:src="blog.imageUrl"
:src="blog.imageUrl || blog.image.formats.thumbnail.url || ''"
:alt="blog.title"
class="w-full h-full object-cover"
/>
</div>
<div class="p-6">
<h3 :class="[titleTextColor, 'text-xl font-bold mb-3']">
<div class="flex flex-col flex-grow p-6">
<h3 :class="[titleTextColor, 'text-xl font-bold mb-2 line-clamp-2']">
{{ blog.title }}
</h3>
<p :class="[descriptionTextColor, 'mb-4 text-sm']">
<p :class="[descriptionTextColor, 'mb-4 text-sm line-clamp-3 flex-grow']">
{{ blog.description }}
</p>
<span
:class="[linkColor, 'text-sm font-semibold hover:opacity-80']"
>
<!-- <a :class="[linkColor, 'text-sm font-semibold hover:opacity-80 mt-auto']" :href="`/blogs/${blog.slug}`">
LEARN MORE
</span>
</a> -->
</div>
</a>
</div>
Expand Down
166 changes: 94 additions & 72 deletions src/components/blogs/BlogPagination.vue
Original file line number Diff line number Diff line change
@@ -1,80 +1,102 @@
<template>
<div class="flex justify-center mt-8">
<!-- Previous Button -->
<section class="container mx-auto flex justify-center mt-8">
<!-- Previous Button -->
<button
class="px-4 py-2 mx-2 border border-blue-400 text-blue-400 rounded-lg disabled:opacity-50 hover:bg-blue-50"
:disabled="currentPage === 1"
@click="changePage(currentPage - 1)"
>
Previous
</button>

<!-- Page Number Buttons -->
<div class="flex items-center">
<button
class="px-4 py-2 mx-2 border border-blue-400 text-blue-400 rounded-lg disabled:opacity-50"
:disabled="currentPage === 1"
@click="changePage(currentPage - 1)"
v-for="page in displayedPages"
:key="page"
:class="[
'px-4 py-2 mx-1 rounded-lg',
page === currentPage
? 'bg-blue-400 text-white'
: 'text-gray-500 hover:bg-blue-50'
]"
@click="changePage(page)"
>
Previous
</button>

<!-- Page Number Buttons -->
<div class="flex items-center">
<button
v-for="page in pages"
:key="page"
:class="['px-4 py-2 mx-1', { 'text-blue-400': page === currentPage, 'text-gray-500': page !== currentPage }]"
@click="changePage(page)"
>
{{ page }}
</button>
</div>

<!-- Next Button -->
<button
class="px-4 py-2 mx-2 border border-blue-400 text-blue-400 rounded-lg disabled:opacity-50"
:disabled="currentPage === totalPages"
@click="changePage(currentPage + 1)"
>
Next
{{ page }}
</button>
</div>
</template>

<script setup>
import { ref, computed } from "vue";

<!-- Next Button -->
<button
class="px-4 py-2 mx-2 border border-blue-400 text-blue-400 rounded-lg disabled:opacity-50 hover:bg-blue-50"
:disabled="currentPage === totalPages"
@click="changePage(currentPage + 1)"
>
Next
</button>
</section>
</template>

<script setup>
import { ref, computed, onMounted } from "vue";
const props = defineProps({
totalItems: {
type: Number,
required: true,
},
itemsPerPage: {
type: Number,
required: true,
},
currentPage: {
type: Number,
required: true,
default: 1,
},
});
const emit = defineEmits(["page-changed"]);
const currentPageRef = ref(props.currentPage);
const totalPages = computed(() => Math.ceil(props.totalItems / props.itemsPerPage));
// Compute the pages to display (show 5 pages at a time)
const displayedPages = computed(() => {
const pages = [];
let start = Math.max(1, currentPageRef.value - 2);
let end = Math.min(totalPages.value, start + 4);
// Pagination state
const props = defineProps({
totalItems: {
type: Number,
required: true,
},
itemsPerPage: {
type: Number,
required: true,
},
});
const emit = defineEmits(["page-changed"]);
const currentPage = ref(1);
const totalPages = ref(Math.ceil(props.totalItems / props.itemsPerPage));
// Computed property to generate page numbers
const pages = computed(() => {
const pageNumbers = [];
for (let i = 1; i <= totalPages.value; i++) {
pageNumbers.push(i);
}
return pageNumbers;
});
// Change page function
const changePage = (newPage) => {
if (newPage >= 1 && newPage <= totalPages.value) {
currentPage.value = newPage;
emit("page-changed", currentPage.value);
}
};
</script>

<style scoped>
button {
transition: background-color 0.2s ease;
// Adjust start if we're near the end
if (end === totalPages.value) {
start = Math.max(1, end - 4);
}
for (let i = start; i <= end; i++) {
pages.push(i);
}
button:hover {
background-color: #1e40af;
return pages;
});
// Change page function
const changePage = async (newPage) => {
if (newPage >= 1 && newPage <= totalPages.value) {
currentPageRef.value = newPage;
// Update URL
const newUrl = newPage === 1
? '/blog'
: `/blog/page/${newPage}`;
console.log('newUrl', newUrl)
window.location.assign(newUrl);
// Emit event for parent component
emit("page-changed", newPage);
window.scrollTo({ top: 0, behavior: 'smooth' });
}
</style>

};
// Update local state when prop changes
onMounted(() => {
currentPageRef.value = props.currentPage;
});
</script>
21 changes: 11 additions & 10 deletions src/components/blogs/BlogsListingMobileView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -32,39 +32,40 @@ const props = defineProps({
<div class="min-h-screen">
<div class="container mx-auto px-1">
<div class="grid grid-rows-1 lg:grid-rows-2 gap-8">

<a
v-for="blog in sectionData"
:key="blog.title"
:href="blog.link"
target="_blank"
:href="`/blog/${blog.slug}`"
rel="noopener noreferrer"
:class="[
cardBgColor,
'rounded-xl overflow-hidden transition-transform hover:scale-105 flex flex-rows md:flex-row',
]"
>
<!-- Left Side - Image -->
<div class="w-full h-48 md:h-auto relative">
<div class="w-full md:h-auto relative">
<img
:src="blog.imageUrl"
:src="blog.imageUrl || blog.image.formats.thumbnail.url || ''"
:alt="blog.title"
class="w-full h-full object-cover absolute inset-0"
class="w-full h-full object-cover"
/>
</div>

<!-- Right Side - Content -->
<div class="w-full p-6 flex flex-col justify-between">
<div>
<h3 :class="[titleTextColor, 'text-xl font-bold mb-3']">
<h6 :class="[titleTextColor, 'text-md font-bold mb-3']">
{{ blog.title }}
</h3>
<p :class="[descriptionTextColor, 'mb-4 text-sm line-clamp-3']">
</h6>
<p :class="[descriptionTextColor, 'mb-2 text-sm line-clamp-2']">
{{ blog.description }}
</p>
</div>
<span
:class="[linkColor, 'text-sm font-semibold hover:opacity-80 inline-block']"
:class="[
linkColor,
'text-sm font-semibold hover:opacity-80 inline-block',
]"
>
LEARN MORE
</span>
Expand Down
45 changes: 22 additions & 23 deletions src/components/blogs/SingleAuthorDetails.vue
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
<script setup lang="ts">
import CustomSection from "../core/CustomSection.vue";
interface Blog {
title: string;
description: string;
imageUrl: string;
link: string;
author: string;
}
const props = defineProps({
blog: {
type: Object as () => Blog,
author: {
type: Array,
required: true,
},
titleTextColor: {
Expand All @@ -33,33 +27,38 @@ const props = defineProps({
</script>

<template>
<CustomSection class="px-4 md:mx-auto">
<p class="text-white px-2">About Other</p>
<section class="container mx-auto px-4 sm:px-6 lg:px-8 xl:px-11 w-full flex flex-col justify-start">
<p class="text-white px-2 py-2">About the Author</p>

<div :class="[cardBgColor, 'rounded-xl overflow-hidden flex md:flex-row']">
<!-- Left Side - Image -->
<div class="w-full md:w-1/6 h-40 md:h-auto relative">
<div :class="[cardBgColor, 'rounded-xl overflow-hidden flex md:flex-row']">
<!-- Left Side - Profile Image (Placeholder if not available) -->
<div class="w-full md:w-1/6 h-40 md:h-auto relative flex items-center justify-center bg-gray-800">
<img
:src="blog.imageUrl"
:alt="blog.title"
v-if="author.imageUrl"
:src="author.imageUrl"
:alt="author.name"
class="w-full h-full object-cover absolute inset-0"
/>
<div v-else class="text-white text-2xl font-bold">{{ author.name}}</div>
</div>

<!-- Right Side - Content -->
<div class="w-full md:w-2/3 p-6 h-40 flex flex-col justify-between">
<div>
<h3 :class="[titleTextColor, 'text-xl font-bold mb-3 underline']">
{{ blog.author }}
{{ author.name }}
</h3>
<p
class="mb-4 text-sm break-words line-clamp-3"
:class="[descriptionTextColor]"
>
{{ blog.description }}
<p class="mb-4 text-sm break-words line-clamp-3" :class="[descriptionTextColor]">
{{ author.bio }}
</p>
</div>

<!-- Social Links -->
<!-- <div class="flex space-x-4">
<a v-if="author.linkedInUrl" :href="author.linkedInUrl" target="_blank" :class="[linkColor, 'underline']">LinkedIn</a>
<a v-if="author.twitterUrl" :href="author.twitterUrl" target="_blank" :class="[linkColor, 'underline']">Twitter</a>
</div> -->
</div>
</div>
</CustomSection>
</section>
</template>
8 changes: 4 additions & 4 deletions src/components/cardComponent/RightSideCard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ const props = defineProps({
</script>

<template>
<div class="rounded-lg h-full">
<div class="rounded-lg h-full ">
<div
class="group custom-hover flex rounded-lg h-full p-2 lg:p-4 space-x-2 lg:space-x-4 bg-gradient-gray transition-all duration-300"
class="group custom-hover min-h-[250px] flex rounded-lg h-full p-2 lg:p-4 space-x-2 lg:space-x-4 bg-gradient-gray transition-all duration-300"
>
<div class="w-full lg:w-1/3 group-hover:grayscale-0 group-hover:filter">
<div class="w-full lg:w-32 group-hover:grayscale-0 group-hover:filter">
<CustomImage
image="card.image"
:image="card.image"
:altText="card.title"
cssClass="w-full h-full object-cover rounded-lg grayscale group-hover:grayscale-0 transition-all duration-300"
/>
Expand Down
3 changes: 1 addition & 2 deletions src/components/core/CustomImage.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,12 @@ const props = defineProps({
},
});
console.log(props?.image,"Props Image Classs");
</script>

<template>
<img
:src="image?.url || '/img/default_project_image.png'"
:src="image?.url || image ||'/img/default_project_image.png'"
:alt="altText || image?.alt || 'Default Image'"
:class="cssClass"
/>
Expand Down
Loading

0 comments on commit dbf5f28

Please sign in to comment.