bx-1379-redesign #15
|
@ -47,6 +47,7 @@ class Element3D(models.Model):
|
||||||
|
|
||||||
class Scene3D(models.Model):
|
class Scene3D(models.Model):
|
||||||
name = models.CharField(max_length=120)
|
name = models.CharField(max_length=120)
|
||||||
|
description = models.TextField(blank=True, null=True)
|
||||||
elements = models.ManyToManyField(Element3D)
|
elements = models.ManyToManyField(Element3D)
|
||||||
env = models.ForeignKey(Environment, models.RESTRICT, blank=True, null=True)
|
env = models.ForeignKey(Environment, models.RESTRICT, blank=True, null=True)
|
||||||
|
|
||||||
|
@ -73,33 +74,33 @@ def maximum_size_validator(image):
|
||||||
|
|
||||||
|
|
||||||
class ClickableArea(models.Model):
|
class ClickableArea(models.Model):
|
||||||
name = models.CharField("название", max_length=255)
|
name = models.CharField(
|
||||||
description = models.TextField("описание")
|
"Название",
|
||||||
object_name = models.CharField("название объекта", max_length=255)
|
max_length=255,
|
||||||
target_name = models.CharField(
|
help_text="Название кликабельной области",
|
||||||
max_length=200,
|
|
||||||
blank=True,
|
|
||||||
null=True,
|
|
||||||
)
|
)
|
||||||
|
description = models.TextField(
|
||||||
|
"Описание",
|
||||||
|
help_text="Описание кликабельной области",
|
||||||
|
)
|
||||||
|
|
||||||
target = models.ForeignKey(
|
target = models.ForeignKey(
|
||||||
Scene3D,
|
Scene3D,
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
related_name="clickable_areas",
|
related_name="clickable_areas",
|
||||||
blank=True,
|
blank=True,
|
||||||
null=True,
|
null=True,
|
||||||
|
help_text="На какую сцену ведет клик",
|
||||||
)
|
)
|
||||||
source = models.ForeignKey(
|
source = models.ForeignKey(
|
||||||
Element3D,
|
Element3D,
|
||||||
on_delete=models.PROTECT,
|
on_delete=models.PROTECT,
|
||||||
|
help_text="В каком элементе искать object_name",
|
||||||
)
|
)
|
||||||
image = models.ImageField(
|
object_name = models.CharField(
|
||||||
"Картинка",
|
"Название объекта",
|
||||||
upload_to=group_based_upload_to,
|
max_length=255,
|
||||||
validators=[
|
help_text="Имя mesh или group в элементе 3D",
|
||||||
maximum_size_validator,
|
|
||||||
],
|
|
||||||
blank=True,
|
|
||||||
null=True,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
|
@ -23,21 +23,9 @@ console.log(router)
|
||||||
<i-mdi:video-3d />
|
<i-mdi:video-3d />
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
</span>
|
</span>
|
||||||
<span class="nav-icon" style="font-size: 1.375rem;" v-if="false">
|
<span class="nav-icon" style="font-size: 1.375rem;">
|
||||||
<i-mdi:vector-arrange-below />
|
<RouterLink :to="`/${page.slug}/gallery`">
|
||||||
</span>
|
<i-mdi:vector-arrange-below />
|
||||||
</div>
|
|
||||||
<div class="nav-group">
|
|
||||||
<span class="nav-icon" :class="[{ disabled: router.options.history.state.back == null }]">
|
|
||||||
<RouterLink :to="(router.options.history.state.back as string) ?? '/'"
|
|
||||||
@click.native.prevent="router.back">
|
|
||||||
<i-mdi:arrow-left />
|
|
||||||
</RouterLink>
|
|
||||||
</span>
|
|
||||||
<span class="nav-icon" :class="[{ disabled: router.options.history.state.forward == null }]">
|
|
||||||
<RouterLink :to="(router.options.history.state.forward as string) ?? '/'"
|
|
||||||
@click.native.prevent="router.forward">
|
|
||||||
<i-mdi:arrow-right />
|
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -53,13 +53,11 @@ interface clickableAreaType {
|
||||||
image?: string;
|
image?: string;
|
||||||
source: number;
|
source: number;
|
||||||
target: number;
|
target: number;
|
||||||
target_name?: string
|
|
||||||
}
|
}
|
||||||
interface PromoSidebarData {
|
interface PromoSidebarData {
|
||||||
title?: string
|
title?: string
|
||||||
description?: string
|
description?: string
|
||||||
target?: string
|
target?: string
|
||||||
target_name?: string
|
|
||||||
}
|
}
|
||||||
interface PromoSidebar extends PromoSidebarData {
|
interface PromoSidebar extends PromoSidebarData {
|
||||||
id_clickable?: number
|
id_clickable?: number
|
||||||
|
|
|
@ -10,7 +10,7 @@ import PromoMain from './components/Promo/main.vue'
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{ path: '/', component: Promo, name: 'home_no' },
|
{ path: '/', component: Promo, name: 'home_no' },
|
||||||
{ path: '/:item', component: Promo, name: 'home' },
|
{ path: '/:item/gallery', component: Promo, name: 'gallery' },
|
||||||
{ path: '/:item/:target', component: PromoMain, name: 'scene' },
|
{ path: '/:item/:target', component: PromoMain, name: 'scene' },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ export const usePromoSidebar = defineStore('promo_sidebar', {
|
||||||
title: undefined,
|
title: undefined,
|
||||||
description: undefined,
|
description: undefined,
|
||||||
target: undefined,
|
target: undefined,
|
||||||
target_name: undefined,
|
|
||||||
loading: true,
|
loading: true,
|
||||||
is_open: false,
|
is_open: false,
|
||||||
accordions: [],
|
accordions: [],
|
||||||
|
@ -28,7 +27,6 @@ export const usePromoSidebar = defineStore('promo_sidebar', {
|
||||||
} as PromoSidebarData
|
} as PromoSidebarData
|
||||||
if (target?.target) {
|
if (target?.target) {
|
||||||
sidebar_data.target = target.target.toString()
|
sidebar_data.target = target.target.toString()
|
||||||
sidebar_data.target_name = target.target_name
|
|
||||||
}
|
}
|
||||||
this.accordions.push('desc')
|
this.accordions.push('desc')
|
||||||
this.setData(sidebar_data)
|
this.setData(sidebar_data)
|
||||||
|
|
Loading…
Reference in New Issue