File size: 2,967 Bytes
6e876c1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""登录页与应用外壳(顶栏 + 标签页导航)。

外壳把各分区(我的数据 / 管理)组装起来,按钮均在静态区,id 稳定。
"""
from __future__ import annotations

from typing import Any

from shiny import ui

from . import config, theme
from .view_admin import _admin_panel
from .view_me import _my_panel


def login_view() -> ui.Tag:
    return ui.div(
        ui.div(
            theme.crest(96),
            ui.div(config.TEAM_NAME, class_="zh"),
            ui.div(config.TEAM_NAME_EN, class_="en"),
            ui.div(f"{config.TEAM_CITY} · EST. {config.EST_YEAR}", class_="city"),
            theme.card(
                "球员登录",
                ui.input_text("in_user", "用户名", placeholder="如 leo / hakimi / admin"),
                ui.input_password("in_pw", "密码", placeholder="请输入密码"),
                ui.input_action_button("btn_login", "登 录", class_="btn-primary"),
                icon="🔐",
            ),
            ui.div(
                ui.HTML(
                    "球员用<b>球队分配的用户名</b>登录,初始密码请向领队索取;"
                    "首次登录后请到『我的数据』页修改密码。"
                ),
                class_="sde-login-hint",
            ),
            class_="sde-login",
        ),
        class_="sde-login-wrap",
    )


def app_shell(
    user: dict[str, Any],
    user_choices: dict[str, str],
    seasons: list[int],
) -> ui.Tag:
    top = ui.div(
        ui.div(
            theme.crest(52),
            ui.div(
                ui.div(config.TEAM_NAME, class_="zh"),
                ui.div(config.TEAM_NAME_EN, class_="en"),
            ),
            class_="sde-brand",
        ),
        ui.div(class_="sde-spacer"),
        ui.span(ui.HTML(f'欢迎,<b>{user["display_name"]}</b>'), class_="sde-welcome"),
        ui.input_action_button("btn_logout", "退出", class_="btn-outline-light btn-sm"),
        class_="sde-topbar",
    )
    season_choices = {"all": "全部赛季", **{str(y): f"{y} 赛季" for y in seasons}}
    panels = [
        ui.nav_panel(
            "🏆 主页",
            ui.div(
                ui.download_button("dl_leaderboard", "📷 导出榜单图", class_="btn-outline-light btn-sm"),
                ui.input_select("home_season", "赛季", season_choices, selected="all", width="150px"),
                class_="sde-season-bar",
            ),
            ui.output_ui("home_content"),
            value="home",
        ),
        ui.nav_panel("📝 我的数据", _my_panel(), value="me"),
    ]
    if user["is_admin"]:
        panels.append(ui.nav_panel("⚙️ 管理", _admin_panel(user_choices), value="admin"))
    return ui.div(
        top,
        ui.navset_tab(*panels, id="main_tabs"),
        ui.div(
            ui.HTML(f"肆带贰足球俱乐部 · {config.TEAM_NAME_EN}"),
            class_="sde-foot",
        ),
        class_="sde-shell",
    )