Add sense page
This commit is contained in:
@@ -6,9 +6,10 @@ from flet_route import Routing, path
|
|||||||
from .local_storage import LocalStorage
|
from .local_storage import LocalStorage
|
||||||
from .middleware import middleware
|
from .middleware import middleware
|
||||||
from .models import BackendType
|
from .models import BackendType
|
||||||
from .routes import AUTH, INDEX, SENSE_ADD, SENSE_LIST
|
from .routes import AUTH, INDEX, SENSE, SENSE_ADD, SENSE_LIST
|
||||||
from .views.auth import AuthView
|
from .views.auth import AuthView
|
||||||
from .views.base import BaseView
|
from .views.base import BaseView
|
||||||
|
from .views.sense import SenseView
|
||||||
from .views.sense_add import SenseAddView
|
from .views.sense_add import SenseAddView
|
||||||
from .views.sense_list import SenseListView
|
from .views.sense_list import SenseListView
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@ class SoulDiaryApp:
|
|||||||
),
|
),
|
||||||
SENSE_LIST: sense_list_view,
|
SENSE_LIST: sense_list_view,
|
||||||
SENSE_ADD: SenseAddView(),
|
SENSE_ADD: SenseAddView(),
|
||||||
|
SENSE: SenseView(),
|
||||||
}
|
}
|
||||||
|
|
||||||
async def run(self, page: flet.Page):
|
async def run(self, page: flet.Page):
|
||||||
|
|||||||
76
soul_diary/ui/app/pages/sense.py
Normal file
76
soul_diary/ui/app/pages/sense.py
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
import uuid
|
||||||
|
|
||||||
|
import flet
|
||||||
|
from soul_diary.ui.app.backend.utils import get_backend_client
|
||||||
|
|
||||||
|
from soul_diary.ui.app.local_storage import LocalStorage
|
||||||
|
from soul_diary.ui.app.pages.base import BasePage
|
||||||
|
from soul_diary.ui.app.routes import SENSE_LIST
|
||||||
|
|
||||||
|
|
||||||
|
class SensePage(BasePage):
|
||||||
|
def __init__(self, view: flet.View, local_storage: LocalStorage, sense_id: uuid.UUID):
|
||||||
|
self.local_storage = local_storage
|
||||||
|
self.sense_id = sense_id
|
||||||
|
|
||||||
|
self.title: flet.Text
|
||||||
|
self.emotions: flet.Row
|
||||||
|
|
||||||
|
super().__init__(view=view)
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
self.title = flet.Text()
|
||||||
|
close_button = flet.IconButton(icon=flet.icons.CLOSE, on_click=self.callback_close)
|
||||||
|
top_row = flet.Row(
|
||||||
|
controls=[self.title, close_button],
|
||||||
|
alignment=flet.MainAxisAlignment.SPACE_BETWEEN,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.emotions = flet.Row(wrap=True)
|
||||||
|
emotions_title = flet.Text("Эмоции", style=flet.TextThemeStyle.HEADLINE_MEDIUM)
|
||||||
|
self.feelings = flet.Text(style=flet.TextThemeStyle.BODY_LARGE)
|
||||||
|
feelings_container = flet.Container(
|
||||||
|
content=flet.Column(controls=[emotions_title, self.feelings]),
|
||||||
|
margin=flet.margin.symmetric(vertical=15),
|
||||||
|
)
|
||||||
|
body_title = flet.Text("Телесные ощущения", style=flet.TextThemeStyle.HEADLINE_MEDIUM)
|
||||||
|
self.body = flet.Text(style=flet.TextThemeStyle.BODY_LARGE)
|
||||||
|
body_container = flet.Container(
|
||||||
|
content=flet.Column(controls=[body_title, self.body]),
|
||||||
|
margin=flet.margin.symmetric(vertical=30),
|
||||||
|
)
|
||||||
|
desires_title = flet.Text("Желания", style=flet.TextThemeStyle.HEADLINE_MEDIUM)
|
||||||
|
self.desires = flet.Text(style=flet.TextThemeStyle.BODY_LARGE)
|
||||||
|
desires_container = flet.Container(
|
||||||
|
content=flet.Column(controls=[desires_title, self.desires]),
|
||||||
|
margin=flet.margin.symmetric(vertical=30),
|
||||||
|
)
|
||||||
|
|
||||||
|
return flet.Container(
|
||||||
|
content=flet.Column(
|
||||||
|
controls=[top_row, self.emotions, feelings_container, body_container,
|
||||||
|
desires_container],
|
||||||
|
width=600,
|
||||||
|
),
|
||||||
|
alignment=flet.alignment.center,
|
||||||
|
)
|
||||||
|
|
||||||
|
async def did_mount_async(self):
|
||||||
|
backend_client = await get_backend_client(local_storage=self.local_storage)
|
||||||
|
sense = await backend_client.get_sense(sense_id=self.sense_id)
|
||||||
|
self.title.value = f"Запись от {sense.created_at.strftime('%d %b %H:%M')}"
|
||||||
|
self.emotions.controls = [
|
||||||
|
flet.Chip(
|
||||||
|
label=flet.Text(emotion.value),
|
||||||
|
show_checkmark=False,
|
||||||
|
selected=True,
|
||||||
|
)
|
||||||
|
for emotion in sense.emotions
|
||||||
|
]
|
||||||
|
self.feelings.value = sense.feelings
|
||||||
|
self.body.value = sense.body
|
||||||
|
self.desires.value = sense.desires
|
||||||
|
await self.update_async()
|
||||||
|
|
||||||
|
async def callback_close(self, event: flet.ControlEvent):
|
||||||
|
await event.page.go_async(SENSE_LIST)
|
||||||
@@ -1,16 +1,20 @@
|
|||||||
|
import uuid
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
import flet
|
import flet
|
||||||
|
|
||||||
from soul_diary.ui.app.backend.utils import get_backend_client
|
from soul_diary.ui.app.backend.utils import get_backend_client
|
||||||
from soul_diary.ui.app.controls.utils import in_progress
|
from soul_diary.ui.app.controls.utils import in_progress
|
||||||
from soul_diary.ui.app.local_storage import LocalStorage
|
from soul_diary.ui.app.local_storage import LocalStorage
|
||||||
from soul_diary.ui.app.models import Sense
|
from soul_diary.ui.app.models import Sense
|
||||||
from soul_diary.ui.app.routes import AUTH, SENSE_ADD
|
from soul_diary.ui.app.routes import AUTH, SENSE, SENSE_ADD
|
||||||
from .base import BasePage, callback_error_handle
|
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):
|
||||||
self.local_storage = local_storage
|
self.local_storage = local_storage
|
||||||
|
self.senses = []
|
||||||
self.senses_cards: flet.Column
|
self.senses_cards: flet.Column
|
||||||
|
|
||||||
super().__init__(view=view)
|
super().__init__(view=view)
|
||||||
@@ -51,10 +55,10 @@ class SenseListPage(BasePage):
|
|||||||
|
|
||||||
async def render_cards(self):
|
async def render_cards(self):
|
||||||
backend_client = await get_backend_client(self.local_storage)
|
backend_client = await get_backend_client(self.local_storage)
|
||||||
senses = await backend_client.get_sense_list()
|
self.senses = await backend_client.get_sense_list()
|
||||||
self.senses_cards.controls = [
|
self.senses_cards.controls = [
|
||||||
await self.render_card(sense)
|
await self.render_card(sense)
|
||||||
for sense in senses
|
for sense in self.senses
|
||||||
]
|
]
|
||||||
await self.update_async()
|
await self.update_async()
|
||||||
|
|
||||||
@@ -62,14 +66,27 @@ class SenseListPage(BasePage):
|
|||||||
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"))
|
||||||
|
|
||||||
return flet.Card(
|
card = flet.Container(
|
||||||
|
content=flet.Card(
|
||||||
content=flet.Container(
|
content=flet.Container(
|
||||||
content=flet.Column(controls=[feelings, created_datetime]),
|
content=flet.Column(controls=[feelings, created_datetime]),
|
||||||
padding=10,
|
padding=10,
|
||||||
),
|
),
|
||||||
width=400,
|
width=400,
|
||||||
height=100,
|
height=100,
|
||||||
|
),
|
||||||
|
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_card_click(self, event: flet.ControlEvent, sense_id: uuid.UUID):
|
||||||
|
await event.page.go_async(SENSE.replace(":sense_id", str(sense_id)))
|
||||||
|
|
||||||
@callback_error_handle
|
@callback_error_handle
|
||||||
async def callback_add_sense(self, event: flet.ControlEvent):
|
async def callback_add_sense(self, event: flet.ControlEvent):
|
||||||
|
|||||||
@@ -2,3 +2,4 @@ INDEX = "/"
|
|||||||
AUTH = "/auth"
|
AUTH = "/auth"
|
||||||
SENSE_LIST = "/senses"
|
SENSE_LIST = "/senses"
|
||||||
SENSE_ADD = "/senses/add"
|
SENSE_ADD = "/senses/add"
|
||||||
|
SENSE = "/sense/:sense_id"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import asyncio
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
import flet
|
import flet
|
||||||
|
from flet_route import Params
|
||||||
|
|
||||||
from soul_diary.ui.app.backend.soul import SoulBackend
|
from soul_diary.ui.app.backend.soul import SoulBackend
|
||||||
from soul_diary.ui.app.controls.utils import in_progress
|
from soul_diary.ui.app.controls.utils import in_progress
|
||||||
@@ -23,7 +23,7 @@ class AuthView(BaseView):
|
|||||||
self.backend = backend
|
self.backend = backend
|
||||||
self.backend_data = backend_data
|
self.backend_data = backend_data
|
||||||
|
|
||||||
async def entrypoint(self, page: flet.Page) -> 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)
|
||||||
if self.backend == BackendType.SOUL:
|
if self.backend == BackendType.SOUL:
|
||||||
return await self.connect_to_soul_server(
|
return await self.connect_to_soul_server(
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ class BaseView:
|
|||||||
async def __call__(self, page: flet.Page, params: Params, basket: Basket) -> flet.View:
|
async def __call__(self, page: flet.Page, params: Params, basket: Basket) -> flet.View:
|
||||||
self.view = flet.View(vertical_alignment=flet.MainAxisAlignment.CENTER)
|
self.view = flet.View(vertical_alignment=flet.MainAxisAlignment.CENTER)
|
||||||
|
|
||||||
page = await self.entrypoint(page=page)
|
page = await self.entrypoint(page=page, params=params)
|
||||||
self.view.controls = [page]
|
self.view.controls = [page]
|
||||||
|
|
||||||
return self.view
|
return self.view
|
||||||
|
|
||||||
async def entrypoint(self, page: flet.Page) -> BasePage:
|
async def entrypoint(self, page: flet.Page, params: Params) -> BasePage:
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|||||||
16
soul_diary/ui/app/views/sense.py
Normal file
16
soul_diary/ui/app/views/sense.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import uuid
|
||||||
|
|
||||||
|
import flet
|
||||||
|
from flet_route import Params
|
||||||
|
|
||||||
|
from soul_diary.ui.app.local_storage import LocalStorage
|
||||||
|
from soul_diary.ui.app.pages.base import BasePage
|
||||||
|
from soul_diary.ui.app.pages.sense import SensePage
|
||||||
|
from .base import BaseView
|
||||||
|
|
||||||
|
|
||||||
|
class SenseView(BaseView):
|
||||||
|
async def entrypoint(self, page: flet.Page, params: Params) -> BasePage:
|
||||||
|
sense_id = uuid.UUID(params.sense_id)
|
||||||
|
local_storage = LocalStorage(page.client_storage)
|
||||||
|
return SensePage(view=self.view, local_storage=local_storage, sense_id=sense_id)
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
import flet
|
import flet
|
||||||
from soul_diary.ui.app.local_storage import LocalStorage
|
from flet_route import Params
|
||||||
|
|
||||||
|
from soul_diary.ui.app.local_storage import LocalStorage
|
||||||
from soul_diary.ui.app.pages.base import BasePage
|
from soul_diary.ui.app.pages.base import BasePage
|
||||||
from soul_diary.ui.app.pages.sense_add.emotions import EmotionsPage
|
from soul_diary.ui.app.pages.sense_add.emotions import EmotionsPage
|
||||||
from .base import BaseView
|
from .base import BaseView
|
||||||
|
|
||||||
|
|
||||||
class SenseAddView(BaseView):
|
class SenseAddView(BaseView):
|
||||||
async def entrypoint(self, page: flet.Page) -> BasePage:
|
async def entrypoint(self, page: flet.Page, params: Params) -> BasePage:
|
||||||
local_storage = LocalStorage(page.client_storage)
|
local_storage = LocalStorage(page.client_storage)
|
||||||
return EmotionsPage(view=self.view, local_storage=local_storage)
|
return EmotionsPage(view=self.view, local_storage=local_storage)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import flet
|
import flet
|
||||||
|
from flet_route import Params
|
||||||
|
|
||||||
from soul_diary.ui.app.local_storage import LocalStorage
|
from soul_diary.ui.app.local_storage import LocalStorage
|
||||||
from soul_diary.ui.app.pages.base import BasePage
|
from soul_diary.ui.app.pages.base import BasePage
|
||||||
@@ -7,6 +8,6 @@ from .base import BaseView
|
|||||||
|
|
||||||
|
|
||||||
class SenseListView(BaseView):
|
class SenseListView(BaseView):
|
||||||
async def entrypoint(self, page: flet.Page) -> 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)
|
return SenseListPage(view=self.view, local_storage=local_storage)
|
||||||
|
|||||||
Reference in New Issue
Block a user