Add color overlay settings for link buttons

- Added link_overlay_enabled, link_overlay_color, link_overlay_opacity to DesignSettings model
- Created migration 0008 for new fields
- Updated CustomizationPanel with link overlay controls section
- Added validation for new overlay settings in serializer
- Updated PublicDesignSettingsSerializer to include overlay settings
- Applied link overlay to all ExpandableGroup components in public page
- Added preview in customization panel for link overlay effect
This commit is contained in:
2025-11-09 13:00:25 +09:00
parent cefd884172
commit d59c1ad42a
7 changed files with 267 additions and 6 deletions

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.7 on 2025-11-09 14:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('customization', '0007_designsettings_body_font_family_and_more'),
]
operations = [
migrations.AddField(
model_name='designsettings',
name='link_overlay_color',
field=models.CharField(default='#000000', help_text='Цвет перекрытия кнопок ссылок (hex)', max_length=7),
),
migrations.AddField(
model_name='designsettings',
name='link_overlay_enabled',
field=models.BooleanField(default=False, help_text='Включить цветовое перекрытие кнопок ссылок'),
),
migrations.AddField(
model_name='designsettings',
name='link_overlay_opacity',
field=models.FloatField(default=0.2, help_text='Прозрачность перекрытия кнопок ссылок (0.0 - 1.0)'),
),
]

View File

@@ -0,0 +1,14 @@
# Generated by Django 5.2.7 on 2025-11-09 03:56
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('customization', '0008_add_template_id_and_test_list_layout'),
('customization', '0008_designsettings_link_overlay_color_and_more'),
]
operations = [
]

View File

@@ -149,6 +149,21 @@ class DesignSettings(models.Model):
help_text='ID выбранного дизайн-шаблона'
)
# Новые поля для цветового оверлея кнопок ссылок
link_overlay_enabled = models.BooleanField(
default=False,
help_text='Включить цветовое перекрытие кнопок ссылок'
)
link_overlay_color = models.CharField(
max_length=7,
default='#000000',
help_text='Цвет перекрытия кнопок ссылок (hex)'
)
link_overlay_opacity = models.FloatField(
default=0.2,
help_text='Прозрачность перекрытия кнопок ссылок (0.0 - 1.0)'
)
updated_at = models.DateTimeField(
auto_now=True,
help_text='Дата и время последнего изменения'

View File

@@ -36,6 +36,9 @@ class DesignSettingsSerializer(serializers.ModelSerializer):
'group_description_text_color',
'body_font_family',
'heading_font_family',
'link_overlay_enabled',
'link_overlay_color',
'link_overlay_opacity',
'updated_at'
]
read_only_fields = ['id', 'updated_at', 'background_image_url']
@@ -261,6 +264,26 @@ class DesignSettingsSerializer(serializers.ModelSerializer):
raise serializers.ValidationError('ID шаблона слишком длинный')
return value
def validate_link_overlay_color(self, value):
"""
Валидация цвета перекрытия кнопок ссылок
"""
if not value.startswith('#') or len(value) != 7:
raise serializers.ValidationError('Цвет должен быть в формате #RRGGBB')
try:
int(value[1:], 16)
except ValueError:
raise serializers.ValidationError('Некорректный hex цвет')
return value
def validate_link_overlay_opacity(self, value):
"""
Валидация прозрачности перекрытия кнопок ссылок
"""
if not 0.0 <= value <= 1.0:
raise serializers.ValidationError('Прозрачность должна быть между 0.0 и 1.0')
return value
class PublicDesignSettingsSerializer(serializers.ModelSerializer):
"""
@@ -273,8 +296,28 @@ class PublicDesignSettingsSerializer(serializers.ModelSerializer):
fields = [
'theme_color',
'background_image_url',
'dashboard_layout',
'groups_default_expanded',
'show_group_icons',
'show_link_icons',
'dashboard_background_color',
'font_family',
'custom_css'
'header_text_color',
'group_text_color',
'link_text_color',
'group_overlay_enabled',
'group_overlay_color',
'group_overlay_opacity',
'show_groups_title',
'group_description_text_color',
'body_font_family',
'heading_font_family',
'cover_overlay_enabled',
'cover_overlay_color',
'cover_overlay_opacity',
'link_overlay_enabled',
'link_overlay_color',
'link_overlay_opacity'
]
def get_background_image_url(self, obj):