new intarfece

This commit is contained in:
2026-04-06 12:15:09 +05:00
parent fe078b8560
commit 10fb240dcd
17 changed files with 197 additions and 129 deletions

View File

@@ -1,18 +1,28 @@
import flet as ft import flet as ft
# Глобальный масштаб интерфейса. 1.0 = 100%, 1.7 = 170%.
# Меняйте только эту константу, чтобы масштабировать весь UI.
SCALE: float = 1.7
def s(v: int | float) -> int:
"""Применяет SCALE к любому размеру: шрифтам, отступам, ицих."""
return round(v * SCALE)
class clolors: class clolors:
background = "#C8B1E4" background = "#C0DE9E"
laer1 = "#9B72CF" laer1 = "#FFEAB7"
laer2 = "#532B88" laer2 = "#D9F1F4"
laer3 = "#2F184B" laer3 = "#D2EA32"
ferst = "#F4EFFA" ferst = "#85C446"
class CastomText(ft.Text): class CastomText(ft.Text):
def __init__(self, text, size=14, color=clolors.ferst, weight=ft.FontWeight.NORMAL): def __init__(self, text, size=14, color=clolors.ferst, weight=ft.FontWeight.NORMAL):
super().__init__( super().__init__(
value=text, value=text,
color=color, color=color,
size=size, size=s(size),
weight=weight, weight=weight,
max_lines=99, max_lines=99,
) )
@@ -26,19 +36,22 @@ class CastomTextField_input(ft.TextField):
filled=True, # заливка фона filled=True, # заливка фона
bgcolor=clolors.ferst, # цвет заливки bgcolor=clolors.ferst, # цвет заливки
border_color=clolors.laer2, # цвет границы border_color=clolors.laer2, # цвет границы
border_radius=12, # скругление углов border_radius=s(12), # скругление углов
label_style=ft.TextStyle( label_style=ft.TextStyle(
color=clolors.laer3, color=clolors.laer3,
size=s(14),
weight=ft.FontWeight.BOLD, weight=ft.FontWeight.BOLD,
), ),
hint_style=ft.TextStyle( hint_style=ft.TextStyle(
color=clolors.laer1, color=clolors.laer1,
size=s(14),
italic=True, italic=True,
), ),
text_style=ft.TextStyle( text_style=ft.TextStyle(
color=clolors.laer3, color=clolors.laer3,
size=16, size=s(16),
), ),
content_padding=ft.padding.symmetric(horizontal=s(12), vertical=s(14)),
prefix_icon=prefix_icon, prefix_icon=prefix_icon,
suffix_icon=suffix_icon, suffix_icon=suffix_icon,
on_change=on_change, on_change=on_change,
@@ -54,8 +67,9 @@ class CastomButton(ft.Button):
color=clolors.ferst, color=clolors.ferst,
bgcolor=clolors.laer1, bgcolor=clolors.laer1,
text_style=ft.TextStyle( text_style=ft.TextStyle(
size=14 size=s(14)
) ),
padding=ft.padding.symmetric(horizontal=s(16), vertical=s(10)),
), ),
on_click=on_click on_click=on_click
) )
@@ -66,17 +80,18 @@ class CastomIconButton(ft.Button):
def __init__(self, text, icon, on_click): def __init__(self, text, icon, on_click):
super().__init__( super().__init__(
content=ft.Row( content=ft.Row(
spacing=8, spacing=s(8),
tight=True, tight=True,
controls=[ controls=[
ft.Icon(icon, color=clolors.ferst, size=18), ft.Icon(icon, color=clolors.ferst, size=s(18)),
ft.Text(text, color=clolors.ferst, size=14), ft.Text(text, color=clolors.ferst, size=s(14)),
], ],
), ),
style=ft.ButtonStyle( style=ft.ButtonStyle(
color=clolors.ferst, color=clolors.ferst,
bgcolor=clolors.laer2, bgcolor=clolors.laer2,
text_style=ft.TextStyle(size=14), text_style=ft.TextStyle(size=s(14)),
padding=ft.padding.symmetric(horizontal=s(16), vertical=s(10)),
), ),
on_click=on_click, on_click=on_click,
) )
@@ -91,19 +106,21 @@ class CastomDropdown(ft.Dropdown):
fill_color=clolors.laer3, fill_color=clolors.laer3,
color=clolors.ferst, color=clolors.ferst,
border_color=clolors.laer2, border_color=clolors.laer2,
border_radius=12, border_radius=s(12),
focused_border_color=clolors.laer1, focused_border_color=clolors.laer1,
label_style=ft.TextStyle( label_style=ft.TextStyle(
color=clolors.ferst, color=clolors.ferst,
size=s(14),
weight=ft.FontWeight.BOLD, weight=ft.FontWeight.BOLD,
), ),
hint_style=ft.TextStyle( hint_style=ft.TextStyle(
color=clolors.laer1, color=clolors.laer1,
size=s(14),
italic=True, italic=True,
), ),
text_style=ft.TextStyle( text_style=ft.TextStyle(
color=clolors.ferst, color=clolors.ferst,
size=16, size=s(16),
), ),
menu_style=ft.MenuStyle( menu_style=ft.MenuStyle(
bgcolor=clolors.laer3, bgcolor=clolors.laer3,
@@ -117,8 +134,7 @@ class CastomSwitch(ft.Switch):
def __init__(self, label, on_change): def __init__(self, label, on_change):
super().__init__( super().__init__(
label=label, label=label,
width=400, label_text_style=ft.TextStyle(size=s(12), color=clolors.ferst),
label_text_style=ft.TextStyle(size=14, color=clolors.ferst),
active_color=clolors.ferst, active_color=clolors.ferst,
active_track_color=clolors.laer1, active_track_color=clolors.laer1,
inactive_thumb_color=clolors.laer2, inactive_thumb_color=clolors.laer2,
@@ -128,7 +144,8 @@ class CastomSwitch(ft.Switch):
class AlterDiaalogApproval(ft.AlertDialog): class AlterDiaalogApproval(ft.AlertDialog):
def __init__(self): def __init__(self, on_accept=None):
self._on_accept = on_accept
self.switch_approval = CastomSwitch( self.switch_approval = CastomSwitch(
label="Я согласен с условиями пользовательского соглашения", label="Я согласен с условиями пользовательского соглашения",
@@ -139,13 +156,22 @@ class AlterDiaalogApproval(ft.AlertDialog):
text="Принять", text="Принять",
on_click=self.accept on_click=self.accept
) )
self.button_approval.disabled = True
super().__init__( super().__init__(
title=ft.Text("Пользовательское соглашение"), bgcolor=clolors.laer3,
title=ft.Text(
"Пользовательское соглашение",
color=clolors.ferst,
size=s(16),
weight=ft.FontWeight.BOLD,
),
content=ft.Container(
width=s(350),
height=s(400),
content=ft.Column( content=ft.Column(
width=400, scroll=ft.ScrollMode.AUTO,
height=600, expand=True,
scroll="auto",
controls=[ controls=[
ft.Markdown( ft.Markdown(
""" """
@@ -265,20 +291,31 @@ class AlterDiaalogApproval(ft.AlertDialog):
*Соглашение соответствует законодательству Российской Федерации, включая Федеральный закон «О защите персональных данных» и Федеральный закон «О защите прав потребителей».* *Соглашение соответствует законодательству Российской Федерации, включая Федеральный закон «О защите персональных данных» и Федеральный закон «О защите прав потребителей».*
""", """,
width=400, expand=True,
md_style_sheet=ft.MarkdownStyleSheet(
p_text_style=ft.TextStyle(color=clolors.ferst, size=s(12)),
h1_text_style=ft.TextStyle(color=clolors.ferst, size=s(18), weight=ft.FontWeight.BOLD),
h2_text_style=ft.TextStyle(color=clolors.ferst, size=s(15), weight=ft.FontWeight.BOLD),
h3_text_style=ft.TextStyle(color=clolors.laer1, size=s(13), weight=ft.FontWeight.BOLD),
a_text_style=ft.TextStyle(color=clolors.laer1),
),
) )
] ]
), ),
),
actions=[ actions=[
ft.Column( ft.Column(
width=400, width=s(350),
horizontal_alignment=ft.CrossAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER,
controls=[ controls=[
ft.Row( ft.Row(
expand=True, expand=True,
alignment=ft.MainAxisAlignment.START, alignment=ft.MainAxisAlignment.START,
controls=[ controls=[
self.switch_approval, ft.Container(
width=s(330),
content=self.switch_approval,
),
] ]
), ),
ft.Row( ft.Row(
@@ -300,7 +337,9 @@ class AlterDiaalogApproval(ft.AlertDialog):
self.update() self.update()
def accept(self, e): def accept(self, e):
self.dialog_result = True
self.open = False self.open = False
self.page.update() self.page.update()
self.page.run_task(self.page.push_route, "/login") if self._on_accept:
self._on_accept()
else:
self.page.run_task(self.page.push_route, "/reg")

View File

@@ -30,6 +30,25 @@ async def _radar_image(request):
async def main(page: ft.Page): async def main(page: ft.Page):
page.title = "COPP" page.title = "COPP"
page.bgcolor = ds.clolors.background page.bgcolor = ds.clolors.background
# Масштабирование глобального text_theme синхронно с ds.SCALE:
# покрывает ft.Text() без явного size (body_medium по умолчанию = 14)
_ts = lambda base: ft.TextStyle(size=ds.s(base))
page.theme = ft.Theme(
text_theme=ft.TextTheme(
body_large=_ts(16),
body_medium=_ts(14),
body_small=_ts(12),
label_large=_ts(14),
label_medium=_ts(12),
label_small=_ts(11),
title_large=_ts(22),
title_medium=_ts(16),
title_small=_ts(14),
headline_medium=_ts(28),
headline_small=_ts(24),
display_small=_ts(36),
),
)
setup_router(page) setup_router(page)
initial = page.route if page.route and page.route not in ("/", "") else "/login" initial = page.route if page.route and page.route not in ("/", "") else "/login"
await page.push_route(initial) await page.push_route(initial)

View File

@@ -4,8 +4,8 @@ import designer as ds
class MainPageUser(ft.Column): class MainPageUser(ft.Column):
def __init__(self, page: ft.Page): def __init__(self, page: ft.Page):
self._page = page self._page = page
self.spacing_groop = 6 self.spacing_groop = ds.s(6)
self.border_radius = 15 self.border_radius = ds.s(15)
super().__init__( super().__init__(
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
@@ -20,8 +20,8 @@ class MainPageUser(ft.Column):
controls=[ controls=[
ft.Container( ft.Container(
border_radius=self.border_radius, border_radius=self.border_radius,
height=160, height=ds.s(160),
width=160, width=ds.s(160),
alignment=ft.Alignment(0.0, 0.0), alignment=ft.Alignment(0.0, 0.0),
content=ft.Column( content=ft.Column(
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
@@ -31,8 +31,8 @@ class MainPageUser(ft.Column):
controls=[ controls=[
ft.Image( ft.Image(
src="icons/clipboard-question_16542596.svg", src="icons/clipboard-question_16542596.svg",
width=100, width=ds.s(100),
height=100, height=ds.s(100),
) )
] ]
), ),
@@ -50,8 +50,8 @@ class MainPageUser(ft.Column):
), ),
ft.Container( ft.Container(
border_radius=self.border_radius, border_radius=self.border_radius,
height=160, height=ds.s(160),
width=160, width=ds.s(160),
alignment=ft.Alignment(0.0, 0.0), alignment=ft.Alignment(0.0, 0.0),
content=ft.Column( content=ft.Column(
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
@@ -61,8 +61,8 @@ class MainPageUser(ft.Column):
controls=[ controls=[
ft.Image( ft.Image(
src="icons/leaderboard-trophy_14227576.svg", src="icons/leaderboard-trophy_14227576.svg",
width=100, width=ds.s(100),
height=100, height=ds.s(100),
) )
] ]
), ),

View File

@@ -7,12 +7,12 @@ import api_client
class MyTestsPage(ft.Column): class MyTestsPage(ft.Column):
def __init__(self, page: ft.Page): def __init__(self, page: ft.Page):
self._page = page self._page = page
self._loading = ft.ProgressRing(width=40, height=40, color=ds.clolors.laer1) self._loading = ft.ProgressRing(width=ds.s(40), height=ds.s(40), color=ds.clolors.laer1)
super().__init__( super().__init__(
alignment=ft.MainAxisAlignment.START, alignment=ft.MainAxisAlignment.START,
horizontal_alignment=ft.CrossAxisAlignment.STRETCH, horizontal_alignment=ft.CrossAxisAlignment.STRETCH,
spacing=8, spacing=ds.s(8),
controls=[ controls=[
ft.Row( ft.Row(
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
@@ -56,14 +56,14 @@ class MyTestsPage(ft.Column):
cards.append( cards.append(
ft.Container( ft.Container(
border_radius=12, border_radius=ds.s(12),
padding=16, padding=ds.s(16),
bgcolor=ds.clolors.laer2, bgcolor=ds.clolors.laer2,
content=ft.Row( content=ft.Row(
alignment=ft.MainAxisAlignment.SPACE_BETWEEN, alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
controls=[ controls=[
ft.Column( ft.Column(
spacing=4, spacing=ds.s(4),
expand=True, expand=True,
controls=[ controls=[
ds.CastomText( ds.CastomText(

View File

@@ -20,7 +20,7 @@ class PollPage(ft.Column):
controls=[ controls=[
ft.Row( ft.Row(
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
controls=[ft.ProgressRing(width=40, height=40, color=ds.clolors.laer1)], controls=[ft.ProgressRing(width=ds.s(40), height=ds.s(40), color=ds.clolors.laer1)],
) )
], ],
) )
@@ -57,8 +57,8 @@ class PollPage(ft.Column):
tight=True, tight=True,
spacing=6, spacing=6,
controls=[ controls=[
ft.Icon(ft.Icons.STOP_CIRCLE_OUTLINED, color=ds.clolors.ferst, size=16), ft.Icon(ft.Icons.STOP_CIRCLE_OUTLINED, color=ds.clolors.ferst, size=ds.s(16)),
ft.Text("Прервать тест", color=ds.clolors.ferst, size=13), ft.Text("Прервать тест", color=ds.clolors.ferst, size=ds.s(13)),
], ],
), ),
style=ft.ButtonStyle( style=ft.ButtonStyle(
@@ -70,12 +70,12 @@ class PollPage(ft.Column):
counter_badge = ft.Container( counter_badge = ft.Container(
bgcolor=ds.clolors.laer2, bgcolor=ds.clolors.laer2,
border_radius=10, border_radius=ds.s(10),
padding=ft.padding.symmetric(horizontal=20, vertical=10), padding=ft.padding.symmetric(horizontal=ds.s(20), vertical=ds.s(10)),
content=ft.Text( content=ft.Text(
f"Вопрос {idx + 1} из {total}", f"Вопрос {idx + 1} из {total}",
color=ds.clolors.ferst, color=ds.clolors.ferst,
size=14, size=ds.s(14),
weight=ft.FontWeight.BOLD, weight=ft.FontWeight.BOLD,
text_align=ft.TextAlign.CENTER, text_align=ft.TextAlign.CENTER,
), ),
@@ -90,14 +90,14 @@ class PollPage(ft.Column):
# --- Блок вопроса (alignment на Container, не вложенный Column) --- # --- Блок вопроса (alignment на Container, не вложенный Column) ---
question_box = ft.Container( question_box = ft.Container(
expand=True, expand=True,
border_radius=14, border_radius=ds.s(14),
padding=24, padding=ds.s(24),
bgcolor=ds.clolors.laer2, bgcolor=ds.clolors.laer2,
alignment=ft.Alignment(0.0, 0.0), alignment=ft.Alignment(0.0, 0.0),
content=ft.Text( content=ft.Text(
value=q.get("text", ""), value=q.get("text", ""),
color=ds.clolors.ferst, color=ds.clolors.ferst,
size=16, size=ds.s(16),
weight=ft.FontWeight.BOLD, weight=ft.FontWeight.BOLD,
text_align=ft.TextAlign.CENTER, text_align=ft.TextAlign.CENTER,
no_wrap=False, no_wrap=False,
@@ -113,22 +113,22 @@ class PollPage(ft.Column):
cid = c["id"] cid = c["id"]
is_selected = cid == selected_choice is_selected = cid == selected_choice
return ft.Container( return ft.Container(
border_radius=8, border_radius=ds.s(8),
padding=ft.padding.symmetric(horizontal=12, vertical=10), padding=ft.padding.symmetric(horizontal=ds.s(12), vertical=ds.s(10)),
bgcolor=ds.clolors.laer1 if is_selected else ds.clolors.laer3, bgcolor=ds.clolors.laer1 if is_selected else ds.clolors.laer3,
content=ft.Row( content=ft.Row(
spacing=10, spacing=ds.s(10),
vertical_alignment=ft.CrossAxisAlignment.CENTER, vertical_alignment=ft.CrossAxisAlignment.CENTER,
controls=[ controls=[
ft.Icon( ft.Icon(
ft.Icons.CHECK_CIRCLE if is_selected else ft.Icons.RADIO_BUTTON_UNCHECKED, ft.Icons.CHECK_CIRCLE if is_selected else ft.Icons.RADIO_BUTTON_UNCHECKED,
color=ds.clolors.ferst, color=ds.clolors.ferst,
size=20, size=ds.s(20),
), ),
ft.Text( ft.Text(
value=c["text"], value=c["text"],
color=ds.clolors.ferst, color=ds.clolors.ferst,
size=14, size=ds.s(14),
expand=True, expand=True,
no_wrap=False, no_wrap=False,
), ),
@@ -143,12 +143,12 @@ class PollPage(ft.Column):
tile.on_click = lambda e, _qid=q["id"]: self._select_answer(_qid, e.control.data) tile.on_click = lambda e, _qid=q["id"]: self._select_answer(_qid, e.control.data)
choice_tiles.append(tile) choice_tiles.append(tile)
choices_col = ft.Column(controls=choice_tiles, spacing=6) choices_col = ft.Column(controls=choice_tiles, spacing=ds.s(6))
self.controls = [ self.controls = [
ft.Column( ft.Column(
expand=True, expand=True,
spacing=12, spacing=ds.s(12),
controls=[ controls=[
nav_row, nav_row,
question_box, question_box,
@@ -179,7 +179,7 @@ class PollPage(ft.Column):
content=ft.Text( content=ft.Text(
"Завершить тест →", "Завершить тест →",
color=ds.clolors.ferst, color=ds.clolors.ferst,
size=16, size=ds.s(16),
weight=ft.FontWeight.BOLD, weight=ft.FontWeight.BOLD,
), ),
data="__finish__", data="__finish__",
@@ -250,7 +250,7 @@ class PollPage(ft.Column):
self.controls = [ self.controls = [
ft.Row( ft.Row(
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
controls=[ft.ProgressRing(width=48, height=48, color=ds.clolors.laer1)], controls=[ft.ProgressRing(width=ds.s(48), height=ds.s(48), color=ds.clolors.laer1)],
) )
] ]
self.update() self.update()
@@ -272,7 +272,7 @@ class PollPage(ft.Column):
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
horizontal_alignment=ft.CrossAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER,
controls=[ controls=[
ft.Icon(ft.Icons.ERROR_OUTLINE, size=48, color=ds.clolors.laer1), ft.Icon(ft.Icons.ERROR_OUTLINE, size=ds.s(48), color=ds.clolors.laer1),
ds.CastomText(text=error, size=14), ds.CastomText(text=error, size=14),
ds.CastomButton( ds.CastomButton(
text="Попробовать снова", text="Попробовать снова",
@@ -292,7 +292,7 @@ class PollPage(ft.Column):
) )
success_controls: list[ft.Control] = [ success_controls: list[ft.Control] = [
ft.Icon(ft.Icons.CHECK_CIRCLE_OUTLINE, size=48, color=ds.clolors.laer1), ft.Icon(ft.Icons.CHECK_CIRCLE_OUTLINE, size=ds.s(48), color=ds.clolors.laer1),
ds.CastomText(text="Тест пройден!", size=20, weight=ft.FontWeight.BOLD), ds.CastomText(text="Тест пройден!", size=20, weight=ft.FontWeight.BOLD),
] ]
@@ -307,7 +307,7 @@ class PollPage(ft.Column):
content=ft.Image( content=ft.Image(
src=data_uri, src=data_uri,
expand=True, expand=True,
height=380, height=ds.s(380),
fit=ft.BoxFit.CONTAIN, fit=ft.BoxFit.CONTAIN,
), ),
) )
@@ -338,14 +338,14 @@ class PollPage(ft.Column):
self.controls = [ self.controls = [
ft.Container( ft.Container(
padding=20, padding=ds.s(20),
bgcolor=ds.clolors.laer3, bgcolor=ds.clolors.laer3,
border_radius=16, border_radius=ds.s(16),
expand=True, expand=True,
content=ft.Column( content=ft.Column(
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
horizontal_alignment=ft.CrossAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER,
spacing=16, spacing=ds.s(16),
controls=success_controls, controls=success_controls,
), ),
) )

View File

@@ -31,11 +31,11 @@ class ProfilePage(ft.Column):
hint_text="Загрузка...", hint_text="Загрузка...",
) )
self._loading = ft.ProgressRing(visible=False, width=24, height=24) self._loading = ft.ProgressRing(visible=False, width=ds.s(24), height=ds.s(24))
self._status = ft.Text(value="", size=14) self._status = ft.Text(value="", size=ds.s(14))
super().__init__( super().__init__(
spacing=16, spacing=ds.s(16),
controls=[ controls=[
ds.CastomText( ds.CastomText(
text="Редактировать профиль", text="Редактировать профиль",
@@ -47,7 +47,7 @@ class ProfilePage(ft.Column):
self._org_dropdown, self._org_dropdown,
self._group_dropdown, self._group_dropdown,
ft.Row( ft.Row(
spacing=12, spacing=ds.s(12),
controls=[ controls=[
ds.CastomButton(text="Сохранить", on_click=self._save), ds.CastomButton(text="Сохранить", on_click=self._save),
self._loading, self._loading,

View File

@@ -8,12 +8,12 @@ class ResponsePage(ft.Column):
def __init__(self, page: ft.Page, response_id: str): def __init__(self, page: ft.Page, response_id: str):
self._page = page self._page = page
self._response_id = response_id self._response_id = response_id
self._loading = ft.ProgressRing(width=40, height=40, color=ds.clolors.laer1) self._loading = ft.ProgressRing(width=ds.s(40), height=ds.s(40), color=ds.clolors.laer1)
super().__init__( super().__init__(
alignment=ft.MainAxisAlignment.START, alignment=ft.MainAxisAlignment.START,
horizontal_alignment=ft.CrossAxisAlignment.STRETCH, horizontal_alignment=ft.CrossAxisAlignment.STRETCH,
spacing=8, spacing=ds.s(8),
controls=[ controls=[
ft.Row(alignment=ft.MainAxisAlignment.CENTER, controls=[self._loading]) ft.Row(alignment=ft.MainAxisAlignment.CENTER, controls=[self._loading])
], ],
@@ -43,8 +43,8 @@ class ResponsePage(ft.Column):
controls: list[ft.Control] = [ controls: list[ft.Control] = [
ft.Container( ft.Container(
padding=ft.padding.only(bottom=8), padding=ft.padding.only(bottom=ds.s(8)),
content=ft.Column(spacing=4, controls=[ content=ft.Column(spacing=ds.s(4), controls=[
ds.CastomText(text=poll.get("title", ""), size=20, weight=ft.FontWeight.BOLD), ds.CastomText(text=poll.get("title", ""), size=20, weight=ft.FontWeight.BOLD),
ds.CastomText(text=f"Пройден: {submitted_at}", size=12), ds.CastomText(text=f"Пройден: {submitted_at}", size=12),
]), ]),
@@ -61,12 +61,12 @@ class ResponsePage(ft.Column):
await self._page.launch_url(_url) await self._page.launch_url(_url)
controls.append(ft.Container( controls.append(ft.Container(
border_radius=16, border_radius=ds.s(16),
padding=12, padding=ds.s(12),
bgcolor=ds.clolors.laer3, bgcolor=ds.clolors.laer3,
content=ft.Column( content=ft.Column(
horizontal_alignment=ft.CrossAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER,
spacing=10, spacing=ds.s(10),
controls=[ controls=[
ds.CastomText(text="Результат", size=16, weight=ft.FontWeight.BOLD), ds.CastomText(text="Результат", size=16, weight=ft.FontWeight.BOLD),
ft.Container( ft.Container(
@@ -74,7 +74,7 @@ class ResponsePage(ft.Column):
content=ft.Image( content=ft.Image(
src=data_uri, src=data_uri,
expand=True, expand=True,
height=380, height=ds.s(380),
fit=ft.BoxFit.CONTAIN, fit=ft.BoxFit.CONTAIN,
), ),
), ),
@@ -103,23 +103,23 @@ class ResponsePage(ft.Column):
for c in q.get("choices", []): for c in q.get("choices", []):
is_selected = c["id"] == answer.get("choice_id") is_selected = c["id"] == answer.get("choice_id")
choice_rows.append(ft.Container( choice_rows.append(ft.Container(
border_radius=8, border_radius=ds.s(8),
padding=ft.padding.symmetric(horizontal=12, vertical=6), padding=ft.padding.symmetric(horizontal=ds.s(12), vertical=ds.s(6)),
bgcolor=ds.clolors.laer1 if is_selected else ds.clolors.laer3, bgcolor=ds.clolors.laer1 if is_selected else ds.clolors.laer3,
content=ft.Row(spacing=8, controls=[ content=ft.Row(spacing=ds.s(8), controls=[
ft.Icon( ft.Icon(
ft.Icons.CHECK_CIRCLE if is_selected else ft.Icons.RADIO_BUTTON_UNCHECKED, ft.Icons.CHECK_CIRCLE if is_selected else ft.Icons.RADIO_BUTTON_UNCHECKED,
color=ds.clolors.ferst, size=16, color=ds.clolors.ferst, size=ds.s(16),
), ),
ft.Container(expand=True, content=ds.CastomText(text=c["text"], size=13)), ft.Container(expand=True, content=ds.CastomText(text=c["text"], size=13)),
]), ]),
)) ))
answer_cards.append(ft.Container( answer_cards.append(ft.Container(
border_radius=12, border_radius=ds.s(12),
padding=16, padding=ds.s(16),
bgcolor=ds.clolors.laer2, bgcolor=ds.clolors.laer2,
content=ft.Column(spacing=8, controls=[ content=ft.Column(spacing=ds.s(8), controls=[
ds.CastomText(text=q.get("text", ""), size=14, weight=ft.FontWeight.BOLD), ds.CastomText(text=q.get("text", ""), size=14, weight=ft.FontWeight.BOLD),
*choice_rows, *choice_rows,
]), ]),

View File

@@ -6,7 +6,7 @@ import api_client
class TakeTestPage(ft.Column): class TakeTestPage(ft.Column):
def __init__(self, page: ft.Page): def __init__(self, page: ft.Page):
self._page = page self._page = page
self._loading = ft.ProgressRing(width=40, height=40, color=ds.clolors.laer1) self._loading = ft.ProgressRing(width=ds.s(40), height=ds.s(40), color=ds.clolors.laer1)
super().__init__( super().__init__(
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
horizontal_alignment=ft.CrossAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER,
@@ -27,11 +27,11 @@ class TakeTestPage(ft.Column):
def _render_polls(self, polls: list): def _render_polls(self, polls: list):
self.controls = [ self.controls = [
ft.Container( ft.Container(
border_radius=12, border_radius=ds.s(12),
padding=16, padding=ds.s(16),
bgcolor=ds.clolors.laer2, bgcolor=ds.clolors.laer2,
content=ft.Column( content=ft.Column(
spacing=6, spacing=ds.s(6),
controls=[ controls=[
ds.CastomText( ds.CastomText(
text=poll.get("title", ""), text=poll.get("title", ""),

View File

@@ -6,6 +6,7 @@ from info import AuthService
class LoginView(ft.View): class LoginView(ft.View):
def __init__(self, page: ft.Page): def __init__(self, page: ft.Page):
self._auth = AuthService(page) self._auth = AuthService(page)
self.pageS = page
self._username = ds.CastomTextField_input( self._username = ds.CastomTextField_input(
label="Логин", label="Логин",
@@ -21,7 +22,7 @@ class LoginView(ft.View):
can_reveal_password=True, can_reveal_password=True,
) )
self._error = ft.Text("", color=ft.Colors.RED_400, size=14, visible=False) self._error = ft.Text("", color=ft.Colors.RED_400, size=ds.s(14), visible=False)
self._btn = ds.CastomButton( self._btn = ds.CastomButton(
text="Войти", text="Войти",
@@ -29,9 +30,8 @@ class LoginView(ft.View):
) )
self._reg_link = ft.TextButton( self._reg_link = ft.TextButton(
content="Нет аккаунта? Зарегистрироваться", content=ft.Text("Нет аккаунта? Зарегистрироваться", color=ds.clolors.ferst, size=ds.s(14)),
style=ft.ButtonStyle(color=ds.clolors.ferst), on_click=self.open_dialog,
on_click=lambda e: page.run_task(page.push_route, "/reg"),
) )
super().__init__( super().__init__(
@@ -39,22 +39,23 @@ class LoginView(ft.View):
bgcolor=ds.clolors.background, bgcolor=ds.clolors.background,
horizontal_alignment=ft.CrossAxisAlignment.STRETCH, horizontal_alignment=ft.CrossAxisAlignment.STRETCH,
vertical_alignment=ft.MainAxisAlignment.CENTER, vertical_alignment=ft.MainAxisAlignment.CENTER,
padding=ft.padding.symmetric(horizontal=16, vertical=24), padding=ft.padding.symmetric(horizontal=ds.s(16), vertical=ds.s(24)),
scroll=ft.ScrollMode.AUTO, scroll=ft.ScrollMode.AUTO,
) )
self.controls = [ self.controls = [
ft.Text("COPP", color=ds.clolors.ferst, size=30, weight=ft.FontWeight.BOLD, ft.Text("ЦОПП", color=ds.clolors.ferst, size=ds.s(30), weight=ft.FontWeight.BOLD,
text_align=ft.TextAlign.CENTER), text_align=ft.TextAlign.CENTER),
ft.Container(height=8), ft.Container(height=ds.s(8)),
ft.Text("Вход в систему", color=ds.clolors.ferst, size=16, ft.Text("Это проект цопп по проведению иследовательских тестирований", color=ds.clolors.ferst, size=ds.s(16),
text_align=ft.TextAlign.CENTER), text_align=ft.TextAlign.CENTER),
ft.Container(height=24), ft.Container(height=ds.s(24)),
ft.Container( ft.Container(
padding=ft.padding.all(24), padding=ft.padding.all(ds.s(24)),
bgcolor=ds.clolors.laer3, bgcolor=ds.clolors.laer3,
border_radius=16, border_radius=ds.s(16),
alignment=ft.Alignment.CENTER,
content=ft.Column( content=ft.Column(
spacing=16, spacing=ds.s(16),
controls=[ controls=[
self._username, self._username,
self._password, self._password,
@@ -66,6 +67,15 @@ class LoginView(ft.View):
), ),
] ]
def open_dialog(self, e):
self.dialog = ds.AlterDiaalogApproval(
on_accept=lambda: self.pageS.run_task(self.pageS.push_route, "/reg")
)
self.dialog.open = True
self.pageS.overlay.append(self.dialog)
self.pageS.update()
async def _do_login(self): async def _do_login(self):
username = self._username.value.strip() username = self._username.value.strip()
password = self._password.value password = self._password.value

View File

@@ -17,9 +17,9 @@ class MainView(ft.View):
vertical_alignment=ft.MainAxisAlignment.CENTER, vertical_alignment=ft.MainAxisAlignment.CENTER,
) )
self.controls = [ self.controls = [
ft.Text("COPP",color=ds.clolors.ferst, size=30), ft.Text("ЦОПП",color=ds.clolors.ferst, size=ds.s(30)),
ft.Text("Это проект цопп по проведению иследовательских тестирований",color=ds.clolors.ferst, size=16), ft.Text("Это проект цопп по проведению иследовательских тестирований",color=ds.clolors.ferst, size=ds.s(16)),
ft.Container(width=0, height=20), ft.Container(width=0, height=ds.s(20)),
self.button_temp self.button_temp
] ]

View File

@@ -24,7 +24,7 @@ class MyTestsView(ft.View):
controls=[ controls=[
ft.Column( ft.Column(
expand=True, expand=True,
spacing=10, spacing=ds.s(10),
controls=[ controls=[
ft.Row( ft.Row(
controls=[ controls=[

View File

@@ -18,13 +18,13 @@ class PollView(ft.View):
super().__init__( super().__init__(
route=f"/poll/{url_key}/{poll_id}", route=f"/poll/{url_key}/{poll_id}",
bgcolor=ds.clolors.background, bgcolor=ds.clolors.background,
padding=ft.padding.symmetric(horizontal=12, vertical=8), padding=ft.padding.symmetric(horizontal=ds.s(12), vertical=ds.s(8)),
horizontal_alignment=ft.CrossAxisAlignment.STRETCH, horizontal_alignment=ft.CrossAxisAlignment.STRETCH,
vertical_alignment=ft.MainAxisAlignment.START, vertical_alignment=ft.MainAxisAlignment.START,
controls=[ controls=[
ft.Column( ft.Column(
expand=True, expand=True,
spacing=10, spacing=ds.s(10),
controls=[ controls=[
ft.Row( ft.Row(
controls=[ controls=[

View File

@@ -24,7 +24,7 @@ class ProfileView(ft.View):
controls=[ controls=[
ft.Column( ft.Column(
expand=True, expand=True,
spacing=10, spacing=ds.s(10),
controls=[ controls=[
ft.Row( ft.Row(
controls=[ controls=[

View File

@@ -46,7 +46,7 @@ class RegView(ft.View):
hint_text="Загрузка...", hint_text="Загрузка...",
) )
self._error = ft.Text("", color=ft.Colors.RED_400, size=14, visible=False) self._error = ft.Text("", color=ft.Colors.RED_400, size=ds.s(14), visible=False)
self._btn = ds.CastomButton( self._btn = ds.CastomButton(
text="Зарегистрироваться", text="Зарегистрироваться",
@@ -63,22 +63,22 @@ class RegView(ft.View):
bgcolor=ds.clolors.background, bgcolor=ds.clolors.background,
horizontal_alignment=ft.CrossAxisAlignment.STRETCH, horizontal_alignment=ft.CrossAxisAlignment.STRETCH,
vertical_alignment=ft.MainAxisAlignment.CENTER, vertical_alignment=ft.MainAxisAlignment.CENTER,
padding=ft.padding.symmetric(horizontal=16, vertical=24), padding=ft.padding.symmetric(horizontal=ds.s(16), vertical=ds.s(24)),
scroll=ft.ScrollMode.AUTO, scroll=ft.ScrollMode.AUTO,
) )
self.controls = [ self.controls = [
ft.Text("COPP", color=ds.clolors.ferst, size=30, weight=ft.FontWeight.BOLD, ft.Text("COPP", color=ds.clolors.ferst, size=ds.s(30), weight=ft.FontWeight.BOLD,
text_align=ft.TextAlign.CENTER), text_align=ft.TextAlign.CENTER),
ft.Container(height=8), ft.Container(height=ds.s(8)),
ft.Text("Регистрация в системе", color=ds.clolors.ferst, size=16, ft.Text("Регистрация в системе", color=ds.clolors.ferst, size=ds.s(16),
text_align=ft.TextAlign.CENTER), text_align=ft.TextAlign.CENTER),
ft.Container(height=24), ft.Container(height=ds.s(24)),
ft.Container( ft.Container(
padding=ft.padding.all(24), padding=ft.padding.all(ds.s(24)),
bgcolor=ds.clolors.laer3, bgcolor=ds.clolors.laer3,
border_radius=16, border_radius=ds.s(16),
content=ft.Column( content=ft.Column(
spacing=16, spacing=ds.s(16),
controls=[ controls=[
self._first_name, self._first_name,
self._last_name, self._last_name,
@@ -89,8 +89,8 @@ class RegView(ft.View):
self._error, self._error,
ft.Row( ft.Row(
wrap=True, wrap=True,
spacing=8, spacing=ds.s(8),
run_spacing=8, run_spacing=ds.s(8),
controls=[ controls=[
self._btn_cansel, self._btn_cansel,
self._btn, self._btn,

View File

@@ -18,14 +18,14 @@ class ResponseView(ft.View):
super().__init__( super().__init__(
route=f"/response/{url_key}/{response_id}", route=f"/response/{url_key}/{response_id}",
bgcolor=ds.clolors.background, bgcolor=ds.clolors.background,
padding=ft.padding.symmetric(horizontal=12, vertical=8), padding=ft.padding.symmetric(horizontal=ds.s(12), vertical=ds.s(8)),
horizontal_alignment=ft.CrossAxisAlignment.STRETCH, horizontal_alignment=ft.CrossAxisAlignment.STRETCH,
vertical_alignment=ft.MainAxisAlignment.START, vertical_alignment=ft.MainAxisAlignment.START,
scroll=ft.ScrollMode.AUTO, scroll=ft.ScrollMode.AUTO,
controls=[ controls=[
ft.Column( ft.Column(
expand=True, expand=True,
spacing=10, spacing=ds.s(10),
controls=[ controls=[
ft.Row( ft.Row(
controls=[ controls=[

View File

@@ -18,7 +18,7 @@ class TakeTestView(ft.View):
super().__init__( super().__init__(
route=f"/take_test/{url_key}", route=f"/take_test/{url_key}",
bgcolor=ds.clolors.background, bgcolor=ds.clolors.background,
padding=ft.padding.symmetric(horizontal=12, vertical=8), padding=ft.padding.symmetric(horizontal=ds.s(12), vertical=ds.s(8)),
horizontal_alignment=ft.CrossAxisAlignment.START, horizontal_alignment=ft.CrossAxisAlignment.START,
vertical_alignment=ft.MainAxisAlignment.START, vertical_alignment=ft.MainAxisAlignment.START,
controls=[ controls=[

View File

@@ -12,7 +12,7 @@ class UserView(ft.View):
profile_btn = ft.IconButton( profile_btn = ft.IconButton(
icon=ft.Icons.ACCOUNT_CIRCLE, icon=ft.Icons.ACCOUNT_CIRCLE,
icon_color=ds.clolors.ferst, icon_color=ds.clolors.ferst,
icon_size=30, icon_size=ds.s(30),
tooltip="Профиль", tooltip="Профиль",
on_click=lambda _: page.go(f"/profile/{url_key}"), on_click=lambda _: page.go(f"/profile/{url_key}"),
) )
@@ -22,7 +22,7 @@ class UserView(ft.View):
bgcolor=ds.clolors.background, bgcolor=ds.clolors.background,
horizontal_alignment=ft.CrossAxisAlignment.STRETCH, horizontal_alignment=ft.CrossAxisAlignment.STRETCH,
vertical_alignment=ft.MainAxisAlignment.START, vertical_alignment=ft.MainAxisAlignment.START,
padding=ft.padding.symmetric(horizontal=12, vertical=8), padding=ft.padding.symmetric(horizontal=ds.s(12), vertical=ds.s(8)),
) )
self.controls = [ self.controls = [
ft.Column( ft.Column(
@@ -35,7 +35,7 @@ class UserView(ft.View):
ft.Text( ft.Text(
"Добро пожаловать в COPP!", "Добро пожаловать в COPP!",
color=ds.clolors.ferst, color=ds.clolors.ferst,
size=20, size=ds.s(20),
weight=ft.FontWeight.BOLD, weight=ft.FontWeight.BOLD,
expand=True, expand=True,
), ),