Add extend view for list
This commit is contained in:
@@ -16,6 +16,7 @@ class AuthData(BaseModel):
|
|||||||
class LocalStorage:
|
class LocalStorage:
|
||||||
AUTH_DATA_KEY = "soul_diary.client.auth_data"
|
AUTH_DATA_KEY = "soul_diary.client.auth_data"
|
||||||
SHARED_DATA_KEY = "soul_diary.client.shared_data"
|
SHARED_DATA_KEY = "soul_diary.client.shared_data"
|
||||||
|
CLIENT_DATA_KEY = "soul_diary.client.{key}"
|
||||||
|
|
||||||
def __init__(self, client_storage):
|
def __init__(self, client_storage):
|
||||||
self._client_storage = client_storage
|
self._client_storage = client_storage
|
||||||
@@ -65,11 +66,25 @@ class LocalStorage:
|
|||||||
return tmp_data.get(key)
|
return tmp_data.get(key)
|
||||||
|
|
||||||
async def clear_shared_data(self):
|
async def clear_shared_data(self):
|
||||||
if not await self.raw_contains(self.SHARED_DATA_KEY):
|
if await self.raw_contains(self.SHARED_DATA_KEY):
|
||||||
return
|
|
||||||
|
|
||||||
await self.raw_remove(self.SHARED_DATA_KEY)
|
await self.raw_remove(self.SHARED_DATA_KEY)
|
||||||
|
|
||||||
|
async def add_client_data(self, key: str, value):
|
||||||
|
full_key = self.CLIENT_DATA_KEY.format(key=key)
|
||||||
|
await self.raw_write(key=full_key, value=value)
|
||||||
|
|
||||||
|
async def get_client_data(self, key: str):
|
||||||
|
full_key = self.CLIENT_DATA_KEY.format(key=key)
|
||||||
|
|
||||||
|
if await self.raw_contains(full_key):
|
||||||
|
return await self.raw_read(full_key)
|
||||||
|
|
||||||
|
async def remove_client_data(self, key: str):
|
||||||
|
full_key = self.CLIENT_DATA_KEY.format(key=key)
|
||||||
|
|
||||||
|
if await self.raw_contains(full_key):
|
||||||
|
await self.raw_remove(full_key)
|
||||||
|
|
||||||
async def raw_contains(self, key: str) -> bool:
|
async def raw_contains(self, key: str) -> bool:
|
||||||
return await self._client_storage.contains_key_async(key)
|
return await self._client_storage.contains_key_async(key)
|
||||||
|
|
||||||
|
|||||||
@@ -37,13 +37,13 @@ class SensePage(BasePage):
|
|||||||
self.body = flet.Text(style=flet.TextThemeStyle.BODY_LARGE)
|
self.body = flet.Text(style=flet.TextThemeStyle.BODY_LARGE)
|
||||||
body_container = flet.Container(
|
body_container = flet.Container(
|
||||||
content=flet.Column(controls=[body_title, self.body]),
|
content=flet.Column(controls=[body_title, self.body]),
|
||||||
margin=flet.margin.symmetric(vertical=30),
|
margin=flet.margin.symmetric(vertical=15),
|
||||||
)
|
)
|
||||||
desires_title = flet.Text("Желания", style=flet.TextThemeStyle.HEADLINE_MEDIUM)
|
desires_title = flet.Text("Желания", style=flet.TextThemeStyle.HEADLINE_MEDIUM)
|
||||||
self.desires = flet.Text(style=flet.TextThemeStyle.BODY_LARGE)
|
self.desires = flet.Text(style=flet.TextThemeStyle.BODY_LARGE)
|
||||||
desires_container = flet.Container(
|
desires_container = flet.Container(
|
||||||
content=flet.Column(controls=[desires_title, self.desires]),
|
content=flet.Column(controls=[desires_title, self.desires]),
|
||||||
margin=flet.margin.symmetric(vertical=30),
|
margin=flet.margin.symmetric(vertical=15),
|
||||||
)
|
)
|
||||||
|
|
||||||
return flet.Container(
|
return flet.Container(
|
||||||
|
|||||||
@@ -12,16 +12,27 @@ from .base import BasePage, callback_error_handle
|
|||||||
|
|
||||||
|
|
||||||
class SenseListPage(BasePage):
|
class SenseListPage(BasePage):
|
||||||
def __init__(self, view: flet.View, local_storage: LocalStorage):
|
def __init__(self, view: flet.View, local_storage: LocalStorage, extend: bool = False):
|
||||||
self.local_storage = local_storage
|
self.local_storage = local_storage
|
||||||
self.senses = []
|
self.senses = []
|
||||||
self.senses_cards: flet.Column
|
self.senses_cards: flet.Column
|
||||||
|
self.extend = extend
|
||||||
|
|
||||||
super().__init__(view=view)
|
super().__init__(view=view)
|
||||||
|
|
||||||
def build(self) -> flet.Container:
|
def build(self) -> flet.Container:
|
||||||
self.view.vertical_alignment = flet.MainAxisAlignment.START
|
self.view.vertical_alignment = flet.MainAxisAlignment.START
|
||||||
|
self.view.scroll = flet.ScrollMode.ALWAYS
|
||||||
|
|
||||||
|
view_switch = flet.Switch(
|
||||||
|
label="Расширенный вид",
|
||||||
|
value=self.extend,
|
||||||
|
on_change=self.callback_switch_view,
|
||||||
|
)
|
||||||
|
top_row_left = flet.Row(
|
||||||
|
controls=[view_switch],
|
||||||
|
alignment=flet.MainAxisAlignment.START,
|
||||||
|
)
|
||||||
add_button = flet.IconButton(
|
add_button = flet.IconButton(
|
||||||
icon=flet.icons.ADD_CIRCLE_OUTLINE,
|
icon=flet.icons.ADD_CIRCLE_OUTLINE,
|
||||||
on_click=self.callback_add_sense,
|
on_click=self.callback_add_sense,
|
||||||
@@ -34,19 +45,21 @@ class SenseListPage(BasePage):
|
|||||||
icon=flet.icons.LOGOUT,
|
icon=flet.icons.LOGOUT,
|
||||||
on_click=self.callback_logout,
|
on_click=self.callback_logout,
|
||||||
)
|
)
|
||||||
top_container = flet.Container(
|
top_row_right = flet.Row(
|
||||||
content=flet.Row(
|
|
||||||
controls=[add_button, settings_button, logout_button],
|
controls=[add_button, settings_button, logout_button],
|
||||||
alignment=flet.MainAxisAlignment.END,
|
alignment=flet.MainAxisAlignment.END,
|
||||||
),
|
)
|
||||||
|
top_row = flet.Row(
|
||||||
|
controls=[top_row_left, top_row_right],
|
||||||
|
alignment=flet.MainAxisAlignment.SPACE_BETWEEN,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.senses_cards = flet.Column(alignment=flet.alignment.center)
|
self.senses_cards = flet.Column(alignment=flet.alignment.center)
|
||||||
|
|
||||||
return flet.Container(
|
return flet.Container(
|
||||||
content=flet.Column(
|
content=flet.Column(
|
||||||
controls=[top_container, self.senses_cards],
|
controls=[top_row, self.senses_cards],
|
||||||
width=400,
|
width=600,
|
||||||
),
|
),
|
||||||
alignment=flet.alignment.center,
|
alignment=flet.alignment.center,
|
||||||
)
|
)
|
||||||
@@ -55,25 +68,38 @@ class SenseListPage(BasePage):
|
|||||||
await self.render_cards()
|
await self.render_cards()
|
||||||
|
|
||||||
async def render_cards(self):
|
async def render_cards(self):
|
||||||
|
function = self.render_extend_card if self.extend else self.render_compact_card
|
||||||
backend_client = await get_backend_client(self.local_storage)
|
backend_client = await get_backend_client(self.local_storage)
|
||||||
self.senses = await backend_client.get_sense_list()
|
self.senses = await backend_client.get_sense_list()
|
||||||
self.senses_cards.controls = [
|
self.senses_cards.controls = [await function(sense) for sense in self.senses]
|
||||||
await self.render_card(sense)
|
|
||||||
for sense in self.senses
|
|
||||||
]
|
|
||||||
await self.update_async()
|
await self.update_async()
|
||||||
|
|
||||||
async def render_card(self, sense: Sense) -> flet.Card:
|
async def render_compact_card(self, sense: Sense) -> flet.Card:
|
||||||
feelings = flet.Container(content=flet.Text(sense.feelings), expand=True)
|
feelings = flet.Container(content=flet.Text(sense.feelings), expand=True)
|
||||||
created_datetime = flet.Text(sense.created_at.strftime("%d %b %H:%M"))
|
created_datetime = flet.Text(sense.created_at.strftime("%d %b %H:%M"))
|
||||||
|
emotions = flet.Row(
|
||||||
|
controls=[
|
||||||
|
flet.Chip(
|
||||||
|
label=flet.Text(emotion.value),
|
||||||
|
show_checkmark=False,
|
||||||
|
selected=True,
|
||||||
|
)
|
||||||
|
for emotion in sense.emotions
|
||||||
|
],
|
||||||
|
wrap=True,
|
||||||
|
)
|
||||||
|
bottom_row = flet.Row(
|
||||||
|
controls=[created_datetime, emotions],
|
||||||
|
alignment=flet.MainAxisAlignment.SPACE_BETWEEN,
|
||||||
|
)
|
||||||
|
|
||||||
card = flet.Container(
|
card = flet.Container(
|
||||||
content=flet.Card(
|
content=flet.Card(
|
||||||
content=flet.Container(
|
content=flet.Container(
|
||||||
content=flet.Column(controls=[feelings, created_datetime]),
|
content=flet.Column(controls=[feelings, bottom_row]),
|
||||||
padding=10,
|
padding=10,
|
||||||
),
|
),
|
||||||
width=400,
|
width=600,
|
||||||
height=100,
|
height=100,
|
||||||
),
|
),
|
||||||
on_click=partial(self.callback_card_click, sense_id=sense.id),
|
on_click=partial(self.callback_card_click, sense_id=sense.id),
|
||||||
@@ -85,6 +111,66 @@ class SenseListPage(BasePage):
|
|||||||
|
|
||||||
return gesture_detector
|
return gesture_detector
|
||||||
|
|
||||||
|
async def render_extend_card(self, sense: Sense) -> flet.Card:
|
||||||
|
title = flet.Text(f"Запись от {sense.created_at.strftime('%d %b %H:%M')}")
|
||||||
|
|
||||||
|
emotions_title = flet.Text("Эмоции", style=flet.TextThemeStyle.HEADLINE_MEDIUM)
|
||||||
|
emotions = flet.Row(
|
||||||
|
controls=[
|
||||||
|
flet.Chip(
|
||||||
|
label=flet.Text(emotion.value),
|
||||||
|
show_checkmark=False,
|
||||||
|
selected=True,
|
||||||
|
)
|
||||||
|
for emotion in sense.emotions
|
||||||
|
],
|
||||||
|
wrap=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
feelings = flet.Text(sense.feelings, style=flet.TextThemeStyle.BODY_LARGE)
|
||||||
|
feelings_container = flet.Container(
|
||||||
|
content=flet.Column(controls=[emotions_title, feelings]),
|
||||||
|
margin=flet.margin.symmetric(vertical=5),
|
||||||
|
)
|
||||||
|
|
||||||
|
body_title = flet.Text("Телесные ощущения", style=flet.TextThemeStyle.HEADLINE_MEDIUM)
|
||||||
|
body = flet.Text(sense.body, style=flet.TextThemeStyle.BODY_LARGE)
|
||||||
|
body_container = flet.Container(
|
||||||
|
content=flet.Column(controls=[body_title, body]),
|
||||||
|
margin=flet.margin.symmetric(vertical=5),
|
||||||
|
)
|
||||||
|
|
||||||
|
desires_title = flet.Text("Желания", style=flet.TextThemeStyle.HEADLINE_MEDIUM)
|
||||||
|
desires = flet.Text(sense.desires, style=flet.TextThemeStyle.BODY_LARGE)
|
||||||
|
desires_container = flet.Container(
|
||||||
|
content=flet.Column(controls=[desires_title, desires]),
|
||||||
|
margin=flet.margin.symmetric(vertical=5),
|
||||||
|
)
|
||||||
|
card = flet.Card(
|
||||||
|
content=flet.Container(
|
||||||
|
content=flet.Column(controls=[title, emotions, feelings_container, body_container,
|
||||||
|
desires_container]),
|
||||||
|
padding=10,
|
||||||
|
),
|
||||||
|
width=600,
|
||||||
|
)
|
||||||
|
card = flet.Container(
|
||||||
|
content=card,
|
||||||
|
on_click=partial(self.callback_card_click, sense_id=sense.id),
|
||||||
|
)
|
||||||
|
gesture_detector = flet.GestureDetector(
|
||||||
|
mouse_cursor=flet.MouseCursor.CLICK,
|
||||||
|
content=card,
|
||||||
|
)
|
||||||
|
|
||||||
|
return gesture_detector
|
||||||
|
|
||||||
|
@callback_error_handle
|
||||||
|
async def callback_switch_view(self, event: flet.ControlEvent):
|
||||||
|
self.extend = event.control.value
|
||||||
|
await self.local_storage.add_client_data(key="extend_list_view", value=self.extend)
|
||||||
|
await self.render_cards()
|
||||||
|
|
||||||
@callback_error_handle
|
@callback_error_handle
|
||||||
async def callback_card_click(self, event: flet.ControlEvent, sense_id: uuid.UUID):
|
async def callback_card_click(self, event: flet.ControlEvent, sense_id: uuid.UUID):
|
||||||
await event.page.go_async(SENSE.replace(":sense_id", str(sense_id)))
|
await event.page.go_async(SENSE.replace(":sense_id", str(sense_id)))
|
||||||
|
|||||||
@@ -10,4 +10,5 @@ from .base import BaseView
|
|||||||
class SenseListView(BaseView):
|
class SenseListView(BaseView):
|
||||||
async def entrypoint(self, page: flet.Page, params: Params) -> BasePage:
|
async def entrypoint(self, page: flet.Page, params: Params) -> BasePage:
|
||||||
local_storage = LocalStorage(client_storage=page.client_storage)
|
local_storage = LocalStorage(client_storage=page.client_storage)
|
||||||
return SenseListPage(view=self.view, local_storage=local_storage)
|
extend = await local_storage.get_client_data(key="extend_list_view") or False
|
||||||
|
return SenseListPage(view=self.view, local_storage=local_storage, extend=extend)
|
||||||
|
|||||||
Reference in New Issue
Block a user