def log(self, type, msg, icon=None, date=None): """ Adds a message to the log :param type: The type of the message. :type type: "success", "error", "warning", "info", "progress" :param msg: The message to append :type msg: str """ assert type in ["success", "error", "warning", "info", "progress"] msgWrap = html5.Li() msgWrap.addClass("msg--" + type, "msg", "is-active") msgWrap.addClass("is-new popup popup--s") if icon: svg = embedsvg.get(icon) else: svg = embedsvg.get("icons-%s" % type) if not svg: svg = embedsvg.get("icons-message-news") if svg: msgWrap.element.innerHTML = svg + msgWrap.element.innerHTML msgContent = html5.Div() msgContent.addClass("msg-content") msgWrap.appendChild(msgContent) if not date: adate = datetime.now().strftime("%d. %b. %Y, %H:%M:%S") else: adate = date msgDate = html5.Span() msgDate.appendChild(html5.TextNode(adate)) msgDate.addClass("msg-date") msgContent.appendChild(msgDate) if isinstance(msg, html5.Widget): #Append that widget directly msgContent.appendChild(msg) else: #Create a span element for that message msgDescr = html5.Span() msgDescr.appendChild(html5.TextNode(html5.utils.unescape(msg))) msgDescr.addClass("msg-descr") msgContent.appendChild(msgDescr) DeferredCall(self.removeNewCls, msgWrap, _delay=2500) self.logUL.appendChild(msgWrap) if len(self.logUL._children) > 1: self.logUL.element.removeChild(msgWrap.element) self.logUL.element.insertBefore( msgWrap.element, self.logUL.element.children.item(0))
def invoke(self): self.iconnav.removeAllChildren() newBtn = html5.A() newBtn["href"] = "https://www.viur.is" newBtn["target"] = "_blank" newBtn.addClass("btn") svg = embedsvg.get("icons-ribbon") if svg: newBtn.element.innerHTML = svg + newBtn.element.innerHTML newBtn.appendChild(translate("vi.topbar.newbtn")) #self.iconnav.appendChild(newBtn) newMarker = html5.Span() newMarker.addClass("marker") newMarker.appendChild(translate("vi.topbar.new")) newBtn.appendChild(newMarker) for icon in conf["toplevelactions"]: widget = toplevelActionSelector.select(icon) # register log Button as Loghandler if widget == LogButton: conf["mainWindow"].logWdg = widget() self.iconnav.appendChild(conf["mainWindow"].logWdg) elif widget: self.iconnav.appendChild(widget())
def __init__(self): super(TopBarWidget, self).__init__() self["class"] = "vi-topbar bar" self.sinkEvent("onClick") # language=HTML self.fromHTML(""" <div class="vi-tb-left bar-group bar-group--left" [name]="topbarLeft"> <div class="vi-tb-logo" [name]="topbarLogo"></div> <h1 class="vi-tb-title" [name]="moduleH1"></h1> <div class="item" [name]="moduleContainer"> <div [name]="modulImg"></div> <div class="item-content" [name]="moduleName"></div> </div> </div> <nav class="vi-tb-right bar-group bar-group--right" [name]="topbarRight"> <div class="input-group input-group--bar" [name]="iconnav"> </div> </nav> """) if not conf["theApp"].isFramed: svg = embedsvg.get("logos-vi") if svg: self.topbarLogo.element.innerHTML = svg + self.topbarLogo.element.innerHTML else: self.topbarLogo.hide() self.moduleH1.hide() DeferredCall(self.setTitle, _delay=500)
def __init__(self, ident, title=None): super(AccordionSegment, self).__init__() self.sinkEvent("onClick") self.addClass("vi-accordion-segment") self["name"] = ident legend = html5.Legend() legend.addClass("vi-accordion-legend") self.appendChild(legend) self.title = html5.Span() embedSvg = embedsvg.get("icons-arrow-right") if embedSvg: self.title.element.innerHTML = embedSvg self.title.appendChild(html5.TextNode(title or ident)) self.title.addClass("vi-accordion-title") self.title["role"] = "button" legend.appendChild(self.title) # icon = html5.Div() # icon.addClass("vi-accordion-icon") # self.title.appendChild() self._section = html5.Section() self._section.addClass("vi-accordion-section") self.appendChild(self._section)
def onAttach(self): super(FilterSelector, self).onAttach() activeFilter = self.parent().parent().filterID isSearchDisabled = False if self.module in conf["modules"].keys(): modulConfig = conf["modules"][self.module] if "views" in modulConfig.keys() and modulConfig["views"]: for view in modulConfig["views"]: self.appendChild(CompoundFilter(view, self.module)) if "disabledFunctions" in modulConfig.keys() and modulConfig["disabledFunctions"] and "fulltext-search" in \ modulConfig["disabledFunctions"]: isSearchDisabled = True if not isSearchDisabled: self.search = Search() self.search.addClass("item", "has-hover", "is-collapsed") self.appendChild(self.search) self.search.startSearchEvent.register(self) filterImage = html5.Div() filterImage.addClass("item-image") self.search.prependChild(filterImage) self.filterIcon = html5.I() self.filterIcon.addClass("i") filterImage.appendChild(self.filterIcon) self.search.searchLbl.addClass("item-content") embedSvg = embedsvg.get("icons-search") if embedSvg: self.filterIcon.element.innerHTML = embedSvg + self.filterIcon.element.innerHTML
def __init__(self, descr, icon=None): super(Icon, self).__init__() self._icon = icon self._descr = descr self.addClass("item-image") self.modulIcon = html5.I() self.modulIcon.addClass("i") if icon: embedSvg = embedsvg.get(self._icon) if embedSvg: self.modulIcon.element.innerHTML = embedSvg + self.modulIcon.element.innerHTML self.appendChild(self.modulIcon) else: img = html5.Img() img.onError = lambda e: self.onError(e) img.sinkEvent("onError") img["src"] = self._icon self.modulIcon["style"]["background"] = "none" self.modulIcon.appendChild(img) else: self.modulIcon.appendChild(self._descr[:1]) self.appendChild(self.modulIcon)
def EntryIcon(self): self.nodeImage.removeClass("is-hidden") svg = embedsvg.get("icons-folder") if svg: nodeIcon = html5.I() nodeIcon.addClass("i") nodeIcon.element.innerHTML = svg + nodeIcon.element.innerHTML self.nodeImage.appendChild(nodeIcon)
def msgOverlay(self, logObj): assert logObj["type"] in [ "success", "error", "warning", "info", "progress" ] msgwrap = html5.Div() msgwrap["class"] = [ "msg", "is-active", "popup", "popup--se", "msg--%s" % logObj["type"] ] msgcontent = html5.Div() msgcontent["class"] = ["msg-content"] msgwrap.appendChild(msgcontent) date = html5.Span() date["class"] = ["msg-date"] date.appendChild(html5.TextNode(logObj["date"])) msgcontent.appendChild(date) msgdescr = html5.Div() msgdescr["class"] = ["msg-descr"] msgcontent.appendChild(msgdescr) if isinstance(logObj["msg"], html5.Widget): msgdescr.appendChild(logObj["msg"]) else: msgdescr.appendChild( html5.TextNode(html5.utils.unescape(logObj["msg"]))) if logObj["icon"]: svg = embedsvg.get(logObj["icon"]) else: svg = embedsvg.get("icons-%s" % logObj["type"]) if not svg: svg = embedsvg.get("icons-message-news") if svg: msgwrap.element.innerHTML = svg + msgwrap.element.innerHTML self.appendChild(msgwrap) DeferredCall(self.removeInfo, msgwrap, _delay=2500)
def EntryIcon(self): ''' Leafs have a different Icon ''' self.nodeImage.removeClass("is-hidden") svg = embedsvg.get("icons-file") if svg: nodeIcon = html5.I() nodeIcon.addClass("i") nodeIcon.element.innerHTML = svg + nodeIcon.element.innerHTML self.nodeImage.appendChild(nodeIcon)
def onClick(self, sender=None): if isinstance(self.parent().parent().sideBar.getWidget(), FilterSelector): self.parent().parent().sideBar.setWidget(None) self.filterSelector = None else: self.filterSelector = FilterSelector(self.parent().parent().module) self.parent().parent( ).sideBar.sidebarHeadline.element.innerHTML = translate( "vi.sidebar.filterselector") svg = embedsvg.get("icons-search") if svg: self.parent().parent( ).sideBar.sidebarIcon.element.innerHTML = svg self.parent().parent().sideBar.setWidget(self.filterSelector)
def __init__(self, shortText="", longText="", *args, **kwargs): super(ToolTip, self).__init__(*args, **kwargs) self["class"] = "vi-tooltip msg is-active" self.sinkEvent("onClick") svg = embedsvg.get("icons-arrow-right") if svg: self.element.innerHTML = svg self.fromHTML(""" <div class="msg-content" [name]="tooltipMsg"> <h2 class="msg-headline" [name]="tooltipHeadline"></h2> <div class="msg-descr" [name]="tooltipDescr"></div> </div> """) self.tooltipHeadline.element.innerHTML = translate( "vi.tooltip.headline") self.tooltipDescr.element.innerHTML = longText.replace("\n", "<br />")
def toggleIntPrev(self): intPrevActive = self.intPrevActive selection = self.parent().parent().getCurrentSelection() if len(selection) == 1 and intPrevActive == True: preview = InternalPreview(self.parent().parent().module, self.parent().parent()._structure, selection[0]) self.parent().parent( ).sideBar.sidebarHeadline.element.innerHTML = translate( "vi.sidebar.internalpreview") svg = embedsvg.get("icons-list-item") if svg: self.parent().parent( ).sideBar.sidebarIcon.element.innerHTML = svg self.parent().parent().sideBar.setWidget(preview) else: if isinstance(self.parent().parent().sideBar.getWidget(), InternalPreview): self.parent().parent().sideBar.setWidget(None)
def __init__(self, module, filter=None, columns=None, filterID=None, filterDescr=None, batchSize=None, context=None, autoload=True, *args, **kwargs): """ :param module: Name of the module we shall handle. Must be a list application! :type module: str """ if not module in conf["modules"].keys(): conf["mainWindow"].log( "error", translate("The module '{module}' does not exist.", module=module)) assert module in conf["modules"].keys() super(ListWidget, self).__init__() self.addClass("vi-widget vi-widget--list") self._batchSize = batchSize or conf[ "batchSize"] # How many rows do we fetch at once? self.isDetaching = False #If set, this widget is beeing about to be removed - dont issue nextBatchNeeded requests self.module = module self.context = context self.loadedPages = 0 # Amount of Pages which are currently loaded self.currentPage = self.loadedPages # last loaded page self.targetPage = 1 #the page which we want to show next if we set this to currentPage +1 and call setPage next page will be loaded #List actions self.actionBar = ActionBar(module, "list", currentAction="list") self.appendChild(self.actionBar) #Entry Actions self.entryActionBar = ActionBar(module, "list", currentAction="list") self.entryActionBar["class"] = ["bar", "vi-entryactionbar"] self.appendChild(self.entryActionBar) self.sideBar = SideBar() self.appendChild(self.sideBar) self.widgetContent = html5.Div() self.widgetContent.addClass("vi-widget-content") self.appendChild(self.widgetContent) myView = None if filterID: if conf["modules"] and module in conf["modules"].keys(): if "views" in conf["modules"][module].keys( ) and conf["modules"][module]["views"]: for v in conf["modules"][module]["views"]: if v["__id"] == filterID: myView = v break if myView and "extendedFilters" in myView.keys( ) and myView["extendedFilters"]: #fixme #self.appendChild(CompoundFilter(myView, module, embed=True)) logging.error("#fixme CompoundFilter") self._checkboxes = (conf["modules"] and module in conf["modules"].keys() and "checkboxSelection" in conf["modules"][module].keys() and conf["modules"][module]["checkboxSelection"]) self._indexes = (conf["modules"] and module in conf["modules"].keys() and "indexes" in conf["modules"][module].keys() and conf["modules"][module]["indexes"]) self._currentCursor = None self._structure = None self._currentRequests = [] self.columns = [] self.selectionMulti = True self.selectionAllow = None self.selectionCallback = None self.filter = filter.copy() if isinstance(filter, dict) else {} self.columns = columns[:] if isinstance(columns, list) else [] self.filterID = filterID #Hint for the sidebarwidgets which predefined filter is currently active self.filterDescr = filterDescr #Human-readable description of the current filter self._tableHeaderIsValid = False #build Table self.tableInitialization(*args, **kwargs) self.selectionActivatedEvent = EventDispatcher("selectionActivated") self.actionBar.setActions(self.getActions(myView), widget=self) self.entryActionBar.setActions(self.getDefaultEntryActions(myView), widget=self) self.emptyNotificationDiv = html5.Div() svg = embedsvg.get("icons-error-file") if svg: self.emptyNotificationDiv.element.innerHTML = svg + self.emptyNotificationDiv.element.innerHTML self.emptyNotificationDiv.appendChild( html5.TextNode(translate("Currently no entries"))) self.emptyNotificationDiv.addClass( "popup popup--center popup--local msg emptynotification") self.widgetContent.appendChild(self.emptyNotificationDiv) self.emptyNotificationDiv.removeClass("is-active") self.setTableActionBar() if autoload: self.reloadData() self.sinkEvent("onClick")
def toggleArrow(self): self.nodeToggle["title"] = translate("Expand/Collapse") embedSvg = embedsvg.get("icons-arrow-right") if embedSvg: self.nodeToggle.element.innerHTML = embedSvg + self.nodeToggle.element.innerHTML
def __init__(self, view, module, embed=False, *args, **kwargs): super(CompoundFilter, self).__init__(*args, **kwargs) self.addClass("vi-sb-compoundfilter item has-hover") self.view = view self.module = module self.embed = embed if embed: self.addClass("vi-sb-compoundfilter--embed") self.addClass("is-expanded", "is-active") else: self.addClass("vi-sb-compoundfilter--standalone") self.addClass("is-collapsed") self.filterheader = html5.Div() self.filterheader["class"] = "vi-sb-compoundfilter-header" filterImage = html5.Div() filterImage.addClass("item-image") self.filterheader.appendChild(filterImage) self.filterIcon = html5.I() self.filterIcon.addClass("i") filterImage.appendChild(self.filterIcon) if "icon" in view.keys(): embedSvg = embedsvg.get(view["icon"]) if embedSvg: self.filterIcon.element.innerHTML = embedSvg + self.filterIcon.element.innerHTML else: img = html5.Img() img["src"] = view["icon"] self.filterIcon.appendChild(img) else: self.filterIcon.appendChild(view["name"][:1]) if "name" in view.keys(): h2 = html5.H2() h2.addClass("vi-sb-compoundfilter-name item-content") h2.appendChild(html5.TextNode(view["name"])) self.filterheader.appendChild(h2) self.appendChild(self.filterheader) self.extendedFilters = [] self.mutualExclusiveFilters = {} for extension in (view["extendedFilters"] if "extendedFilters" in view.keys() else []): wdg = extendedSearchWidgetSelector.select(extension, view, module) if wdg is not None: container = html5.Div() container.addClass("vi-sb-compoundfilter-extended") wdg = wdg(extension, view, module) container.appendChild(wdg) self.appendChild(container) self.extendedFilters.append(wdg) if hasattr(wdg, "mutualExclusiveGroupTarget"): if not self.mutualExclusiveFilters.has_key( "wdg.mutualExclusiveGroupTarget"): self.mutualExclusiveFilters[ wdg.mutualExclusiveGroupTarget] = {} self.mutualExclusiveFilters[ wdg.mutualExclusiveGroupTarget][ wdg.mutualExclusiveGroupKey] = wdg wdg.filterChangedEvent.register(self)