Files
NSG_PORTAL_V2/components/dynamic-page/page-component/templates/articles/individuals/Card.vue
T

125 lines
3.9 KiB
Vue
Raw Normal View History

2024-05-30 18:06:50 +07:00
<script lang="ts" setup>
import { enumPageComponentTemplates } from "@/definitions/enum";
import { DEFAULT_QUERY_DROP, getInputValue } from '@/utils/parseSQL';
const props = defineProps<{
dataResult?: any
dataType?: any
dataQuery?: any
layout?: string
}>()
const LAYOUT_PARSE = computed(() => {
const parseLayout = props.layout?.split('-')?.map((_layout : any) => {
const parseItem = _layout.split(':')
return {
[parseItem[0]]: parseItem[0] === 'HIDE' ? parseItem[1].split(',') : parseItem[1],
};
}) || [];
return Object.assign({}, ...parseLayout);
})
const emit = defineEmits(['selectComponent', 'dropData']);
const selectComponent = () => {
emit('selectComponent');
}
const parseData = computed(() => {
if(!props.dataResult) return
const result = getInputValue(props.dataResult, 'OBJECT');
return result
})
const drop = (e: any) => {
if (e.dataTransfer.getData(`${enumPageComponentTemplates.ARTICLE}`)) {
const data = e.dataTransfer.getData(`${enumPageComponentTemplates.ARTICLE}`);
const { dataType, dataResult } = JSON.parse(data);
const dataQuery = DEFAULT_QUERY_DROP(dataType, dataResult.id);
emit('dropData', {
dataType,
dataResult,
dataQuery: dataQuery,
});
}
}
</script>
<template>
2024-05-30 21:32:51 +07:00
<article class="basic-article gap-x-4" :class="[LAYOUT_PARSE['LAYOUT'] || 'horizontal', !parseData && 'no-data', LAYOUT_PARSE['REVERSE'] ? 'reverse' : '']">
2024-05-30 18:06:50 +07:00
<div v-if="!LAYOUT_PARSE['HIDE'] || !LAYOUT_PARSE['HIDE'].includes('thumbnail')" class="basic-article_thumbnail">
<template v-if="parseData">
2024-05-31 12:49:28 +07:00
<img class="object-cover" :src="parseData.thumbnail ? parseData.thumbnail : '/images/default-thumbnail.jpg'" :alt="parseData.title?.replace(/<[^>]+>/g, '')" />
2024-05-30 18:06:50 +07:00
</template>
</div>
<div class="basic-article_content" :class="[!parseData && 'no-data']">
<div>
2024-05-30 21:32:51 +07:00
<template v-if="parseData">
2024-05-31 15:04:22 +07:00
<nuxt-link :to="`/bai-viet/${parseData.slug}`">
2024-06-03 12:27:58 +07:00
<h3 v-if="!LAYOUT_PARSE['HIDE'] || !LAYOUT_PARSE['HIDE'].includes('title')" class="mb-1 line-clamp-2 text-base font-700 hover:text-primary-600 transition-all duration-300">
2024-05-30 21:32:51 +07:00
{{ parseData.title?.replace(/<[^>]+>/g, '') }}
</h3>
</nuxt-link>
</template>
2024-05-31 00:46:43 +07:00
<p v-if="!LAYOUT_PARSE['HIDE'] || !LAYOUT_PARSE['HIDE'].includes('paragraph')" class="mb-0 line-clamp-3 sm:line-clamp-3 text-[14px]">
2024-05-30 18:06:50 +07:00
<template v-if="parseData">
2024-05-30 21:32:51 +07:00
<template v-if="parseData.intro">
{{ parseData.intro?.replace(/<[^>]+>/g, '') }}
</template>
<template v-if="parseData.sub">
{{ parseData.sub?.replace(/<[^>]+>/g, '') }}
</template>
2024-05-30 18:06:50 +07:00
</template>
</p>
</div>
</div>
</article>
</template>
<style lang="scss" scoped>
.basic-article {
display: grid;
height: 100%;
&.vertical {
2024-05-30 22:42:55 +07:00
@apply lg:grid-cols-1 sm:grid-cols-2;
2024-05-30 21:32:51 +07:00
.basic-article_content {
padding: 10px 0px;
}
2024-05-30 18:06:50 +07:00
}
&.horizontal {
grid-template-columns: 1fr 1fr;
2024-05-30 21:32:51 +07:00
.basic-article_content {
padding: 0px 0px;
}
2024-05-30 18:06:50 +07:00
&.reverse {
.basic-article_thumbnail {
grid-column: 2;
}
.basic-article_content {
grid-row: 1;
}
}
}
&_thumbnail {
flex: 1;
img {
width: 100%;
border-radius: 6px;
aspect-ratio: 16/10;
}
}
.empty-block {
background-color: #409eff;
height: 100px;
display: block;
}
}
</style>