Add wagtail image component. And modify resolvers

This commit is contained in:
Lorenz Padberg 2024-04-08 18:36:20 +02:00
parent 3600c8b28d
commit 080d9f92d0
5 changed files with 80 additions and 12 deletions

View File

@ -28,11 +28,10 @@
{{ module.title }} {{ module.title }}
</h1> </h1>
<div class="module__hero"> <div class="module__hero">
<img
:src="module.heroImage"
alt="" <wagtail-image class="module__hero-image" :src="module.heroImage"></wagtail-image>
class="module__hero-image"
/>
<h5 <h5
class="module__hero-source" class="module__hero-source"
v-if="module.heroSource" v-if="module.heroSource"
@ -116,6 +115,7 @@ import highlightSidebar from '@/helpers/highlight-sidebar';
import { doUpdateHighlight } from '@/graphql/mutations'; import { doUpdateHighlight } from '@/graphql/mutations';
import Mark from 'mark.js'; import Mark from 'mark.js';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import WagtailImage from "@/components/ui/WagtailImage.vue";
export interface Props { export interface Props {
module: ModuleNode; module: ModuleNode;

View File

@ -3,10 +3,11 @@
:to="moduleLink" :to="moduleLink"
:class="['module-teaser', { 'module-teaser--small': !teaser }]" :class="['module-teaser', { 'module-teaser--small': !teaser }]"
> >
<div <!-- <div-->
:style="{ backgroundImage: 'url(' + heroImage + ')' }" <!-- :style="{ backgroundImage: 'url(' + heroImage + ')' }"-->
class="module-teaser__image" <!-- class="module-teaser__image"-->
/> <!-- />-->
<wagtail-image class="module-teaser__image" :src="heroImage"></wagtail-image>
<div class="module-teaser__body"> <div class="module-teaser__body">
<div class="module-teaser__content"> <div class="module-teaser__content">
<h3 class="module-teaser__content-meta-title">{{ metaTitle }}</h3> <h3 class="module-teaser__content-meta-title">{{ metaTitle }}</h3>
@ -33,6 +34,7 @@
import Pill from '@/components/ui/Pill.vue'; import Pill from '@/components/ui/Pill.vue';
import { ModuleCategoryNode, ModuleLevelNode } from '@/__generated__/graphql'; import { ModuleCategoryNode, ModuleLevelNode } from '@/__generated__/graphql';
import { computed } from '@vue/reactivity'; import { computed } from '@vue/reactivity';
import WagtailImage from "@/components/ui/WagtailImage.vue";
export interface Props { export interface Props {
metaTitle: string; metaTitle: string;

View File

@ -0,0 +1,56 @@
<template>
<img :src="modifiedUrl" alt="Responsive Image" ref="imgElement" />
</template>
<script>
export default {
props: ['src'],
data() {
return {
width: 0,
height: 0
};
},
computed: {
modifiedUrl() {
// Assuming the server accepts dimensions as query parameters
// Check if dimensions are known, otherwise return the original src\
console.log("x, y, hdpi, retina:", this.width, this.height, this.isHighDensity(), this.isRetina())
// if (this.height && this.width){
// return this.src.replace('original', 'max-' + this.width + 'x' + this.height)
//
// }
const density = this.isHighDensity() ? 2 :1
if (this.width) {
return this.src.replace('original', 'width-' + this.width * density)
}
if (this.height)
return this.src.replace('original', 'height-' + this.height * density)
return this.src
}
},
mounted() {
this.updateDimensions();
},
methods: {
updateDimensions() {
const { clientWidth, clientHeight } = this.$refs.imgElement.parentElement;
this.width = clientWidth;
this.height = clientHeight;
},
isHighDensity(){
return ((window.matchMedia && (window.matchMedia('only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3)').matches)) || (window.devicePixelRatio && window.devicePixelRatio > 1.3));
},
isRetina(){
return ((window.matchMedia && (window.matchMedia('only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx), only screen and (min-resolution: 75.6dpcm)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2)').matches)) || (window.devicePixelRatio && window.devicePixelRatio >= 2)) && /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
}
}
};
</script>

View File

@ -1,6 +1,7 @@
import graphene import graphene
from graphene import relay from graphene import relay
from wagtail.images.models import Image
from api.graphene_wagtail import generate_image_url
class ModuleInterface(relay.Node): class ModuleInterface(relay.Node):
pk = graphene.Int() pk = graphene.Int()
@ -14,4 +15,5 @@ class ModuleInterface(relay.Node):
@staticmethod @staticmethod
def resolve_hero_image(parent, info, **kwargs): def resolve_hero_image(parent, info, **kwargs):
if parent.hero_image: if parent.hero_image:
return parent.hero_image.file.url image = Image.objects.get(id=parent.hero_image.id)
return generate_image_url(image, 'original')

View File

@ -6,23 +6,31 @@ from django.views.generic import RedirectView
from wagtail.admin import urls as wagtailadmin_urls from wagtail.admin import urls as wagtailadmin_urls
from wagtail import urls as wagtail_urls from wagtail import urls as wagtail_urls
from wagtail.documents import urls as wagtaildocs_urls from wagtail.documents import urls as wagtaildocs_urls
#from wagtail.images import urls as wagtailimages_urls
from wagtail.images.views.serve import ServeView
from wagtailautocomplete.urls.admin import urlpatterns as autocomplete_admin_urls from wagtailautocomplete.urls.admin import urlpatterns as autocomplete_admin_urls
from core import views from core import views
from core.views import override_wagtailadmin_explore_default_ordering from core.views import override_wagtailadmin_explore_default_ordering, user_image
urlpatterns = [ urlpatterns = [
# django admin # django admin
re_path(r"^guru/", admin.site.urls), re_path(r"^guru/", admin.site.urls),
re_path(r"^statistics/", include("statistics.urls", namespace="statistics")), re_path(r"^statistics/", include("statistics.urls", namespace="statistics")),
# wagtail # wagtail
re_path(r'^api/images/([^/]*)/(\d*)/([^/]*)/[^/]*$', ServeView.as_view(action='redirect'), name='wagtailimages_serve'),
re_path(r"^cms/autocomplete/", include(autocomplete_admin_urls)), re_path(r"^cms/autocomplete/", include(autocomplete_admin_urls)),
re_path(r"^cms/pages/(\d+)/$", override_wagtailadmin_explore_default_ordering), re_path(r"^cms/pages/(\d+)/$", override_wagtailadmin_explore_default_ordering),
re_path(r"^cms/", include(wagtailadmin_urls)), re_path(r"^cms/", include(wagtailadmin_urls)),
re_path(r"^documents/", include(wagtaildocs_urls)), re_path(r"^documents/", include(wagtaildocs_urls)),
#re_path(r"^images/", include(wagtailimages_urls)),
# graphql backend # graphql backend
re_path(r"^api/", include("api.urls", namespace="api")), re_path(r"^api/", include("api.urls", namespace="api")),
# favicon # favicon
re_path( re_path(
r"^favicon\.ico$", r"^favicon\.ico$",