def _table_head( treename: str, id_: str, isopen: bool, title: str, show_more_toggle: bool, help_text: Union[str, HTML, None] = None, ) -> None: onclick = foldable_container_onclick(treename, id_, fetch_url=None) img_id = foldable_container_img_id(treename, id_) html.open_thead() html.open_tr(class_="heading") html.open_td(id_="nform.%s.%s" % (treename, id_), onclick=onclick, colspan=2) html.img( id_=img_id, class_=["treeangle", "nform", "open" if isopen else "closed"], src=theme.url("images/tree_closed.svg"), align="absbottom", ) html.write_text(title) html.help(help_text) if show_more_toggle: html.more_button("foldable_" + id_, dom_levels_up=4, with_text=True) html.close_td() html.close_tr() html.close_thead()
def _table_head( treename: str, id_: str, isopen: bool, title: str, show_more_toggle: bool, ) -> None: onclick = html.foldable_container_onclick(treename, id_, fetch_url=None) img_id = html.foldable_container_img_id(treename, id_) html.open_thead() html.open_tr(class_="heading") html.open_td(id_="nform.%s.%s" % (treename, id_), onclick=onclick, colspan=2) html.img(id_=img_id, class_=["treeangle", "nform", "open" if isopen else "closed"], src="themes/%s/images/tree_closed.png" % (html.get_theme()), align="absbottom") html.write_text(title) if show_more_toggle: html.more_button("foldable_" + id_, dom_levels_up=4) html.close_td() html.close_tr() html.close_thead()
def show(self, menu: MegaMenu) -> None: more_id = "main_menu_" + menu.name show_more = get_show_more_setting(more_id) html.open_div(id_=more_id, class_=["main_menu", "more" if show_more else "less"]) hide_entries_js = "cmk.popup_menu.mega_menu_hide_entries('%s')" % more_id html.open_div(class_="navigation_bar") html.open_div(class_="search_bar") if menu.search: menu.search.show_search_field() html.close_div() if menu.info_line: html.span(menu.info_line(), id_="info_line") topics = menu.topics() if any_show_more_items(topics): html.open_div() html.more_button(id_=more_id, dom_levels_up=3, additional_js=hide_entries_js, with_text=True) html.close_div() html.close_div() html.open_div(class_="content inner", id="content_inner_%s" % menu.name) for topic in topics: self._show_topic(topic, menu.name) html.div(None, class_=["topic", "sentinel"]) html.close_div() html.close_div() html.javascript(hide_entries_js) html.javascript("cmk.popup_menu.initialize_mega_menus();") html.open_div(class_="content inner", id="content_inner_%s_search" % menu.name) html.close_div()
def show(self, menu: MegaMenu) -> None: more_id = "main_menu_" + menu.name show_more = get_show_more_setting(more_id) html.open_div(id_="main_menu_" + menu.name, class_=("more" if show_more else "less")) topics = menu.topics() if any_advanced_items(topics): html.more_button(id_=more_id, dom_levels_up=1) html.open_div(class_="content inner") for topic in topics: self._show_topic(topic, menu.name) html.close_div() html.close_div()
def _show_dropdown_area(self, dropdown: PageMenuDropdown) -> None: id_ = "menu_%s" % dropdown.name show_more = user.get_tree_state("more_buttons", id_, isopen=False) or user.show_more_mode html.open_div(class_=["menu", ("more" if show_more else "less")], id_=id_) if dropdown.any_show_more_entries: html.open_div(class_=["more_container"]) html.more_button(id_, dom_levels_up=2) html.close_div() for topic in dropdown.topics: if not topic.entries: continue # Do not display empty topics self._show_topic(topic) html.close_div()
def show(self, menu: MegaMenu) -> None: more_id = "main_menu_" + menu.name show_more = get_show_more_setting(more_id) html.open_div(id_=more_id, class_=["main_menu", "more" if show_more else "less"]) hide_entries_js = "cmk.popup_menu.mega_menu_hide_entries('%s')" % more_id topics = menu.topics() if any_advanced_items(topics): html.more_button(id_=more_id, dom_levels_up=1, additional_js=hide_entries_js) html.open_div(class_="content inner") for topic in topics: self._show_topic(topic, menu.name) html.close_div() html.close_div() html.javascript(hide_entries_js) html.javascript("cmk.popup_menu.initialize_mega_menus();")
def render_snapin(self, snapin: UserSidebarSnapin) -> str: snapin_class = snapin.snapin_type name = snapin_class.type_name() snapin_instance = snapin_class() more_id = "sidebar_snapin_%s" % name show_more = config.user.get_show_more_setting(more_id) html.open_div(id_="snapin_container_%s" % name, class_=["snapin", ("more" if show_more else "less")]) self._render_snapin_styles(snapin_instance) # When not permitted to open/close snapins, the snapins are always opened if snapin.visible == SnapinVisibility.OPEN or not config.user.may( "general.configure_sidebar"): style = None else: style = "display:none" toggle_url = "sidebar_openclose.py?name=%s&state=" % name # If the user may modify the sidebar then add code for dragging the snapin head_actions: Dict[str, str] = {} if config.user.may("general.configure_sidebar"): head_actions = { "onmouseover": "document.body.style.cursor='move';", "onmouseout ": "document.body.style.cursor='';", "onmousedown": "cmk.sidebar.snapin_start_drag(event)", "onmouseup": "cmk.sidebar.snapin_stop_drag(event)" } html.open_div(class_=["head", snapin.visible.value], **head_actions) show_more = snapin_instance.has_show_more_items() may_configure = config.user.may("general.configure_sidebar") if show_more or may_configure: html.open_div(class_="snapin_buttons") if show_more: html.open_span(class_="moresnapin") html.more_button(more_id, dom_levels_up=4) html.close_span() if may_configure: # Button for closing (removing) a snapin html.open_span(class_="closesnapin") close_url = "sidebar_openclose.py?name=%s&state=off" % name html.icon_button( url=None, title=_("Remove this snapin"), icon="close", onclick="cmk.sidebar.remove_sidebar_snapin(this, '%s')" % close_url) html.close_span() html.close_div() # The heading. A click on the heading mini/maximizes the snapin toggle_actions: Dict[str, str] = {} if config.user.may("general.configure_sidebar"): toggle_actions = { "onclick": "cmk.sidebar.toggle_sidebar_snapin(this,'%s')" % toggle_url, "onmouseover": "this.style.cursor='pointer'", "onmouseout": "this.style.cursor='auto'" } html.b(textwrap.shorten(snapin_class.title(), width=27, placeholder="..."), class_=["heading"], **toggle_actions) if may_configure: # Icon for mini/maximizing html.span("", class_="minisnapin", title=_("Toggle this snapin"), onclick="cmk.sidebar.toggle_sidebar_snapin(this, '%s')" % toggle_url) # End of header html.close_div() # Now comes the content html.open_div(class_="content", id_="snapin_%s" % name, style=style) refresh_url = '' try: # TODO: Refactor this confusing special case. Add deddicated method or something # to let the snapins make the sidebar know that there is a URL to fetch. url = snapin_instance.show() if url is not None: # Fetch the contents from an external URL. Don't render it on our own. refresh_url = url html.javascript( "cmk.ajax.get_url(\"%s\", cmk.utils.update_contents, \"snapin_%s\")" % (refresh_url, name)) except Exception as e: logger.exception("error rendering snapin %s", name) write_snapin_exception(e) html.close_div() html.close_div() return refresh_url