diff --git a/home/start_page.py b/home/start_page.py index f67d126..1a04802 100644 --- a/home/start_page.py +++ b/home/start_page.py @@ -56,27 +56,26 @@ def _inner(self, change): class AiidaLabHome: - """Class that mananges the appearance of the AiiDAlab home page.""" + """Class that manages the appearance of the AiiDAlab home page.""" def __init__(self): self.config_fn = ".launcher.json" - self.output = ipw.Output() self._app_widgets = {} def _create_app_widget(self, name): """Create the widget representing the app on the home screen.""" config = self.read_config() app = AiidaLabApp(name, None, AIIDALAB_APPS) - - if name == "home": - app_widget = AppWidget(app, allow_move=False, allow_manage=False) - else: - app_widget = CollapsableAppWidget(app, allow_move=True) - app_widget.hidden = name in config["hidden"] - app_widget.observe(self._on_app_widget_change_hidden, names=["hidden"]) - + app_widget = CollapsableAppWidget(app, allow_move=True) + app_widget.hidden = name in config["hidden"] + app_widget.observe(self._on_app_widget_change_hidden, names=["hidden"]) return app_widget + def _create_home_widget(self): + """Create the home app widget.""" + app = AiidaLabApp("home", None, AIIDALAB_APPS) + return AppWidget(app, allow_move=False, allow_manage=False) + def _on_app_widget_change_hidden(self, change): """Record whether a app widget is hidden on the home screen in the config file.""" config = self.read_config() @@ -98,18 +97,28 @@ def read_config(self): def render(self): """Rendering all apps.""" - self.output.clear_output() - apps = self.load_apps() + home = self._create_home_widget() + display(home) + + from pathlib import Path + + config_dir = Path("../../.aiidalab").resolve().absolute() + warning_md = config_dir / "home_app_warning.md" - with self.output: - for name in apps: + if warning_md.exists(): + content = warning_md.read_text() + self._show_home_warning(content) + + self.apps_output = ipw.Output() + + with self.apps_output: + for name in self.load_apps(): # Create app widget if it has not been created yet. if name not in self._app_widgets: self._app_widgets[name] = self._create_app_widget(name) - display(self._app_widgets[name]) - return self.output + display(self.apps_output) def load_apps(self): """Load apps according to the order defined in the config file.""" @@ -125,7 +134,7 @@ def load_apps(self): apps.sort(key=lambda x: order.index(x) if x in order else -1) config["order"] = apps self.write_config(config) - return ["home", *apps] + return apps def move_updown(self, name, delta): """Move the app up/down on the start page.""" @@ -138,6 +147,19 @@ def move_updown(self, name, delta): config["order"] = order self.write_config(config) + def _show_home_warning(self, content): + from IPython.display import Markdown + from jinja2 import Environment + + env = Environment() + warning = env.from_string(content).render() + output = ipw.Output() + warning_box = ipw.VBox(children=[output]) + warning_box.add_class("home-warning") + with output: + display(Markdown(warning)) + display(warning_box) + class AppWidget(ipw.VBox): """Widget that represents an app as part of the home page.""" @@ -146,7 +168,7 @@ def __init__(self, app, allow_move=False, allow_manage=True): self.app = app launcher = load_widget(app.name) - launcher.layout = ipw.Layout(width="900px") + launcher.layout.flex = "1" header_items = [] footer_items = [] @@ -155,7 +177,7 @@ def __init__(self, app, allow_move=False, allow_manage=True): app_status_info = AppStatusInfoWidget() for trait in ("detached", "compatible", "remote_update_status"): ipw.dlink((app, trait), (app_status_info, trait)) - app_status_info.layout.margin = "0px 0px 0px 800px" + app_status_info.layout.margin = "0px 0px 0px auto" header_items.append(app_status_info) footer_items.append( @@ -177,7 +199,7 @@ def __init__(self, app, allow_move=False, allow_manage=True): footer = ipw.HTML(" ".join(footer_items), layout={"width": "initial"}) footer.layout.margin = ( - "0px 0px 0px 700px" if allow_manage else "0px 0px 20px 0px" + "0px 0px 0px auto" if allow_manage else "0px 0px 20px 0px" ) super().__init__(children=[header, body, footer]) diff --git a/start.ipynb b/start.ipynb index fc51cd7..8302e5f 100644 --- a/start.ipynb +++ b/start.ipynb @@ -31,6 +31,12 @@ " .output_subarea {\n", " max-width: none !important;\n", " }\n", + " .home-warning {\n", + " background-color: antiquewhite;\n", + " margin: 8px;\n", + " padding: 8px;\n", + " border: 1px solid red;\n", + " }\n", "\n" ] }, @@ -64,7 +70,7 @@ " home.move_updown(parsed_url[\"move_up\"][0], -1)\n", "elif \"move_down\" in parsed_url:\n", " home.move_updown(parsed_url[\"move_down\"][0], +1)\n", - "display(home.render())" + "home.render()" ] }, {