def get_header_wdg(my): div = DivWdg() div.add("<hr/>") dots_div = DivWdg() dots_div.add_style("margin-top: -12px") div.add(dots_div) left = 50 width = 60 for i, widget in enumerate(my.widgets): on_dot = IconWdg("", IconWdg.DOT_GREEN) on_dot.add_class("spt_wizard_on_dot") off_dot = IconWdg("", IconWdg.DOT_GREY) off_dot.add_class("spt_wizard_off_dot") if i == 0: off_dot.add_style("display: none") else: on_dot.add_style("display: none") dot_div = DivWdg() dots_div.add(dot_div) dot_div.add(on_dot) dot_div.add(off_dot) dot_div.add_style("width: %spx" % width) dot_div.add_style("float: left") dot_div.add_style("margin-left: %spx" % left) dot_div.add_style("text-align: center") if (i+1) < len(my.widgets): arrow_div = DivWdg() dots_div.add(arrow_div) arrow_div.add_style("float: left") arrow_div.add_style("position: absolute") arrow_div.add_style("margin-left: %spx" % ((width+left)*(i+1.2))) arrow_div.add_style("margin-top: -3px") arrow_div.add_style("text-align: center") icon = IconWdg("", IconWdg.ARROWHEAD_DARK_RIGHT) arrow_div.add(icon) dots_div.add("<br clear='all'/>") for widget in my.widgets: name_div = DivWdg() div.add(name_div) name_div.add_style("float: left") name_div.add_style("margin-left: %spx" % left) name = widget.get_name() name_div.add(name) name_div.add_style("width: %spx" % width) name_div.add_style("text-align: center") div.add("<br clear='all'/>") return div
def get_item_div(self, sobject): ''' get the item div the sobject''' top = DivWdg() top.add_style("padding: 3px 2px") top.add_class("spt_drop_item") top.add_class("SPT_DROP_ITEM") item_div = DivWdg() top.add(item_div, "item_div") item_div.add_style("text-overflow: ellipsis") item_div.add_style("white-space: nowrap") item_div.add_style("width: 80%") item_div.add_attr('title','Click to remove') item_div.add_style("display", "inline-block") item_div.add_style("vertical-align", "top") item_div.add_style("overflow", "hidden") icon_div = DivWdg() top.add(icon_div) icon = IconWdg(icon="BS_REMOVE") icon_div.add(icon) icon_div.add_behavior( { 'type': 'click_up', #'cbjs_action': '''spt.dg_table_action.sobject_drop_remove(evt,bvr)''' 'cbjs_action': '''spt.drop.sobject_drop_remove(evt,bvr)''' } ) icon.add_style("opacity: 0.3") icon_div.add_class("hand") icon_div.add_style("display", "inline-block") icon_div.add_style("vertical-align", "top") #icon_div.add_border() #self.menu.set_over(item_div, event="mousein") #self.menu.set_out(top, event="mouseleave") # set this as the place for the display value to go item_div.add_class("spt_drop_display_value") add_icon = True ExpressionParser.clear_cache() if sobject: if add_icon: self._add_icon(sobject, item_div) if self.display_expr: display_value = Search.eval(self.display_expr, sobjects = sobject, single=True) else: display_value = sobject.get_display_value() if isinstance(display_value, list): display_value = display_value[0] item_div.add( display_value ) self.values.append( SearchKey.get_by_sobject(sobject) ) return top
def get_display(self): self.display_expr = self.kwargs.get('display_expr') self.values = [] instance_type = self.get_option("instance_type") accepted_type = self.get_option("accepted_drop_type") div = DivWdg() div.add_class("spt_drop_element_top") div.add_style("width: 100%") div.add_style("min-height: 70px") div.add_style("height: auto") div.add_style("min-width: 100px") div.add_style("max-height: 300px") div.add_style("overflow-y: auto") div.add_style("overflow-x: hidden") self.value_wdg = HiddenWdg(self.get_name()) self.value_wdg.add_class("spt_drop_element_value") div.add( self.value_wdg ) version = self.parent_wdg.get_layout_version() #if version != "2": self.add_drop_behavior(div, accepted_type) # add the hidden div which holds containers info for the sobject template_div = DivWdg() template_div.add_style("display: none") template_item = self.get_item_div(None) # float left for the new icon beside it item_div = template_item.get_widget('item_div') #item_div.add_style('float: left') template_item.add_class("spt_drop_template") new_icon = IconWdg("New", IconWdg.NEW) new_icon.add_style('padding-left','3px') #TODO: insert the new_icon at add(new_icon, index=0) and make sure # the js-side sobject_drop_action cloning align the template div properly #template_item.add(new_icon) template_div.add(template_item) div.add(template_div) content_div = DivWdg() div.add(content_div) content_div.add_class("spt_drop_content") if instance_type: instance_wdg = self.get_instance_wdg(instance_type) content_div.add(instance_wdg) return div
def get_input_by_arg_key(self, key): if key == 'icon': input = SelectWdg("option_icon_select") input.set_option("values", IconWdg.get_icons_keys()) input.add_empty_option("-- Select --") elif key == 'script': input = SelectWdg("option_script_select") input.set_option("query", "config/custom_script|code|code" ) input.add_empty_option("-- Select --") else: input = TextWdg("value") return input
def get_display(my): msg = my.kwargs.get("message") arrow_div = DivWdg() icon = IconWdg(msg, IconWdg.ARROW_UP_LEFT_32) icon.add_style("margin-top: -20") icon.add_style("margin-left: -15") icon.add_style("position: absolute") arrow_div.add(icon) arrow_div.add(" "*5) arrow_div.add("<b>%s</b>" % msg) arrow_div.add_style("position: relative") arrow_div.add_style("margin-top: 5px") arrow_div.add_style("margin-left: 20px") arrow_div.add_style("float: left") arrow_div.add_style("padding: 25px") arrow_div.set_box_shadow("1px 1px 2px 2px") arrow_div.set_round_corners(30) arrow_div.add_color("background", "background") return arrow_div
def get_link_wdg(my, element_name, config, options, info): li = HtmlElement.li() li.add_class("spt_side_bar_link") level = info.get("level") if level == 1: li.add_class("menu_header") li.add_class("main_link") else: li.add_class("sub_li") title = my._get_title(config, element_name) attributes = config.get_element_attributes(element_name) show_icons = my.kwargs.get("show_icons") if show_icons in [True, 'true']: icon = attributes.get("icon") if not icon: icon = "view" icon_path = IconWdg.get_icon_path(icon.upper()) li.add(HtmlElement.img(icon_path)) li.add(" ") link_mode = my.kwargs.get("link_mode") if not link_mode: use_href = my.kwargs.get("use_href") if use_href in ['true', True]: link_mode = 'href' link_mode = 'tab' target = my.kwargs.get("target") if not target: target = ".spt_content" else: if target[0] not in [".", "#"]: target = ".%s" % target link = "/tab/%s" % (element_name) #link = "/link/%s" % (element_name) li.add_attr("spt_link", link) if link_mode == 'href': project_code = Project.get_project_code() #li.add("<a href='/tactic/%s/#/tab/%s'>%s</a>" % (project_code, element_name, title) ) li.add("<a>%s</a>" % title) li.add_behavior( { 'type': 'click_up', 'bvr_repeat_interval': 3, 'title': title, 'link': link, 'target': target, 'cbjs_action': ''' var content = $(document).getElement(bvr.target); spt.app_busy.show("Loading link "+bvr.title); spt.panel.load_link(content, bvr.link); spt.app_busy.hide(); ''' } ) elif link_mode == 'tab': # find the tab below the target li.add("<a>%s</a>" % title) li.add_behavior( { 'type': 'click_up', 'bvr_repeat_interval': 3, 'title': title, 'link': link, 'element_name': element_name, 'target': target, 'cbjs_action': ''' var content = $(document).getElement(bvr.target); var tab_top = null;; // check if there even is a tab if (spt.tab) { tab_top = spt.tab.set_tab_top(content); } if (tab_top) { setTimeout( function() { spt.app_busy.show("Loading link "+bvr.title); }, 0 ); var link = bvr.src_el.getAttribute("spt_link"); var class_name = 'tactic.ui.panel.HashPanelWdg'; var kwargs = { hash: link } spt.tab.add_new(bvr.element_name,bvr.title,class_name,kwargs); } else { spt.app_busy.show("Loading link "+bvr.title); spt.panel.load_link(content, bvr.link); } spt.app_busy.hide(); ''' } ) elif link_mode == 'custom': li.add("<a>%s</a>" % title) li.add_attr('spt_title', title) li.add_attr('spt_element_name', element_name) else: li.add(title) li.add_attr("spt_title", title) li.add_attr("spt_element_name", element_name) li.add_attr("spt_icon", attributes.get("icon")) li.add_attr("spt_view", config.get_view() ) li.add_attr("spt_path", options['path']) li.add_attr("spt_view", config.get_view() ) li.add_class("spt_side_bar_element") my.add_link_behavior(li, element_name, config, options) return li
def handle_item_div(my, item_div, dirname, basename): table = Table() item_div.add(table) table.add_row() table.add_style("width: 100%") icon_string = my.get_file_icon(dirname, basename) icon_div = DivWdg() td = table.add_cell(icon_div) td.add_style("width: 15px") icon = IconWdg("%s/%s" % (dirname, basename), icon_string) icon_div.add(icon) icon_div.add_style("float: left") icon_div.add_style("margin-top: -1px") path = "%s/%s" % (dirname, basename) status = my.path_info.get(path) margin_left = -16 if status == 'same': check = IconWdg( "No Changes", IconWdg.CHECK, width=12 ) elif status == 'added': check = IconWdg( "Added", IconWdg.NEW, width=16 ) margin_left = -18 elif status == 'unversioned': check = IconWdg( "Unversioned", IconWdg.HELP, width=12 ) elif status == 'missing': check = IconWdg( "Missing", IconWdg.WARNING, width=12 ) elif status == 'editable': check = IconWdg( "Editable", IconWdg.EDIT, width=12 ) elif status == 'modified': check = IconWdg( "Modified", IconWdg.WARNING, width=12 ) else: check = IconWdg( "Error (unknown status)", IconWdg.ERROR, width=12 ) if check: td = table.add_cell(check) td.add_style("width: 3px") check.add_style("float: left") check.add_style("margin-left: %spx" % margin_left) check.add_style("margin-top: 4px") item_div.add_color("color", "color", [0, 0, 50]) if status == 'missing': item_div.add_style("opacity: 0.3") else: item_div.add_style("opacity: 0.8") name_div = DivWdg() td = table.add_cell(name_div) name_div.add(basename) name_div.add_style("float: left") if status != "same": name_div.add(" <i style='opacity: 0.5; font-size: 10px'>(%s)</i>" % status) spath = path.replace(" ", "_") # add the size of the file size_div = DivWdg() td = table.add_cell(size_div) td.add_style("width: 60px") size = my.sizes.get(spath) if size is None or size == -1: size_div.add("-") else: size_div.add(FormatValue().get_format_value(size, 'KB')) size_div.add_style("margin-right: 5px") size_div.add_style('text-align: right') # FIXME: this still is needed right now, although really used. my.subcontext_options = [] if not my.subcontext_options: subcontext = TextWdg("subcontext") subcontext = HiddenWdg("subcontext") subcontext.add_class("spt_subcontext") subcontext.add_style("float: right") else: subcontext = SelectWdg("subcontext") subcontext = HiddenWdg("subcontext") subcontext.set_option("show_missing", False) subcontext.set_option("values", my.subcontext_options) subcontext.add_empty_option("----") subcontext.add_behavior( { 'type': 'click_up', 'propagate_evt': False, 'cbjs_action': ''' bvr.src_el.focus(); ''' } ) subcontext.add_style("display: none") item_div.add(subcontext)
def get_display(my): my.collection_key = my.kwargs.get("collection_key") collection = Search.get_by_search_key(my.collection_key) top = my.top my.kwargs["scale"] = 75; my.kwargs["show_scale"] = False; my.kwargs["expand_mode"] = "plain" from tile_layout_wdg import TileLayoutWdg tile = TileLayoutWdg( **my.kwargs ) parent_dict = my.kwargs.get("parent_dict") has_parent=False if parent_dict: has_parent = True path = my.kwargs.get("path") if collection and path: title_div = DivWdg() top.add(title_div) title_div.add_style("float: left") title_div.add_style("margin: 15px 0px 15px 30px") asset_lib_span_div = SpanWdg() title_div.add(asset_lib_span_div) icon = IconWdg(name="Asset Library", icon="BS_FOLDER_OPEN") asset_lib_span_div.add(icon) asset_lib_span_div.add(" <a><b>Asset Library</b></a> ") path = path.strip("/") parts = path.split("/") for idx, part in enumerate(parts): title_div.add(" / ") # the last spt_collection_link does not need a search_key if has_parent and (idx is not len(parts) - 1): search_key = parent_dict.get(part) title_div.add(" <a class='spt_collection_link' search_key=%s><b>%s</b></a> " % (search_key, part)) else: title_div.add(" <a class='spt_collection_link'><b>%s</b></a> " % part) title_div.add_style("margin-top: 10px") # Adding behavior to collections link parts = my.kwargs.get("search_type").split("/") collection_type = "%s/%s_in_%s" % (parts[0], parts[1], parts[1]) exists = SearchType.get(collection_type, no_exception=True) if not exists: title_div.add("SearchType %s is not registered." % collection_type) return top # These behaviors are only activated if the view is within collection layout, # "is_new_tab" is a kwargs set to true, if opening a new tab if not my.kwargs.get("is_new_tab"): icon.add_class("hand") icon.add_behavior( { 'type': 'mouseover', 'cbjs_action': ''' bvr.src_el.setStyle('opacity', 1.0); ''' } ) icon.add_behavior( { 'type': 'mouseout', 'cbjs_action': ''' bvr.src_el.setStyle('opacity', 0.6); ''' } ) # make icon and All Assets title clickable to return to view all assets asset_lib_span_div.add_class("hand") asset_lib_span_div.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_collection_top"); var content = top.getElements(".spt_collection_content"); spt.panel.refresh(top); ''' } ) title_div.add_class("hand") title_div.add_relay_behavior( { 'type': 'mouseup', 'search_type': my.kwargs.get("search_type"), 'collection_type': collection_type, 'bvr_match_class': 'spt_collection_link', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_collection_top"); var content = top.getElement(".spt_collection_content"); var collection_key = bvr.src_el.getAttribute("search_key"); if (!collection_key) { spt.notify.show_message("Already in the Collection."); } else { var collection_code = collection_key.split("workflow/asset?project=workflow&code=")[1]; var collection_path = bvr.src_el.innerText; var expr = "@SEARCH("+bvr.collection_type+"['parent_code','"+collection_code+"']."+bvr.search_type+")"; var cls = "tactic.ui.panel.CollectionContentWdg"; var kwargs = { collection_key: collection_key, path: collection_path, search_type: bvr.search_type, show_shelf: false, show_search_limit: true, expression: expr } spt.panel.load(content, cls, kwargs); bvr.src_el.setStyle("box-shadow", "0px 0px 3px rgba(0,0,0,0.5)"); } ''' } ) #title_div.add("/ %s" % collection.get_value("name") ) #scale_wdg = tile.get_scale_wdg() #top.add(scale_wdg) #scale_wdg.add_style("float: right") top.add(my.get_header_wdg()) top.add(tile) return top
def get_display(my): div = DivWdg() if not Container.get_dict("JSLibraries", "spt_popup"): div.add_style("position: fixed") div.add_style("top: 0px") div.add_style("left: 0px") div.add_style("opacity: 0.4") div.add_style("background", "#000") div.add_style("padding: 100px") div.add_style("height: 100%") div.add_style("width: 100%") div.add_class("spt_popup_background") div.add_style("display: none") div.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.hide(bvr.src_el); ''' } ) Container.put("PopupWdg:background", True) # This is the absolute outside of a popup, including the drop shadow widget = DivWdg() div.add(widget) widget.add_class("spt_popup") if not Container.get_dict("JSLibraries", "spt_popup"): widget.add_behavior( { 'type': 'load', 'cbjs_action': my.get_onload_js() } ) width = my.kwargs.get("width") if not width: width = 10 #widget.add_behavior( { # 'type': 'load', # 'cbjs_action': 'bvr.src_el.makeResizable({handle:bvr.src_el.getElement(".spt_popup_resize")})' #} ) web = WebContainer.get_web() widget.set_id(my.name) if my.kwargs.get("display") == "true": pass else: widget.add_style("display: none") widget.add_style("position: absolute") widget.add_style("left: 400px") widget.add_style("top: 100px") widget.add_border() widget.add_color("background", "background") #widget.set_box_shadow(color="#000") widget.set_box_shadow() table = Table() table.add_behavior( { 'type': 'load', 'width': width, 'cbjs_action': ''' bvr.src_el.setStyle("width", bvr.width) var popup = bvr.src_el.getParent(".spt_popup"); var window_size = $(window).getSize(); var size = bvr.src_el.getSize(); var left = window_size.x/2 - size.x/2; var top = window_size.y/2 - size.y/2; popup.setStyle("left", left); //popup.setStyle("top", top); ''' } ) table.add_row() """ # Qt doesn't support shadows very well if web.get_browser() == 'Qtx': # dynamically add css files table.add_class("css_shadow_table") td = table.add_cell() td.add_class("css_shadow_td css_shadow_top_left SPT_POPUP_SHADOW") td = table.add_cell() td.add_class("css_shadow_td css_shadow_top SPT_POPUP_SHADOW") td = table.add_cell() td.add_class("css_shadow_td css_shadow_top_right SPT_POPUP_SHADOW") # Middle (Content) Row of Shadow table ... table.add_row() td = table.add_cell() td.add_class("css_shadow_td css_shadow_left SPT_POPUP_SHADOW") """ content_td = table.add_cell() content_td.add_class("css_shadow_td") """ if web.get_browser() == 'Qtx': td = table.add_cell() td.add_class("css_shadow_td css_shadow_right SPT_POPUP_SHADOW") # Bottom Row of Shadow table ... table.add_row() td = table.add_cell() td.add_class("css_shadow_td css_shadow_bottom_left SPT_POPUP_SHADOW") td = table.add_cell() td.add_class("css_shadow_td css_shadow_bottom SPT_POPUP_SHADOW") td = table.add_cell() td.add_class("css_shadow_td css_shadow_bottom_right SPT_POPUP_SHADOW") """ drag_div = DivWdg() #from tactic.ui.container import ArrowWdg #arrow = ArrowWdg() #drag_div.add(arrow) # FIXME: for some reason, this causes popups to stop functioning after # close a couple of times my.add_header_context_menu(drag_div) # create the 'close' button ... if my.allow_close: close_wdg = SpanWdg(css='spt_popup_close') #close_wdg.add( IconWdg("Close", IconWdg.POPUP_WIN_CLOSE) ) close_wdg.add( IconWdg("Close", "BS_REMOVE") ) close_wdg.add_style("margin: 5px 1px 3px 1px") close_wdg.add_style("float: right") close_wdg.add_class("hand") close_wdg.add_behavior({ 'type': 'click_up', 'cbjs_action': my.get_cancel_script() }) drag_div.add(close_wdg) # create the 'minimize' button ... minimize_wdg = SpanWdg(css='spt_popup_min') minimize_wdg.add_style("margin: 5px 1px 3px 1px") #minimize_wdg.add( IconWdg("Minimize", IconWdg.POPUP_WIN_MINIMIZE) ) minimize_wdg.add( IconWdg("Minimize", "BS_MINUS") ) minimize_wdg.add_style("float: right") minimize_wdg.add_class("hand") behavior = { 'type': 'click_up', 'cbjs_action': "spt.popup.toggle_minimize( bvr.src_el );" } minimize_wdg.add_behavior( behavior ); drag_div.add(minimize_wdg) #-- TO ADD SOON -- create the 'refresh' button ... # refresh_wdg = SpanWdg() # refresh_wdg.add( IconWdg("Refresh Popup", IconWdg.POPUP_WIN_REFRESH) ) # refresh_wdg.add_style("float: right") # refresh_wdg.add_class("hand") # behavior = { # 'type': 'click_up', # 'cbjs_action': "spt.popup.toggle_minimize( bvr.src_el );" # } # refresh_wdg.add_behavior( behavior ); # drag_div.add(refresh_wdg) width = my.kwargs.get("width") # style drag_div.add_style("font-size: 1.1em") drag_div.add_style("text-align: left") drag_div.add_class("spt_popup_width") drag_handle_div = DivWdg(id='%s_title' %my.name) drag_handle_div.add_style("padding: 12px;") #drag_handle_div.add_gradient("background", "background", +10) drag_handle_div.add_color("background", "background", -5) drag_handle_div.add_color("color", "color") drag_handle_div.add_style("font-weight", "bold") drag_handle_div.add_style("font-size", "12px") # add the drag capability. # NOTE: need to use getParent because spt.popup has not yet been # initialized when this is processed shadow_color = drag_div.get_color("shadow") drag_div.add_behavior( { 'type':'smart_drag', 'shadow_color': shadow_color, 'drag_el': "@.getParent('.spt_popup')", 'bvr_match_class': 'spt_popup_title', 'options': {'z_sort': 'bring_forward'}, 'ignore_default_motion': 'true', "cbjs_setup": ''' if (spt.popup.is_background_visible) { spt.popup.offset_x = document.body.scrollLeft; spt.popup.offset_y = document.body.scrollTop; spt.popup.hide_background(); var parent = bvr.src_el.getParent(".spt_popup"); parent.setStyle("box-shadow","0px 0px 20px " + bvr.shadow_color); } else { spt.popup.offset_x = 0; spt.popup.offset_y = 0; } ''', "cbjs_motion": ''' mouse_411.curr_x += spt.popup.offset_x; mouse_411.curr_y += spt.popup.offset_y; spt.mouse.default_drag_motion(evt, bvr, mouse_411); ''', "cbjs_action": '' } ) title_wdg = my.title_wdg if not title_wdg: title_wdg = "No Title" #else: # title_wdg = title_wdg drag_handle_div.add_behavior({ 'type': 'double_click', 'cbjs_action': my.get_cancel_script() }) drag_handle_div.add(title_wdg) drag_handle_div.add_class("spt_popup_title") # add a context menu from tactic.ui.container.smart_menu_wdg import SmartMenu SmartMenu.assign_as_local_activator( drag_handle_div, 'HEADER_CTX' ) drag_handle_div.add_attr("spt_element_name", "Test Dock") # add the content content_div = DivWdg() content_div.add_color("color", "color2") #content_div.add_color("background", "background2") from pyasm.web.palette import Palette palette = Palette.get() content_div.add_color("color", "color2") content_div.add_color("background", "background2") content_div.add_style("margin", "0px, -1px -0px -1px") content_div.set_id("%s_content" % my.name) content_div.add_class("spt_popup_content") content_div.add_style("overflow: hidden") content_div.add_style("display: block") #content_div.add_style("padding: 10px") if not my.content_wdg: my.content_wdg = "No Content" content_div.add(my.content_wdg) drag_div.add( drag_handle_div ) my.position_aux_div(drag_div, content_div) content_td.add(drag_div) widget.add(table) # ALWAYS make the Popup a Page Utility Widget (now processed client side) widget.add_class( "SPT_PUW" ) if my.z_start: widget.set_z_start( my.z_start ) widget.add_style("z-index: %s" % my.z_start) else: widget.add_style("z-index: 102") # add the resize icon icon = IconWdg( "Resize", IconWdg.RESIZE_CORNER ) icon.add_style("cursor: nw-resize") icon.add_style("z-index: 1000") icon.add_class("spt_popup_resize") icon.add_style("float: right") icon.add_style("margin-top: -15px") icon.add_behavior( { 'type': 'drag', "drag_el": '@', "cb_set_prefix": 'spt.popup.resize_drag' } ) content_td.add(icon) #return widget return div
def get_display(my): top = DivWdg() top.add_border() top.add_style("padding: 10px") top.add_color("color", "color") top.add_color("background", "background") title = DivWdg() title.add("Advanced Project Setup Tools") title.add_style("font-size: 18px") title.add_style("font-weight: bold") title.add_style("text-align: center") title.add_style("padding: 10px") title.add_style("margin: -10px -10px 10px -10px") top.add(title) from tactic.ui.widget import TitleWdg subtitle = TitleWdg(name_of_title='', help_alias='project-startup-configuration') top.add(subtitle) title.add_gradient("background", "background3", 5, -10) top.add("<br/>") content = DivWdg() top.add(content) """ desc = DivWdg() content.add(desc) desc.add_style("text-align: left") desc.add_style("padding-left: 15px") desc.center() desc.add("The following tools are used for advanced project configuration.<br/><br/>") desc.add_style("width: 600px") """ button_div = DivWdg() button = SingleButtonWdg(title="Project Startup", icon=IconWdg.HOME) button_div.add(button) button_div.add_style("float: left") button_div.add_style("margin-top: -10px") button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.startup.MainWdg'; var kwargs = { help_alias: 'project-startup-configuration' }; spt.tab.add_new("_startup", "Startup", class_name, kwargs); ''' }) content.add(button_div) table = Table() content.add(table) table.add_color("color", "color") table.add_row() table.center() # Schema Editor td = table.add_cell() td.add_style("vertical-align: top") td.add_style("padding: 3px") title = "Create Schema" description = '''The schema is a collection of nodes that layout the basic components of a project. Each node represents a separate list of items (sType) used in this project: ie Assets, Shots, Artwork, etc.''' #image = "<img src='/context/icons/64x64/schema_64.png'/>" image = "<img src='/context/images/getting_started_schema.png'/>" behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.tools.SchemaToolWdg'; var kwargs = { help_alias: 'project-schema' }; spt.tab.add_new("create_schema", "Create Schema", class_name, kwargs); ''' } schema_wdg = my.get_main_section_wdg(title, description, image, behavior) td.add(schema_wdg) # Workflow td = table.add_cell() td.add_style("vertical-align: top") td.add_style("padding: 3px") title = "Create Workflow" image = "<img src='/context/images/getting_started_pipeline.png'/>" description = "Pipelines define how particular items of an sType will move through its lifecycle. Creating pipelines will also allow you to set up automatic triggers and notifications for each process." behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.tools.PipelineToolWdg'; var kwargs = { help_alias: 'project-workflow' }; spt.tab.add_new("create_workflow", "Create Workflow", class_name, kwargs); ''' } pipeline_wdg = my.get_main_section_wdg(title, description, image, behavior) td.add(pipeline_wdg) # Sidebar td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Manage Side Bar" #image = "<img src='/context/icons/64x64/sidebar_64.png'/>" image = "<img src='/context/images/getting_started_sidebar.png'/>" description = "The Side Bar can be easily configured to show specific views of your project to each user." behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.panel.ManageViewPanelWdg'; var kwargs = { help_alias: 'managing-sidebar' }; spt.tab.add_new("manage_project_views", "Manage Side Bar", class_name, kwargs); ''' } side_bar_wdg = my.get_main_section_wdg(title, description, image, behavior) td.add(side_bar_wdg) tr = table.add_row() # Manage View td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Manage Views" image = IconWdg("Manage Views", IconWdg.LIST_01) div = DivWdg(image) image = div description = "Manage the views within the project." behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.manager.ViewManagerWdg'; var kwargs = { help_alias: 'view-manager' }; spt.tab.add_new("manage_views", "Manage Views", class_name, kwargs); ''' } manage_view_wdg = my.get_small_section_wdg(title, description, image, behavior) td.add(manage_view_wdg) # Naming Conventions td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Naming Conventions" image = IconWdg("Naming Conventions", IconWdg.FOLDERS_01) div = DivWdg(image) image = div description = "Setup custom Directory and File naming conventions." behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { 'view': 'table', 'search_type': 'config/naming', help_alias: 'project-automation-file-naming' }; spt.tab.add_new("naming_conventions", "Naming Conventions", class_name, kwargs); ''' } naming_wdg = my.get_small_section_wdg(title, description, image, behavior) td.add(naming_wdg) # Users td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Manage Security" image = IconWdg("Manage Security", IconWdg.LOCK_32_01) div = DivWdg(image) image = div description = "Manage users and group permissions" behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.startup.SecurityWdg'; var kwargs = { }; spt.tab.add_new("manage_security", "Manage Security", class_name, kwargs); ''' } users_wdg = my.get_small_section_wdg(title, description, image, behavior) td.add(users_wdg) tr = table.add_row() # Script Editor td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Script Editor" image = IconWdg("Script Editor", IconWdg.SCRIPT_EDITOR_01) div = DivWdg(image) image = div description = "Edit and Create custom Python and Javascipt tools, triggers and scripts." behavior = { 'type': 'click_up', 'cbjs_action': ''' var title = "TACTIC Script Editor" var class_name = "tactic.ui.app.ShelfEditWdg" spt.panel.load_popup(title, class_name, {}, {"load_once": true} ) ''' } script_editor_wdg = my.get_small_section_wdg(title, description, image, behavior) td.add(script_editor_wdg) # Project Settings td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Project Settings" image = IconWdg("Project Settings", IconWdg.CONFIGURE_02) div = DivWdg(image) image = div description = "Setting for the current project." behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { 'view': 'table', 'search_type': 'config/prod_setting', help_alias: 'main' }; spt.tab.add_new("project_settings", "Project Settings", class_name, kwargs); ''' } prod_settings_wdg = my.get_small_section_wdg(title, description, image, behavior) td.add(prod_settings_wdg) # Widget Config td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Widget Config" image = IconWdg("Widget Config", IconWdg.WIDGET_CONFIG_01) div = DivWdg(image) image = div description = "Modify the base widget configurations for the project." behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { 'view': 'table', 'search_type': 'config/widget_config', help_alias: 'tactic-widgets' }; spt.tab.add_new("widget_config", "Widget Config", class_name, kwargs); ''' } config_wdg = my.get_small_section_wdg(title, description, image, behavior) td.add(config_wdg) # Quicklinks tr, td = table.add_row_cell() td.add_style("font-size: 14px") td.add("<br/>") div = DivWdg() title = DivWdg() div.add(title) div.add_color("background", "background") div.add_style("margin: 0px 10px 15px 10px") title.add("Quick Links") title.add_style("font-size: 16px") title.add_style("padding: 5px") title.add_gradient("background", "background") title.add_border() title.set_round_corners(corners=['TL', 'TR']) content_wdg = DivWdg() div.add(content_wdg) content_wdg.add_border() content_wdg.add_style("padding: 20px") content_wdg.add( "<div style='font-size: 12px'>The following links will help you find out more information on how to set up or use TACTIC.</div>" ) content_wdg.add("<hr/>") hover = title.get_color("background", -10) link_div = DivWdg() link_div.add_style("padding: 10px") content_wdg.add(link_div) icon = IconWdg("TACTIC Documentation", IconWdg.JUMP) link_div.add(icon) link = HtmlElement.href("TACTIC Documentation", "/doc/", target="_blank") link.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.help.set_top(); spt.help.load_alias("main"); ''' }) link.add_behavior({ 'type': 'hover', 'color': hover, 'cbjs_action_over': ''' bvr.src_el.setStyle("background", bvr.color); ''', 'cbjs_action_out': ''' bvr.src_el.setStyle("background", ""); ''' }) link_div.add(link) link.add_color("color", "color") link_div.add("<br/>" * 2) icon = IconWdg("Southpaw Web Site", IconWdg.JUMP) link_div.add(icon) link = HtmlElement.href("Southpaw Web Site", "http://www.southpawtech.com", target="_blank") link_div.add(link) link.add_color("color", "color") link.add_behavior({ 'type': 'hover', 'color': hover, 'cbjs_action_over': ''' bvr.src_el.setStyle("background", bvr.color); ''', 'cbjs_action_out': ''' bvr.src_el.setStyle("background", ""); ''' }) link_div.add("<br/>" * 2) icon = IconWdg("TACTIC Community", IconWdg.JUMP) link_div.add(icon) link = HtmlElement.href("TACTIC Community", "http://community.southpawtech.com", target="_blank") link_div.add(link) link.add_color("color", "color") link.add_behavior({ 'type': 'hover', 'color': hover, 'cbjs_action_over': ''' bvr.src_el.setStyle("background", bvr.color); ''', 'cbjs_action_out': ''' bvr.src_el.setStyle("background", ""); ''' }) td.add(div) return top
def get_script_wdg(my): search = Search("config/custom_script") #search.add_user_filter() search.add_order_by("folder") search.add_order_by("title") scripts = search.get_sobjects() widget = DivWdg() widget.add_style("width: 100%") from pyasm.web.palette import Palette palette = Palette.get() bg_color = palette.color("background3") hover_color = palette.color("background3", 20) widget.add_color("background", bg_color) ''' # Try the table layout widget from tactic.ui.panel import TableLayoutWdg table = TableLayoutWdg(id='js_edit_list',search_type="config/custom_script", view='simple') table.set_sobjects(scripts) widget.add(table) ''' title = DivWdg() title.add("Saved Scripts") title.add_style("font-size: 14px") title.add_color("color", "color") title.add_style("padding: 8px 3px") title.add_style("margin: 0 0 0 -1") title.add_color("background", "background", -5) title.add_border() widget.add(title) script_div = DivWdg() script_div.add_border() script_div.add_color("background", "background3") script_div.add_color("color", "color3") script_div.add_style("padding: 8px") script_div.add_style("overflow-x: hidden") script_div.add_style("overflow-y: auto") script_div.add_style("height: 100%") script_div.add_style("min-width: 100px") script_div.add_style("width: 220px") script_div.add_style("margin: -1px 0px 0px -1px") script_div.add_class("spt_resizable") inner = DivWdg() script_div.add(inner) inner.add_style("height: 100%") inner.add_style("width: 800px") last_folder = '' for script in scripts: title = script.get_value("title") folder = script.get_value("folder") language = script.get_value("language", no_exception=True) if not language: language = 'javascript' if folder != last_folder: div = DivWdg() icon = IconWdg("Script", IconWdg.FOLDER) div.add(icon) div.add(" %s" % folder) inner.add(div) last_folder = folder div = DivWdg() inner.add(div) div.add_class('hand') icon = IconWdg("Script", IconWdg.TOGGLE_ON) icon.add_style("margin-left: 10px") div.add(icon) div.add("%s" %title) span = SpanWdg() span.add_style("font-size: 9px") span.add_style("opacity: 0.2") span.add(" <i>(%s)</i>" % language) div.add(span) div.add_event("onmou8eover", "this.style.background='%s'" % hover_color) div.add_event("onmouseout", "this.style.background='%s'" % bg_color) behavior = { 'type': 'click_up', 'editor_id': my.editor_id, 'cbjs_action': 'spt.script_editor.display_script_cbk(evt, bvr)', 'code': script.get_code() } div.add_behavior(behavior) widget.add(script_div) return widget
def get_display(self): top = self.top top.add_color("background", "background") top.add_class("spt_pipelines_top") self.set_as_panel(top) inner = DivWdg() top.add(inner) search_type = self.kwargs.get("search_type") pipeline_code = self.kwargs.get("pipeline_code") if search_type: search = Search("sthpw/pipeline") search.add_filter("search_type", search_type) pipelines = search.get_sobjects() else: pipeline = Pipeline.get_by_code(pipeline_code) if pipeline: pipelines = [pipeline] else: pipelines = [] if not pipelines: div = DivWdg() inner.add(div) inner.add_style("padding: 50px") div.add_border() div.add_color("color", "color3") div.add_color("background", "background3") div.add_style("width: 400px") div.add_style("height: 100px") div.add_style("padding: 30px") icon = IconWdg("WARNING", IconWdg.WARNING) div.add(icon) div.add("<b>This Searchable Type does not have pipelines defined.</b>") div.add("<br/>"*2) div.add("<b style='padding-left: 35px'>Click Create to add one...</b>") div.add("<br/>"*2) button_div = DivWdg() div.add(button_div) button = ActionButtonWdg(title="Create", tip="Create pipeline") button_div.add(button) button.add_style("margin: auto") button.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'cbjs_action': ''' var server = TacticServerStub.get(); var cmd = 'tactic.ui.startup.PipelineCreateCbk'; var kwargs = { search_type: bvr.search_type } server.execute_cmd(cmd, kwargs) var top = bvr.src_el.getParent(".spt_pipelines_top"); spt.panel.refresh(top); ''' } ) return top # get the defalt task statuses task_pipeline = Pipeline.get_by_code("task") if task_pipeline: statuses = task_pipeline.get_process_names() else: statuses = ['Pending', 'In Progress', 'Complete'] statuses_str = ",".join(statuses) pipelines_div = DivWdg() inner.add( pipelines_div ) pipelines_div.add_style("font-size: 12px") pipelines_div.add_style("padding: 10px") buttons_div = DivWdg() pipelines_div.add(buttons_div) #button = SingleButtonWdg( title="Save Pipelines", icon=IconWdg.SAVE ) button = ActionButtonWdg( title="Save" ) buttons_div.add(button) button.add_behavior( { 'type': 'click_up', 'default_statuses': statuses_str, 'cbjs_action': ''' spt.app_busy.show("Saving Pipeline...") setTimeout(function() { try { var top = bvr.src_el.getParent(".spt_pipelines_top"); // get all the pipeline divs var pipeline_els = top.getElements(".spt_pipeline_top"); var data = {}; for ( var i = 0; i < pipeline_els.length; i++) { var pipeline_code = pipeline_els[i].getAttribute("spt_pipeline_code"); var values = spt.api.Utility.get_input_values(pipeline_els[i]); data[pipeline_code] = values; } var class_name = 'tactic.ui.startup.PipelineEditCbk'; var kwargs = { data: data } var server = TacticServerStub.get(); server.execute_cmd(class_name, kwargs); } catch(e) { spt.alert(spt.exception.handler(e)); } spt.app_busy.hide(); } , 100); ''' } ) buttons_div.add("<br clear='all'/>") buttons_div.add_style("margin-bottom: 5px") for pipeline in pipelines: pipeline_div = DivWdg() pipelines_div.add(pipeline_div) pipeline_div.add_class("spt_pipeline_top") code = pipeline.get_code() label = '%s (%s)' %(pipeline.get('name'), code) pipeline_div.add_attr("spt_pipeline_code", code) title = DivWdg() pipeline_div.add(title) title.add("Pipeline: ") title.add(label) title.add_style("padding: 8px 10px") title.add_color("background", "background3") title.add_style("font-weight: bold") title.add_style("margin: -10 -10 5 -10") header_wdg = DivWdg() pipeline_div.add(header_wdg) header_wdg.add_color("background", "background", -5) headers = ['Process', 'Description', 'Task Status'] widths = ['100px', '180px', '210px'] for header, width in zip(headers,widths): th = DivWdg() header_wdg.add(th) th.add("<b>%s</b>" % header) th.add_style("float: left") th.add_style("width: %s" % width) th.add_style("padding: 8px 3px") header_wdg.add("<br clear='all'/>") # get all of the process sobjects from this pipeline pipeline_code = pipeline.get_code() search = Search("config/process") search.add_filter("pipeline_code", pipeline.get_code() ) process_sobjs = search.get_sobjects() process_sobj_dict = {} for process_sobj in process_sobjs: process = process_sobj.get_value("process") process_sobj_dict[process] = process_sobj from tactic.ui.container import DynamicListWdg dyn_list = DynamicListWdg() pipeline_div.add(dyn_list) pipeline_div.add_style("width: 725px") processes = pipeline.get_process_names() if not processes: processes.append("") processes.append("") processes.append("") processes.insert(0, "") for i, process in enumerate(processes): if process == '': process_name = '' description = '' else: process_sobj = process_sobj_dict.get(process) if process_sobj: process_name = process_sobj.get_value("process") description = process_sobj.get_value("description") else: if isinstance(process,basestring): process_name = process else: process_name = process.get_name() deccription = '' process_type = 'manual' process_xpos = '' process_ypos = '' # get the task pipeline for this process if process_name: process = pipeline.get_process(process_name) process_type = process.get_type() process_xpos = process.get_attribute('xpos') process_ypos = process.get_attribute('ypos') task_pipeline_code = process.get_task_pipeline() if task_pipeline_code != "task": task_pipeline = Search.get_by_code("sthpw/pipeline", task_pipeline_code) else: task_pipeline = None else: task_pipeline_code = "task" task_pipeline = None process_div = DivWdg() process_div.add_style("float: left") process_div.add_class("spt_process_top") if i == 0: dyn_list.add_template(process_div) else: dyn_list.add_item(process_div) #process_div.add_style("padding-left: 10px") #process_div.add_style("margin: 5px") table = Table() process_div.add(table) table.add_row() text = TextInputWdg(name="process") process_cell = table.add_cell(text) text.add_style("width: 95px") text.add_style("margin: 5px") text.set_value(process_name) text.add_class("spt_process") # the template has a border if i == 0: text.add_style("border: solid 1px #AAA") hidden = HiddenWdg(name='process_type') hidden.set_value(process_type) process_cell.add(hidden) hidden = HiddenWdg(name='process_xpos') hidden.set_value(process_xpos) process_cell.add(hidden) hidden = HiddenWdg(name='process_ypos') hidden.set_value(process_ypos) process_cell.add(hidden) text = TextInputWdg(name="description") table.add_cell(text) text.add_style("width: 175px") text.add_style("margin: 5px") text.set_value(description) # the template has a border if i == 0: text.add_style("border: solid 1px #AAA") if process_type in ['manual','approval']: read_only = False else: read_only = True text = TextInputWdg(name="task_status", read_only=read_only) table.add_cell(text) text.add_style("width: 325px") text.add_style("margin: 5px") #text.set_value(statuses_str) #text.add_style("opacity: 0.5") text.add_style("border-style: none") if process_type in ['manual','approval']: if task_pipeline: statuses = task_pipeline.get_process_names() text.set_value(",".join(statuses)) else: text.set_value("(default)") text.add_behavior( { 'type': 'click_up', 'statuses': statuses_str, 'cbjs_action': ''' if (bvr.src_el.value == '(default)') { bvr.src_el.value = bvr.statuses; } ''' } ) table.add_cell(" "*2) button = IconButtonWdg(tip="Trigger", icon=IconWdg.ARROW_OUT) table.add_cell(button) button.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'pipeline_code': pipeline_code, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_process_top"); var process_el = top.getElement(".spt_process"); var process = process_el.value; if (process == "") { alert("Process value is empty"); return; } var class_name = 'tactic.ui.tools.TriggerToolWdg'; var kwargs = { mode: "pipeline", process: process, pipeline_code: bvr.pipeline_code }; spt.panel.load_popup("Trigger", class_name, kwargs); ''' } ) """ button = IconButtonWdg(tip="Edit", icon=IconWdg.EDIT) table.add_cell(button) button.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'pipeline_code': pipeline_code, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_process_top"); var process_el = top.getElement(".spt_process"); var process = process_el.value; if (process == "") { alert("Process value is empty"); return; } var class_name = 'tactic.ui.panel.EditWdg'; var kwargs = { expression: "@SOBJECT(config/process['process','"+process+"'])" } spt.panel.load_popup("Trigger", class_name, kwargs); ''' } ) """ table.add_cell(" "*3) pipeline_div.add("<br clear='all'/>") pipeline_div.add("<br clear='all'/>") if self.kwargs.get("is_refresh"): return inner else: return top
def get_display(my): my.sobject_data = {} top = my.top top.add_style top.add_class("spt_gallery_top") inner = DivWdg() top.add(inner) inner.add_style("position: fixed") inner.add_style("top: 0") inner.add_style("left: 0") inner.add_style("width: 100%") #inner.add_style("height: 100%") inner.add_style("bottom: 0px") inner.add_style("padding-bottom: 40px") #inner.add_style("background: rgba(0,0,0,0.5)") inner.add_style("background: rgba(0,0,0,1)") inner.add_style("z-index: 1000") width = my.kwargs.get("width") height = my.kwargs.get("height") if not width: width = 1300 else: width = int(width) paths = my.get_paths(file_type='main') # icon type may be too small thumb_paths = my.get_paths(file_type='web') descriptions = [] for path in paths: sobject = my.sobject_data.get(path) if not sobject: descriptions.append("") else: description = sobject.get("description") if not description: description = "" descriptions.append(description) total_width = width * len(paths) inner.add_behavior({ 'type': 'load', 'width': width, 'total_width': total_width, 'descriptions': descriptions, 'cbjs_action': ''' spt.gallery = {}; // 1250 is defined also in the css styles spt.gallery.portrait = window.innerWidth < 1250; spt.gallery.top = bvr.src_el; spt.gallery.content = spt.gallery.top.getElement(".spt_gallery_content"); spt.gallery.content.setStyle('opacity','0.1') spt.gallery.desc_el = spt.gallery.top.getElement(".spt_gallery_description"); var height_factor = '100%'; if (spt.gallery.portrait) { bvr.width = bvr.width * 0.8; var scroll = bvr.src_el.getElement('.spt_gallery_scroll'); scroll.setStyle('width', bvr.width); scroll.setStyle('height', '80%'); scroll.setStyle('position', 'relative'); scroll.setStyle('top', '500px'); var items = bvr.src_el.getElements('.spt_gallery_item'); for (var k=0; k < items.length; k++) { items[k].setStyle('width', bvr.width); items[k].setStyle('height', '80%'); } var left = bvr.src_el.getElement('.spt_left_arrow'); var right = bvr.src_el.getElement('.spt_right_arrow'); left.setStyle('top','88%') left.setStyle('left','35%') right.setStyle('top','88%') right.setStyle('right','35%') height_factor = '70%'; } //window.addEvent('domready', function() { setTimeout(function() { // set the img h or w directly var items = bvr.src_el.getElements('.spt_gallery_item img'); // fade in spt.gallery.content.set('tween', {duration: 250}).fade('in'); for (var k=0; k < items.length; k++) { var sizes = items[k].getSize(); var item_h = sizes.y; var item_w = sizes.x; if (item_h >= item_w){ items[k].setStyle('width', ''); items[k].setStyle('height', height_factor); } else { items[k].setStyle('width','100%'); items[k].setStyle('height',''); } } }, 50) spt.gallery.width = bvr.width; spt.gallery.descriptions = bvr.descriptions; spt.gallery.index = 0; spt.gallery.total = bvr.descriptions.length; spt.gallery.left_arrow = bvr.src_el.getElement('.spt_left_arrow'); spt.gallery.right_arrow = bvr.src_el.getElement('.spt_right_arrow'); spt.gallery.videos = {}; spt.gallery.init = function() { } spt.gallery.stack = []; spt.gallery.push_stack = function(key) { spt.gallery.stack.push(key); } spt.gallery.show_next = function(src_el) { if (!src_el) src_el = spt.gallery.right_arrow; if (spt.gallery.index >= spt.gallery.total-2) { spt.hide(src_el); } if (spt.gallery.index == spt.gallery.total-1) { return; } spt.gallery.index += 1; spt.gallery.show_index(spt.gallery.index); } spt.gallery.show_prev = function(src_el) { if (!src_el) src_el = spt.gallery.left_arrow; if (spt.gallery.index <= 1) { spt.hide(src_el); } if (spt.gallery.index == 0) { return; } spt.gallery.index -= 1; spt.gallery.show_index(spt.gallery.index); } spt.gallery.show_index = function(index) { // stop all videos var videos = spt.gallery.top.getElements(".video-js"); for (var i = 0; i < videos.length; i++) { try { var video = videos[i]; var video_id = video.get("id"); var video_obj = videojs(video_id, {"nativeControlsForTouch": false}); video_obj.pause(); } catch(e) { } } var width = spt.gallery.width; var margin = - width * index; var content = spt.gallery.content; //content.setStyle("margin-left", margin + "px"); new Fx.Tween(content,{duration: 250}).start("margin-left", margin); spt.gallery.index = index; var total = spt.gallery.total; if (index == 0) { spt.hide(spt.gallery.left_arrow); spt.show(spt.gallery.right_arrow); } else if (index == total - 1) { spt.show(spt.gallery.left_arrow); spt.hide(spt.gallery.right_arrow); } else { spt.show(spt.gallery.left_arrow); spt.show(spt.gallery.right_arrow); } var description = spt.gallery.descriptions[index]; if (!description) { description = (index+1)+" of "+total; } else { description = (index+1)+" of "+total+" - " + description; } spt.gallery.set_description(description); } spt.gallery.close = function() { var content = spt.gallery.content; var top = content.getParent(".spt_gallery_top"); spt.behavior.destroy_element(top); } spt.gallery.set_description = function(desc) { var desc_el = spt.gallery.desc_el; desc_el.innerHTML = desc; } ''' }) scroll = DivWdg(css='spt_gallery_scroll') inner.add(scroll) scroll.set_box_shadow() scroll.add_style("width: %s" % width) if height: scroll.add_style("height: %s" % height) scroll.add_style("overflow-x: hidden") scroll.add_style("overflow-y: hidden") scroll.add_style("background: #000") #scroll.add_style("position: absolute") scroll.add_style("margin-left: auto") scroll.add_style("margin-right: auto") content = DivWdg() top.add_attr('tabindex', '-1') scroll.add(content) content.add_class("spt_gallery_content") # make the itesm vertically align to bottom content.add_styles( "display: flex; flex-flow: row nowrap; align-items: flex-end;") content.add_style("width: %s" % total_width) top.add_behavior({ 'type': 'load', 'cbjs_action': ''' bvr.src_el.focus(); ''' }) top.add_behavior({ 'type': 'mouseenter', 'cbjs_action': ''' bvr.src_el.focus(); ''' }) top.add_behavior({ 'type': 'mouseleave', 'cbjs_action': ''' bvr.src_el.blur(); ''' }) """ input = TextWdg("keydown") content.add(input) input.add_style("position: absolute") input.add_style("left: -5000px") """ top.add_behavior({ 'type': 'keydown', 'cbjs_action': ''' var key = evt.key; if (key == "left") { spt.gallery.push_stack(key); spt.gallery.show_prev(); } else if (key == "right") { spt.gallery.push_stack(key); spt.gallery.show_next(); } else if (key == "esc" || key == "enter") { var top = bvr.src_el spt.behavior.destroy_element(top); } ''' }) curr_index = 0 for i, path in enumerate(paths): path_div = DivWdg(css='spt_gallery_item') content.add(path_div) path_div.add_style("float: left") if path == my.curr_path: curr_index = i try: thumb_path = thumb_paths[i] except IndexError: print "Cannot find the thumb_path [%s] " % i thumb_path = '' path_div.add_style("width: %s" % width) if height: path_div.add_style("height: %s" % height) from tactic.ui.widget import EmbedWdg embed = EmbedWdg(src=path, click=False, thumb_path=thumb_path, index=i) path_div.add(embed) #img = HtmlElement.img(path) #path_div.add(img) #img.add_style("width: 100%") content.add_behavior({ 'type': 'load', 'index': curr_index, 'cbjs_action': ''' if (!bvr.index) bvr.index = 0; spt.gallery.show_index(bvr.index); ''' }) #icon = IconWdg(title="Close", icon="/plugins/remington/pos/icons/close.png") icon = IconWdg(title="Close", icon="/context/icons/glyphs/close.png", width="40px") inner.add(icon) #icon = DivWdg() #icon.add("X") #icon.add_style("font-size: 42px") #icon.add_style("color: #ddd") #icon.add_style("width: 48px") #icon.add_style("height: 48px") #icon.add_style("text-align: center") #icon.add_style("border-radius: 30px") #icon.add_style("border: solid 3px #ddd") icon.add_style("position: absolute") icon.add_style("cursor: pointer") icon.add_style("bottom: 80px") icon.add_style("left: 38px") icon.add_style("opacity: 0.5") icon.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_gallery_top"); spt.behavior.destroy_element(top); ''' }) icon = IconWdg(title="Previous", icon="/context/icons/glyphs/chevron_left.png") inner.add(icon) icon.add_class('spt_left_arrow') icon.add_style("cursor: pointer") icon.add_style("position: absolute") icon.add_style("top: 40%") icon.add_style("left: 0px") icon.add_style("opacity: 0.5") icon.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var arrow = bvr.src_el; spt.gallery.show_prev(arrow); ''' }) icon = IconWdg(title="Next", icon="/context/icons/glyphs/chevron_right.png") inner.add(icon) icon.add_class('spt_right_arrow') icon.add_style("position: absolute") icon.add_style("cursor: pointer") icon.add_style("top: 40%") icon.add_style("right: 0px") icon.add_style("opacity: 0.5") icon.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var arrow = bvr.src_el; spt.gallery.show_next(arrow); ''' }) desc_div = DivWdg() desc_div.add_class("spt_gallery_description") desc_div.add_style("height: 30px") desc_div.add_style("width: %s" % width) desc_div.add_style("text-align: center") desc_div.add_style("background: rgba(0,0,0,1)") desc_div.add_style("color: #bbb") desc_div.add_style("font-weight: bold") desc_div.add_style("font-size: 16px") desc_div.add_style("padding-top: 10px") desc_div.add_style("margin-left: -%s" % (width / 2)) desc_div.add_style("z-index: 1000") desc_div.add("") desc_outer_div = DivWdg() inner.add(desc_outer_div) desc_outer_div.add_style("position: fixed") desc_outer_div.add(desc_div) desc_outer_div.add_style("bottom: 0px") desc_outer_div.add_style("left: 50%") return top
def get_container(my, xml): # handle the container element_node = xml.get_node("config/tmp/element") attrs = Xml.get_attributes(element_node) element_name = attrs.get("name") show_resize_scroll = attrs.get("show_resize_scroll") if not show_resize_scroll: show_resize_scroll = my.kwargs.get("show_resize_scroll") if not show_resize_scroll: show_resize_scroll = "false" # look for attributes in the element tag for specifying a title action button to plug # into the title bar of the custom section ... # title_action_icon = attrs.get("title_action_icon") title_action_script = attrs.get("title_action_script") title_action_label = attrs.get("title_action_label") if title_action_script and not title_action_label: title_action_label = '[action]' # get the width and height for the element content ... width = attrs.get("width") height = attrs.get("height") if width and height: container = ContainerWdg( inner_width=width, inner_height=height, show_resize_scroll=show_resize_scroll ) else: container = ContainerWdg(show_resize_scroll=show_resize_scroll) # create the title title = attrs.get("title") if not title: title = Common.get_display_title(element_name) title_wdg = DivWdg() SmartMenu.assign_as_local_activator( title_wdg, 'HEADER_CTX' ) title_wdg.add_style("margin: 0px 0px 5px 0px") title_wdg.add_gradient("background", "background", 0) title_wdg.add_color("color", "color") title_wdg.add_style("padding", "5px") if title_action_script: # add an action button if an action script code was found in the attributes of the element proj = Project.get_project_code() script_search = Search("config/custom_script") script_sobj = script_search.get_by_search_key( "config/custom_script?project=%s&code=%s" % (proj, title_action_script) ) script = script_sobj.get_value('script') icon_str = "HELP" if title_action_icon: icon_str = title_action_icon action_btn = HtmlElement.img( IconWdg.get_icon_path(icon_str) ) action_btn.set_attr('title',title_action_label) # action_btn = IconWdg( title_action_label, icon=icon) action_btn.add_behavior( {'type': 'click_up', 'cbjs_action': script } ) action_btn.add_styles( "cursor: pointer; float: right;" ) title_wdg.add( action_btn ) title_wdg.add(title) container.add(title_wdg) return container
def get_display(my): top = DivWdg() top.add_border() top.add_style("padding: 10px") top.add_color("color", "color") top.add_gradient("background", "background", 0, -5) #top.add_style("height: 550px") #top.add_behavior( { # 'type': 'load', # 'cbjs_action': ''' # spt.named_events.fire_event("side_bar|hide_now", {} ); # ''' #} ) project = Project.get() title = TitleWdg(title='Tools') top.add(title) shelf = DivWdg() top.add(shelf) shelf.add_style("margin-left: -8px") shelf.add_style("width: 130px") button_div = DivWdg() shelf.add(button_div) button_div.add_style("float: left") button_div.add_style("margin-top: -3px") search_wdg = DivWdg() search_wdg.add_class("spt_main_top") top.add(search_wdg) search_wdg.add_style("padding: 10px") search_wdg.add_style("margin: 10px auto") search_wdg.add_style("width: 430px") search_wdg.add( "<div style='float: left; margin: 8px 10px;'>Search: </div>") custom_cbk = {} custom_cbk['enter'] = ''' var top = bvr.src_el.getParent(".spt_main_top"); var search_el = top.getElement(".spt_main_search"); var keywords = search_el.value; if (keywords != '') { var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { 'search_type': 'sthpw/sobject_list', 'view': 'table', 'keywords': keywords, 'simple_search_view': 'simple_search', //'show_shelf': false, } spt.tab.set_main_body_tab(); spt.tab.add_new("Search Results", "Search Results", class_name, kwargs); } ''' from tactic.ui.input import TextInputWdg, LookAheadTextInputWdg #text = TextInputWdg(name="search") text = LookAheadTextInputWdg(name="search", custom_cbk=custom_cbk, height="42px") #text = TextWdg("search") text.add_class("spt_main_search") text.add_style("width: 290px") search_wdg.add(text) search_wdg.add_style("font-weight: bold") search_wdg.add_style("font-size: 16px") text.add_style("float: left") #search_wdg.add(button) #button.add_style("margin-top: -28px") icon_div = DivWdg() search_wdg.add(icon_div) icon_div.add_style("width: 38px") icon_div.add_style("height: 27px") icon_div.add_style("padding-top: 3px") icon_div.add_style("padding-left: 4px") icon_div.add_style("text-align: center") #icon_div.add_gradient("background", "background3", 15, -10) icon_div.add_color("background", "background3", 10) over_color = icon_div.get_color("background3", 0) out_color = icon_div.get_color("background3", 10) icon_div.set_round_corners(5) icon_div.set_box_shadow("1px 1px 1px 1px") icon = IconWdg("Search", IconWdg.SEARCH_32, width=24) icon_div.add(icon) icon_div.add_style("float: right") icon_div.add_style("margin-top: 4px") button = icon_div icon_div.add_class("hand") icon_div.add_behavior({ 'type': 'mouseover', 'color': over_color, 'cbjs_action': ''' bvr.src_el.setStyle("background", bvr.color); ''' }) icon_div.add_behavior({ 'type': 'mouseout', 'color': out_color, 'cbjs_action': ''' bvr.src_el.setStyle("background", bvr.color); bvr.src_el.setStyle("box-shadow", "1px 1px 1px 1px #999"); bvr.src_el.setStyle("margin-top", "-5"); bvr.src_el.setStyle("margin-right", "0"); ''' }) icon_div.add_behavior({ 'type': 'click', 'color': out_color, 'cbjs_action': ''' bvr.src_el.setStyle("box-shadow", "0px 0px 1px 1px #999"); bvr.src_el.setStyle("margin-top", "-3"); bvr.src_el.setStyle("margin-right", "-2"); ''' }) icon_div.add_behavior({ 'type': 'click_up', 'color': out_color, 'cbjs_action': ''' bvr.src_el.setStyle("box-shadow", "1px 1px 1px 1px #999"); bvr.src_el.setStyle("margin-top", "-5"); bvr.src_el.setStyle("margin-right", "0"); ''' }) button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_main_top"); var search_el = top.getElement(".spt_main_search"); var keywords = search_el.value; if (keywords == '') { return; } var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { 'search_type': 'sthpw/sobject_list', 'view': 'table', 'keywords': keywords, 'simple_search_view': 'simple_search', //'show_shelf': false, } spt.tab.set_main_body_tab(); spt.tab.add_new("Search Results", "Search Results", class_name, kwargs); ''' }) #desc = DivWdg() #top.add(desc) #desc.add("Dashboard") #desc.add_style("width: 600px") # create a bunch of panels table = Table() table.add_color("color", "color") table.add_style("margin-bottom: 20px") table.center() top.add(table) table.add_row() td = table.add_cell() td.add_style("vertical-align: top") td.add_style("padding: 3px") title = "Themes" image = "<img src='/context/icons/64x64/dashboard_64.png'/>" description = '''Themes define the look and feel of a project.''' behavior = { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.startup.themes_wdg.ThemesWdg'; var kwargs = { help_alias: 'project-startup-dashboards' }; spt.tab.set_main_body_tab(); spt.tab.add_new("themes", "Themes", class_name, kwargs); ''' } dashboard_wdg = my.get_section_wdg(title, description, image, behavior) td.add(dashboard_wdg) td = table.add_cell() td.add_style("vertical-align: top") td.add_style("padding: 3px") title = "Dashboards" image = "<img src='/context/icons/64x64/dashboard_64.png'/>" description = '''Dashboards display key project data in single views. Drill down further to work on tasks, make status changes or add notes.''' # read the config file #from pyasm.widget import WidgetConfig #tmp_path = __file__ #dir_name = os.path.dirname(tmp_path) #file_path="%s/../config/dashboard-conf.xml" % (dir_name) #config = WidgetConfig.get(file_path=file_path, view="definition") # FIXME: this bypasses the link security #element_name = "dashboards" #attrs = config.get_element_attributes(element_name) #dashboard_data = {} #kwargs = config.get_display_options(element_name) #class_name = kwargs.get('class_name') behavior = { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.startup.dashboards_wdg.DashboardsWdg'; var kwargs = { help_alias: 'project-startup-dashboards' }; spt.tab.set_main_body_tab(); spt.tab.add_new("dashboards", "Dashboards", class_name, kwargs); ''' } dashboard_wdg = my.get_section_wdg(title, description, image, behavior) td.add(dashboard_wdg) td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Reports" image = "<img src='/context/icons/64x64/report_64.png'/>" description = '''TACTIC provides a number of predefined reports that project managers can access instantly to get real-time analytics.''' behavior = { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.startup.reports_wdg.ReportsWdg'; var kwargs = {}; spt.tab.set_main_body_tab(); spt.tab.add_new("reports", "Reports", class_name, kwargs); //spt.panel.load_popup("Reports", class_name, kwargs); ''' } side_bar_wdg = my.get_section_wdg(title, description, image, behavior) td.add(side_bar_wdg) td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "Lists of Items" description = '''View all of the lists items for this project<br/><br/> ''' image = "<img src='/context/icons/48x48/search_type_48.png'/>" #image = "<img src='/context/images/getting_started_pipeline.png'/>" behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.startup.HomeWdg'; var kwargs = {}; spt.tab.add_new("lists", "Lists", class_name, kwargs); ''' } config_wdg = my.get_section_wdg(title, description, image, behavior) td.add(config_wdg) tr, td = table.add_row_cell() td.add_style("font-size: 14px") td.add("<br/>" * 2) quick_links_wdg = QuickLinksWdg() td.add(quick_links_wdg) return top
def get_display(my): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") html.add_attr("xmlns:v", 'urn:schemas-microsoft-com:vml') is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add( my.get_copyright_wdg() ) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n') head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add('<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>') # add the css styling head.add(my.get_css_wdg()) # add the title in the header project = Project.get() project_code = project.get_code() project_title = project.get_value("title") if project_code == 'admin': head.add("<title>TACTIC</title>\n" ) else: head.add("<title>%s</title>\n" % project_title ) # add the body body = my.body html.add( body ) # Add a NOSCRIPT tag block here to provide a warning message on browsers where 'Enable JavaScript' # is not checked ... TODO: clean up and re-style to make look nicer body.add( """ <NOSCRIPT> <div style="border: 2px solid black; background-color: #FFFF99; color: black; width: 600px; height: 70px; padding: 20px;"> <img src="%s" style="border: none;" /> <b>Javascript is not enabled on your browser!</b> <p>This TACTIC powered, web-based application requires JavaScript to be enabled in order to function. In your browser's options/preferences, please make sure that the 'Enable JavaScript' option is checked on, click OK to accept the settings change, and then refresh this web page.</p> </div> </NOSCRIPT> """ % ( IconWdg.get_icon_path("ERROR") ) ) # add the javascript libraries #head.add( JavascriptImportWdg() ) body.add("<form id='form' name='form' method='post' enctype='multipart/form-data'>\n") for content in my.widgets: body.add(content) body.add("</form>\n") from tactic_branding_wdg import TacticCopyrightNoticeWdg copyright = TacticCopyrightNoticeWdg() body.add(copyright) return widget
def get_display(my): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add( my.get_copyright_wdg() ) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n') head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add('<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>') # add the css styling head.add(my.get_css_wdg()) # add the title in the header project = Project.get() project_code = project.get_code() project_title = project.get_value("title") if web.is_admin_page(): is_admin = " - Admin" else: is_admin = "" if project_code == 'admin': head.add("<title>TACTIC Site Admin</title>\n" ) else: head.add("<title>%s%s</title>\n" % (project_title, is_admin) ) # add the javascript libraries head.add( JavascriptImportWdg() ) # add the body body = my.body html.add( body ) # Add a NOSCRIPT tag block here to provide a warning message on browsers where 'Enable JavaScript' # is not checked ... TODO: clean up and re-style to make look nicer body.add( """ <NOSCRIPT> <div style="border: 2px solid black; background-color: #FFFF99; color: black; width: 600px; height: 70px; padding: 20px;"> <img src="%s" style="border: none;" /> <b>Javascript is not enabled on your browser!</b> <p>This TACTIC powered, web-based application requires JavaScript to be enabled in order to function. In your browser's options/preferences, please make sure that the 'Enable JavaScript' option is checked on, click OK to accept the settings change, and then refresh this web page.</p> </div> </NOSCRIPT> """ % ( IconWdg.get_icon_path("ERROR") ) ) # add the content if my.widgets: content_wdg = my.get_widget('content') else: content_wdg = Widget() my.add(content_wdg) body.add( content_wdg ) body.add_event('onload', 'spt.onload_startup(this)') if web.is_admin_page(): from tactic_branding_wdg import TacticCopyrightNoticeWdg branding = TacticCopyrightNoticeWdg(show_license_info=True) body.add(branding) # add the admin bar security = Environment.get_security() if not web.is_admin_page() and security.check_access("builtin", "view_site_admin", "allow"): div = DivWdg() body.add(div) body.add_style("padding-top: 21px") div.add_class("spt_admin_bar") div.add_style("height: 15px") div.add_style("padding: 3px 0px 3px 15px") #div.add_style("margin-bottom: -5px") div.add_style("position: fixed") div.add_style("top: 0px") div.add_style("left: 0px") div.add_style("opacity: 0.7") div.add_style("width: 100%") #div.add_gradient("background", "background2", 20, 10) div.add_style("background-color", "#000") div.add_style("color", "#FFF") div.add_style("z-index", "1000") div.add_class("hand") div.set_box_shadow("0px 5px 5px") # remove icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Remove Admin Bar", icon=IconWdg.POPUP_WIN_CLOSE) icon_div.add(icon_button) icon_button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var parent = bvr.src_el.getParent(".spt_admin_bar"); spt.behavior.destroy_element(parent); $(document.body).setStyle("padding-top", "0px"); ''' } ) div.add("<b>ADMIN >></b>") div.add_behavior( { 'type': 'listen', 'event_name': 'close_admin_bar', 'cbjs_action': ''' spt.behavior.destroy_element(bvr.src_el); $(document.body).setStyle("padding-top", "0px"); ''' } ) div.add_behavior( { 'type': 'mouseover', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.85) //new Fx.Tween(bvr.src_el).start('height', "30px"); ''' } ) div.add_behavior( { 'type': 'mouseout', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.7) //new Fx.Tween(bvr.src_el).start('height', "15px"); ''' } ) project_code = Project.get_project_code() div.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var url = "/tactic/%s/link/_startup"; window.open(url); ''' % project_code } ) # Add the script editor listener load_div = DivWdg() body.add(load_div) load_div.add_behavior( { 'type': 'listen', 'event_name': 'show_script_editor', 'cbjs_action': ''' var js_popup_id = "TACTIC Script Editor"; var js_popup = $(js_popup_id); if( js_popup ) { spt.popup.toggle_display( js_popup_id, false ); } else { spt.panel.load_popup(js_popup_id, "tactic.ui.app.ShelfEditWdg", {}, {"load_once": true} ); } '''} ) # deal with the palette defined in /index which can override the palette if my.kwargs.get("hash") == (): key = "index" search = Search("config/url") search.add_filter("url", "/%s/%%"%key, "like") search.add_filter("url", "/%s"%key) search.add_where("or") url = search.get_sobject() if url: xml = url.get_xml_value("widget") palette_key = xml.get_value("element/@palette") # look up palette the expression for index from pyasm.web import Palette palette = Palette.get() palette.set_palette(palette_key) colors = palette.get_colors() colors = jsondumps(colors) script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_colors(%s); env.set_palette('%s'); ''' % (colors, palette_key) ) body.add(script) env = Environment.get() client_handoff_dir = env.get_client_handoff_dir(include_ticket=False, no_exception=True) client_asset_dir = env.get_client_repo_dir() login = Environment.get_login() user_name = login.get_value("login") user_id = login.get_id() login_groups = Environment.get_group_names() # add environment information script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_project('%s'); env.set_user('%s'); env.set_user_id('%s'); var login_groups = '%s'.split('|'); env.set_login_groups(login_groups); env.set_client_handoff_dir('%s'); env.set_client_repo_dir('%s'); ''' % (Project.get_project_code(), user_name, user_id, '|'.join(login_groups), client_handoff_dir,client_asset_dir)) body.add(script) # add a global container for commonly used widgets div = DivWdg() body.add(div) div.set_id("global_container") # add in the app busy widget # find out if there is an override for this search = Search("config/url") search.add_filter("url", "/app_busy") url = search.get_sobject() if url: busy_div = DivWdg() div.add(busy_div) busy_div.add_class( "SPT_PUW" ) busy_div.add_styles( "display: none; position: absolute; z-index: 1000" ) busy_div.add_class("app_busy_msg_block") busy_div.add_style("width: 300px") busy_div.add_style("height: 100px") busy_div.add_style("padding: 20px") busy_div.add_color("background", "background3") busy_div.add_border() busy_div.set_box_shadow() busy_div.set_round_corners(20) busy_div.set_attr("id","app_busy_msg_block") # put the custom url here title_wdg = DivWdg() busy_div.add(title_wdg) title_wdg.add_style("font-size: 20px") title_wdg.add_class("spt_app_busy_title") busy_div.add("<hr/>") msg_div = DivWdg() busy_div.add(msg_div) msg_div.add_class("spt_app_busy_msg") else: from page_header_wdg import AppBusyWdg div.add( AppBusyWdg() ) # popup parent popup = DivWdg() popup.set_id("popup") div.add(popup) # create another general popup popup_div = DivWdg() popup_div.set_id("popup_container") popup_div.add_class("spt_panel") popup = PopupWdg(id="popup_template",destroy_on_close=True) popup_div.add(popup) div.add(popup_div) # popup parent inner_html_div = DivWdg() inner_html_div.set_id("inner_html") div.add(inner_html_div) # add in a global color from tactic.ui.input import ColorWdg color = ColorWdg() div.add(color) # add in a global notify wdg from notify_wdg import NotifyWdg widget.add(NotifyWdg()) return widget
def get_display(self): top = self.top top.add_class("hand") inner = self.inner top.add(inner) inner.add_class("spt_swap_top") table = Table() inner.add(table) table.add_color("color", "color") table.add_class("SPT_DTS") table.add_row() td = table.add_cell() title = self.kwargs.get("title") # determine whether this widget is on or off is_on = self.kwargs.get("is_on") if is_on in [True, "true"]: is_on = True else: is_on = False if not self.on_wdg or not self.off_wdg: self.set_default_wdg() # add the content id if self.content_id: inner.add_attr("spt_content_id", self.content_id) # add the behaviors if not self.behavior_top: self.handle_top(top) on_div = DivWdg() td.add(on_div) on_div.add_class("SPT_SWAP_ON") off_div = DivWdg() td.add(off_div) off_div.add_class("SPT_SWAP_OFF") if is_on: off_div.add_style("display: none") inner.add_attr("spt_state", "on") else: on_div.add_style("display: none") inner.add_attr("spt_state", "off") on_div.add(self.on_wdg) off_div.add(self.off_wdg) # handle an icon icon_str = self.kwargs.get("icon") if icon_str and isinstance(icon_str, basestring): icon_div = DivWdg() if icon_str.startswith("BS_"): icon = IconWdg(name=title, icon=icon_str, size=12) icon_div.add_style("margin: -2px 10px 0px 10px") icon_div.add_style("margin-left: -3px") else: icon = IconWdg(name=title, icon=icon_str) icon_div.add_style("margin-left: -6px") icon_div.add(icon) td = table.add_cell(icon_div) elif icon_str: td = table.add_cell(icon_str) icon_str.add_style("margin-left: -6px") else: show_border = self.kwargs.get("show_border") if show_border in [True, 'true']: on_div.add_border() off_div.add_border() on_div.add_style("width: 16") on_div.add_style("height: 16") on_div.add_style("overflow: hidden") off_div.add_style("width: 16") off_div.add_style("height: 16") off_div.add_style("overflow: hidden") if self.title_wdg: td = table.add_cell(self.title_wdg) else: td = table.add_cell(title) return top
def handle_set(my, table, instance_name, asset, session_instances): asset_code = asset.get_code() # get all of the reference instances from the latest published snapshot = Snapshot.get_latest_by_sobject(asset, "publish") # if there is no publish snapshot, then this is definitely not # a set, so handle it like an instance if not instance_name in session_instances: return if not snapshot: my.handle_instance(table, instance_name, asset) return xml = snapshot.get_xml_value("snapshot") # skip if none are in session set_instances = xml.get_values("snapshot/ref/@instance") # TODO should get it based on the set's asset code so that # if the sesssion's set is older, it will still work session_set_items = my.session._get_data().get_nodes_attr(\ "session/node[@set_asset_code='%s']" %asset_code, 'instance') count = 0 set_instances_in_session = [] set_instances_not_in_session = [] for set_instance in set_instances: # backwards compatible: tmp_set_instance = set_instance if set_instance.find(":") != -1: print "WARNING: snapshot '%s' has deprecated maya instance names" % snapshot.get_code( ) set_instance, tmp = set_instance.split(":") # make sure the set_instance comes from this set if set_instance in session_set_items: count += 1 set_instances_in_session.append(tmp_set_instance) else: set_instances_not_in_session.append(tmp_set_instance) if count == 0: return my.handle_instance(table, instance_name, asset) # display all of the set instance that are in session for set_instance in set_instances_in_session: ref_snapshot = snapshot.get_ref_snapshot("instance", set_instance) ref_asset = ref_snapshot.get_sobject() # backwards compatible if set_instance.find(":") != -1: print "WARNING: snapshot '%s' has deprecated maya instance names" % snapshot.get_code( ) set_instance, tmp = set_instance.split(":") my.handle_instance(table, set_instance, ref_asset, publish=False) widget = Widget(" ") if set_instances_not_in_session: widget = Widget() widget.add(IconWdg("warning", icon=IconWdg.ERROR)) widget.add("missing set items from last publish") th, td = table.add_row_cell(widget) for set_instance in set_instances_not_in_session: ref_snapshot = snapshot.get_ref_snapshot("instance", set_instance) ref_asset = ref_snapshot.get_sobject() # backwards compatible if set_instance.find(":") != -1: print "WARNING: snapshot '%s' has deprecated maya instance names" % snapshot.get_code( ) set_instance, tmp = set_instance.split(":") my.handle_missing_instance(table, set_instance, ref_asset) if set_instances_not_in_session: table.add_row_cell(" ")
def _add_icon(my, sobject, item_div): '''add icon to the item_div''' if sobject.get_base_search_type() == 'sthpw/login_in_group': icon = IconWdg(icon=IconWdg.USER) item_div.add(icon)
def get_day_wdg(self, month, day): div = DivWdg() div.add_style("width: 120px") div.add_style("height: 150px") div.add_style("padding: 5px") # disabled until further development is done on WeekWdg """ div.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.widget.week_wdg.WeekWdg'; spt.panel.load_popup("Week", class_name); ''' } ) """ # if the day is today today = datetime.today() if day.year == today.year and day.month == today.month and day.day == today.day: div.add_color("background", "background", [-20, -20, 20]) div.add("[%s]" % day.day) elif day.weekday() in [5, 6]: div.add_color("background", "background", -3) if day.month != self.month: div.add("<i style='opacity: 0.3'>[%s]</i>" % day.day) else: div.add("[%s]" % day.day) # if the month is different than today elif day.month != self.month: #div.add_color("background", "background", [-5, -5, -5]) div.add("<i style='opacity: 0.3'>[%s]</i>" % day.day) else: div.add("[%s]" % day.day) div.add(HtmlElement.br(2)) key = "%s-%0.2d-%0.2d 00:00:00" % (day.year, day.month, day.day) div.add_attr("date", key) div.add_class("spt_date_div_content") line_div = DivWdg() div.add(line_div) line_div.add_style("padding: 3px") icon = IconWdg("Number of task due", IconWdg.CALENDAR) line_div.add(icon) num_tasks = self.tasks_count.get(key) if not num_tasks: num_tasks = 0 line_div.add_style("opacity: 0.15") line_div.add_style("font-style: italic") line_div.add("%s task/s due" % num_tasks) line_div.add(HtmlElement.br()) line_div = DivWdg() div.add(line_div) line_div.add_style("padding: 3px") icon = IconWdg("Number of check-ins", IconWdg.PUBLISH) line_div.add(icon) num_snapshots = self.snapshots_count.get(key) if not num_snapshots: num_snapshots = 0 line_div.add_style("opacity: 0.15") line_div.add_style("font-style: italic") line_div.add("%s check-in/s" % num_snapshots) line_div.add(HtmlElement.br()) line_div = DivWdg() div.add(line_div) line_div.add_style("padding: 3px") icon = IconWdg("Number of notes", IconWdg.NOTE) line_div.add(icon) num_notes = self.notes_count.get(key) if not num_notes: num_notes = 0 line_div.add_style("opacity: 0.15") line_div.add_style("font-style: italic") line_div.add("%s note/s" % num_notes) line_div.add(HtmlElement.br()) line_div = DivWdg() div.add(line_div) line_div.add_style("padding: 3px") icon = IconWdg("Work Hours", IconWdg.CLOCK) line_div.add(icon) work_hours = self.work_hours_count.get(key) if not work_hours: work_hours = 0 line_div.add_style("opacity: 0.15") line_div.add_style("font-style: italic") line_div.add("%s work hours" % work_hours) line_div.add(HtmlElement.br()) line_div = DivWdg() div.add(line_div) line_div.add_style("padding: 3px") num_milestone = self.milestones_count.get(key) if num_milestone: icon = IconWdg("Milestones", IconWdg.GOOD) line_div.add(icon) line_div.add_style("font-style: italic") line_div.add_style("cursor: pointer;") line_div.add("%i milestone/s" % (num_milestone)) line_div.add(HtmlElement.br()) line_div.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var key_array = "%s".split(" "); // array var single_day = key_array[0]; // string var time_key = Date.parse(single_day); // time object var time_key_str = time_key.format('db'); // string var next_day = time_key.increment('day', 1).format('db'); // string var class_name = "tactic.ui.panel.FastTableLayoutWdg"; var popup_kwargs = { "search_type": "sthpw/milestone", "expression": "@SOBJECT(sthpw/milestone['due_date', '>=', '" + time_key_str + "']['due_date', '<=', '" + next_day + "']['@ORDER_BY', 'due_date desc'])" }; spt.tab.set_main_body_tab(); spt.tab.add_new("add_milestone", "Add Milestone", class_name, popup_kwargs); //spt.panel.load_popup("Add Milestone", class_name, popup_kwargs); ''' % (key) }) else: num_milestone = 0 icon = IconWdg("Milestones", "BS_PLUS") line_div.add(icon) #line_div.add_style("opacity: 0.85") line_div.add("Add milestone") line_div.add(HtmlElement.br()) line_div.add_style("cursor: pointer") line_div.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var server = TacticServerStub.get(); var date_div = bvr.src_el.getParent("td"); var full_date = date_div.getElement(".spt_date_div_content").getAttribute("date"); var date_array = full_date.split(" "); full_date = date_array[0]; date_array = full_date.split("-"); var date = date_array[2]; var month = date_array[1]; var year = date_array[0]; var due_date_string = month.concat(" " + date + ", ").concat(year); var project_code = server.get_project(); data = { "due_date": due_date_string, "project_code": project_code }; var class_name = "tactic.ui.panel.EditWdg"; var popup_kwargs = { "default": data, "search_type": "sthpw/milestone" }; spt.panel.load_popup("Add Milestone", class_name, popup_kwargs); ''' }) #div.add("%s tasks completed<br/>" % self.task_count) #div.add("%s notes entered<br/>" % self.notes_count) #div.add("%s work hours<br/>" % self.work_hours_count) return div
def get_display(my): top = DivWdg() top.add_border() top.add_style("padding: 10px") top.add_color("color", "color") top.add_gradient("background", "background", 0, -5) #top.add_style("height: 550px") top.add_behavior({ 'type': 'load', 'cbjs_action': ''' spt.named_events.fire_event("side_bar|hide", {} ); ''' }) project = Project.get() title = TitleWdg(title='Client Home') top.add(title) shelf = DivWdg() top.add(shelf) shelf.add_style("margin-left: -8px") shelf.add_style("width: 130px") security = Environment.get_security() view_side_bar = security.check_access("builtin", "view_side_bar", "allow", default='allow') if view_side_bar: button_div = DivWdg() shelf.add(button_div) button_div.add_style("float: left") button_div.add_style("margin-top: -3px") button = IconButtonWdg(title="Side Bar", icon=IconWdg.ARROW_LEFT) button_div.add(button) shelf.add("Toggle Side Bar") button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.named_events.fire_event("side_bar|toggle"); ''' }) shelf.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.named_events.fire_event("side_bar|toggle"); ''' }) shelf.add_class("hand") else: shelf.add(" ") search_wdg = DivWdg() search_wdg.add_class("spt_main_top") top.add(search_wdg) search_wdg.add_style("padding: 10px") search_wdg.add_style("margin: 10px auto") search_wdg.add_style("width: 430px") search_wdg.add("Search: ") search_wdg.add(" " * 3) custom_cbk = {} custom_cbk['enter'] = ''' var top = bvr.src_el.getParent(".spt_main_top"); var search_el = top.getElement(".spt_main_search"); var keywords = search_el.value; if (keywords != '') { var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { 'search_type': 'sthpw/sobject_list', 'view': 'table', 'keywords': keywords, 'simple_search_view': 'simple_search', //'show_shelf': false, } spt.tab.set_main_body_tab(); spt.tab.add_new("Search Results", "Search Results", class_name, kwargs); } ''' from tactic.ui.input import TextInputWdg, LookAheadTextInputWdg #text = TextInputWdg(name="search") text = LookAheadTextInputWdg(name="search", custom_cbk=custom_cbk) #text = TextWdg("search") text.add_class("spt_main_search") text.add_style("width: 290px") search_wdg.add(text) search_wdg.add_style("font-weight: bold") search_wdg.add_style("font-size: 16px") button = ActionButtonWdg(title="Search") #search_wdg.add(button) button.add_style("float: right") #button.add_style("margin-top: -28px") icon_div = DivWdg() search_wdg.add(icon_div) icon_div.add_style("width: 38px") icon_div.add_style("height: 27px") icon_div.add_style("padding-top: 3px") icon_div.add_style("padding-left: 4px") icon_div.add_style("text-align: center") #icon_div.add_gradient("background", "background3", 15, -10) icon_div.add_color("background", "background3", 10) over_color = icon_div.get_color("background3", 0) out_color = icon_div.get_color("background3", 10) icon_div.set_round_corners(5) icon_div.set_box_shadow("1px 1px 1px 1px") icon = IconWdg("Search", IconWdg.SEARCH_32, width=24) icon_div.add(icon) icon_div.add_style("float: right") icon_div.add_style("margin-top: -5px") button = icon_div icon_div.add_class("hand") icon_div.add_behavior({ 'type': 'mouseover', 'color': over_color, 'cbjs_action': ''' bvr.src_el.setStyle("background", bvr.color); ''' }) icon_div.add_behavior({ 'type': 'mouseout', 'color': out_color, 'cbjs_action': ''' bvr.src_el.setStyle("background", bvr.color); bvr.src_el.setStyle("box-shadow", "1px 1px 1px 1px #999"); bvr.src_el.setStyle("margin-top", "-5"); bvr.src_el.setStyle("margin-right", "0"); ''' }) icon_div.add_behavior({ 'type': 'click', 'color': out_color, 'cbjs_action': ''' bvr.src_el.setStyle("box-shadow", "0px 0px 1px 1px #999"); bvr.src_el.setStyle("margin-top", "-3"); bvr.src_el.setStyle("margin-right", "-2"); ''' }) icon_div.add_behavior({ 'type': 'click_up', 'color': out_color, 'cbjs_action': ''' bvr.src_el.setStyle("box-shadow", "1px 1px 1px 1px #999"); bvr.src_el.setStyle("margin-top", "-5"); bvr.src_el.setStyle("margin-right", "0"); ''' }) button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_main_top"); var search_el = top.getElement(".spt_main_search"); var keywords = search_el.value; if (keywords == '') { return; } var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { 'search_type': 'sthpw/sobject_list', 'view': 'table', 'keywords': keywords, 'simple_search_view': 'simple_search', //'show_shelf': false, } spt.tab.set_main_body_tab(); spt.tab.add_new("Search Results", "Search Results", class_name, kwargs); ''' }) #desc = DivWdg() #top.add(desc) #desc.add("Dashboard") #desc.add_style("width: 600px") # create a bunch of panels table = Table() table.add_color("color", "color") table.add_style("margin-bottom: 20px") table.center() top.add(table) table.add_row() td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "My Approvals" description = '''View all pending items for approval<br/><br/> ''' #image = "<img src='/context/images/getting_started_pipeline.png'/>" image = "<img src='/context/icons/64x64/dashboard_64.png'/>" behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { search_type: 'sthpw/sobject_list', view: 'client_approval', show_shelf: false, show_select: false, element_names: ['preview', 'name', 'description', 'task_pipeline_vertical','notes'], is_editable: false, //expression: "@SOBJECT(sthpw/task['project_code','fickle3'].fickle3/cars.sthpw/sobject_list)" }; spt.tab.add_new("approvals", "Approvals", class_name, kwargs); ''' } config_wdg = my.get_section_wdg(title, description, image, behavior) td.add(config_wdg) td = table.add_cell() td.add_style("vertical-align: top") td.add_style("padding: 3px") title = "My Dashboard" image = "<img src='/context/icons/64x64/dashboard_64.png'/>" description = '''Dashboards display key project data in single views. Drill down further to work on tasks, make status changes or add notes.''' # read the config file from pyasm.widget import WidgetConfig tmp_path = __file__ dir_name = os.path.dirname(tmp_path) file_path = "%s/../config/dashboard-conf.xml" % (dir_name) config = WidgetConfig.get(file_path=file_path, view="definition") #element_name = "my_dashboard" element_name = "my_dashboard" attrs = config.get_element_attributes(element_name) dashboard_data = {} kwargs = config.get_display_options(element_name) class_name = kwargs.get('class_name') dashboard_data['class_name'] = class_name dashboard_data['kwargs'] = kwargs dashboard_data['title'] = attrs.get("title") dashboard_data['description'] = attrs.get("description") dashboard_data['image'] = attrs.get("image") behavior = { 'type': 'click_up', 'dashboard': dashboard_data, 'cbjs_action': ''' var class_name = 'tactic.ui.startup.dashboards_wdg.DashboardsWdg'; var kwargs = {}; spt.tab.set_main_body_tab(); spt.tab.add_new("my_dashboard", "My Dashboard", bvr.dashboard.class_name, bvr.dashboard.kwargs); ''' } pipeline_wdg = my.get_section_wdg(title, description, image, behavior) td.add(pipeline_wdg) td = table.add_cell() td.add_style("padding: 3px") td.add_style("vertical-align: top") title = "My Reports" image = "<img src='/context/icons/64x64/report_64.png'/>" description = '''TACTIC provides a number of predefined reports that project managers can access instantly to get real-time analytics.''' behavior = { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.startup.reports_wdg.ReportsWdg'; var kwargs = {}; spt.tab.set_main_body_tab(); spt.tab.add_new("reports", "Reports", class_name, kwargs); //spt.panel.load_popup("Reports", class_name, kwargs); ''' } side_bar_wdg = my.get_section_wdg(title, description, image, behavior) td.add(side_bar_wdg) """ td = table.add_cell() td.add_style("vertical-align: top") td.add_style("padding: 3px") title = "Documentation" description = '''TACTIC Documentation. <br/><br/> * Project Setup Documentation<br/> <br/> * End User Documentation<br/> <br/> * Developer Documentation<br/> <br/> * System Administrator Documentation<br/> <br/> ''' image = "<img src='/context/images/getting_started_pipeline.png'/>" behavior = { 'type': 'click_up', 'cbjs_action': ''' spt.help.load_alias("main") ''' } doc_wdg = my.get_section_wdg(title, description, image, behavior) td.add(doc_wdg) """ tr, td = table.add_row_cell() td.add_style("font-size: 14px") td.add("<br/>" * 2) quick_links_wdg = QuickLinksWdg() td.add(quick_links_wdg) return top
def handle_item_div(my, item_div, dirname, basename): table = Table() item_div.add(table) table.add_row() table.add_style("width: 100%") icon_string = my.get_file_icon(dirname, basename) icon_div = DivWdg() td = table.add_cell(icon_div) td.add_style("width: 15px") icon = IconWdg("%s/%s" % (dirname, basename), icon_string) icon_div.add(icon) icon_div.add_style("float: left") icon_div.add_style("margin-top: -1px") path = "%s/%s" % (dirname, basename) status = my.path_info.get(path) margin_left = -16 if status == 'same': check = IconWdg("No Changes", IconWdg.CHECK, width=12) elif status == 'added': check = IconWdg("Added", IconWdg.NEW, width=16) margin_left = -18 elif status == 'unversioned': check = IconWdg("Unversioned", IconWdg.HELP, width=12) elif status == 'missing': check = IconWdg("Missing", IconWdg.WARNING, width=12) elif status == 'editable': check = IconWdg("Editable", IconWdg.EDIT, width=12) elif status == 'modified': check = IconWdg("Modified", IconWdg.WARNING, width=12) else: check = IconWdg("Error (unknown status)", IconWdg.ERROR, width=12) if check: td = table.add_cell(check) td.add_style("width: 3px") check.add_style("float: left") check.add_style("margin-left: %spx" % margin_left) check.add_style("margin-top: 4px") item_div.add_color("color", "color", [0, 0, 50]) if status == 'missing': item_div.add_style("opacity: 0.3") else: item_div.add_style("opacity: 0.8") name_div = DivWdg() td = table.add_cell(name_div) name_div.add(basename) name_div.add_style("float: left") if status != "same": name_div.add(" <i style='opacity: 0.5; font-size: 10px'>(%s)</i>" % status) spath = path.replace(" ", "_") # add the size of the file size_div = DivWdg() td = table.add_cell(size_div) td.add_style("width: 60px") size = my.sizes.get(spath) if size is None or size == -1: size_div.add("-") else: size_div.add(FormatValue().get_format_value(size, 'KB')) size_div.add_style("margin-right: 5px") size_div.add_style('text-align: right') # FIXME: this still is needed right now, although really used. my.subcontext_options = [] if not my.subcontext_options: subcontext = TextWdg("subcontext") subcontext = HiddenWdg("subcontext") subcontext.add_class("spt_subcontext") subcontext.add_style("float: right") else: subcontext = SelectWdg("subcontext") subcontext = HiddenWdg("subcontext") subcontext.set_option("show_missing", False) subcontext.set_option("values", my.subcontext_options) subcontext.add_empty_option("----") subcontext.add_behavior({ 'type': 'click_up', 'propagate_evt': False, 'cbjs_action': ''' bvr.src_el.focus(); ''' }) subcontext.add_style("display: none") item_div.add(subcontext)
def get_display(my): top = my.top top.add_class("spt_subscription_bar_top") my.set_as_panel(top) top.add_style("width: 40px") top.add_style("height: 20px") #top.add_class("hand") interval = my.kwargs.get("interval") if not interval: interval = 10 * 1000 else: interval = int(interval) * 1000 inner = DivWdg() top.add(inner) my.set_refresh(inner,interval,panel_cls='spt_subscription_bar_top') mode = my.kwargs.get("mode") if not mode: mode = "tab" dialog_open = my.kwargs.get("dialog_open") if dialog_open in [True, 'true']: dialog_open = True else: dialog_open = False mode = "dialog" if mode == "dialog": from tactic.ui.container import DialogWdg dialog = DialogWdg(display=dialog_open, show_title=False) inner.add(dialog) dialog.set_as_activator(inner) subscription_wdg = SubscriptionWdg() dialog.add(subscription_wdg) subscription_wdg.add_style("width: %spx"%(my.WIDTH+50)) subscription_wdg.add_color("background", "background") subscription_wdg.add_style("height: 500px") elif mode == "popup": top.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.app.SubscriptionWdg'; var kwargs = {}; spt.panel.load_popup("Subscriptions", class_name, kwargs); ''' } ) else: top.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.app.SubscriptionWdg'; var kwargs = {}; spt.tab.add_new("Subscriptions", "Subscriptions", class_name, kwargs); ''' } ) color = inner.get_color("border") inner.add_style("border-style: solid") inner.add_style("border-size: 1px") inner.add_style("border-color: transparent") inner.set_round_corners(5) inner.add_style("padding: 2px") inner.add_behavior( { 'type': 'mouseenter', 'color': color, 'cbjs_action': ''' bvr.src_el.setStyle("border", "solid 1px "+bvr.color); ''' } ) inner.add_behavior( { 'type': 'mouseleave', 'cbjs_action': ''' bvr.src_el.setStyle("border-color", "transparent"); ''' } ) category = None subscriptions = my.get_subscriptions(category) #if not subscriptions: # inner.add_style("display: none") num = len(subscriptions) # the word message takes up too much space """ if num <= 1: msg = "%s message" % num else: msg = "%s messages" % num """ if num > 0: msg = num else: msg = '' icon = IconWdg(msg, IconWdg.STAR) icon.add_style('float: left') inner.add(icon) msg_div = DivWdg(msg) msg_div.add_style('padding-top: 1px') #msg_div.add_style('border-width: 1px') #msg_div.add_styles('border-radius: 50%; width: 18px; height: 18px; background: white') inner.add(msg_div) if my.kwargs.get("is_refresh") == 'true': return inner else: return top
def get_display(my): widget = my.widget widget.set_box_shadow() widget.add_class("spt_dialog_top") widget.add_class("spt_popup") z_index = my.kwargs.get("z_index") if not z_index: z_index = "500" widget.add_style("z-index: %s" % z_index) web = WebContainer.get_web() widget.set_id(my.name) widget.add_attr("spt_dialog_id", my.name); if my.kwargs.get("display") not in [True, "true"]: widget.add_style("display: none") widget.add_style("position: absolute") widget.add_behavior( { 'type': 'listen', 'event_name': '%s|dialog_close' % my.name, 'cbjs_action': my.get_cancel_script() } ) offset = my.kwargs.get("offset") if not offset: offset = my.offset show_header = True show_resize = False drag_div = DivWdg() if show_header: widget.add(drag_div) show_pointer = my.kwargs.get("show_pointer") if show_pointer not in [False, 'false']: from tactic.ui.container import ArrowWdg offset_x = 15 - offset.get('x') offset_y = offset.get("y") arrow = ArrowWdg( offset_x=offset_x, offset_y=offset_y, color=widget.get_color("background", -10) ) arrow.add_class("spt_popup_pointer") arrow.add_style("z-index: 10") widget.add(arrow) # create the 'close' button ... close_wdg = SpanWdg() close_wdg.add( IconWdg("Close", "BS_REMOVE") ) close_wdg.add_style("float: right") close_wdg.add_class("hand") close_wdg.add_style("margin: 3px 1px 3px 1px") close_wdg.add_behavior({ 'type': 'click_up', 'cbjs_action': my.get_cancel_script() }) drag_div.add(close_wdg) anchor_wdg = SpanWdg() drag_div.add(anchor_wdg) anchor_wdg.add_style("margin: 5px 5px 3px 1px") anchor_wdg.add( IconWdg("Anchor Dialog", "BS_PUSHPIN") ) anchor_wdg.add_style("float: right") anchor_wdg.add_class("hand") anchor_wdg.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_dialog_top"); var position = top.getStyle("position"); if (position == 'fixed') { top.setStyle("position", "absolute"); bvr.src_el.setStyle("opacity", "1.0"); } else { top.setStyle("position", "fixed"); bvr.src_el.setStyle("opacity", "0.5"); } ''' }) width = my.kwargs.get("width") if not width: width = "100px" if width: drag_div.add_style("min-width: %s" % width) # style #drag_div.add_looks("popup") drag_div.add_style("text-align: left") drag_div.add_class("spt_popup_width") drag_div.add_style("border-style: solid") drag_div.add_color("border-color", "border") drag_div.add_style("border-size: 0 0 1 0") drag_handle_div = DivWdg(id='%s_title' %my.name) drag_div.add( drag_handle_div ) drag_handle_div.add_style("padding: 3px;") #drag_handle_div.add_gradient("background", "background", +10) drag_handle_div.add_color("background", "background", -10) drag_handle_div.add_color("color", "color") drag_handle_div.add_style("padding: 8px 5px 8px 8px") drag_handle_div.add_behavior({ 'type': 'double_click', 'cbjs_action': my.get_cancel_script() }) # add the drag capability drag_handle_div.add_behavior( { 'type':'smart_drag', 'drag_el': 'spt.popup.get_popup(@);', 'options': {'z_sort': 'bring_forward'}, 'ignore_default_motion': 'false', 'cbjs_setup': ''' var pointer = bvr.drag_el.getElement(".spt_popup_pointer"); if (pointer) { spt.hide(pointer); } ''' } ) # add the content content_div = DivWdg() title_wdg = my.title_wdg if not title_wdg: title_wdg = "No Title" # if the title is empty, just don't show if my.kwargs.get("show_title") in [False, 'false']: drag_div.add_style("display: none") #else: # content_div.add_style("margin-top: -1px") drag_handle_div.add(title_wdg) drag_handle_div.add_class("spt_popup_title") drag_handle_div.add_style("font-weight: bold") widget.add(content_div) content_div.add_color("color", "color2") content_div.add_gradient( "background", "background2" ) content_div.set_id("%s_content" % my.name) content_div.add_class("spt_popup_content") content_div.add_class("spt_dialog_content") content_div.add_style("overflow: hidden") content_div.add_style("display: block") #content_div.add_style("padding: 5px") view = my.kwargs.get("view") if view: from tactic.ui.panel import CustomLayoutWdg my.add( CustomLayoutWdg(view=view) ) if not my.content_wdg: my.content_wdg = "No Content" content_div.add(my.content_wdg) # add the resize icon if show_resize: icon = IconWdg( "Resize", IconWdg.RESIZE_CORNER ) icon.add_style("cursor: nw-resize") icon.add_style("z-index: 1000") icon.add_class("spt_popup_resize") icon.add_style("float: right") icon.add_style("margin-top: -25px") icon.add_style("margin-right: 5px") icon.add_behavior( { 'type': 'drag', "drag_el": '@', "cb_set_prefix": 'spt.popup.resize_drag' } ) widget.add(icon) return widget
def get_display(my): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add(my.get_copyright_wdg()) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add( '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n' ) head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add( '<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>' ) # add the css styling head.add(my.get_css_wdg()) # add the title in the header project = Project.get() project_code = project.get_code() project_title = project.get_value("title") if web.is_admin_page(): is_admin = " - Admin" else: is_admin = "" if project_code == 'admin': head.add("<title>TACTIC Site Admin</title>\n") else: head.add("<title>%s%s</title>\n" % (project_title, is_admin)) # add the javascript libraries head.add(JavascriptImportWdg()) # add the body body = my.body html.add(body) body.add_event('onload', 'spt.onload_startup(this)') top = my.top # Add a NOSCRIPT tag block here to provide a warning message on browsers where 'Enable JavaScript' # is not checked ... TODO: clean up and re-style to make look nicer top.add(""" <NOSCRIPT> <div style="border: 2px solid black; background-color: #FFFF99; color: black; width: 600px; height: 70px; padding: 20px;"> <img src="%s" style="border: none;" /> <b>Javascript is not enabled on your browser!</b> <p>This TACTIC powered, web-based application requires JavaScript to be enabled in order to function. In your browser's options/preferences, please make sure that the 'Enable JavaScript' option is checked on, click OK to accept the settings change, and then refresh this web page.</p> </div> </NOSCRIPT> """ % (IconWdg.get_icon_path("ERROR"))) # add the content content_div = DivWdg() top.add(content_div) Container.put("TopWdg::content", content_div) # add a dummy button for global behaviors from tactic.ui.widget import ButtonNewWdg, IconButtonWdg ButtonNewWdg(title="DUMMY", icon=IconWdg.FILM) IconButtonWdg(title="DUMMY", icon=IconWdg.FILM) # NOTE: it does not need to be in the DOM. Just needs to be # instantiated #content_div.add(button) if my.widgets: content_wdg = my.get_widget('content') else: content_wdg = Widget() my.add(content_wdg) content_div.add(content_wdg) # add a calendar wdg from tactic.ui.widget import CalendarWdg cal_wdg = CalendarWdg(css_class='spt_calendar_template_top') cal_wdg.top.add_style('display: none') content_div.add(cal_wdg) if web.is_admin_page(): from tactic_branding_wdg import TacticCopyrightNoticeWdg branding = TacticCopyrightNoticeWdg(show_license_info=True) top.add(branding) # add the admin bar security = Environment.get_security() if not web.is_admin_page() and security.check_access( "builtin", "view_site_admin", "allow"): div = DivWdg() top.add(div) top.add_style("padding-top: 21px") div.add_class("spt_admin_bar") # home icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: left") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Home", icon="BS_HOME") icon_div.add(icon_button) icon_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' window.location.href="/"; ''' }) div.add_style("height: 15px") div.add_style("padding: 3px 0px 3px 15px") #div.add_style("margin-bottom: -5px") div.add_style("position: fixed") div.add_style("top: 0px") div.add_style("left: 0px") div.add_style("opacity: 0.7") div.add_style("width: 100%") #div.add_gradient("background", "background2", 20, 10) div.add_style("background-color", "#000") div.add_style("color", "#FFF") div.add_style("z-index", "1000") div.add_class("hand") div.set_box_shadow("0px 5px 5px") # remove icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Remove Admin Bar", icon="BS_REMOVE") icon_div.add(icon_button) icon_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var parent = bvr.src_el.getParent(".spt_admin_bar"); bvr.src_el.getParent(".spt_top").setStyle("padding-top", "0px"); spt.behavior.destroy_element(parent); ''' }) # sign-out icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 5px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Sign Out", icon="BS_LOG_OUT") icon_div.add(icon_button) icon_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var ok = function(){ var server = TacticServerStub.get(); server.execute_cmd("SignOutCmd", {login: bvr.login} ); window.location.href="/"; } spt.confirm("Are you sure you wish to sign out?", ok ) ''' }) div.add("<b>ADMIN >></b>") div.add_behavior({ 'type': 'listen', 'event_name': 'close_admin_bar', 'cbjs_action': ''' bvr.src_el.getParent(".spt_top").setStyle("padding-top", "0px"); spt.behavior.destroy_element(bvr.src_el); ''' }) div.add_behavior({ 'type': 'mouseover', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.85) //new Fx.Tween(bvr.src_el).start('height', "30px"); ''' }) div.add_behavior({ 'type': 'mouseout', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.7) //new Fx.Tween(bvr.src_el).start('height', "15px"); ''' }) project_code = Project.get_project_code() site_root = web.get_site_root() div.add_behavior({ 'type': 'click_up', 'site_root': site_root, 'project_code': project_code, 'cbjs_action': ''' var url = "/"+bvr.site_root+"/"+bvr.project_code+"/admin/link/_startup"; window.open(url); ''' }) # Add the script editor listener load_div = DivWdg() top.add(load_div) load_div.add_behavior({ 'type': 'listen', 'event_name': 'show_script_editor', 'cbjs_action': ''' var js_popup_id = "TACTIC Script Editor"; var js_popup = $(js_popup_id); if( js_popup ) { spt.popup.toggle_display( js_popup_id, false ); } else { spt.panel.load_popup(js_popup_id, "tactic.ui.app.ShelfEditWdg", {}, {"load_once": true} ); } ''' }) # deal with the palette defined in /index which can override the palette if my.kwargs.get("hash") == (): key = "index" search = Search("config/url") search.add_filter("url", "/%s/%%" % key, "like") search.add_filter("url", "/%s" % key) search.add_where("or") url = search.get_sobject() if url: xml = url.get_xml_value("widget") palette_key = xml.get_value("element/@palette") # look up palette the expression for index from pyasm.web import Palette palette = Palette.get() palette.set_palette(palette_key) colors = palette.get_colors() colors = jsondumps(colors) script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_colors(%s); env.set_palette('%s'); ''' % (colors, palette_key)) top.add(script) env = Environment.get() client_handoff_dir = env.get_client_handoff_dir(include_ticket=False, no_exception=True) client_asset_dir = env.get_client_repo_dir() login = Environment.get_login() user_name = login.get_value("login") user_id = login.get_id() login_groups = Environment.get_group_names() from pyasm.security import Site site = Site.get_site() kiosk_mode = Config.get_value("look", "kiosk_mode") if not kiosk_mode: kiosk_mode = 'false' # add environment information script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_site('%s'); env.set_project('%s'); env.set_user('%s'); env.set_user_id('%s'); var login_groups = '%s'.split('|'); env.set_login_groups(login_groups); env.set_client_handoff_dir('%s'); env.set_client_repo_dir('%s'); env.set_kiosk_mode('%s'); ''' % (site, Project.get_project_code(), user_name, user_id, '|'.join(login_groups), client_handoff_dir, client_asset_dir, kiosk_mode)) top.add(script) # add a global container for commonly used widgets div = DivWdg() top.add(div) div.set_id("global_container") # add in the app busy widget # find out if there is an override for this search = Search("config/url") search.add_filter("url", "/app_busy") url = search.get_sobject() if url: busy_div = DivWdg() div.add(busy_div) busy_div.add_class("SPT_PUW") busy_div.add_styles( "display: none; position: absolute; z-index: 1000") busy_div.add_class("app_busy_msg_block") busy_div.add_style("width: 300px") busy_div.add_style("height: 100px") busy_div.add_style("padding: 20px") busy_div.add_color("background", "background3") busy_div.add_border() busy_div.set_box_shadow() busy_div.set_round_corners(20) busy_div.set_attr("id", "app_busy_msg_block") # put the custom url here title_wdg = DivWdg() busy_div.add(title_wdg) title_wdg.add_style("font-size: 20px") title_wdg.add_class("spt_app_busy_title") busy_div.add("<hr/>") msg_div = DivWdg() busy_div.add(msg_div) msg_div.add_class("spt_app_busy_msg") else: from page_header_wdg import AppBusyWdg div.add(AppBusyWdg()) # popup parent popup = DivWdg() popup.set_id("popup") div.add(popup) # create another general popup popup_div = DivWdg() popup_div.set_id("popup_container") popup_div.add_class("spt_panel") popup = PopupWdg(id="popup_template", destroy_on_close=True) popup_div.add(popup) div.add(popup_div) inner_html_div = DivWdg() inner_html_div.set_id("inner_html") div.add(inner_html_div) # add in a global color from tactic.ui.input import ColorWdg color = ColorWdg() div.add(color) # add in a global notify wdg from notify_wdg import NotifyWdg widget.add(NotifyWdg()) from tactic.ui.app import DynamicUpdateWdg widget.add(DynamicUpdateWdg()) return widget
def handle_dir_or_item(my, item_div, dirname, basename): spath = "%s/%s" % (dirname, basename) fspath = "%s/%s" % (dirname, File.get_filesystem_name(basename)) md5 = my.md5s.get(fspath) changed = False context = None error_msg = None snapshot = None file_obj = my.checked_in_paths.get(fspath) if not file_obj: if fspath.startswith(my.base_dir): rel = fspath.replace("%s/" % my.base_dir, "") file_obj = my.checked_in_paths.get(rel) if file_obj != None: snapshot_code = file_obj.get_value("snapshot_code") snapshot = my.snapshots_dict.get(snapshot_code) if not snapshot: # last resort snapshot = file_obj.get_parent() if snapshot: context = snapshot.get_value("context") item_div.add_attr("spt_snapshot_code", snapshot.get_code()) snapshot_md5 = file_obj.get_value("md5") item_div.add_attr("spt_md5", snapshot_md5) item_div.add_attr("title", "Checked-in as: %s" % file_obj.get_value("file_name")) if md5 and md5 != snapshot_md5: item_div.add_class("spt_changed") changed = True else: error_msg = 'snapshot not found' status = None if file_obj != None: if changed: check = IconWdg( "Checked-In", IconWdg.ERROR, width=12 ) status = "changed" else: check = IconWdg( "Checked-In", IconWdg.CHECK, width=12 ) status = "same" item_div.add_color("color", "color", [0, 0, 50]) else: check = None item_div.add_style("opacity: 0.8") status = "unversioned" if check: item_div.add(check) check.add_style("float: left") check.add_style("margin-left: -16px") check.add_style("margin-top: 4px") # add the file name filename_div = DivWdg() item_div.add(filename_div) filename_div.add(basename) file_info_div = None if snapshot and status != 'unversioned': file_info_div = SpanWdg() filename_div.add(file_info_div) if error_msg: filename_div.add(' (%s)'%error_msg) filename_div.add_style("float: left") filename_div.add_style("overflow: hidden") filename_div.add_style("width: 65%") # DEPRECATED from pyasm.widget import CheckboxWdg, TextWdg, SelectWdg, HiddenWdg checkbox = CheckboxWdg("check") checkbox.add_style("display: none") checkbox.add_class("spt_select") checkbox.add_style("float: right") checkbox.add_style("margin-top: 1px") item_div.add(checkbox) subcontext_val = '' cat_input = None is_select = True if my.context_options: context_sel = SelectWdg("context") context_sel.add_attr('title', 'context') context_sel.set_option("show_missing", False) context_sel.set_option("values", my.context_options) item_div.add_attr("spt_context", my.context_options[0]) cat_input = context_sel input_cls = 'spt_context' else: if my.subcontext_options in [['(main)'], ['(auto)'] , []]: is_select = False #subcontext = TextWdg("subcontext") subcontext = HiddenWdg("subcontext") subcontext.add_class("spt_subcontext") elif my.subcontext_options == ['(text)']: is_select = False subcontext = TextWdg("subcontext") subcontext.add_class("spt_subcontext") else: is_select = True subcontext = SelectWdg("subcontext") subcontext.set_option("show_missing", False) subcontext.set_option("values", my.subcontext_options) #subcontext.add_empty_option("----") cat_input = subcontext input_cls = 'spt_subcontext' if my.subcontext_options == ['(main)'] or my.subcontext_options == ['(auto)']: subcontext_val = my.subcontext_options[0] subcontext.set_value(subcontext_val) item_div.add_attr("spt_subcontext", subcontext_val) elif context: parts = context.split("/") if len(parts) > 1: # get the actual subcontext value subcontext_val = "/".join(parts[1:]) # identify a previous "auto" check-in and preselect the item in the select if is_select and subcontext_val not in my.subcontext_options: subcontext_val = '(auto)' elif isinstance(cat_input, HiddenWdg): subcontext_val = '' # the Text field will adopt the subcontext value of the last check-in subcontext.set_value(subcontext_val) item_div.add_attr("spt_subcontext", subcontext_val) else: if is_select: if my.subcontext_options: subcontext_val = my.subcontext_options[0] #subcontext_val = '(auto)' cat_input.set_value(subcontext_val) else: subcontext_val = '' item_div.add_attr("spt_subcontext", subcontext_val) item_div.add(cat_input) cat_input.add_behavior( { 'type': 'click_up', 'propagate_evt': False, 'cbjs_action': ''' bvr.src_el.focus(); ''' } ) cat_input.add_style("display: none") cat_input.add_class("spt_subcontext") cat_input.add_style("float: right") cat_input.add_style("width: 50px") cat_input.add_style("margin-top: -1px") cat_input.add_style("font-size: 10px") cat_input.add_style("height: 16px") # we depend on the attribute cuz sometimes we go by the initialized value # since they are not drawn cat_input.add_behavior( { 'type': 'change', 'cbjs_action': ''' var el = bvr.src_el.getParent('.spt_dir_list_item'); el.setAttribute("%s", bvr.src_el.value); ''' %input_cls } ) if file_info_div: if subcontext_val in ['(auto)','(main)', '']: file_info_div.add(" <i style='font-size: 9px; opacity: 0.6'>(v%s)</i>" % snapshot.get_value("version") ) else: file_info_div.add(" <i style='font-size: 9px; opacity: 0.6'>(v%s - %s)</i>" % (snapshot.get_value("version"), subcontext_val) )
def get_display(self): top = self.top self.set_as_panel(top) top.add_class("spt_delete_top") top.add_color("background", "background") top.add_color("color", "color") top.add_border() top.add_style("width: 400px") top.add_border() search_key = self.kwargs.get("search_key") search_keys = self.kwargs.get("search_keys") if search_key: sobject = Search.get_by_search_key(search_key) sobjects = [sobject] search_keys = [search_key] elif search_keys: sobjects = Search.get_by_search_keys(search_keys) sobject = sobjects[0] if not sobjects or not sobject: msg = "%s not found" %search_key return msg search_type = sobject.get_base_search_type() if search_type in ['sthpw/project', 'sthpw/search_object']: msg = 'You cannot delete these items with this tool' return msg self.search_keys = search_keys title = DivWdg() top.add(title) icon = IconWdg("WARNING", IconWdg.WARNING) icon.add_style("float: left") title.add(icon) if len(self.search_keys) > 1: title.add("Delete %s Items" % len(self.search_keys)) else: title.add("Delete Item [%s]" % (sobject.get_code())) title.add_style("font-size: 20px") title.add_style("font-weight: bold") title.add_style("padding: 10px") title.add("<hr/>") content = DivWdg() top.add(content) content.add_style("margin: 5px 10px 20px 10px") content.add("The item to be deleted has a number of dependencies as described below:<br/>", 'heading') # find all the relationships related_types = SearchType.get_related_types(search_type, direction='children') items_div = DivWdg() content.add( items_div ) items_div.add_style("padding: 10px") valid_related_ctr = 0 for related_type in related_types: if related_type == "*": print("WARNING: related_type is *") continue if related_type == search_type: continue if related_type in ['sthpw/search_object','sthpw/search_type']: continue item_div = self.get_item_div(sobjects, related_type) if item_div: items_div.add(item_div) valid_related_ctr += 1 if valid_related_ctr > 0: #icon = IconWdg("Note", "BS_NOTE") #icon.add_style("float: left") #content.add( icon ) content.add("<div><b>By selecting the above, the corresponding related items will be deleted as well.</b></div>") content.add("<br/>"*2) else: # changed the heading to say no dependencies content.add("The item to be deleted has no dependencies.<br/>", 'heading') num_items = len(self.search_keys) if num_items == 1: verb = "is 1 item" else: verb = "are %s items" % num_items content.add("There %s to be deleted" % verb) content.add("<br/>"*2) content.add("Do you wish to continue deleting?") content.add("<br/>"*3) button_div = DivWdg() button_div.add_class("spt_buttons") content.add(button_div) button_div.add_style('text-align: center') button = ActionButtonWdg(title="Delete", width=100, color="danger") button_div.add(button) button.add_style("display: inline-block") deleting_div = DivWdg() content.add(deleting_div) deleting_div.add("<img src='/context/icons/common/indicator_snake.gif'/>") deleting_div.add_class("spt_delete_msg") deleting_div.add(" Deleting ...") deleting_div.add_style("text-align: center") deleting_div.add_style("font-size: 16px") deleting_div.add_style("margin: 20px") deleting_div.add_style("display: none") on_complete = self.kwargs.get("on_complete") button.add_behavior( { 'type': 'click_up', 'search_keys': self.search_keys, 'on_complete': on_complete, 'cbjs_action': ''' spt.app_busy.show("Deleting"); //spt.notify.show_message("Deleting ..."); //var button_el = bvr.src_el.getParent(".spt_buttons"); //button_el.setStyle("display", "none"); var top = bvr.src_el.getParent(".spt_delete_top"); var values = spt.api.Utility.get_input_values(top); var class_name = "tactic.ui.tools.DeleteCmd"; var kwargs = { 'search_keys': bvr.search_keys, 'values': values }; var del_trigger = function() { // for fast table var tmps = spt.split_search_key(bvr.search_keys[0]) var tmps2 = tmps[0].split('?'); var del_st_event = "delete|" + tmps2[0]; var bvr_fire = {}; var input = {'search_keys': bvr.search_keys}; bvr_fire.options = input; spt.named_events.fire_event(del_st_event, bvr_fire); } var server = TacticServerStub.get(); server.execute_cmd(class_name, kwargs, null, { on_complete: function() { //spt.notify.show_message("Finshed deleting ..."); // run the post delete and destroy the popup var popup = bvr.src_el.getParent(".spt_popup"); if (popup.spt_on_post_delete) { popup.spt_on_post_delete(); } del_trigger(); spt.popup.destroy(popup); if (bvr.on_complete) { on_complete = function() { eval(bvr.on_complete); } on_complete(); } spt.app_busy.hide(); }, on_error: function(e) { spt.notify.show_message("Error on delete"); spt.alert(spt.exception.handler(e)); spt.app_busy.hide(); } } ); ''' } ) button = ActionButtonWdg(title="Cancel", width=100) button_div.add(button) button.add_style("display: inline-block") button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_popup"); top.destroy(); ''' } ) content.add("<br clear='all'/>") return top
def get_display(self): self.sobject_data = {} top = self.top top.add_style top.add_class("spt_gallery_top") inner = DivWdg() top.add(inner) # make the whole Gallery unselectable inner.add_class('unselectable') inner.add_style("position: fixed") inner.add_style("top: 0px") inner.add_style("left: 0px") inner.add_style("width: 100%") #inner.add_style("height: 100%") inner.add_style("bottom: 0px") inner.add_style("padding-bottom: 40px") #inner.add_style("background: rgba(0,0,0,0.5)") inner.add_style("background: rgba(0,0,0,1)") inner.add_style("z-index: 2000") width = self.kwargs.get("width") height = self.kwargs.get("height") # default to top. align = self.kwargs.get("align") if not align: align = "top" if not width: width = 1300 else: width = int(width) paths = self.get_paths(file_type='main') # icon type may be too small thumb_paths = self.get_paths(file_type='web') descriptions = [] for path in paths: sobject = self.sobject_data.get(path) if not sobject: descriptions.append("") else: description = sobject.get("description") if not description: description = "" descriptions.append(description) total_width = width * len(paths) inner.add_behavior( { 'type': 'load', 'width': width, 'total_width': total_width, 'descriptions': descriptions, 'cbjs_action': ''' spt.gallery = {}; // 1250 is defined also in the css styles spt.gallery.portrait = window.innerWidth < 1250; spt.gallery.portrait = false spt.gallery.top = bvr.src_el; spt.gallery.content = spt.gallery.top.getElement(".spt_gallery_content"); spt.gallery.content.setStyle('opacity','0.1') spt.gallery.desc_el = spt.gallery.top.getElement(".spt_gallery_description"); //window.addEvent('domready', function() { setTimeout(function() { // set the img h or w directly var items = bvr.src_el.getElements('.spt_gallery_item img'); // fade in spt.gallery.content.set('tween', {duration: 250}).fade('in'); /* for (var k=0; k < items.length; k++) { var sizes = items[k].getSize(); var item_h = sizes.y; var item_w = sizes.x; if (item_h >= item_w){ //items[k].setStyle('width', 'auto'); //items[k].setStyle('height', '100%'); } else { //items[k].setStyle('width','auto'); //items[k].setStyle('height','100%'); } } */ }, 50) spt.gallery.width = bvr.width; spt.gallery.descriptions = bvr.descriptions; spt.gallery.index = 0; spt.gallery.total = bvr.descriptions.length; spt.gallery.left_arrow = bvr.src_el.getElement('.spt_left_arrow'); spt.gallery.right_arrow = bvr.src_el.getElement('.spt_right_arrow'); spt.gallery.videos = {}; spt.gallery.init = function() { } spt.gallery.stack = []; spt.gallery.push_stack = function(key) { spt.gallery.stack.push(key); } spt.gallery.show_next = function(src_el) { if (!src_el) src_el = spt.gallery.right_arrow; if (spt.gallery.index >= spt.gallery.total-2) { spt.hide(src_el); } if (spt.gallery.index == spt.gallery.total-1) { return; } spt.gallery.index += 1; spt.gallery.show_index(spt.gallery.index); } spt.gallery.show_prev = function(src_el) { if (!src_el) src_el = spt.gallery.left_arrow; if (spt.gallery.index <= 1) { spt.hide(src_el); } if (spt.gallery.index == 0) { return; } spt.gallery.index -= 1; spt.gallery.show_index(spt.gallery.index); } spt.gallery.show_index = function(index) { // stop all videos var videos = spt.gallery.top.getElements(".video-js"); for (var i = 0; i < videos.length; i++) { try { var video = videos[i]; var video_id = video.get("id"); var video_obj = videojs(video_id, {"nativeControlsForTouch": false}); video_obj.pause(); } catch(e) { } } // can't tween percentage with this library??? var width = spt.gallery.width; var margin = - width * index; var content = spt.gallery.content; //content.setStyle("margin-left", margin + "px"); new Fx.Tween(content,{duration: 250}).start("margin-left", margin); spt.gallery.index = index; var total = spt.gallery.total; if (index == 0) { spt.hide(spt.gallery.left_arrow); spt.show(spt.gallery.right_arrow); } else if (index == total - 1) { spt.show(spt.gallery.left_arrow); spt.hide(spt.gallery.right_arrow); } else { spt.show(spt.gallery.left_arrow); spt.show(spt.gallery.right_arrow); } var description = spt.gallery.descriptions[index]; if (!description) { description = (index+1)+" of "+total; } else { description = (index+1)+" of "+total+" - " + description; } spt.gallery.set_description(description); } spt.gallery.close = function() { var content = spt.gallery.content; var top = content.getParent(".spt_gallery_top"); spt.behavior.destroy_element(top); } spt.gallery.set_description = function(desc) { var desc_el = spt.gallery.desc_el; desc_el.innerHTML = desc; } ''' } ) scroll = DivWdg(css='spt_gallery_scroll') inner.add(scroll) scroll.set_box_shadow() scroll.add_style("width: %s" % width) if height: scroll.add_style("height: %s" % height) scroll.add_style("overflow-x: hidden") scroll.add_style("overflow-y: hidden") scroll.add_style("background: #000") #scroll.add_style("position: absolute") scroll.add_style("margin-left: auto") scroll.add_style("margin-right: auto") content = DivWdg() top.add_attr('tabindex','-1') scroll.add(content) content.add_class("spt_gallery_content") # make the items vertically align to bottom (flex-emd) # on a regular monitor, align to top (flex-start) is better if align == 'bottom': align_items = 'flex-end' else: align_items = 'flex-start' content.add_styles("display: flex; flex-flow: row nowrap; align-items: %s; justify-content: center;"%align_items) content.add_style("width: %s" % total_width) top.add_behavior( { 'type': 'load', 'cbjs_action': ''' bvr.src_el.focus(); ''' } ) top.add_behavior( { 'type': 'mouseenter', 'cbjs_action': ''' bvr.src_el.focus(); ''' } ) top.add_behavior( { 'type': 'mouseleave', 'cbjs_action': ''' bvr.src_el.blur(); ''' } ) """ input = TextWdg("keydown") content.add(input) input.add_style("position: absolute") input.add_style("left: -5000px") """ top.add_behavior( { 'type': 'keydown', 'cbjs_action': ''' var key = evt.key; if (key == "left") { spt.gallery.push_stack(key); spt.gallery.show_prev(); } else if (key == "right") { spt.gallery.push_stack(key); spt.gallery.show_next(); } else if (key == "esc" || key == "enter") { var top = bvr.src_el spt.behavior.destroy_element(top); } ''' } ) curr_index = 0 for i, path in enumerate(paths): path_div = DivWdg(css='spt_gallery_item') content.add(path_div) #path_div.add_style("float: left") path_div.add_style("display: inline-block") path_div.add_style("vertical-align: middle") if path == self.curr_path: curr_index = i try: thumb_path = thumb_paths[i] except IndexError: print "Cannot find the thumb_path [%s] "%i thumb_path = '' #path_div.add_style("width: %s" % width) #if height: # path_div.add_style("height: %s" % height) path_div.add_style("width: 100%") path_div.add_style("height: 100%") path_div.add_style("overflow-x: hidden") path_div.add_style("overflow-y: hidden") from tactic.ui.widget import EmbedWdg embed = EmbedWdg(src=path, click=False, thumb_path=thumb_path, index=i, controls="true") path_div.add(embed) content.add_behavior({ 'type': 'load', 'index': curr_index, 'cbjs_action': ''' if (!bvr.index) bvr.index = 0; spt.gallery.show_index(bvr.index); ''' } ) #icon = IconWdg(title="Close", icon="/plugins/remington/pos/icons/close.png") icon = IconWdg(title="Close", icon="/context/icons/glyphs/close.png", width="40px") inner.add(icon) icon.add_style("position: absolute") icon.add_style("cursor: pointer") icon.add_style("top: 30px") icon.add_style("right: 38px") icon.add_style("opacity: 0.5") icon.add_behavior( { 'type': 'click_up' , 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_gallery_top"); spt.behavior.destroy_element(top); ''' } ) icon.add_style("background", "rgba(48,48,48,0.7)") icon.add_style("border-radius", "5px") icon = IconWdg(title="Previous", icon="/context/icons/glyphs/chevron_left.png") inner.add(icon) icon.add_class('spt_left_arrow') icon.add_style("cursor: pointer") icon.add_style("position: absolute") icon.add_style("top: 40%") icon.add_style("left: 0px") icon.add_style("opacity: 0.5") icon.add_behavior( { 'type': 'click_up' , 'cbjs_action': ''' var arrow = bvr.src_el; spt.gallery.show_prev(arrow); ''' } ) icon.add_style("background", "rgba(48,48,48,0.7)") icon.add_style("border-radius", "5px") icon = IconWdg(title="Next", icon="/context/icons/glyphs/chevron_right.png") inner.add(icon) icon.add_class('spt_right_arrow') icon.add_style("position: absolute") icon.add_style("cursor: pointer") icon.add_style("top: 40%") icon.add_style("right: 0px") icon.add_style("opacity: 0.5") icon.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var arrow = bvr.src_el; spt.gallery.show_next(arrow); ''' } ) icon.add_style("background", "rgba(48,48,48,0.7)") icon.add_style("border-radius", "5px") desc_div = DivWdg() desc_div.add_class("spt_gallery_description") desc_div.add_style("height: 30px") desc_div.add_style("width: %s" % width) desc_div.add_style("text-align: center") desc_div.add_style("background: rgba(0,0,0,1)") desc_div.add_style("color: #bbb") desc_div.add_style("font-weight: bold") desc_div.add_style("font-size: 16px") desc_div.add_style("padding-top: 10px") desc_div.add_style("margin-left: -%s" % (width/2)) desc_div.add_style("z-index: 1000") desc_div.add("") desc_outer_div = DivWdg() inner.add(desc_outer_div) desc_outer_div.add_style("position: fixed") desc_outer_div.add(desc_div) desc_outer_div.add_style("bottom: 0px") desc_outer_div.add_style("left: 50%") return top
def get_display(my): widget = my.widget widget.set_box_shadow() widget.add_class("spt_dialog_top") widget.add_class("spt_popup") z_index = my.kwargs.get("z_index") if not z_index: z_index = "500" widget.add_style("z-index: %s" % z_index) web = WebContainer.get_web() widget.set_id(my.name) widget.add_attr("spt_dialog_id", my.name) if my.kwargs.get("display") not in [True, "true"]: widget.add_style("display: none") widget.add_style("position: absolute") widget.add_behavior({ 'type': 'listen', 'event_name': '%s|dialog_close' % my.name, 'cbjs_action': my.get_cancel_script() }) offset = my.kwargs.get("offset") if not offset: offset = my.offset show_header = True show_resize = False drag_div = DivWdg() if show_header: widget.add(drag_div) show_pointer = my.kwargs.get("show_pointer") if show_pointer not in [False, 'false']: from tactic.ui.container import ArrowWdg offset_x = 15 - offset.get('x') offset_y = offset.get("y") arrow = ArrowWdg(offset_x=offset_x, offset_y=offset_y, color=widget.get_color("background", -10)) arrow.add_class("spt_popup_pointer") arrow.add_style("z-index: 10") widget.add(arrow) # create the 'close' button ... close_wdg = SpanWdg() close_wdg.add(IconWdg("Close", "BS_REMOVE")) close_wdg.add_style("float: right") close_wdg.add_class("hand") close_wdg.add_style("margin: 3px 1px 3px 1px") close_wdg.add_behavior({ 'type': 'click_up', 'cbjs_action': my.get_cancel_script() }) drag_div.add(close_wdg) anchor_wdg = SpanWdg() drag_div.add(anchor_wdg) anchor_wdg.add_style("margin: 5px 5px 3px 1px") anchor_wdg.add(IconWdg("Anchor Dialog", "BS_PUSHPIN")) anchor_wdg.add_style("float: right") anchor_wdg.add_class("hand") anchor_wdg.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_dialog_top"); var position = top.getStyle("position"); if (position == 'fixed') { top.setStyle("position", "absolute"); bvr.src_el.setStyle("opacity", "1.0"); } else { top.setStyle("position", "fixed"); bvr.src_el.setStyle("opacity", "0.5"); } ''' }) width = my.kwargs.get("width") if not width: width = "100px" if width: drag_div.add_style("min-width: %s" % width) # style #drag_div.add_looks("popup") drag_div.add_style("text-align: left") drag_div.add_class("spt_popup_width") drag_div.add_style("border-style: solid") drag_div.add_color("border-color", "border") drag_div.add_style("border-size: 0 0 1 0") drag_handle_div = DivWdg(id='%s_title' % my.name) drag_div.add(drag_handle_div) drag_handle_div.add_style("padding: 3px;") #drag_handle_div.add_gradient("background", "background", +10) drag_handle_div.add_color("background", "background", -10) drag_handle_div.add_color("color", "color") drag_handle_div.add_style("padding: 8px 5px 8px 8px") drag_handle_div.add_behavior({ 'type': 'double_click', 'cbjs_action': my.get_cancel_script() }) # add the drag capability drag_handle_div.add_behavior({ 'type': 'smart_drag', 'drag_el': 'spt.popup.get_popup(@);', 'options': { 'z_sort': 'bring_forward' }, 'ignore_default_motion': 'false', 'cbjs_setup': ''' var pointer = bvr.drag_el.getElement(".spt_popup_pointer"); if (pointer) { spt.hide(pointer); } ''' }) # add the content content_div = DivWdg() title_wdg = my.title_wdg if not title_wdg: title_wdg = "No Title" # if the title is empty, just don't show if my.kwargs.get("show_title") in [False, 'false']: drag_div.add_style("display: none") drag_handle_div.add(title_wdg) drag_handle_div.add_class("spt_popup_title") drag_handle_div.add_style("font-weight: bold") widget.add(content_div) content_div.add_color("color", "color2") content_div.add_gradient("background", "background2") content_div.set_id("%s_content" % my.name) content_div.add_class("spt_popup_content") content_div.add_class("spt_dialog_content") content_div.add_style("overflow: hidden") content_div.add_style("display: block") #content_div.add_style("padding: 5px") view = my.kwargs.get("view") view_kwargs = my.kwargs.get("view_kwargs") if not view_kwargs: view_kwargs = {} if view: from tactic.ui.panel import CustomLayoutWdg my.add(CustomLayoutWdg(view=view, view_kwargs=view_kwargs)) if not my.content_wdg: my.content_wdg = "No Content" content_div.add(my.content_wdg) # add the resize icon if show_resize: icon = IconWdg("Resize", IconWdg.RESIZE_CORNER) icon.add_style("cursor: nw-resize") icon.add_style("z-index: 1000") icon.add_class("spt_popup_resize") icon.add_style("float: right") icon.add_style("margin-top: -25px") icon.add_style("margin-right: 5px") icon.add_behavior({ 'type': 'drag', "drag_el": '@', "cb_set_prefix": 'spt.popup.resize_drag' }) widget.add(icon) return widget
def get_display(my): web = WebContainer.get_web() top = my.top top.add_class("spt_ace_editor_top") script = my.kwargs.get("custom_script") if script: language = script.get_value("language") else: language = my.kwargs.get("language") if not language: language = 'javascript' code = my.kwargs.get("code") if not code: code = "" show_options = my.kwargs.get("show_options") if show_options in ['false', False]: show_options = False else: show_options = True options_div = DivWdg() top.add(options_div) if not show_options: options_div.add_style("display: none") options_div.add_color("background", "background3") options_div.add_border() options_div.add_style("text-align: center") options_div.add_style("padding: 2px") select = SelectWdg("language") select.add_style("width: 100px") select.add_style("display: inline") options_div.add(select) select.add_class("spt_language") select.set_option("values", "javascript|server_js|python|expression|xml") select.add_behavior( { 'type': 'change', 'editor_id': my.get_editor_id(), 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var value = bvr.src_el.value; spt.ace_editor.set_language(value); //register_change(bvr); ''' } ) select = SelectWdg("font_size") select.add_style("width: 100px") select.add_style("display: inline") options_div.add(select) select.set_option("labels", "8 pt|9 pt|10 pt|11 pt|12 pt|14 pt|16 pt") select.set_option("values", "8 pt|9pt|10pt|11pt|12pt|14pt|16pt") select.set_value("10pt") select.add_behavior( { 'type': 'click_up', 'editor_id': my.get_editor_id(), 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var editor = spt.ace_editor.editor; var editor_id = spt.ace_editor.editor_id; var value = bvr.src_el.value; $(editor_id).setStyle("font-size", value) //editor.resize(); ''' } ) select = SelectWdg("keybinding") select.add_style("width: 100px") #options_div.add(select) select.set_option("labels", "Ace|Vim|Emacs") select.set_option("values", "ace|vim|emacs") select.set_value("10pt") select.add_behavior( { 'type': 'change', 'editor_id': my.get_editor_id(), 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var editor = spt.ace_editor.editor; var editor_id = spt.ace_editor.editor_id; var vim = require("ace/keyboard/keybinding/vim").Vim; editor.setKeyboardHandler(vim) ''' } ) editor_div = DivWdg() top.add(editor_div) if code: load_div = DivWdg() top.add(load_div) readonly = my.kwargs.get("readonly") if readonly in ['true', True]: readonly = True else: readonly = False load_div.add_behavior( { 'type': 'load', 'code': code, 'language': language, 'editor_id': my.get_editor_id(), 'readonly': readonly, 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var func = function() { var editor = spt.ace_editor.editor; var document = editor.getSession().getDocument(); if (bvr.code) { spt.ace_editor.set_value(bvr.code); } spt.ace_editor.set_language(bvr.language); editor.setReadOnly(bvr.readonly); var session = editor.getSession(); //session.setUseWrapMode(true); //session.setWrapLimitRange(120, 120); }; var editor = spt.ace_editor.editor; if (!editor) { setTimeout( func, 1000); } else { func(); } ''' } ) # theme select = SelectWdg("theme") select.add_style("width: 100px") select.add_style("display: inline") options_div.add(select) select.set_option("labels", "Eclipse|Twilight|TextMate|Vibrant Ink|Merbivore|Clouds") select.set_option("values", "eclipse|twilight|textmate|vibrant_ink|merbivore|clouds") select.set_value("twilight") select.add_behavior( { 'type': 'change', 'editor_id': my.get_editor_id(), 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var editor = spt.ace_editor.editor; var editor_id = spt.ace_editor.editor_id; value = bvr.src_el.value; editor.setTheme("ace/theme/" + value); ''' } ) editor_div = DivWdg() top.add(editor_div) my.text_area.add_style("margin-top: -1px") my.text_area.add_style("margin-bottom: 0px") my.text_area.add_color("background", "background") my.text_area.add_style("font-family: courier new") my.text_area.add_border() editor_div.add(my.text_area) my.text_area.add_style("position: relative") #text_area.add_style("margin: 20px") size = web.get_form_value("size") if size: width, height = size.split(",") else: width = my.kwargs.get("width") if not width: width = "650px" height = my.kwargs.get("height") if not height: height = "450px" my.text_area.add_style("width: %s" % width) my.text_area.add_style("height: %s" % height) bottom_div = DivWdg() top.add(bottom_div) bottom_div.add_color("background", "background3") bottom_div.add_border() bottom_div.add_style("text-align: center") bottom_div.add_style("padding: 2px") bottom_div.add_style("height: 20px") bottom_title = "Script Editor" bottom_div.add(bottom_title) icon = IconWdg("Resize Editor", IconWdg.RESIZE_CORNER) bottom_div.add(icon) icon.add_style("float: right") icon.add_style("margin-right: -4px") icon.add_style("cursor: se-resize") icon.add_behavior( { 'type': 'drag', "cb_set_prefix": 'spt.ace_editor.drag_resize', } ) #hidden = HiddenWdg("size") hidden = TextWdg("size") bottom_div.add(hidden) hidden.add_style("width: 85px") hidden.add_style("text-align: center") hidden.add_style("float: right") hidden.add_class("spt_size") hidden.set_value("%s,%s" % (width, height)) theme = top.get_theme() if theme == 'dark': theme = 'twilight' else: theme = 'eclipse' print "theme: ", theme top.add_behavior( { 'type': 'load', 'unique_id': my.unique_id, 'theme': theme, 'cbjs_action': ''' if (typeof(ace) == 'undefined') { // fist time loading spt.ace_editor = {} spt.ace_editor.editor = null; spt.ace_editor.editor_id = bvr.unique_id; spt.ace_editor.theme = bvr.theme; spt.ace_editor.set_editor = function(editor_id) { spt.ace_editor.editor_id = editor_id; spt.ace_editor.editor = $(editor_id).editor; } spt.ace_editor.set_editor_top = function(top_el) { if (!top_el.hasClass("spt_ace_editor")) { top_el = top_el.getElement(".spt_ace_editor"); } var editor_id = top_el.getAttribute("id"); spt.ace_editor.set_editor(editor_id); } spt.ace_editor.get_editor = function() { return spt.ace_editor.editor; } spt.ace_editor.clear_selection = function() { var editor = spt.ace_editor.editor; editor.clearSelection(); } spt.ace_editor.get_selection = function() { var editor = spt.ace_editor.editor; //return editor.getSelection(); return editor.getCopyText(); } spt.ace_editor.get_value = function() { var editor = spt.ace_editor.editor; var document = editor.getSession().getDocument() var value = document.getValue(); return value; } spt.ace_editor.set_value = function(value) { var editor = spt.ace_editor.editor; var document = editor.getSession().getDocument() document.setValue(value); editor.gotoLine(2); editor.resize(); editor.focus(); } spt.ace_editor.goto_line = function(number) { var editor = spt.ace_editor.editor; var document = editor.getSession().getDocument() editor.gotoLine(2); editor.resize(); editor.focus(); } spt.ace_editor.insert = function(value) { var editor = spt.ace_editor.editor; var position = editor.getCursorPosition(); var doc = editor.getSession().getDocument() doc.insertInLine(position, value); } spt.ace_editor.insert_lines = function(values) { var editor = spt.ace_editor.editor; var position = editor.getCursorPosition(); var doc = editor.getSession().getDocument() doc.insertLines(position.row, values); } spt.ace_editor.get_document = function() { var document = spt.ace_editor.editor.getSession().getDocument() return document; } spt.ace_editor.set_language = function(value) { if (!value) { value = 'javascript'; } var editor = spt.ace_editor.editor; var top = $(spt.ace_editor.editor_id).getParent(".spt_ace_editor_top"); var lang_el = top.getElement(".spt_language"); for ( var i = 0; i < lang_el.options.length; i++ ) { if ( lang_el.options[i].value == value ) { lang_el.options[i].selected = true; break; } } var session = editor.getSession(); var mode; if (value == 'python') { mode = require("ace/mode/python").Mode; } else if (value == 'xml') { mode = require("ace/mode/xml").Mode; } else if (value == 'expression') { mode = require("ace/mode/xml").Mode; } else { mode = require("ace/mode/javascript").Mode; } session.setMode( new mode() ); } spt.ace_editor.drag_start_x; spt.ace_editor.drag_start_y; spt.ace_editor.drag_size; spt.ace_editor.drag_editor_el; spt.ace_editor.drag_size_el; spt.ace_editor.drag_resize_setup = function(evt, bvr, mouse_411) { var editor = spt.ace_editor.editor; var editor_id = spt.ace_editor.editor_id; spt.ace_editor.drag_start_x = mouse_411.curr_x; spt.ace_editor.drag_start_y = mouse_411.curr_y; var editor_el = $(editor_id); spt.ace_editor.drag_editor_el = editor_el; spt.ace_editor.drag_size = editor_el.getSize(); var top = bvr.src_el.getParent(".spt_ace_editor_top"); spt.ace_editor.drag_size_el = top.getElement(".spt_size"); } spt.ace_editor.drag_resize_motion = function(evt, bvr, mouse_411) { var diff_x = parseFloat(mouse_411.curr_x - spt.ace_editor.drag_start_x); var diff_y = parseFloat(mouse_411.curr_y - spt.ace_editor.drag_start_y); var size = spt.ace_editor.drag_size; var editor_el = spt.ace_editor.drag_editor_el; var width = size.x + diff_x if (width < 300) { width = 300; } var height = size.y + diff_y if (height < 200) { height = 200; } editor_el.setStyle("width", width); editor_el.setStyle("height", height); spt.ace_editor.drag_size_el.value = width + "," + height; var editor = spt.ace_editor.editor; editor.resize(); } var js_files = [ "ace/ace-0.2.0/src/ace.js", //"ace/ace-0.2.0/src/ace-uncompressed.js", ]; var ace_setup = function() { var editor = ace.edit(bvr.unique_id); spt.ace_editor.editor = editor; // put the editor into the dom spt.ace_editor.editor_id = bvr.unique_id; $(bvr.unique_id).editor = editor; editor.setTheme("ace/theme/" + spt.ace_editor.theme); var JavaScriptMode = require("ace/mode/javascript").Mode; editor.getSession().setMode(new JavaScriptMode()) } spt.dom.load_js(js_files, function() { ace; require; define; var core_js_files = [ "ace/ace-0.2.0/src/mode-javascript.js", "ace/ace-0.2.0/src/mode-xml.js", "ace/ace-0.2.0/src/mode-python.js", "ace/ace-0.2.0/src/theme-twilight.js", "ace/ace-0.2.0/src/theme-textmate.js", "ace/ace-0.2.0/src/theme-vibrant_ink.js", "ace/ace-0.2.0/src/theme-merbivore.js", "ace/ace-0.2.0/src/theme-clouds.js", "ace/ace-0.2.0/src/theme-eclipse.js" ]; //var supp_js_files = []; spt.dom.load_js(core_js_files, ace_setup); //spt.dom.load_js(supp_js_files); }); } else { var editor = ace.edit(bvr.unique_id); editor.setTheme("ace/theme/" + bvr.theme); var JavaScriptMode = require("ace/mode/javascript").Mode; editor.getSession().setMode(new JavaScriptMode()) spt.ace_editor.editor_id = bvr.unique_id; spt.ace_editor.editor = editor; $(bvr.unique_id).editor = editor; } ''' } ) return top
def get_display(my): value = my.get_value() name = my.get_name() type = my.get_option("type") if not type: type = my.get_type() # FIXME: this needs to be handled outside of this class to centralize # the type of an element!!! if type in ["timestamp"]: # make a guess here if name.endswith('time'): type = 'time' elif name.endswith('date'): type = 'date' if type == "text": wiki = WikiUtil() display = wiki.convert(value) elif type in ["time"]: if value: display = Date(value).get_display_time() else: display = '' elif type in ["datetime"]: if value: display = Date(value).get_display_datetime() else: display = '' elif type in ["timestamp", 'date']: if value == '{now}': display = Date() elif value: display = Date(value).get_display_date() else: display = '' elif type == "timecode": display = "00:00:00:00" elif type == "currency": display = "$%s" % value elif type == "color": display = DivWdg() color = DivWdg(" ") color.add_style("height: 15px") color.add_style("width: 15px") color.add_style("float: left") color.add_style("margin: 0 5px 0 5px") color.add_style("background: %s" % value) display.add(color) display.add(value) display.add_style("width: 100%") display.add_style("height: 100%") elif type == "boolean": display = DivWdg() display.add_style("text-align: center") display.add_style("width: 100%") display.add_style("height: 100%") if value == True: from pyasm.widget import IconWdg icon = IconWdg("True", IconWdg.CHECK) display.add(icon) elif value == False: from pyasm.widget import IconWdg icon = IconWdg("False", IconWdg.INVALID) display.add(icon) else: display.add(" ") else: if not isinstance(value, basestring): display = DivWdg() display.add_style("float: right") display.add_style("padding-right: 3px") display.add(str(value)) else: display = value return display
def get_display(my): top = my.top my.set_as_panel(top) top.add_class("spt_delete_top") top.add_color("background", "background") top.add_color("color", "color") top.add_border() top.add_style("width: 300px") top.add_border() search_key = my.kwargs.get("search_key") search_keys = my.kwargs.get("search_keys") if search_key: sobject = Search.get_by_search_key(search_key) sobjects = [sobject] search_keys = [search_key] elif search_keys: sobjects = Search.get_by_search_keys(search_keys) sobject = sobjects[0] if not sobjects: msg = "%s not found" % search_key return msg search_type = sobject.get_base_search_type() if search_type in ['sthpw/project', 'sthpw/search_object']: msg = 'You cannot delete these items with this tool' return msg my.search_keys = search_keys title = DivWdg() top.add(title) title.add_color("background", "background", -10) if my.search_keys: title.add("Delete %s Items" % len(my.search_keys)) else: title.add("Delete Item [%s]" % (sobject.get_code())) title.add_style("font-size: 14px") title.add_style("font-weight: bold") title.add_style("padding: 10px") content = DivWdg() top.add(content) content.add_style("padding: 10px") content.add( "The item to be deleted has a number of dependencies as described below:<br/>", 'heading') # find all the relationships related_types = SearchType.get_related_types(search_type, direction='children') items_div = DivWdg() content.add(items_div) items_div.add_style("padding: 10px") valid_related_ctr = 0 for related_type in related_types: if related_type == "*": print "WARNING: related_type is *" continue if related_type == search_type: continue if related_type in ['sthpw/search_object', 'sthpw/search_type']: continue item_div = my.get_item_div(sobjects, related_type) if item_div: items_div.add(item_div) valid_related_ctr += 1 if valid_related_ctr > 0: icon = IconWdg("WARNING", IconWdg.WARNING) icon.add_style("float: left") content.add(icon) content.add( "<div><b>WARNING: By selecting the related items above, you can delete them as well when deleting this sObject.</b></div>" ) content.add("<br/>" * 2) else: # changed the heading to say no dependencies content.add("The item to be deleted has no dependencies.<br/>", 'heading') content.add("There are %s items to be deleted" % len(my.search_keys)) content.add("<br/>" * 2) content.add("Do you wish to continue deleting?") content.add("<br/>" * 2) button_div = DivWdg() button_div.add_styles('width: 300px; height: 75px') button = ActionButtonWdg(title="Delete") button_div.add(button) content.add(button_div) button.add_style("float: left") button.add_behavior({ 'type': 'click_up', 'search_keys': my.search_keys, 'cbjs_action': ''' spt.app_busy.show("Deleting"); var top = bvr.src_el.getParent(".spt_delete_top"); var values = spt.api.Utility.get_input_values(top); var class_name = "tactic.ui.tools.DeleteCmd"; var kwargs = { 'search_keys': bvr.search_keys, 'values': values }; var del_trigger = function() { // for fast table var tmps = spt.split_search_key(bvr.search_keys[0]) var tmps2 = tmps[0].split('?'); var del_st_event = "delete|" + tmps2[0]; var bvr_fire = {}; var input = {'search_keys': bvr.search_keys}; bvr_fire.options = input; spt.named_events.fire_event(del_st_event, bvr_fire); } var server = TacticServerStub.get(); try { server.start({'title': 'Delete sObject', 'description': 'Delete sObject [' + bvr.search_keys + ']'}); server.execute_cmd(class_name, kwargs); server.finish(); // run the post delete and destroy the popup var popup = bvr.src_el.getParent(".spt_popup"); if (popup.spt_on_post_delete) { popup.spt_on_post_delete(); } del_trigger(); spt.popup.destroy(popup); } catch(e) { spt.alert(spt.exception.handler(e)); } spt.app_busy.hide(); ''' }) button = ActionButtonWdg(title="Cancel") button.add_style("float: left") button_div.add(button) button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_popup"); top.destroy(); ''' }) content.add("<br clear='all'/>") return top
def get_display(my): smenu_div = DivWdg() smenu_div.add_class("SPT_SMENU") smenu_div.add_class("SPT_SMENU_%s" % my.menu_tag_suffix) smenu_div.set_box_shadow() smenu_div.add_border() smenu_div.add_color("background", "background") smenu_div.add_color("color", "color") smenu_div.add_behavior({ 'type': 'load', 'cbjs_action': ''' spt.dom.load_js( ["ctx_menu.js"], function() { spt.dom.load_js( ["smart_menu.js"], function() { } ) } ); ''' }) if my.setup_cbfn: smenu_div.set_attr("SPT_SMENU_SETUP_CBFN", my.setup_cbfn) smenu_div.set_z_start(300) #smenu_div.add_looks( "smenu border curs_default" ) # smenu_div.add_styles( "padding-top: 3px; padding-bottom: 5px;" ) m_width = my.width - 2 smenu_div.add_style(("width: %spx" % m_width)) smenu_div.add_style("overflow-x: hidden") icon_width = 16 icon_col_width = 0 if my.allow_icons: icon_col_width = icon_width + 2 label_width = m_width - icon_col_width - icon_width menu_table = Table() menu_table.add_styles( "text-align: left; text-indent: 3px; border-collapse: collapse;") #menu_table.add_color("background", "background") menu_table.add_color("color", "color") options = my.opt_spec_list opt_count = 0 if options[0].get('type') != 'title': my._add_spacer_row(menu_table, 3, icon_width, icon_col_width, label_width) """ menu_table.add_relay_behavior( { 'type': 'mouseenter', 'bvr_match_class': 'SPT_SMENU_ENTRY', 'bgcolor': menu_table.get_color("side_bar_title", -15, default="background3"), 'cbjs_action': ''' bvr.src_el.setStyle("background-color", bvr.bgcolor); bvr.src_el.setStyle("color", bvr.bgcolor); spt.smenu.entry_over( evt, bvr ); ''' } ) menu_table.add_relay_behavior( { 'type': 'mouseleave', 'bvr_match_class': 'SPT_SMENU_ENTRY', 'cbjs_action': ''' bvr.src_el.setStyle("background-color", ""); spt.smenu.entry_out( evt, bvr ); ''' } ) """ for opt in options: # if entry is a title, then add a spacer before if opt.get('type') == 'title' and opt_count: my._add_spacer_row(menu_table, 6, icon_width, icon_col_width, label_width) tbody = menu_table.add_tbody() tbody.add_style("display", "table-row-group") tr = menu_table.add_row() #tr.add_looks( "smenu" ) tr.add_class("SPT_SMENU_ENTRY") tr.add_class("SPT_SMENU_ENTRY_%s" % opt['type'].upper()) if opt.has_key('enabled_check_setup_key'): tr.set_attr("SPT_ENABLED_CHECK_SETUP_KEY", opt.get('enabled_check_setup_key')) if opt.has_key('hide_when_disabled') and opt.get( 'hide_when_disabled'): tr.set_attr("SPT_HIDE_WHEN_DISABLED", "true") if opt['type'] in ['action', 'toggle']: hover_bvr = { 'type': 'hover', 'add_looks': 'smenu_hilite', 'cbjs_action_over': 'spt.smenu.entry_over( evt, bvr );', 'cbjs_action_out': 'spt.smenu.entry_out( evt, bvr );' } if opt.has_key('hover_bvr_cb'): hover_bvr.update(opt.get('hover_bvr_cb')) tr.add_behavior(hover_bvr) tr.add_class("hand") if opt['type'] == 'action': if opt.has_key('bvr_cb') and type(opt['bvr_cb']) == dict: bvr = {} bvr.update(opt['bvr_cb']) bvr['cbjs_action_for_menu_item'] = bvr['cbjs_action'] bvr['cbjs_action'] = 'spt.smenu.cbjs_action_wrapper( evt, bvr );' bvr.update({'type': 'click_up'}) tr.add_behavior(bvr) if opt['type'] == 'submenu': hover_bvr = { 'type': 'hover', 'add_looks': 'smenu_hilite', 'cbjs_action_over': 'spt.smenu.submenu_entry_over( evt, bvr );', 'cbjs_action_out': 'spt.smenu.submenu_entry_out( evt, bvr );', 'submenu_tag': "SPT_SMENU_%s" % opt['submenu_tag_suffix'], } if opt.has_key('hover_bvr_cb'): hover_bvr.update(opt.get('hover_bvr_cb')) tr.add_behavior(hover_bvr) # now trap click on submenu, so that it doesn't make the current menu disappear ... tr.add_behavior({ 'type': 'click', 'cbjs_action': ';', 'activator_type': 'smart_menu' }) tr.add_looks("curs_default") # Left icon cell ... if my.allow_icons: td = menu_table.add_cell() td.add_styles( "text-align: center; vertical-align: middle; width: %spx;" % icon_col_width) #td.add_looks("smenu_icon_column") td.add_color("color", "color3") td.add_color("background", "background3") if opt.has_key('icon'): icon_wdg = IconWdg("", opt['icon']) icon_wdg.add_class("SPT_ENABLED_ICON_LOOK") td.add(icon_wdg) # if disabled: # icon_wdg.add_style( "opacity: .4" ) # icon_wdg.add_style( "filter: alpha(opacity=40)" ) # Menu option label cell ... td = menu_table.add_cell() td.add_style("width", ("%spx" % label_width)) td.add_style("height", ("%spx" % icon_col_width)) if opt.get('type') != 'title': td.add_style("padding-left: 6px") td.add_style("padding-top: 2px") if opt.has_key('label'): label_str = opt.get('label').replace('"', '"') td.add_class("SPT_LABEL") td.add(label_str) td.set_attr("SPT_ORIG_LABEL", label_str) #td.add_looks("fnt_text") td.add_style("font-size: 11px") if opt.get('type') == 'title': #td.add_looks("smenu_title") td.add_color("background", "background2") td.add_color("color", "color2") td.add_style("font-weight", "bold") td.add_style("padding", "3px") elif opt.get('type') == 'separator': hr = HtmlElement("hr") hr.add_looks("smenu_separator") td.add(hr) td.add_class("SPT_ENABLED_LOOK") # if disabled: # td.add_style( "opacity: .2" ) # td.add_style( "filter: alpha(opacity=20)" ) # Submenu arrow icon cell ... td = menu_table.add_cell() td.add_style("width", ("%spx" % icon_width)) if opt['type'] == 'submenu': icon_wdg = IconWdg("", IconWdg.ARROWHEAD_DARK_RIGHT) td.add(icon_wdg) td.add_class("SPT_ENABLED_ICON_LOOK") # extend title entry styling into the submenu arrow cell and add some spacing after if opt.get('type') == 'title': #td.add_looks("smenu_title") td.add_color("background", "background2") td.add_color("color", "color2") td.add_style("font-weight", "bold") td.add_style("padding", "3px") my._add_spacer_row(menu_table, 3, icon_width, icon_col_width, label_width) # if disabled: # td.add_style( "opacity: .4" ) # td.add_style( "filter: alpha(opacity=40)" ) opt_count += 1 my._add_spacer_row(menu_table, 5, icon_width, icon_col_width, label_width) smenu_div.add(menu_table) smenu_div.add_style("display: none") smenu_div.add_style("position: absolute") return smenu_div
def get_display(my): top = my.top top.add_color("background", "background") top.add_color("color", "color") top.add_style("width", "400px") top.add_class('spt_delete_stype_top') top.add_border() project_code = Project.get_project_code() # Note search types should only really be deleted if they were just # created search_type = my.kwargs.get("search_type") if not search_type: node_name = my.kwargs.get("node_name") if node_name: #project_code = Project.get_project_code() search_type = "%s/%s" % (project_code, node_name) assert search_type built_in_stypes = [ 'task', 'note', 'work_hour', 'login', 'login_group', 'schema', 'project', 'login_in_group', 'snapshot', 'file', 'trigger', 'spt_trigger', 'widget_config', 'custom_script', 'notification', 'notification_log', 'file_access', 'cache', 'exception_log', 'milestone', 'pipeline', 'pref_list', 'pref_setting', 'project_type', 'repo', 'remote_repo', 'search_sobject', 'sobject_list', 'ticket', 'db_resource', 'wdg_settings', 'status_log', 'debug_log', 'transaction_log', 'sobject_log' ] for tbl in built_in_stypes: if search_type == 'sthpw/%s' % tbl: top.add("sType [%s] is internal and cannot be deleted!" % search_type) top.add_style("font-size: 14px") top.add_style('padding: 20px') return top search_type_obj = SearchType.get(search_type) if not search_type: top.add("sType [%s] does not exist!" % search_type) top.add_style("font-size: 14px") top.add_style('padding: 20px') return top table = search_type_obj.get_table() db_val = search_type_obj.get_value('database') if db_val == '{project}': label = '' elif db_val == 'sthpw': label = 'built-in' else: label = 'project-specific' # warn if more than 1 sType point to the same table in the same project expr = "@GET(sthpw/search_type['table_name', '%s']['database', 'in', '{project}|%s']['namespace','%s'].search_type)" % ( table, project_code, project_code) rtn = Search.eval(expr) warning_msg = '' if len(rtn) > 1: warning_msg = 'Warning: There is more than 1 sType [%s] pointing to the same table [%s]. Deleting will affect both sTypes.' % ( ', '.join(rtn), table) title_wdg = DivWdg() top.add(title_wdg) title_wdg.add(IconWdg(icon=IconWdg.WARNING)) title_wdg.add("Delete %s sType: %s" % (label, search_type)) title_wdg.add_color("background", "background", -10) title_wdg.add_style("font-weight: bold") title_wdg.add_style("font-size: 14px") content = DivWdg() top.add(content) content.add_style("padding: 10px") if warning_msg: content.add(DivWdg(warning_msg, css='warning')) content.add("<br/>") content.add("This sType uses the table \"%s\" to store items.<br/>" % table) content.add("<br/>") search = Search(search_type) count = search.get_count() content.add("Number of items in the table: %s<br/>" % count) content.add("<br/>") search.add_column("id") sobjects = search.get_sobjects() if sobjects: items_search_type = sobjects[0].get_search_type() search_ids = [x.get_id() for x in sobjects] notes_search = Search("sthpw/note") notes_search.add_filters("search_id", search_ids) notes_search.add_filter("search_type", items_search_type) note_count = notes_search.get_count() cb = CheckboxWdg('related_types') cb.set_attr('value', 'sthpw/note') content.add(cb) content.add( SpanWdg("Number of related notes: %s" % note_count, css='small')) content.add(HtmlElement.br()) tasks_search = Search("sthpw/task") tasks_search.add_filters("search_id", search_ids) tasks_search.add_filter("search_type", items_search_type) task_count = tasks_search.get_count() cb = CheckboxWdg('related_types') cb.set_attr('value', 'sthpw/task') content.add(cb) content.add( SpanWdg("Number of related tasks: %s" % task_count, css='small')) content.add(HtmlElement.br()) snapshots_search = Search("sthpw/snapshot") snapshots_search.add_filters("search_id", search_ids) snapshots_search.add_filter("search_type", items_search_type) snapshot_count = snapshots_search.get_count() cb = CheckboxWdg('related_types') cb.set_attr('value', 'sthpw/snapshot') content.add(cb) content.add( SpanWdg("Number of related snapshots: %s" % snapshot_count, css='small')) content.add(HtmlElement.br()) pipelines_search = Search("sthpw/pipeline") pipelines_search.add_filter("search_type", search_type) pipeline_count = pipelines_search.get_count() cb = CheckboxWdg('related_types') cb.set_attr('value', 'sthpw/pipeline') content.add(cb) content.add( SpanWdg("Number of related pipelines: %s" % pipeline_count, css='small')) content.add(HtmlElement.br(2)) content.add( "<b>WARNING: Deleting the sType will delete all of these items.</b> " ) content.add("<br/>" * 2) content.add("Do you wish to continue deleting?") content.add("<br/>" * 2) button_div = DivWdg() button_div.add_styles('width: 300px; height: 50px') button = ActionButtonWdg(title="Delete") button_div.add(button) content.add(button_div) button.add_style("float: left") button.add_behavior({ 'type': 'click_up', 'search_type': search_type, 'cbjs_action': ''' spt.app_busy.show("Deleting sType"); var class_name = "tactic.ui.tools.DeleteSearchTypeCmd"; var ui_top = bvr.src_el.getParent(".spt_delete_stype_top"); var values = spt.api.Utility.get_input_values(ui_top); var kwargs = { 'search_type': bvr.search_type, 'values': values }; var server = TacticServerStub.get(); try { server.start({'title': 'Delete sType', 'description': 'Delete sType [' + bvr.search_type + ']'}); server.execute_cmd(class_name, kwargs); var top = bvr.src_el.getParent(".spt_popup"); spt.pipeline.remove_node(top.stype_node); // force a schema save spt.named_events.fire_event('schema|save', bvr) top.destroy(); server.finish(); } catch(e) { spt.alert(spt.exception.handler(e)); } spt.app_busy.hide(); spt.notify.show_message("Successfully deleted sType ["+bvr.search_type+"]"); ''' }) button = ActionButtonWdg(title="Cancel") button.add_style("float: left") button_div.add(button) button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_popup"); top.destroy(); ''' }) return top
def get_display(self): self.check() if self.is_refresh: div = Widget() else: div = DivWdg() self.set_as_panel(div) div.add_style('padding', '6px') min_width = '400px' div.add_style('min-width', min_width) div.add_color('background', 'background') div.add_class('spt_add_task_panel') div.add_style("padding: 20px") from tactic.ui.app import HelpButtonWdg help_button = HelpButtonWdg(alias="creating-tasks") div.add(help_button) help_button.add_style("float: right") help_button.add_style("margin-top: -5px") if not self.search_key_list: msg_div = DivWdg() msg_table = Table() msg_div.add(msg_table) msg_table.add_row() msg_table.add_cell(IconWdg("No items selected", IconWdg.WARNING)) msg_table.add_cell( 'Please select at least 1 item to add tasks to.') msg_div.add_style('margin: 10px') msg_table.add_style("font-weight: bold") div.add(msg_div) return div msg_div = DivWdg() msg_div.add_style('margin-left: 4px') div.add(msg_div, 'info') msg_div.add('Total: %s item/s to add tasks to' % len(self.search_key_list)) div.add(HtmlElement.br()) hint = HintWdg('Tasks are added according to the assigned pipeline.') msg_div.add(" ") msg_div.add(hint) msg_div.add(HtmlElement.br()) option_div = DivWdg(css='spt_ui_options') #option_div.add_style('margin-left: 12px') sel = SelectWdg('pipeline_mode', label='Create tasks by: ') sel.set_option('values', ['simple process', 'context', 'standard']) sel.set_option('labels', ['process', 'context', 'all contexts in process']) sel.set_persistence() sel.add_behavior({ 'type': 'change', 'cbjs_action': 'spt.panel.refresh(bvr.src_el)' }) option_div.add(sel) value = sel.get_value() # default to simple process if not value: value = 'simple process' msg = '' if value not in ['simple process', 'context', 'standard']: value = 'simple process' if value == 'context': msg = 'In context mode, a single task will be created for each selected context.' elif value == 'simple process': msg = 'In process mode, a single task will be created for each selected process.' elif value == 'standard': msg = 'In this mode, a task will be created for all contexts of each selected process.' option_div.add(HintWdg(msg)) div.add(option_div) div.add(HtmlElement.br()) title = DivWdg('Assigned Pipelines') title.add_style('padding: 6px') title.add_color('background', 'background2') title.add_color('color', 'color', +120) div.add(title) content_div = DivWdg() content_div.add_style('min-height', '150px') div.add(content_div) content_div.add_border() filtered_search_key_list = [] for sk in self.search_key_list: id = SearchKey.extract_id(sk) if id == '-1': continue filtered_search_key_list.append(sk) sobjects = SearchKey.get_by_search_keys(filtered_search_key_list) skipped = [] pipeline_codes = [] for sobject in sobjects: if isinstance(sobject, Task): msg_div = DivWdg( 'WARNING: Creation of task for [Task] is not allowed.') msg_div.add_style('margin-left: 10px') div.add(msg_div, 'info') return div pipeline_code = sobject.get_value('pipeline_code', no_exception=True) if not pipeline_code: skipped.append(sobject) if pipeline_code not in pipeline_codes: pipeline_codes.append(pipeline_code) pipelines = Search.get_by_code('sthpw/pipeline', pipeline_codes) if pipelines == None: pipelines = [] #if not pipelines: # msg_div = DivWdg('WARNING: No Pipelines found for selected.') # msg_div.add_style('margin-left: 10px') # div.add(msg_div, 'info') # return div # expand the width according to num of pipelines content_div.add_style('min-width', len(pipelines) * 250) mode_cb = SelectWdg('pipeline_mode') mode_cb.set_persistence() mode = mode_cb.get_value() if 'context' == mode: mode = 'context' else: mode = 'process' show_subpipeline = True min_height = '150px' # create a temp default pipeline if not pipelines: pipeline = SearchType.create("sthpw/pipeline") pipeline.set_value("code", "__default__") pipeline.set_value( "pipeline", ''' <pipeline> <process name='publish'/> </pipeline> ''') # FIXME: HACK to initialize virtual pipeline pipeline.set_pipeline(pipeline.get_value("pipeline")) pipelines = [pipeline] for pipeline in pipelines: name = pipeline.get_value("name") if not name: name = pipeline.get_code() span = SpanWdg("Pipeline: %s" % name) span.add_style('font-weight: bold') v_div = FloatDivWdg(span) v_div.add_style('margin: 20px') v_div.add_style('min-height', min_height) v_div.add(HtmlElement.br(2)) content_div.add(v_div) processes = pipeline.get_processes(recurse=show_subpipeline, type=['manual', 'approval']) cb_name = '%s|task_process' % pipeline.get_code() master_cb = CheckboxWdg('master_control') master_cb.set_checked() master_cb.add_behavior({ 'type': 'click_up', 'propagate_evt': True, 'cbjs_action': ''' var inputs = spt.api.Utility.get_inputs(bvr.src_el.getParent('.spt_add_task_panel'),'%s'); for (var i = 0; i < inputs.length; i++) inputs[i].checked = bvr.src_el.checked; ''' % cb_name }) toggle_div = DivWdg() toggle_div.add(SpanWdg(master_cb, css='small')) label = HtmlElement.i('toggle all') label.add_style('color: #888') toggle_div.add_styles( 'border-bottom: 1px solid #888; width: 170px') toggle_div.add(label) v_div.add(toggle_div) process_names = [] for process in processes: process_labels = [] if process.is_from_sub_pipeline(): process_name = process.get_full_name() else: process_name = process.get_name() process_label = process.get_label() if not process_label: process_label = '' if mode == 'context': contexts = pipeline.get_output_contexts(process.get_name()) labels = contexts if process.is_from_sub_pipeline(): labels = [ '%s/%s' % (process.parent_pipeline_code, x) for x in contexts ] for x in labels: process_labels.append(process_label) # prepend process to contexts in this mode to ensure uniqueness contexts = ['%s:%s' % (process_name, x) for x in contexts] else: contexts = [process_name] labels = contexts process_labels.append(process_label) for idx, context in enumerate(contexts): cb = CheckboxWdg(cb_name) cb.set_checked() cb.set_option('value', context) v_div.add(SpanWdg(cb, css='small')) if mode == 'context': span = SpanWdg(process_name, css='med') #span.add_color('color','color') v_div.add(span) v_div.add(SpanWdg(labels[idx])) process_label = process_labels[idx] if process_label: v_div.add(SpanWdg("(%s)" % process_label, css='small')) v_div.add(HtmlElement.br()) content_div.add("<br clear='all'/>") skipped = [] if True: div.add("<br/>") btn = ActionButtonWdg(title='Add Tasks') btn.add_behavior({ 'type': 'click_up', 'post_event': 'search_table_%s' % self.table_id, 'cbjs_action': ''' spt.dg_table.add_task_selected(bvr); ''', 'search_key_list': self.search_key_list }) cb = CheckboxWdg('skip_duplicated', label='Skip Duplicates') cb.set_checked() option_div = DivWdg(cb) option_div.add_style('width', '130px') option_div.add_style('align: left') div.add(option_div) div.add(HtmlElement.br()) btn.add_style("float: right") div.add(btn) div.add(HtmlElement.br(clear="all")) if skipped: content_div.add(HtmlElement.br()) skip_div = DivWdg('Missing pipeline code (Skipped)') skip_div.add_style('text-decoration: underline') content_div.add(skip_div) content_div.add(HtmlElement.br()) item_div = DivWdg() item_div.add_style('margin-left: 10px') content_div.add(item_div) for skip in skipped: item_div.add(skip.get_code()) item_div.add(HtmlElement.br()) return div
def get_display(my): top = my.top top.add_color("background", "background") top.add_color("color", "color") top.add_style("width", "400px") top.add_border() top.add_class("spt_delete_project_tool_top") login = Environment.get_user_name() if login != 'admin': top.add(IconWdg(icon=IconWdg.WARNING)) top.add("Only Admin can delete projects") top.add_style("padding: 50px") top.add_style("text-align: center") return top site = my.kwargs.get("site") if site: Site.set_site(site) project_code = my.kwargs.get("project_code") # check if delete permissions exist for this site and project security = Environment.get_security() if False and not security.check_access("project", project_code, "delete"): top.add(IconWdg(icon=IconWdg.WARNING)) top.add("Not permitted to delete this project") top.add_style("padding: 30px") top.add_style("text-align: center") top.add_style("margin: 50px 30px") top.add_border() top.add_color("background", "background3") return top if project_code: project = Project.get_by_code(project_code) if not project: top.add(IconWdg(icon=IconWdg.WARNING)) top.add("No project [%s] exists in this database" % project_code) top.add_style("padding: 30px") top.add_style("text-align: center") top.add_style("margin: 50px 30px") top.add_border() top.add_color("background", "background3") return top search_key = project.get_search_key() else: search_key = my.kwargs.get("search_key") project = Search.get_by_search_key(search_key) if project: project_code = project.get_code() title_wdg = DivWdg() if project: top.add(title_wdg) title_wdg.add(IconWdg(icon=IconWdg.WARNING)) title_wdg.add("Deleting Project: %s" % project.get_value("title")) title_wdg.add_color("background", "background", -5) title_wdg.add_style("padding: 5px") title_wdg.add_style("font-weight: bold") title_wdg.add_style("font-size: 14px") content = DivWdg() top.add(content) content.add_style("padding: 10px") if not search_key: warning_msg = "Projects must be deleted individually" content.add(DivWdg(warning_msg, css='warning')) content.add("<br/>") return top warning_msg = "Deleting a project will delete the database associated with this project. All data and files will be lost. Please consider carefully before proceeding." if warning_msg: warning_wdg = DivWdg(warning_msg, css='warning') content.add(warning_wdg) warning_wdg.add_style("margin: 20 10px") content.add("<br/>") if not project_code: content.add("This project [%s] has been deleted." % search_key) return top elif not project: content.add("This project [%s] has been deleted." % project_code) return top assert project_code assert project content.add("<br/>") content.add( "<b>NOTE: These items will be deleted, but the sTypes entries in search_objects table will be retained.</b> " ) content.add("<br/>") content.add("<br/>") total_items_wdg = DivWdg() total_items = 0 content.add(total_items_wdg) # find all of the sTypes details_wdg = DivWdg() content.add(details_wdg) details_wdg.add_style("max-height: 300px") details_wdg.add_style("overflow-y: auto") details_wdg.add_style("padding-left: 15px") details_wdg.add_border() search_types = project.get_search_types() related_types = [] for search_type_obj in search_types: search_type_wdg = DivWdg() title = search_type_obj.get_title() search_type = search_type_obj.get_value("search_type") search_type_wdg.add_style("margin-top: 5px") search_type_wdg.add_style("margin-bottom: 5px") details_wdg.add(search_type_wdg) search_type_wdg.add(title) search_type_wdg.add(" (%s)" % search_type) search = Search(search_type, project_code=project_code) count = search.get_count() total_items += count search_type_wdg.add(" - %s item(s)" % count) # TODO: this is similar to SearchType.get_related_types(). streamline at some point. related_types = my.get_related_types(search_type) for related_type in related_types: try: search = Search(related_type) except Exception, e: print "WARNING: ", e continue full_search_type = "%s?project=%s" % (search_type, project_code) if related_type.startswith("sthpw/"): search.add_filter("search_type", full_search_type) count = search.get_count() if count == 0: continue total_items += count related_wdg = DivWdg() related_wdg.add_style('padding-left: 25px') search_type_wdg.add(related_wdg) related_wdg.add(related_type) related_wdg.add(" - %s item(s)" % count)
def get_display(my): div = DivWdg() if not Container.get_dict("JSLibraries", "spt_popup"): div.add_style("position: fixed") div.add_style("top: 0px") div.add_style("left: 0px") div.add_style("opacity: 0.4") div.add_style("background", "#000") div.add_style("padding: 100px") div.add_style("height: 100%") div.add_style("width: 100%") div.add_class("spt_popup_background") div.add_style("display: none") div.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' spt.hide(bvr.src_el); ''' }) Container.put("PopupWdg:background", True) # This is the absolute outside of a popup, including the drop shadow widget = DivWdg() div.add(widget) widget.add_class("spt_popup") if not Container.get_dict("JSLibraries", "spt_popup"): widget.add_behavior({ 'type': 'load', 'cbjs_action': my.get_onload_js() }) width = my.kwargs.get("width") if not width: width = 10 #widget.add_behavior( { # 'type': 'load', # 'cbjs_action': 'bvr.src_el.makeResizable({handle:bvr.src_el.getElement(".spt_popup_resize")})' #} ) web = WebContainer.get_web() widget.set_id(my.name) if my.kwargs.get("display") == "true": pass else: widget.add_style("display: none") widget.add_style("position: absolute") widget.add_style("left: 400px") widget.add_style("top: 100px") widget.add_border() widget.add_color("background", "background") #widget.set_box_shadow(color="#000") widget.set_box_shadow() table = Table() table.add_behavior({ 'type': 'load', 'width': width, 'cbjs_action': ''' bvr.src_el.setStyle("width", bvr.width) var popup = bvr.src_el.getParent(".spt_popup"); var window_size = $(window).getSize(); var size = bvr.src_el.getSize(); var left = window_size.x/2 - size.x/2; var top = window_size.y/2 - size.y/2; popup.setStyle("left", left); //popup.setStyle("top", top); var content = popup.getElement(".spt_popup_content"); content.setStyle("max-height", window_size.y - 200); content.setStyle("overflow-y", "auto"); ''' }) table.add_row() """ # Qt doesn't support shadows very well if web.get_browser() == 'Qtx': # dynamically add css files table.add_class("css_shadow_table") td = table.add_cell() td.add_class("css_shadow_td css_shadow_top_left SPT_POPUP_SHADOW") td = table.add_cell() td.add_class("css_shadow_td css_shadow_top SPT_POPUP_SHADOW") td = table.add_cell() td.add_class("css_shadow_td css_shadow_top_right SPT_POPUP_SHADOW") # Middle (Content) Row of Shadow table ... table.add_row() td = table.add_cell() td.add_class("css_shadow_td css_shadow_left SPT_POPUP_SHADOW") """ content_td = table.add_cell() content_td.add_class("css_shadow_td") """ if web.get_browser() == 'Qtx': td = table.add_cell() td.add_class("css_shadow_td css_shadow_right SPT_POPUP_SHADOW") # Bottom Row of Shadow table ... table.add_row() td = table.add_cell() td.add_class("css_shadow_td css_shadow_bottom_left SPT_POPUP_SHADOW") td = table.add_cell() td.add_class("css_shadow_td css_shadow_bottom SPT_POPUP_SHADOW") td = table.add_cell() td.add_class("css_shadow_td css_shadow_bottom_right SPT_POPUP_SHADOW") """ drag_div = DivWdg() #from tactic.ui.container import ArrowWdg #arrow = ArrowWdg() #drag_div.add(arrow) # FIXME: for some reason, this causes popups to stop functioning after # close a couple of times my.add_header_context_menu(drag_div) # create the 'close' button ... if my.allow_close: close_wdg = SpanWdg(css='spt_popup_close') #close_wdg.add( IconWdg("Close", IconWdg.POPUP_WIN_CLOSE) ) close_wdg.add(IconWdg("Close", "BS_REMOVE")) close_wdg.add_style("margin: 5px 1px 3px 1px") close_wdg.add_style("float: right") close_wdg.add_class("hand") close_wdg.add_behavior({ 'type': 'click_up', 'cbjs_action': my.get_cancel_script() }) drag_div.add(close_wdg) # create the 'minimize' button ... minimize_wdg = SpanWdg(css='spt_popup_min') minimize_wdg.add_style("margin: 5px 1px 3px 1px") #minimize_wdg.add( IconWdg("Minimize", IconWdg.POPUP_WIN_MINIMIZE) ) minimize_wdg.add(IconWdg("Minimize", "BS_MINUS")) minimize_wdg.add_style("float: right") minimize_wdg.add_class("hand") behavior = { 'type': 'click_up', 'cbjs_action': "spt.popup.toggle_minimize( bvr.src_el );" } minimize_wdg.add_behavior(behavior) drag_div.add(minimize_wdg) #-- TO ADD SOON -- create the 'refresh' button ... # refresh_wdg = SpanWdg() # refresh_wdg.add( IconWdg("Refresh Popup", IconWdg.POPUP_WIN_REFRESH) ) # refresh_wdg.add_style("float: right") # refresh_wdg.add_class("hand") # behavior = { # 'type': 'click_up', # 'cbjs_action': "spt.popup.toggle_minimize( bvr.src_el );" # } # refresh_wdg.add_behavior( behavior ); # drag_div.add(refresh_wdg) width = my.kwargs.get("width") # style drag_div.add_style("font-size: 1.1em") drag_div.add_style("text-align: left") drag_div.add_class("spt_popup_width") drag_handle_div = DivWdg(id='%s_title' % my.name) drag_handle_div.add_style("padding: 6px;") #drag_handle_div.add_gradient("background", "background", +10) drag_handle_div.add_color("background", "background", -5) drag_handle_div.add_color("color", "color") drag_handle_div.add_style("font-weight", "bold") drag_handle_div.add_style("font-size", "12px") # add the drag capability. # NOTE: need to use getParent because spt.popup has not yet been # initialized when this is processed shadow_color = drag_div.get_color("shadow") drag_div.add_behavior({ 'type': 'smart_drag', 'shadow_color': shadow_color, 'drag_el': "@.getParent('.spt_popup')", 'bvr_match_class': 'spt_popup_title', 'options': { 'z_sort': 'bring_forward' }, 'ignore_default_motion': 'true', "cbjs_setup": ''' if (spt.popup.is_background_visible) { spt.popup.offset_x = document.body.scrollLeft; spt.popup.offset_y = document.body.scrollTop; spt.popup.hide_background(); var parent = bvr.src_el.getParent(".spt_popup"); parent.setStyle("box-shadow","0px 0px 20px " + bvr.shadow_color); } else { spt.popup.offset_x = 0; spt.popup.offset_y = 0; } ''', "cbjs_motion": ''' mouse_411.curr_x += spt.popup.offset_x; mouse_411.curr_y += spt.popup.offset_y; spt.mouse.default_drag_motion(evt, bvr, mouse_411); ''', "cbjs_action": '' }) title_wdg = my.title_wdg if not title_wdg: title_wdg = "No Title" #else: # title_wdg = title_wdg drag_handle_div.add_behavior({ 'type': 'double_click', 'cbjs_action': my.get_cancel_script() }) drag_handle_div.add(title_wdg) drag_handle_div.add_class("spt_popup_title") # add a context menu from tactic.ui.container.smart_menu_wdg import SmartMenu SmartMenu.assign_as_local_activator(drag_handle_div, 'HEADER_CTX') drag_handle_div.add_attr("spt_element_name", "Test Dock") # add the content content_div = DivWdg() content_div.add_color("color", "color2") #content_div.add_color("background", "background2") from pyasm.web.palette import Palette palette = Palette.get() content_div.add_color("color", "color2") content_div.add_color("background", "background2") content_div.add_style("margin", "0px, -1px -0px -1px") content_div.set_id("%s_content" % my.name) content_div.add_class("spt_popup_content") content_div.add_style("overflow: hidden") content_div.add_style("display: block") #content_div.add_style("padding: 10px") if not my.content_wdg: my.content_wdg = "No Content" content_div.add(my.content_wdg) drag_div.add(drag_handle_div) my.position_aux_div(drag_div, content_div) content_td.add(drag_div) widget.add(table) # ALWAYS make the Popup a Page Utility Widget (now processed client side) widget.add_class("SPT_PUW") if my.z_start: widget.set_z_start(my.z_start) widget.add_style("z-index: %s" % my.z_start) else: widget.add_style("z-index: 102") # add the resize icon icon = IconWdg("Resize", IconWdg.RESIZE_CORNER) icon.add_style("cursor: nw-resize") icon.add_style("z-index: 1000") icon.add_class("spt_popup_resize") icon.add_style("float: right") icon.add_style("margin-top: -15px") icon.add_behavior({ 'type': 'drag', "drag_el": '@', "cb_set_prefix": 'spt.popup.resize_drag' }) content_td.add(icon) #return widget return div
def get_display(self): web = WebContainer.get_web() key = web.get_form_value('name') top = DivWdg() top.add_class('ad_search_wdg_top') self.set_as_panel(top) text = TextWdg("name") text.set_value(key) close_wdg = SpanWdg() close_wdg.add(IconWdg("Close", IconWdg.POPUP_WIN_CLOSE)) close_wdg.add_style("float: right") close_wdg.add_class("hand") # NOTE: the div we are looking for to hide on 'close' is outside of the this widget and # is part of the parent widget close_wdg.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var ad_input_content = bvr.src_el.getParent(".ad_input_content"); spt.toggle_show_hide(ad_input_content); ''' }) top.add(close_wdg) top.add("Active Directory Search:<br clear='all'/> ") table = Table() table.add_row() table.add_cell(text) td = table.add_cell(self.get_search_wdg()) td.add_style("display", "") top.add(table) results_div = DivWdg() top.add(results_div) results_div.add_style("border: solid 1px #444") results_div.add_style("margin: 10px") results_div.add_style("padding: 5px") #results_div.add_style("max-height: 400px") results_div.add_style("overflow: auto") if not key: results_div.add("Please enter search criteria") return top results_div.add("Results Found ...") users = self.find_users(key) max_num_users = 20 if len(users) > max_num_users: display_users = users[:max_num_users] else: display_users = users for user in display_users: user_div = DivWdg() user_div.add_style("margin: 5px") user_div.add_class("hand") user_div.add_event("onmouseover", "$(this).setStyle('background','#444')") user_div.add_event("onmouseout", "$(this).setStyle('background','#222')") checkbox = CheckboxWdg() user_div.add(checkbox) display_name = user.get('display_name') if not display_name: display_name = "%s %s" % (user.get('first_name'), user.get('last_name')) email = user.get('email') login = user.get('login') phone_number = user.get('phone_number') user_div.add(display_name) if email: user_div.add(" (%s) " % email) self.cbjs_action = self.kwargs.get('cbjs_action') if self.cbjs_action: user_behavior = { 'type': 'click_up', 'cbjs_action': self.cbjs_action } user_div.add_behavior(user_behavior) else: user_behavior = { 'type': 'click_up', 'cbjs_action': 'alert("Not implemented")' } user_div.add_behavior(user_behavior) user_div.add_attr("spt_input_value", login) user_div.add_attr("spt_display_value", display_name) user_div.add_attr("spt_phone_number", phone_number) user_div.add_attr("spt_email", email) results_div.add(user_div) num_users = len(users) if num_users > max_num_users: results_div.add("... and %s more results matched" % (num_users - max_num_users)) results_div.add("<br/>Please narrow your search") #nav_div = DivWdg() #num_categories = num_users / max_num_users + 1 #if num_categories > 10: # nav_div.add("<br/>Please narrow your search") #else: # for i in range(0, num_categories): # span = SpanWdg() # span.add(i) # span.add(" ") # nav_div.add(span) #results_div.add(nav_div) if not users: user_div = DivWdg() user_div.add_style("margin: 5px") user_div.add("No Results") results_div.add(user_div) return top
def get_display(my): top = my.top top.add_class("spt_sign_in_top") top.add_color("background", "background") top.add_style("padding: 30px") top.add_style("width: 300px") icon = IconWdg("Not signed in", IconWdg.WARNING) top.add(icon) top.add("You are not signed into Perforce.") top.add("<br/>" * 2) table = Table() top.add(table) from tactic.ui.input import TextInputWdg, PasswordInputWdg table.add_row() td = table.add_cell("Port: ") td.add_style("width: 75px") text = TextInputWdg(name="port") td = table.add_cell(text) td.add_style("vertical-align: top") text.set_value("1666") table.add_row() td = table.add_cell("Login: "******"vertical-align: top") td.add_style("width: 75px") text = TextInputWdg(name="user") td = table.add_cell(text) td.add_style("vertical-align: top") user = Environment.get_user_name() text.set_value(user) table.add_row() td = table.add_cell("Password: "******"vertical-align: top") text = PasswordInputWdg(name="password") table.add_cell(text) tr = table.add_row() table.add_row_cell(" ") tr = table.add_row() tr.add_class("spt_workspaces") #tr.add_style("display: none") td = table.add_cell("Workspace: ") td.add_style("vertical-align: top") workspaces = my.kwargs.get("workspaces") td = table.add_cell() button = ActionButtonWdg(width='55', title="Lookup") td.add(button) button.add_style("float: right") button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' try { var workspaces = spt.scm.get_workspaces(); var clients = []; for (var i = 0; i < workspaces.length; i++) { clients.push(workspaces[i].client); } clients = clients.join("|"); var kwargs = { workspaces: clients } spt.scm.show_login(kwargs); } catch(e) { spt.scm.signout_user(); spt.scm.show_login(); } ''' }) if not workspaces: text = TextInputWdg(name="workspace") text.add_style("width: 165px") td.add(text) else: select = SelectWdg("workspace") td.add(select) select.set_option("values", workspaces) top.add("<br/>" * 2) button = ActionButtonWdg(title="Sign In >>", size='medium') top.add(button) button.add_style("float: right") button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_sign_in_top"); var values = spt.api.get_input_values(top); var port = values.port[0]; var user = values.user[0]; var password = values.password[0]; var client = values.workspace[0]; if (!port) { alert("No port specified"); return; } if (!user) { alert("No user specified"); return; } if (!client) { alert("No workspace specified"); return; } // login in user spt.scm.port = port; spt.scm.user = user; spt.scm.password = password; // test the connection var ping = spt.scm.ping(); if (ping != "OK") { alert("Cannot connect to Perforce") spt.scm.signout_user(); spt.scm.show_login(); } else { spt.scm.client = client; // close the popup var popup = bvr.src_el.getParent(".spt_popup"); if (popup) { spt.popup.destroy(popup); } // NOTE: this is global: find a check-in widget and refresh var checkin_el = $(document.body).getElement(".spt_checkin_top"); spt.panel.refresh(checkin_el); } ''' }) top.add("<br/>" * 2) return top
def get_display(my): top = DivWdg() top.add_border() top.add_style("padding: 10px") top.add_color("color", "color") top.add_color("background", "background") top.add_class("spt_reports_top") title = DivWdg() title.add("Dashboards") title.add_style("font-size: 18px") title.add_style("font-weight: bold") title.add_style("text-align: center") title.add_style("padding: 10px") title.add_style("margin: -10px -10px 10px -10px") title.add_gradient("background", "background3", 5, -10) top.add(title) from tactic.ui.widget import TitleWdg subtitle = TitleWdg(name_of_title='List of Dashboards', help_alias='project-startup-dashboards') top.add(subtitle) top.add("<br/>") dashboards = [] # read the config file from pyasm.widget import WidgetConfig tmp_path = __file__ dir_name = os.path.dirname(tmp_path) file_path = "%s/../config/dashboard-conf.xml" % (dir_name) config = WidgetConfig.get(file_path=file_path, view="definition") element_names = config.get_element_names() for element_name in element_names: attrs = config.get_element_attributes(element_name) dashboard_data = {} kwargs = config.get_display_options(element_name) class_name = kwargs.get('class_name') dashboard_data['class_name'] = class_name dashboard_data['kwargs'] = kwargs dashboard_data['title'] = attrs.get("title") dashboard_data['description'] = attrs.get("description") dashboard_data['image'] = attrs.get("image") dashboard_data['image'] = attrs.get("image") dashboards.append(dashboard_data) # get all of the configs from the database search = Search("config/widget_config") search.add_filter("widget_type", "dashboard") db_configs = search.get_sobjects() for db_config in db_configs: dashboard_data = {} view = db_config.get_value("view") kwargs = {'view': view} parts = view.split(".") title = Common.get_display_title(parts[-1]) xml = db_config.get_value("config") dashboard_data['class_name'] = "tactic.ui.panel.CustomLayoutWdg" dashboard_data['kwargs'] = kwargs dashboard_data['title'] = title dashboard_data['description'] = title dashboard_data['image'] = None dashboard_data['xml'] = xml dashboard_data['widget_type'] = db_config.get_value("widget_type") dashboards.append(dashboard_data) # create a bunch of panels table = Table() top.add(table) table.add_color("color", "color") table.add_style("margin-bottom: 20px") table.center() for i, dashboard in enumerate(dashboards): if i == 0 or i % 4 == 0: tr = table.add_row() td = table.add_cell() td.add_style("vertical-align: top") td.add_style("padding: 3px") title = dashboard description = dashboard.get("title") # Each node will contain a list of "items" and will be stored as a table in the database.''' class_name = dashboard.get("class_name") kwargs = dashboard.get("kwargs") title = dashboard.get("title") description = dashboard.get("description") xml = dashboard.get("xml") or "" image = dashboard.get("image") icon = dashboard.get("icon") if image: div = DivWdg() if isinstance(image, basestring): image = image.upper() image = eval("IconWdg('', IconWdg.%s)" % image) div.add_style("margin-left: 15px") div.add_style("margin-top: 5px") else: image = image div.add(image) image = div elif icon: icon = icon.upper() image = eval("IconWdg('', IconWdg.%s)" % icon) else: div = DivWdg() #image = IconWdg("Bar Chart", IconWdg.WARNING) image = IconWdg("Bar Chart", IconWdg.DASHBOARD_02) div.add_style("margin-left: 15px") div.add_style("margin-top: 5px") div.add(image) image = div behavior = { 'type': 'click_up', 'title': title, 'class_name': class_name, 'kwargs': kwargs, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_reports_top"); spt.tab.set_main_body_tab(); //spt.tab.set_tab_top(top); var kwargs = {}; spt.tab.add_new(bvr.title, bvr.title, bvr.class_name, bvr.kwargs); ''' } schema_wdg = my.get_section_wdg(title, description, image, behavior) schema_wdg.add_behavior({ 'type': 'load', 'title': title, 'class_name': class_name, 'xml': xml, 'kwargs': kwargs, 'cbjs_action': ''' var report_top = bvr.src_el; report_top.kwargs = bvr.kwargs; report_top.class_name = bvr.class_name; report_top.element_name = bvr.title; report_top.xml = bvr.xml; ''' }) td.add(schema_wdg) #from tactic.ui.container import TabWdg #tab = TabWdg(show_add=False) #top.add(tab) return top
def get_display(self): if self.is_popup: icon_chooser_popup_id = "IconChooserPopup" icon_chooser_popup = PopupWdg(id=icon_chooser_popup_id, allow_page_activity=False, width="760px") icon_chooser_popup.add("Icon Chooser", "title") orig_icon_list = IconWdg.icons.keys() icon_list = ['-- No Icon --'] do_not_list = [ 'MAYA', 'HOUDINI', 'PROGRESS', 'CLIP_PLAY', 'XSI', 'CLIP_PAUSE', 'CHECK_OUT_LG', 'CHECK_OUT', 'PUBLISH_LG' ] for k in orig_icon_list: if k in do_not_list: continue icon_list.append(k) icon_list.sort() icon_list_len = float(len(icon_list)) num_cols = 5 num_rows = int(math.ceil(icon_list_len / float(num_cols))) chooser_wrapper_div = DivWdg() chooser_wrapper_div.add_class("SPT_ICON_CHOOSER_WRAPPER_DIV") chooser_bkg_rc = RoundedCornerDivWdg(hex_color_code="949494", corner_size="10") chooser_bkg_rc.set_dimensions(width_str='740px', content_height_str='520px') table = Table() for r in range(num_rows): table.add_row() for c in range(num_cols): td = table.add_cell() td.add_styles( "color: black; overflow: hidden; width: 140px; max-width: 140px; height: 20px;" ) td.add_styles( "border: 1px solid transparent; cursor: pointer;") td.add_behavior({ 'type': 'hover', 'mod_styles': 'background-color: #555555;' }) if c > 0: td.add_styles("border-left-color: black;") idx = int(c * num_rows + r) if idx < icon_list_len: icon_name = icon_list[idx] icon_path = '' if icon_name != '-- No Icon --': icon_path = IconWdg.get_icon_path(icon_name) icon = IconWdg(icon_name, icon_path) td.add(icon) text_span = SpanWdg() text_span.add_looks("fnt_code") text_span.add_styles("font-size: 10px") if len(icon_name) > 16: text_span.add("%s..." % icon_name[:15]) else: text_span.add(icon_name) td.add(text_span) if icon_name == '-- No Icon --': icon_name = '' td.add_class("SPT_ICON_SELECT_%s" % icon_name) if self.is_popup: cbjs_action = ''' var cwd = bvr.src_el.getParent(".SPT_ICON_CHOOSER_WRAPPER_DIV"); cwd.setProperty("spt_icon_selected", "%s"); cwd.setProperty("spt_icon_path", "%s"); spt.popup.close( spt.popup.get_popup( bvr.src_el ) ); spt.named_events.fire_event("%s",bvr); ''' % (icon_name, icon_path, "ICON_CHOOSER_SELECTION_MADE") else: cbjs_action = ''' var cwd = bvr.src_el.getParent(".SPT_ICON_CHOOSER_WRAPPER_DIV"); cwd.setProperty("spt_icon_selected", "%s"); cwd.setProperty("spt_icon_path", "%s"); spt.hide( cwd ); spt.named_events.fire_event("%s",bvr); ''' % (icon_name, icon_path, "ICON_CHOOSER_SELECTION_MADE") pass td.add_behavior({ 'type': 'click_up', 'cbjs_action': cbjs_action }) chooser_bkg_rc.add(table) chooser_wrapper_div.add(chooser_bkg_rc) if self.is_popup: icon_chooser_popup.add(chooser_wrapper_div, "content") return icon_chooser_popup return div
def get_link_wdg(self, element_name, config, options, info): attributes = config.get_element_attributes(element_name) if attributes.get("is_visible") == "false": return if options.get("popup") in [True, 'true']: popup = True else: popup = False #display_options = config.get_display_options(element_name) #class_name = display_options.get("class_name") #print element_name #print display_options #print class_name #print "---" li = HtmlElement.li() li.add_class("spt_side_bar_link") level = info.get("level") if level == 1: li.add_class("menu_header") li.add_class("main_link unselectable") else: li.add_class("sub_li") title = self._get_title(config, element_name) show_icons = self.kwargs.get("show_icons") if show_icons in [True, 'true']: icon = attributes.get("icon") if not icon: icon = "view" icon_path = IconWdg.get_icon_path(icon.upper()) li.add(HtmlElement.img(icon_path)) li.add(" ") link_mode = self.kwargs.get("link_mode") if not link_mode: use_href = self.kwargs.get("use_href") if use_href in ['true', True]: link_mode = 'href' link_mode = 'tab' target = self.kwargs.get("target") if not target: target = ".spt_content" else: if target[0] in ["."]: target = target[1:] #link = "/link/%s" % (element_name) link = "/tab/%s" % (element_name) li.add_attr("spt_link", link) if link_mode == 'href': project_code = Project.get_project_code() #li.add("<a href='/tactic/%s/#/tab/%s'>%s</a>" % (project_code, element_name, title) ) li.add("<a>%s</a>" % title) li.add_behavior( { 'type': 'click_up', 'bvr_repeat_interval': 3, 'title': title, 'link': link, 'target': target, 'cbjs_action': ''' var target_class = bvr.target; if (target_class.indexOf("#") != -1) { var target = $(document.body).getElement(target_class); } else if (target_class.indexOf(".") != -1) { var parts = target_class.split("."); var top = bvr.src_el.getParent("."+parts[0]); var target = top.getElement("."+parts[1]); } else { var target = $(document.body).getElement("."+target_class); } //var content = $(document).getElement(bvr.target); var content = target; spt.app_busy.show("Loading link "+bvr.title); spt.panel.load_link(content, bvr.link); spt.app_busy.hide(); ''' } ) elif link_mode == 'tab': # find the tab below the target li.add("<a>%s</a>" % title) li.add_behavior( { 'type': 'click', 'bvr_repeat_interval': 3, 'title': title, 'link': link, 'element_name': element_name, 'popup': popup, 'target': target, 'cbjs_action': ''' var target_class = bvr.target; if (target_class.indexOf("#") != -1) { var target = $(document.body).getElement(target_class); } else if (target_class.indexOf(".") != -1) { var parts = target_class.split("."); var top = bvr.src_el.getParent("."+parts[0]); var target = top.getElement("."+parts[1]); } else { var target = $(document.body).getElement("."+target_class); } //var content = $(document).getElement(bvr.target); var content = target; var tab_top = null;; // check if there even is a tab if (spt.tab) { tab_top = spt.tab.set_tab_top(content); } if (tab_top) { var link = bvr.src_el.getAttribute("spt_link"); var class_name = 'tactic.ui.panel.HashPanelWdg'; var kwargs = { hash: link } // Note: hash is different from link hash = "/link/" + bvr.element_name; if (bvr.popup) { spt.panel.load_popup(bvr.title, class_name, kwargs) } else { spt.tab.add_new(bvr.element_name,bvr.title,class_name,kwargs, null, hash); } } else { spt.panel.load_link(content, bvr.link); } ''' } ) elif link_mode == 'custom': li.add("<a>%s</a>" % title) li.add_attr('spt_title', title) li.add_attr('spt_element_name', element_name) else: li.add(title) li.add_attr("spt_title", title) li.add_attr("spt_element_name", element_name) li.add_attr("spt_icon", attributes.get("icon")) li.add_attr("spt_view", config.get_view() ) li.add_attr("spt_path", options['path']) li.add_attr("spt_view", config.get_view() ) li.add_class("spt_side_bar_element") self.add_link_behavior(li, element_name, config, options) return li
def get_display(my): top = DivWdg() top.add_class("spt_top") dialog = DialogWdg() dialog_id = dialog.get_id() # create the button button = DivWdg() button.add_style("padding: 5px") button.add_style("width: 30px") button.add_style("text-align: center") button.add_style("float: left") button.add_gradient("background", "background") button.add_border() top.add(button) icon = IconWdg("Press Me", IconWdg.ZOOM) icon.add_style("float: left") button.add(icon) icon = IconWdg("Press Me", IconWdg.INFO_OPEN_SMALL) icon.add_style("margin-left: -9px") button.add(icon) button.add_behavior( { 'type': 'click_up', 'dialog_id': dialog_id, 'cbjs_action': ''' var pos = bvr.src_el.getPosition(); var el = $(bvr.dialog_id); el.setStyle("left", pos.x+1); el.setStyle("top", pos.y+32); el.setStyle("display", ""); ''' } ) # defined the dialog top.add(dialog) dialog.add_title("Search Limit") table = Table() table.add_color("color", "color2") dialog.add(table) table.add_row() td = table.add_cell() td.add("Search Limit: ") td = table.add_cell() select = SelectWdg("search_limit") select.set_option("values", "5|10|20|50|100|200|Custom") td.add(select) save_button = ProdIconButtonWdg("Save") td.add(save_button) cancel_script = dialog.get_cancel_script(); save_button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var dialog_top = bvr.src_el.getParent(".spt_dialog_top"); var values = spt.api.get_input_values(dialog_top); var top = spt.get_parent(bvr.src_el, ".spt_top"); var input = top.getElement(".spt_search_limit"); input.value = values.search_limit; %s ''' % cancel_script } ) text = TextWdg("search_limit") text.add_class("spt_search_limit") top.add(text) return top
class DbResourceWdg(BaseRefreshWdg): def get_display(my): top = my.top top.add_style("padding: 20px") wizard = WizardWdg(title="Database Resource Manager") top.add(wizard) wizard.add(my.get_vendor_wdg(), "Vendor" ) wizard.add(my.get_connect_wdg(), "Connection" ) wizard.add(my.get_tables_wdg(), "Tables" ) return top def get_vendor_wdg(my): div = DivWdg() div.set_name("Vendor") vendors = [ "SQLite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] # unfortunately, Sqlite is capitalized incorectly in the code vendor_codes = [ "Sqlite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] vendor_icons = [ "Sqlite", "PostgreSQL", "MySQL", "Oracle", "SQLServer", "MongoDb" ] # get 3rd party vendors for vendor in vendors: vendor_div = DivWdg() div.add(vendor_div) vendor_div.add_style("margin: 10px") radio = RadioWdg("vendor") div.add(radio) radio.set_option("value", vendor) div.add(vendor) return div def get_connect_wdg(my): div = DivWdg() div.set_name("Connection") table = Table() div.add(table) from tactic.ui.panel import EditWdg edit = EditWdg(search_type="sthpw/db_resource", view="edit") table.add_row() table.add_cell(edit) return div def get_tables_wdg(my): div = DivWdg() div.set_name("Tables") div.add("In order to fully register a database, you must bind it to a TACTIC project") div.add("<br/>") project_code = "mongodb" database = "test_database" db_resource = DbResource( server='localhost', vendor='MongoDb', database=database ) try: connect = DbContainer.get(db_resource) except Exception, e: div.add("Could not connect") div.add_style("padding: 30px") div.add("<br/>"*2) div.add(str(e)) return div # Bind project to this resource database_text = TextWdg("database") div.add("Database: ") div.add(database_text) div.add("<br/>"*2) project_text = TextWdg("project") div.add("Project Code: ") div.add(project_text) div.add("<br/>") div.add("<hr/>") # connect and introspect the tables in this database tables = connect.get_tables() table = Table() div.add(table) table.set_max_width() for table_name in tables: table.add_row() search_type = "table/%s?project=%s" % (table_name, project_code) td = table.add_cell() icon = IconWdg("View Table", IconWdg.FOLDER_GO) td.add(icon) icon.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'cbjs_action': ''' var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { search_type: bvr.search_type } spt.panel.load_popup("table", class_name, kwargs); ''' } ) td = table.add_cell() td.add(table_name) td = table.add_cell() search = Search(search_type) count = search.get_count() td.add(" %s item/s" % count) columns = search.get_columns() td = table.add_cell() td.add(columns) # search_type td = table.add_cell() text = TextWdg("search_type") td.add(text) new_search_type = "%s/%s" % (project_code, table_name) text.set_value(new_search_type) register_div = DivWdg() div.add(register_div) register_div.add_style("padding: 20px") button = ActionButtonWdg(title="Register") register_div.add(button) return div
def get_display(my): web = WebContainer.get_web() skin = web.get_skin() # default to 'small' size ... h = 16 fnt_sz = 11 if my.size == 'medium': h = 18 fnt_sz = 13 elif my.size == 'large': h = 20 fnt_sz = 15 w = (h / 2) - 1 my.top_el.add_styles( "height: %spx;" % (h) ) t_styles = "color: #c2c2c2; border: 0px; border-collapse: collapse; padding: 0px" bgi_open = "background-image: url(/context/themes/%(skin)s/images/text_btn/%(skin)s_btn_h%(h)s_" % \ {'skin': skin, 'h': h} bgi_close = ".png)" # pos_list = [ 'left', 'middle', 'right' ] spacer = HtmlElement.img( IconWdg.get_icon_path("TRANSPARENT") ) spacer.add_styles( "width: 2px;" ) div_left = DivWdg() div_left.add_styles( "%(bgi_open)s%(pos)s%(bgi_close)s;" % {'bgi_open': bgi_open, 'pos': 'left', 'bgi_close': bgi_close} ) div_left.add_styles("float: left; height: %spx; width: %spx;" % (h, w) ) div_mid = DivWdg() div_mid.add_styles( "%(bgi_open)s%(pos)s%(bgi_close)s;" % {'bgi_open': bgi_open, 'pos': 'middle', 'bgi_close': bgi_close} ) div_mid.add_styles("float: left; height: %spx; width: auto;" % (h) ) div_mid.add_styles("color: #c2c2c2;") div_mid.add_styles("vertical-align: middle") # move the text lower by 1 px div_mid.add_style('padding-top: 1px') div_mid.add_styles( "font-family: Arial, Helvetica, sans-serif; font-size: %spx;" % fnt_sz ) div_mid.add( spacer ) span = SpanWdg(my.label) # this is better fixed. Bold fonts don't look good span.add_style('font-weight: 100') span.add_style('vertical-align: middle') div_mid.add( span ) div_mid.add( spacer ) if my.show_option: bgi_close = '_options.png)' w += 10 my.div_right.add_styles( "%(bgi_open)s%(pos)s%(bgi_close)s;" % {'bgi_open': bgi_open, 'pos': 'right', 'bgi_close': bgi_close} ) my.div_right.add_styles("float: left; height: %spx; width: %spx;" % (h, w) ) my.top_el.add( div_left ) my.top_el.add( div_mid ) my.top_el.add( my.div_right ) my.top_el.add_styles("overflow: hidden;") if my.horiz_align == 'center': my.top_el.add_styles("margin: auto;") # margin: auto -- used for centering in non-IE brwsrs elif my.horiz_align == 'left': my.top_el.add_styles("margin-left: %s;" % my.horiz_offset) if my.vert_offset: my.top_el.add_styles("margin-top: %s;" % my.vert_offset) if my.width: if type(my.width) == str: my.width.replace("px","") my.top_el.add_styles("width: %spx" % my.width) else: my.top_el.add_behavior({'type': 'load', 'cbjs_action': 'spt.widget.btn_wdg.set_btn_width( bvr.src_el );' }) return my.top_el
class SimpleSearchWdg(BaseRefreshWdg): SEARCH_COLS = ['keyword','keywords','key','name','description','code'] def get_args_keys(my): return { 'search_type': 'search type for this search widget', 'run_search_bvr': 'run search bvr when clicking on Search', 'prefix': 'the prefix used to find the input data' } def init(my): my.prefix = my.kwargs.get('prefix') if not my.prefix: my.prefix = 'simple_search' my.content = None my.top = DivWdg() my.prefix = 'simple' my.search_type = my.kwargs.get("search_type") # this is needed for get_config() to search properly my.base_search_type = Project.extract_base_search_type(my.search_type) my.column_choice = None def handle_search(my): my.search = Search(my.search_type) my.alter_search(my.search) return my.search def get_search(my): return my.search def alter_search(my, search): ''' from tactic.ui.filter import BaseFilterElementWdg config = my.get_config() element_names = config.get_element_names() for element_name in element_names: widget = config.get_display_widget(element_name) if isinstance(widget, BaseFilterElementWdg): widget.alter_search(search) ''' from tactic.ui.panel import CustomLayoutWdg # define a standard search action from tactic.ui.filter import FilterData filter_data = FilterData.get() config = my.get_config() data_list = filter_data.get_values_by_prefix(my.prefix) search_type = search.get_search_type() my.column_choice = my.get_search_col(search_type) element_data_dict = {} for data in data_list: handler = data.get("handler") element_name = data.get("element_name") if not element_name: continue element_data_dict[element_name] = data element_names = config.get_element_names() if not element_names: element_names = ['keywords'] for element_name in element_names: widget = config.get_display_widget(element_name) if not widget: widget = KeywordFilterElementWdg(column=my.column_choice) widget.set_name(element_name) data = element_data_dict.get(element_name) if not data: data = {} widget.set_values(data) if isinstance(widget, KeywordFilterElementWdg): if not data.get("keywords") and my.kwargs.get("keywords"): widget.set_value("value", my.kwargs.get("keywords")) widget.alter_search(search) return def set_content(my, content): my.content = content def get_top(my): top = my.top top.add_color("background", "background", -5) top.add_style("margin-bottom: -2px") top.add_class("spt_filter_top") table = Table() top.add(table) table.add_style("margin-left: auto") table.add_style("margin-right: auto") table.add_style("width: 100%") tr = table.add_row() if not my.content: my.content = DivWdg() my.content.add("No Content") td = table.add_cell() td.add(my.content) my.content.add_style("margin: -2 -1 -2 -2") show_search = my.kwargs.get("show_search") if show_search in [False, 'false']: show_search = False else: show_search = True if show_search: search_wdg = my.get_search_wdg() table.add_row() search_wdg.add_style("float: right") search_wdg.add_style("padding-top: 6px") search_wdg.add_style("padding-left: 10px") search_wdg.add_style("height: 33px") td = table.add_cell() td.add(search_wdg) td.add_style("padding: 10px 20px") #td.add_border() #td.add_color("background", "background", -10) hidden = HiddenWdg("prefix", my.prefix) top.add(hidden) # this cannot be spt_search as it will confuse spt.dg_table.search_cbk() top.add_class("spt_simple_search") return top def get_config(my): config_xml = ''' <config> <custom_filter> <element name='asset_library'> <display class='SelectWdg'> <query>prod/asset_library|code|code</query> <empty>true</empty> </display> </element> <element name='pipeline_code'> <display class='SelectWdg'> <query>sthpw/pipeline|code|code</query> <empty>true</empty> </display> </element> </custom_filter> </config> ''' my.view = my.kwargs.get("search_view") if not my.view: my.view = 'custom_filter' #view = "custom_filter" project_code = Project.extract_project_code(my.search_type) search = Search("config/widget_config", project_code=project_code ) search.add_filter("view", my.view) search.add_filter("search_type", my.base_search_type) config_sobj = search.get_sobject() if config_sobj: config_xml = config_sobj.get_value("config") else: config_xml = ''' <config> <custom_filter> </custom_filter> </config> ''' # use the one defined in the default config file file_configs = WidgetConfigView.get_configs_from_file(my.base_search_type, my.view) if file_configs: config = file_configs[0] xml_node = config.get_view_node() if xml_node is not None: xml = Xml(config.get_xml().to_string()) config_xml = '<config>%s</config>' %xml.to_string(node=xml_node) from pyasm.widget import WidgetConfig config = WidgetConfig.get(view=my.view, xml=config_xml) return config def get_display(my): element_data_dict = {} config = my.get_config() element_names = config.get_element_names() content_wdg = DivWdg() if not element_names: element_names = ['keywords'] my.set_content(content_wdg) # this is somewhat duplicated logic from alter_search, but since this is called # in ViewPanelWdg, it's a diff instance and needs to retrieve again filter_data = FilterData.get() data_list = filter_data.get_values_by_prefix(my.prefix) for data in data_list: handler = data.get("handler") element_name = data.get("element_name") if not element_name: continue element_data_dict[element_name] = data elements_wdg = DivWdg() content_wdg.add(elements_wdg) elements_wdg.add_color("color", "color") elements_wdg.add_style("padding-top: 10px") elements_wdg.add_style("padding-bottom: 15px") #elements_wdg.add_color("background", "background3", 0) elements_wdg.add_color("background", "background", -3) elements_wdg.add_border() if len(element_names) == 1: elements_wdg.add_style("border-width: 0px 0px 0px 0px" ) elements_wdg.add_style("padding-right: 50px" ) else: elements_wdg.add_style("border-width: 0px 1px 0px 0px" ) table = Table() table.add_color("color", "color") elements_wdg.add(table) table.add_class("spt_simple_search_table") num_rows = int(len(element_names)/2)+1 tot_rows = int(len(element_names)/2)+1 project_code = Project.get_project_code() # my.search_type could be the same as my.base_search_type full_search_type = SearchType.build_search_type(my.search_type, project_code) visible_rows = my.kwargs.get("visible_rows") if visible_rows: visible_rows = int(visible_rows) num_rows = visible_rows else: visible_rows = 0 titles = config.get_element_titles() row_count = 0 for i, element_name in enumerate(element_names): attrs = config.get_element_attributes(element_name) if i % 2 == 0: if visible_rows and row_count == visible_rows: tr, td = table.add_row_cell("+ more ...") td.add_class("hand") td.add_class("SPT_DTS") td.add_class("spt_toggle") td.add_style("padding-left: 10px") td.add_behavior( { 'type': 'click_up', 'visible_rows': visible_rows, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_simple_search_table"); var expand = true; var rows = top.getElements(".spt_simple_search_row"); for (var i = 0; i < rows.length; i++) { var row = rows[i]; if (row.getStyle("display") == "none") { row.setStyle("display", ""); } else { row.setStyle("display", "none"); expand = false; } } var spacer = top.getElements(".spt_spacer"); var cell = top.getElement(".spt_toggle"); if (expand) { spacer.setStyle("height", (rows.length+bvr.visible_rows)*20); cell.innerHTML = "- less ..."; } else { spacer.setStyle("height", bvr.visible_rows*20); cell.innerHTML = "+ more ..."; } ''' } ) tr = table.add_row() if visible_rows and row_count >= visible_rows: tr.add_class("spt_simple_search_row") tr.add_style("display: none") tr.add_style("height: 0px") row_count += 1 icon_td = table.add_cell() title_td = table.add_cell() element_td =table.add_cell() # show the title title_td.add_style("text-align: right") title_td.add_style("padding-right: 5px") title_td.add_style("min-width: 100px") element_wdg = DivWdg() if attrs.get('view') == 'false': element_wdg.add_style('display: none') element_td.add(element_wdg) #title_td.add_style("border: solid 1px red") #element_td.add_style("border: solid 1px blue") #element_wdg.add_style("border: solid 1px yellow") if i == 0 and len(element_names) > 1: spacer = DivWdg() spacer.add_class("spt_spacer") spacer.add_style("border-style: solid") spacer.add_style("border-width: 0 1 0 0") #spacer.add_style("height: %spx" % (num_rows*20)) spacer.add_style("height: %spx" % (num_rows*20)) spacer.add_style("width: 10px") spacer.add_style("border-color: %s" % spacer.get_color("border") ) spacer.add(" ") td = table.add_cell(spacer) td.add_attr("rowspan", tot_rows) #element_wdg.add_color("color", "color3") #element_wdg.add_color("background", "background3") #element_wdg.set_round_corners() #element_wdg.add_border() element_wdg.add_style("padding: 4px 10px 4px 5px") element_wdg.add_class("spt_table_search") element_wdg.add_style("margin: 1px") element_wdg.add_style("min-height: 20px") element_wdg.add_style("min-width: 250px") # this is done at get_top() #element_wdg.add_class("spt_search") element_wdg.add( HiddenWdg("prefix", my.prefix)) display_handler = config.get_display_handler(element_name) element_wdg.add( HiddenWdg("handler", display_handler)) element_wdg.add( HiddenWdg("element_name", element_name)) from pyasm.widget import ExceptionWdg try: widget = config.get_display_widget(element_name) if widget: widget.set_title(titles[i]) except Exception, e: element_wdg.add(ExceptionWdg(e)) continue if not widget: # the default for KeywordFilterElementWdg is mode=keyword if not my.column_choice: my.column_choice = my.get_search_col(my.search_type) widget = KeywordFilterElementWdg(column=my.column_choice) widget.set_name(element_name) from pyasm.widget import IconWdg icon_div = DivWdg() icon_td.add(icon_div) icon_div.add_style("width: 20px") icon_div.add_style("margin-top: 2px") icon_div.add_style("padding-left: 5px") icon_div.add_class("spt_filter_top") widget.set_show_title(False) #element_wdg.add("%s: " % title) data = element_data_dict.get(element_name) view_panel_keywords = my.kwargs.get("keywords") #user data takes precedence over view_panel_keywords if isinstance(widget, KeywordFilterElementWdg): if view_panel_keywords: widget.set_value("value", view_panel_keywords) if data: widget.set_values(data) if isinstance(widget, KeywordFilterElementWdg) and not full_search_type.startswith('sthpw/sobject_list'): widget.set_option('filter_search_type', full_search_type) try: if attrs.get('view') != 'false': title_td.add(widget.get_title_wdg()) element_wdg.add(widget.get_buffer_display()) except Exception, e: element_wdg.add(ExceptionWdg(e)) continue icon = IconWdg("Filter Set", "BS_ASTERISK") icon_div.add(icon) icon.add_class("spt_filter_set") icon.add_attr("spt_element_name", element_name) if not widget.is_set(): icon.add_style("display: none")
def get_display(my): web = WebContainer.get_web() top = my.top top.add_class("spt_ace_editor_top") script = my.kwargs.get("custom_script") if script: language = script.get_value("language") else: language = my.kwargs.get("language") if not language: language = 'javascript' code = my.kwargs.get("code") if not code: code = "" show_options = my.kwargs.get("show_options") if show_options in ['false', False]: show_options = False else: show_options = True options_div = DivWdg() top.add(options_div) if not show_options: options_div.add_style("display: none") options_div.add_color("background", "background3") options_div.add_border() options_div.add_style("text-align: center") options_div.add_style("padding: 2px") select = SelectWdg("language") select.add_style("width: 100px") select.add_style("display: inline") options_div.add(select) select.add_class("spt_language") select.set_option("values", "javascript|python|expression|xml") select.add_behavior( { 'type': 'change', 'editor_id': my.get_editor_id(), 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var value = bvr.src_el.value; spt.ace_editor.set_language(value); //register_change(bvr); ''' } ) select = SelectWdg("font_size") select.add_style("width: 100px") select.add_style("display: inline") options_div.add(select) select.set_option("labels", "8 pt|9 pt|10 pt|11 pt|12 pt|14 pt|16 pt") select.set_option("values", "8 pt|9pt|10pt|11pt|12pt|14pt|16pt") select.set_value("10pt") select.add_behavior( { 'type': 'click_up', 'editor_id': my.get_editor_id(), 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var editor = spt.ace_editor.editor; var editor_id = spt.ace_editor.editor_id; var value = bvr.src_el.value; $(editor_id).setStyle("font-size", value) //editor.resize(); ''' } ) select = SelectWdg("keybinding") select.add_style("width: 100px") #options_div.add(select) select.set_option("labels", "Ace|Vim|Emacs") select.set_option("values", "ace|vim|emacs") select.set_value("10pt") select.add_behavior( { 'type': 'change', 'editor_id': my.get_editor_id(), 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var editor = spt.ace_editor.editor; var editor_id = spt.ace_editor.editor_id; var vim = require("ace/keyboard/keybinding/vim").Vim; editor.setKeyboardHandler(vim) ''' } ) editor_div = DivWdg() top.add(editor_div) if code: load_div = DivWdg() top.add(load_div) readonly = my.kwargs.get("readonly") if readonly in ['true', True]: readonly = True else: readonly = False load_div.add_behavior( { 'type': 'load', 'code': code, 'language': language, 'editor_id': my.get_editor_id(), 'readonly': readonly, 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var func = function() { var editor = spt.ace_editor.editor; var document = editor.getSession().getDocument(); if (bvr.code) { spt.ace_editor.set_value(bvr.code); } spt.ace_editor.set_language(bvr.language); editor.setReadOnly(bvr.readonly); var session = editor.getSession(); //session.setUseWrapMode(true); //session.setWrapLimitRange(120, 120); }; var editor = spt.ace_editor.editor; if (!editor) { setTimeout( func, 1000); } else { func(); } ''' } ) # theme select = SelectWdg("theme") select.add_style("width: 100px") select.add_style("display: inline") options_div.add(select) select.set_option("labels", "Eclipse|Twilight|TextMate|Vibrant Ink|Merbivore|Clouds") select.set_option("values", "eclipse|twilight|textmate|vibrant_ink|merbivore|clouds") select.set_value("twilight") select.add_behavior( { 'type': 'change', 'editor_id': my.get_editor_id(), 'cbjs_action': ''' spt.ace_editor.set_editor(bvr.editor_id); var editor = spt.ace_editor.editor; var editor_id = spt.ace_editor.editor_id; value = bvr.src_el.value; editor.setTheme("ace/theme/" + value); ''' } ) editor_div = DivWdg() top.add(editor_div) my.text_area.add_style("margin-top: -1px") my.text_area.add_style("margin-bottom: 0px") my.text_area.add_color("background", "background") my.text_area.add_style("font-family: courier new") my.text_area.add_border() editor_div.add(my.text_area) my.text_area.add_style("position: relative") #text_area.add_style("margin: 20px") size = web.get_form_value("size") if size: width, height = size.split(",") else: width = my.kwargs.get("width") if not width: width = "650px" height = my.kwargs.get("height") if not height: height = "450px" my.text_area.add_style("width: %s" % width) my.text_area.add_style("height: %s" % height) bottom_div = DivWdg() top.add(bottom_div) bottom_div.add_color("background", "background3") bottom_div.add_border() bottom_div.add_style("text-align: center") bottom_div.add_style("padding: 2px") bottom_div.add_style("height: 20px") bottom_title = "Script Editor" bottom_div.add(bottom_title) icon = IconWdg("Resize Editor", IconWdg.RESIZE_CORNER) bottom_div.add(icon) icon.add_style("float: right") icon.add_style("margin-right: -4px") icon.add_style("cursor: se-resize") icon.add_behavior( { 'type': 'drag', "cb_set_prefix": 'spt.ace_editor.drag_resize', } ) #hidden = HiddenWdg("size") hidden = TextWdg("size") bottom_div.add(hidden) hidden.add_style("width: 85px") hidden.add_style("text-align: center") hidden.add_style("float: right") hidden.add_class("spt_size") hidden.set_value("%s,%s" % (width, height)) theme = top.get_theme() if theme == 'dark': theme = 'twilight' else: theme = 'eclipse' print "theme: ", theme top.add_behavior( { 'type': 'load', 'unique_id': my.unique_id, 'theme': theme, 'cbjs_action': ''' if (typeof(ace) == 'undefined') { // fist time loading spt.ace_editor = {} spt.ace_editor.editor = null; spt.ace_editor.editor_id = bvr.unique_id; spt.ace_editor.theme = bvr.theme; spt.ace_editor.set_editor = function(editor_id) { spt.ace_editor.editor_id = editor_id; spt.ace_editor.editor = $(editor_id).editor; } spt.ace_editor.set_editor_top = function(top_el) { if (!top_el.hasClass("spt_ace_editor")) { top_el = top_el.getElement(".spt_ace_editor"); } var editor_id = top_el.getAttribute("id"); spt.ace_editor.set_editor(editor_id); } spt.ace_editor.get_editor = function() { return spt.ace_editor.editor; } spt.ace_editor.clear_selection = function() { var editor = spt.ace_editor.editor; editor.clearSelection(); } spt.ace_editor.get_selection = function() { var editor = spt.ace_editor.editor; //return editor.getSelection(); return editor.getCopyText(); } spt.ace_editor.get_value = function() { var editor = spt.ace_editor.editor; var document = editor.getSession().getDocument() var value = document.getValue(); return value; } spt.ace_editor.set_value = function(value) { var editor = spt.ace_editor.editor; var document = editor.getSession().getDocument() document.setValue(value); editor.gotoLine(2); editor.resize(); editor.focus(); } spt.ace_editor.goto_line = function(number) { var editor = spt.ace_editor.editor; var document = editor.getSession().getDocument() editor.gotoLine(2); editor.resize(); editor.focus(); } spt.ace_editor.insert = function(value) { var editor = spt.ace_editor.editor; var position = editor.getCursorPosition(); var doc = editor.getSession().getDocument() doc.insertInLine(position, value); } spt.ace_editor.insert_lines = function(values) { var editor = spt.ace_editor.editor; var position = editor.getCursorPosition(); var doc = editor.getSession().getDocument() doc.insertLines(position.row, values); } spt.ace_editor.get_document = function() { var document = spt.ace_editor.editor.getSession().getDocument() return document; } spt.ace_editor.set_language = function(value) { if (!value) { value = 'javascript'; } var editor = spt.ace_editor.editor; var top = $(spt.ace_editor.editor_id).getParent(".spt_ace_editor_top"); var lang_el = top.getElement(".spt_language"); for ( var i = 0; i < lang_el.options.length; i++ ) { if ( lang_el.options[i].value == value ) { lang_el.options[i].selected = true; break; } } var session = editor.getSession(); var mode; if (value == 'python') { mode = require("ace/mode/python").Mode; } else if (value == 'xml') { mode = require("ace/mode/xml").Mode; } else if (value == 'expression') { mode = require("ace/mode/xml").Mode; } else { mode = require("ace/mode/javascript").Mode; } session.setMode( new mode() ); } spt.ace_editor.drag_start_x; spt.ace_editor.drag_start_y; spt.ace_editor.drag_size; spt.ace_editor.drag_editor_el; spt.ace_editor.drag_size_el; spt.ace_editor.drag_resize_setup = function(evt, bvr, mouse_411) { var editor = spt.ace_editor.editor; var editor_id = spt.ace_editor.editor_id; spt.ace_editor.drag_start_x = mouse_411.curr_x; spt.ace_editor.drag_start_y = mouse_411.curr_y; var editor_el = $(editor_id); spt.ace_editor.drag_editor_el = editor_el; spt.ace_editor.drag_size = editor_el.getSize(); var top = bvr.src_el.getParent(".spt_ace_editor_top"); spt.ace_editor.drag_size_el = top.getElement(".spt_size"); } spt.ace_editor.drag_resize_motion = function(evt, bvr, mouse_411) { var diff_x = parseFloat(mouse_411.curr_x - spt.ace_editor.drag_start_x); var diff_y = parseFloat(mouse_411.curr_y - spt.ace_editor.drag_start_y); var size = spt.ace_editor.drag_size; var editor_el = spt.ace_editor.drag_editor_el; var width = size.x + diff_x if (width < 300) { width = 300; } var height = size.y + diff_y if (height < 200) { height = 200; } editor_el.setStyle("width", width); editor_el.setStyle("height", height); spt.ace_editor.drag_size_el.value = width + "," + height; var editor = spt.ace_editor.editor; editor.resize(); } var js_files = [ "ace/ace-0.2.0/src/ace.js", //"ace/ace-0.2.0/src/ace-uncompressed.js", ]; var ace_setup = function() { var editor = ace.edit(bvr.unique_id); spt.ace_editor.editor = editor; // put the editor into the dom spt.ace_editor.editor_id = bvr.unique_id; $(bvr.unique_id).editor = editor; editor.setTheme("ace/theme/" + spt.ace_editor.theme); var JavaScriptMode = require("ace/mode/javascript").Mode; editor.getSession().setMode(new JavaScriptMode()) } spt.dom.load_js(js_files, function() { ace; require; define; var core_js_files = [ "ace/ace-0.2.0/src/mode-javascript.js", "ace/ace-0.2.0/src/mode-xml.js", "ace/ace-0.2.0/src/mode-python.js", "ace/ace-0.2.0/src/theme-twilight.js", "ace/ace-0.2.0/src/theme-textmate.js", "ace/ace-0.2.0/src/theme-vibrant_ink.js", "ace/ace-0.2.0/src/theme-merbivore.js", "ace/ace-0.2.0/src/theme-clouds.js", "ace/ace-0.2.0/src/theme-eclipse.js" ]; //var supp_js_files = []; spt.dom.load_js(core_js_files, ace_setup); //spt.dom.load_js(supp_js_files); }); } else { var editor = ace.edit(bvr.unique_id); editor.setTheme("ace/theme/" + bvr.theme); var JavaScriptMode = require("ace/mode/javascript").Mode; editor.getSession().setMode(new JavaScriptMode()) spt.ace_editor.editor_id = bvr.unique_id; spt.ace_editor.editor = editor; $(bvr.unique_id).editor = editor; } ''' } ) return top
def get_display(my): web = WebContainer.get_web() show_multi_project = web.get_form_value('show_multi_project') project = Project.get() search_type_objs = project.get_search_types(include_multi_project=show_multi_project) top = my.top top.add_class("spt_panel_stype_list_top") #top.add_style("min-width: 400px") #top.add_style("max-width: 1000px") #top.add_style("width: 100%") top.center() button = SingleButtonWdg(title="Advanced Setup", icon=IconWdg.ADVANCED) top.add(button) button.add_style("float: right") button.add_style("margin-top: -8px") button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.app.ProjectStartWdg'; spt.tab.set_main_body_tab() spt.tab.add_new("project_setup", "Project Setup", class_name) ''' } ) button = SingleButtonWdg(title="Add", tip="Add New Searchable Type (sType)", icon=IconWdg.ADD) top.add(button) button.add_style("float: left") button.add_style("margin-top: -8px") button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var class_name = 'tactic.ui.app.SearchTypeCreatorWdg'; var kwargs = { }; var popup = spt.panel.load_popup("Create New Searchable Type", class_name, kwargs); var top = bvr.src_el.getParent(".spt_panel_stype_list_top"); popup.on_register_cbk = function() { spt.panel.refresh(top); } ''' } ) cb = CheckboxWdg('show_multi_project', label=' show multi-project') if show_multi_project: cb.set_checked() cb.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var panel = bvr.src_el.getParent('.spt_panel_stype_list_top') spt.panel.refresh(panel, {show_multi_project: bvr.src_el.checked}); ''' }) span = SpanWdg(css='small') top.add(span) top.add(cb) top.add("<br clear='all'/>") #search_type_objs = [] if not search_type_objs: arrow_div = DivWdg() top.add(arrow_div) icon = IconWdg("Click to Add", IconWdg.ARROW_UP_LEFT_32) icon.add_style("margin-top: -20") icon.add_style("margin-left: -15") icon.add_style("position: absolute") arrow_div.add(icon) arrow_div.add(" "*5) arrow_div.add("<b>Click to Add</b>") arrow_div.add_style("position: relative") arrow_div.add_style("margin-top: 5px") arrow_div.add_style("margin-left: 20px") arrow_div.add_style("float: left") arrow_div.add_style("padding: 25px") arrow_div.set_box_shadow("0px 5px 20px") arrow_div.set_round_corners(30) arrow_div.add_color("background", "background") div = DivWdg() top.add(div) div.add_border() div.add_style("min-height: 180px") div.add_style("width: 600px") div.add_style("margin: 30px auto") div.add_style("padding: 20px") div.add_color("background", "background3") icon = IconWdg( "WARNING", IconWdg.WARNING ) div.add(icon) div.add("<b>No Searchable Types have been created</b>") div.add("<br/><br/>") div.add("Searchables Types contain lists of items that are managed in this project. Each item will automatically have the ability to have files checked into it, track tasks and status and record work hours.") div.add("<br/>"*2) div.add("For more information, read the help docs: ") from tactic.ui.app import HelpButtonWdg help = HelpButtonWdg(alias="main") div.add(help) div.add("<br/>") div.add("Click on the 'Add' button above to start adding new types.") return top div = DivWdg() top.add(div) #div.add_style("max-height: 300px") #div.add_style("overflow-y: auto") table = Table() div.add(table) table.add_style("margin-top: 10px") table.set_max_width() # group mouse over table.add_relay_behavior( { 'type': "mouseover", 'bvr_match_class': 'spt_row', 'cbjs_action': "spt.mouse.table_layout_hover_over({}, {src_el: bvr.src_el, add_color_modifier: -2})" } ) table.add_relay_behavior( { 'type': "mouseout", 'bvr_match_class': 'spt_row', 'cbjs_action': "spt.mouse.table_layout_hover_out({}, {src_el: bvr.src_el})" } ) tr = table.add_row() tr.add_color("color", "color") tr.add_gradient("background", "background", -10) th = table.add_header("") th.add_style("text-align: left") th = table.add_header("Title") th.add_style("text-align: left") th = table.add_header("# Items") th.add_style("text-align: left") th = table.add_header("View") th.add_style("text-align: left") th = table.add_header("Add") th.add_style("text-align: left") th = table.add_header("Import") th.add_style("text-align: left") th = table.add_header("Custom Columns") th.add_style("text-align: left") th = table.add_header("Workflow") th.add_style("text-align: left") th = table.add_header("Notifications") th.add_style("text-align: left") th = table.add_header("Triggers") th.add_style("text-align: left") th = table.add_header("Edit") th.add_style("text-align: left") #th = table.add_header("Security") #th.add_style("text-align: left") for i, search_type_obj in enumerate(search_type_objs): tr = table.add_row() tr.add_class("spt_row") if not i or not i%2: tr.add_color("background", "background3") else: tr.add_color("background", "background", -2 ) thumb = ThumbWdg() thumb.set_sobject(search_type_obj) thumb.set_icon_size(30) td = table.add_cell(thumb) search_type = search_type_obj.get_value("search_type") title = search_type_obj.get_title() table.add_cell(title) try: search = Search(search_type) count = search.get_count() if count: table.add_cell("%s item/s" % count) else: table.add_cell(" ") except: td = table.add_cell("< No table >") td.add_style("font-style: italic") td.add_style("color: #F00") continue #search = Search(search_type) #search.add_interval_filter("timestamp", "today") #created_today = search.get_count() #table.add_cell(created_today) td = table.add_cell() button = IconButtonWdg(title="View", icon=IconWdg.ZOOM) td.add(button) button.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'title': title, 'cbjs_action': ''' var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { search_type: bvr.search_type, view: 'table', 'simple_search_view': 'simple_search' }; // use tab var top = bvr.src_el.getParent(".spt_dashboard_top"); spt.tab.set_tab_top(top); spt.tab.add_new(bvr.title, bvr.title, class_name, kwargs); //spt.panel.load_popup(bvr.title, class_name, kwargs); ''' } ) button.add_style("float: left") arrow_button = IconButtonWdg(tip="More Views", icon=IconWdg.ARROWHEAD_DARK_DOWN) arrow_button.add_style("margin-left: 20px") td.add(arrow_button) cbk = ''' var activator = spt.smenu.get_activator(bvr); var class_name = bvr.class_name; var layout = bvr.layout; var kwargs = { search_type: bvr.search_type, layout: layout, view: bvr.view, simple_search_view: 'simple_search', element_names: bvr.element_names, }; // use tab var top = activator.getParent(".spt_dashboard_top"); spt.tab.set_tab_top(top); spt.tab.add_new('%s', '%s', class_name, kwargs); ''' % (title, title) from tactic.ui.panel import SwitchLayoutMenu SwitchLayoutMenu(search_type=search_type, activator=arrow_button, cbk=cbk, is_refresh=False) td = table.add_cell() button = IconButtonWdg(title="Add", icon=IconWdg.ADD) td.add(button) button.add_behavior( { 'type': 'listen', 'search_type': search_type, 'event_name': 'startup_save:' + search_type_obj.get_title(), 'title': search_type_obj.get_title(), 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_dashboard_top"); spt.tab.set_tab_top(top); var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { search_type: bvr.search_type, view: 'table', 'simple_search_view': 'simple_search' }; spt.tab.add_new(bvr.title, bvr.title, class_name, kwargs); ''' } ) button.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'title': search_type_obj.get_title(), 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_dashboard_top"); spt.tab.set_tab_top(top); var class_name = 'tactic.ui.panel.EditWdg'; var kwargs = { search_type: bvr.search_type, view: "insert", save_event: "startup_save:" + bvr.title } spt.panel.load_popup("Add New Items ("+bvr.title+")", class_name, kwargs); var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { search_type: bvr.search_type, view: 'table', 'simple_search_view': 'simple_search' }; spt.tab.add_new(bvr.title, bvr.title, class_name, kwargs); ''' } ) """ td = table.add_cell() button = IconButtonWdg(title="Check-in", icon=IconWdg.PUBLISH) td.add(button) button.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'title': title, 'cbjs_action': ''' var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { search_type: bvr.search_type, view: 'checkin', element_names: ['preview','code','name','description','history','general_checkin','notes'] }; // use tab var top = bvr.src_el.getParent(".spt_dashboard_top"); spt.tab.set_tab_top(top); spt.tab.add_new(bvr.title, bvr.title, class_name, kwargs); //spt.panel.load_popup(bvr.title, class_name, kwargs); ''' } ) """ td = table.add_cell() button = IconButtonWdg(title="Import", icon=IconWdg.IMPORT) td.add(button) button.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'title': "Import Data", 'cbjs_action': ''' var class_name = 'tactic.ui.widget.CsvImportWdg'; var kwargs = { search_type: bvr.search_type, }; spt.panel.load_popup(bvr.title, class_name, kwargs); ''' } ) td = table.add_cell() button = IconButtonWdg(title="Custom Columns", icon=IconWdg.COLUMNS) td.add(button) button.add_behavior( { 'type': 'click_up', 'search_type': search_type, 'title': "Add Custom Columns", 'cbjs_action': ''' var class_name = 'tactic.ui.startup.ColumnEditWdg'; var kwargs = { search_type: bvr.search_type, }; spt.panel.load_popup(bvr.title, class_name, kwargs); ''' } ) td = table.add_cell() button = IconButtonWdg(title="Workflow", icon=IconWdg.PIPELINE) button.add_style("float: left") td.add(button) search = Search("sthpw/pipeline") search.add_filter("search_type", search_type) count = search.get_count() if count: check = IconWdg( "Has Items", IconWdg.CHECK, width=8 ) td.add(check) #check.add_style("margin-left: 0px") check.add_style("margin-top: 4px") button.add_behavior( { 'type': 'click_up', 'title': 'Workflow', 'search_type': search_type, 'cbjs_action': ''' var class_name = 'tactic.ui.startup.PipelineEditWdg'; var kwargs = { search_type: bvr.search_type }; spt.panel.load_popup(bvr.title, class_name, kwargs); ''' } ) td = table.add_cell() button = IconButtonWdg(title="Notifications", icon=IconWdg.MAIL) button.add_style("float: left") td.add(button) search = Search("sthpw/notification") search.add_filter("search_type", search_type) count = search.get_count() if count: check = IconWdg( "Has Items", IconWdg.CHECK, width=8 ) td.add(check) #check.add_style("margin-left: 0px") check.add_style("margin-top: 4px") button.add_behavior( { 'type': 'click_up', 'title': 'Trigger', 'search_type': search_type, 'cbjs_action': ''' var class_name = 'tactic.ui.tools.TriggerToolWdg'; var kwargs = { mode: "search_type", search_type: bvr.search_type }; spt.panel.load_popup(bvr.title, class_name, kwargs); ''' } ) td = table.add_cell() button = IconButtonWdg(title="Triggers", icon=IconWdg.ARROW_OUT) td.add(button) button.add_style("float: left") search = Search("config/trigger") search.add_filter("search_type", search_type) count = search.get_count() if count: check = IconWdg( "Has Items", IconWdg.CHECK, width=8 ) td.add(check) #check.add_style("margin-left: 0px") check.add_style("margin-top: 4px") button.add_behavior( { 'type': 'click_up', 'title': 'Trigger', 'search_type': search_type, 'cbjs_action': ''' var class_name = 'tactic.ui.tools.TriggerToolWdg'; var kwargs = { mode: "search_type", search_type: bvr.search_type }; spt.panel.load_popup(bvr.title, class_name, kwargs); ''' } ) td = table.add_cell() button = IconButtonWdg(title="Edit Searchable Type", icon=IconWdg.EDIT) td.add(button) button.add_behavior( { 'type': 'click_up', 'search_key': search_type_obj.get_search_key(), 'cbjs_action': ''' var class_name = 'tactic.ui.panel.EditWdg'; var kwargs = { search_type: "sthpw/sobject", view: "edit_startup", search_key: bvr.search_key } spt.panel.load_popup("Edit Searchable Type", class_name, kwargs); ''' } ) """ td = table.add_cell() button = IconButtonWdg(title="Security", icon=IconWdg.LOCK) td.add(button) button.add_behavior( { 'type': 'click_up', 'title': 'Trigger', 'search_type': search_type, 'cbjs_action': ''' alert("security"); ''' } ) """ columns_wdg = DivWdg() top.add(columns_wdg) return top
def get_display(my): top = my.top my.set_as_panel(top) top.add_class("spt_delete_top") top.add_color("background", "background") top.add_color("color", "color") top.add_border() top.add_style("width: 300px") top.add_border() search_key = my.kwargs.get("search_key") search_keys = my.kwargs.get("search_keys") if search_key: sobject = Search.get_by_search_key(search_key) sobjects = [sobject] search_keys = [search_key] elif search_keys: sobjects = Search.get_by_search_keys(search_keys) sobject = sobjects[0] if not sobjects: msg = "%s not found" %search_key return msg search_type = sobject.get_base_search_type() if search_type in ['sthpw/project', 'sthpw/search_object']: msg = 'You cannot delete these items with this tool' return msg my.search_keys = search_keys title = DivWdg() top.add(title) title.add_color("background", "background", -10) if my.search_keys: title.add("Delete %s Items" % len(my.search_keys)) else: title.add("Delete Item [%s]" % (sobject.get_code())) title.add_style("font-size: 14px") title.add_style("font-weight: bold") title.add_style("padding: 10px") content = DivWdg() top.add(content) content.add_style("padding: 10px") content.add("The item to be deleted has a number of dependencies as described below:<br/>", 'heading') # find all the relationships schema = Schema.get() related_types = schema.get_related_search_types(search_type, direction="children") parent_type = schema.get_parent_type(search_type) child_types = schema.get_child_types(search_type) # some special considerations # FIXME: this needs to be more automatic. Should only be # deletable children (however, that will be defined) if search_type in ['sthpw/task','sthpw/note', 'sthpw/snapshot']: if "sthpw/project" in related_types: related_types.remove("sthpw/project") if "sthpw/login" in related_types: related_types.remove("sthpw/login") if "config/process" in related_types: related_types.remove("config/process") if parent_type in related_types: related_types.remove(parent_type) related_types.append('sthpw/note') related_types.append('sthpw/task') related_types.append('sthpw/snapshot') if 'sthpw/work_hour' not in related_types: related_types.append('sthpw/work_hour') items_div = DivWdg() content.add( items_div ) items_div.add_style("padding: 10px") valid_related_ctr = 0 for related_type in related_types: if related_type == "*": print "WARNING: related_type is *" continue if related_type == search_type: continue if related_type in ['sthpw/search_object','sthpw/search_type']: continue item_div = my.get_item_div(sobjects, related_type) if item_div: items_div.add(item_div) valid_related_ctr += 1 if valid_related_ctr > 0: icon = IconWdg("WARNING", IconWdg.WARNING) icon.add_style("float: left") content.add( icon ) content.add("<div><b>WARNING: By selecting the related items above, you can delete them as well when deleting this sObject.</b></div>") content.add("<br/>"*2) else: # changed the heading to say no dependencies content.add("The item to be deleted has no dependencies.<br/>", 'heading') content.add("There are %s items to be deleted" % len(my.search_keys)) content.add("<br/>"*2) content.add("Do you wish to continue deleting?") content.add("<br/>"*2) button_div = DivWdg() button_div.add_styles('width: 300px; height: 50px') button = ActionButtonWdg(title="Delete") button_div.add(button) content.add(button_div) button.add_style("float: left") button.add_behavior( { 'type': 'click_up', 'search_keys': my.search_keys, 'cbjs_action': ''' spt.app_busy.show("Deleting"); var top = bvr.src_el.getParent(".spt_delete_top"); var values = spt.api.Utility.get_input_values(top); var class_name = "tactic.ui.tools.DeleteCmd"; var kwargs = { 'search_keys': bvr.search_keys, 'values': values }; var server = TacticServerStub.get(); try { server.start({'title': 'Delete sObject', 'description': 'Delete sObject [' + bvr.search_keys + ']'}); server.execute_cmd(class_name, kwargs); server.finish(); // run the post delete and destroy the popup var popup = bvr.src_el.getParent(".spt_popup"); if (popup.spt_on_post_delete) { popup.spt_on_post_delete(); } spt.popup.destroy(popup); } catch(e) { spt.alert(spt.exception.handler(e)); } spt.app_busy.hide(); ''' } ) button = ActionButtonWdg(title="Cancel") button.add_style("float: left") button_div.add(button) button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_popup"); top.destroy(); ''' } ) content.add("<br clear='all'/>") return top
def get_display(my): top = my.top top.add_style("white-space: nowrap") #top.add_style("position: relative") base = "%s/%s" % (BASE, my.top.get_theme() ) show_menu = my.kwargs.get("show_menu") is_disabled = my.kwargs.get("is_disabled") button = DivWdg() button.add_style("float: left") my.inner = button top.add(button) my.inner.add_class("hand") button.add_class("spt_button_top") button.add_style("position: relative") #img = "<img src='%s/MainButtonSlices_button.png'/>" % base #img_div = DivWdg(img) #button.add(img_div) #img_div.add_style("opacity", ALPHA) img_div = DivWdg() button.add(img_div) img_div.add_style("width: 30px") img_div.add_style("height: 35px") over_div = DivWdg() button.add(over_div) over_div.add_class("spt_button_over") over_img = "<img src='%s/MainButton_over.png'/>" % base over_div.add(over_img) over_div.add_style("position: absolute") over_div.add_style("top: 0px") over_div.add_style("left: 0px") over_div.add_style("display: none") click_div = DivWdg() button.add(click_div) click_div.add_class("spt_button_click") click_img = "<img src='%s/MainButton_click.png'/>" % base click_div.add(click_img) click_div.add_style("position: absolute") click_div.add_style("top: 0px") click_div.add_style("left: 0px") click_div.add_style("display: none") title = my.kwargs.get("title") tip = my.kwargs.get("tip") if not tip: tip = title icon_div = my.icon_div button.add(icon_div) #icon_div.add_class("spt_button_click") icon_str = my.kwargs.get("icon") icon = IconWdg(tip, icon_str, right_margin=0, width=16) icon.add_class("spt_button_icon") icon_div.add(icon) icon_div.add_style("position: absolute") #TODO: removed this top attr after we trim the top and bottom whitespace of the over image icon_div.add_style("top: 12px") icon_div.add_style("left: 6px") if my.is_disabled: icon_div.add_style("opacity: 0.5") my.icon_div = icon_div sub_icon = my.kwargs.get("sub_icon") if sub_icon: sub_icon = IconWdg(icon=sub_icon, size="8") button.add(sub_icon) sub_icon.add_style("position: absolute") sub_icon.add_style("bottom: 4px") sub_icon.add_style("right: 0px") my.show_arrow = my.kwargs.get("show_arrow") in [True, 'true'] if my.show_arrow or my.dialog: arrow_div = DivWdg() button.add(arrow_div) arrow_div.add_style("position: absolute") arrow_div.add_style("top: 24px") arrow_div.add_style("left: 20px") arrow = IconWdg(tip, IconWdg.ARROW_MORE_INFO) arrow_div.add(arrow) web = WebContainer.get_web() is_IE = web.is_IE() #my.hit_wdg.add_style("height: 100%") my.hit_wdg.add_style("width: 100%") if is_IE: my.hit_wdg.add_style("filter: alpha(opacity=0)") my.hit_wdg.add_style("height: 40px") else: my.hit_wdg.add_style("height: 100%") my.hit_wdg.add_style("opacity: 0.0") if my.is_disabled: my.hit_wdg.add_style("display: none") button.add(my.hit_wdg) my.hit_wdg.add_style("position: absolute") my.hit_wdg.add_style("top: 0px") my.hit_wdg.add_style("left: 0px") my.hit_wdg.add_attr("title", tip) """ my.hit_wdg.add_behavior( { 'type': 'hover', 'cbjs_action_over': ''' var top = bvr.src_el.getParent(".spt_button_top") var over = top.getElement(".spt_button_over"); var click = top.getElement(".spt_button_click"); over.setStyle("display", ""); click.setStyle("display", "none"); ''', 'cbjs_action_out': ''' var top = bvr.src_el.getParent(".spt_button_top") var over = top.getElement(".spt_button_over"); var click = top.getElement(".spt_button_click"); over.setStyle("display", "none"); click.setStyle("display", "none"); ''' } ) """ # add a second arrow widget if my.show_arrow_menu: my.inner.add(my.arrow_div) my.arrow_div.add_attr("title", "More Options") my.arrow_div.add_style("position: absolute") my.arrow_div.add_style("top: 11px") my.arrow_div.add_style("left: 20px") my.arrow_div.add(my.arrow_menu) if my.dialog: top.add(my.dialog) dialog_id = my.dialog.get_id() my.hit_wdg.add_behavior( { 'type': 'click_up', 'dialog_id': dialog_id, 'cbjs_action': ''' var dialog = $(bvr.dialog_id); var pos = bvr.src_el.getPosition(); var size = bvr.src_el.getSize(); //var dialog = $(bvr.dialog_id); dialog.setStyle("left", pos.x); dialog.setStyle("top", pos.y+size.y); spt.toggle_show_hide(dialog); ''' } ) return top
def get_display(my): top = my.top #help_div = DivWdg() help_div = top #top.add(help_div) help_div.add_class("spt_help_top") help_div.set_id("spt_help_top") show_title = my.kwargs.get("show_title") if show_title in [True, 'true']: show_title = True else: show_title = False if show_title: title_wdg = DivWdg() help_div.add(title_wdg) title_wdg.add_style("font-size: 12px") title_wdg.add_style("font-weight: bold") title_wdg.add_color("background", "background", -10) title_wdg.add_style("padding: 3px") #title_wdg.add_style("margin-top: 8px") title_wdg.add_style("margin-bottom: 5px") title_wdg.add_style("height: 26px") title_wdg.add_style("padding: 6 0 0 6") title_wdg.set_round_corners(corners=['TL','TR']) icon = IconWdg("Close", IconWdg.KILL) title_wdg.add(icon) icon.add_style("float: right") title_wdg.add("Help") help_div.set_round_corners() help_div.add_color("color", "color2") help_div.add_color("background", "background") help_div.add_style("overflow: hidden") help_div.add_border() shelf_div = DivWdg() help_div.add(shelf_div) shelf_div.add_style("padding: 10px") shelf_div.add_color("background", "background", -10) shelf_div.add_style("height: 25px") #button = SingleButtonWdg(title="Documentation Main Page", icon=IconWdg.HOME) button = IconButtonWdg(title="Documentation Main Page", icon="BS_HOME") shelf_div.add(button) button.add_style("float: left") button.add_style("margin: 0px 10px") button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.help.set_top(); spt.help.load_alias("main") ''' } ) #button = SingleButtonWdg(title="Edit Help", icon=IconWdg.EDIT) if my.show_add_new: button = IconButtonWdg(title="Add New Help", icon="BS_EDIT") shelf_div.add(button) button.add_style("float: left") button.add_style("margin: 0px 10px") button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.tab.set_main_body_tab(); var class_name = 'tactic.ui.app.HelpEditWdg'; var element_name = spt.help.get_view(); if (!element_name) { element_name = "default"; } var kwargs = { view: element_name } spt.tab.add_new("help_edit", "Help Edit", class_name, kwargs); ''' } ) #button = SingleButtonWdg(title="Go Back One Page", icon=IconWdg.ARROW_LEFT) button = IconButtonWdg(title="Go Back One Page", icon="BS_CIRCLE_ARROW_LEFT") shelf_div.add(button) button.add_style("float: left") button.add_style("margin: 0px 10px") button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.help.set_top(); spt.help.load_prev(); ''' } ) #button = SingleButtonWdg(title="Go Forward One Page", icon=IconWdg.ARROW_RIGHT) button = IconButtonWdg(title="Go Forward One Page", icon="BS_CIRCLE_ARROW_RIGHT") shelf_div.add(button) button.add_style("float: left") button.add_style("margin: 0px 10px") button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.help.set_top(); spt.help.load_next(); ''' } ) #button = SingleButtonWdg(title="Documentation Downloads", icon=IconWdg.DOWNLOAD) button = IconButtonWdg(title="Documentation Downloads", icon="BS_DOWNLOAD") shelf_div.add(button) button.add_style("float: right") button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.help.set_top(); spt.help.load_alias("pdf") ''' } ) shelf_div.add("<br clear='all'/>") help_div.add_behavior( { 'type': 'load', 'cbjs_action': my.get_onload_js() }) help_div.add_behavior( { 'type': 'listen', 'event_name': 'tab|select', 'cbjs_action': ''' var content = bvr.src_el.getElement(".spt_help_content"); var options = bvr.firing_data; var element_name = options.element_name; var alias = options.alias; if (!alias) { alias = options.element_name; } spt.help.set_top(); if (spt.help.is_visible()) { spt.help.load_alias(alias); } else { spt.help.set_view(alias); } ''' } ) help_div.add_behavior( { 'type': 'listen', 'event_name': 'show_help', 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_help"); var content = top.getElement(".spt_help_content"); var firing_data = bvr.firing_data; var class_name = firing_data.class_name; if (!class_name) { class_name = 'tactic.ui.app.HelpContentWdg'; } if (top.getStyle("display") != 'none') { spt.hide(top); return; } spt.help.set_top() // get the help view var help_view = spt.help.get_view(); var html = firing_data.html; if (html) { spt.help.load_html(html); } else { if (!help_view) { help_view = 'default' } spt.help.load_alias(help_view); } var size = $(window).getSize(); var dialog = bvr.src_el.getParent(".spt_dialog_content"); dialog.setStyle("height", size.y - 100); dialog.setStyle("width", 650); var top = bvr.src_el.getParent(".spt_dialog_top"); top.setStyle("left", size.x - 660); top.setStyle("top", 40); spt.show(top); ''' } ) content = DivWdg() help_div.add(content) content.add_class("spt_help_content"); content.add_style("position: relative") content.add_style("overflow_x: auto") content.add_style("overflow_y: auto") content.add_style("margin-bottom: 10px") #content.add_style("border: solid 1px blue") content.add_style("height: 98%") #key = "schema_editor" #search = Search("config/doc") #search.add_filter("code", key) #doc = search.get_sobject() #doc_html = doc.get_value("doc") #help_div.add(doc_html) return top
def get_display(self): top = self.top top.add_class("spt_sandbox_select_top") sandbox_options = [{ 'name': 'fast', 'base_dir': 'C:/Fast', }, { 'name': 'faster', 'base_dir': 'C:/Faster', }, { 'name': 'slow', 'base_dir': 'Z:/Slow', }] process = self.kwargs.get("process") search_key = self.kwargs.get("search_key") sobject = Search.get_by_search_key(search_key) search_type = sobject.get_base_search_type() client_os = Environment.get_env_object().get_client_os() if client_os == 'nt': prefix = "win32" else: prefix = "linux" alias_dict = Config.get_dict_value("checkin", "%s_sandbox_dir" % prefix) search_key = sobject.get_search_key() key = "sandbox_dir:%s" % search_key from pyasm.web import WidgetSettings value = WidgetSettings.get_value_by_key(key) sandboxes_div = DivWdg() top.add(sandboxes_div) sandboxes_div.add_relay_behavior({ 'type': 'mouseenter', 'bvr_match_class': 'spt_sandbox_option', 'cbjs_action': ''' var last_background = bvr.src_el.getStyle("background-color"); bvr.src_el.setAttribute("spt_last_background", last_background); bvr.src_el.setStyle("background-color", "#E0E0E0"); bvr.src_el.setStyle("opacity", "1.0"); ''' }) sandboxes_div.add_relay_behavior({ 'type': 'mouseleave', 'bvr_match_class': 'spt_sandbox_option', 'cbjs_action': ''' var last_background = bvr.src_el.getAttribute("spt_last_background"); bvr.src_el.setStyle("background-color", last_background); if (!bvr.src_el.hasClass("spt_selected")) { bvr.src_el.setStyle("opacity", "0.5"); } ''' }) sandboxes_div.add_relay_behavior({ 'type': 'mouseup', 'key': key, 'bvr_match_class': 'spt_sandbox_option', 'cbjs_action': ''' var sandbox_dir = bvr.src_el.getAttribute("spt_sandbox_dir"); var server = TacticServerStub.get(); server.set_widget_setting(bvr.key, sandbox_dir); var applet = spt.Applet.get(); applet.makedirs(sandbox_dir); //var top = bvr.src_el.getParent(".spt_sandbox_select_top"); var top = bvr.src_el.getParent(".spt_checkin_top"); spt.panel.refresh(top); ''' }) #search = Search("config/naming") #search.add_filter("search_type", search_type) #search.add_filter("process", process) #namings = search.get_sobjects() #naming = namings[0] from pyasm.biz import Snapshot, Naming virtual_snapshot = Snapshot.create_new() virtual_snapshot.set_value("process", process) # for purposes of the sandbox folder for the checkin widget, # the context is the process virtual_snapshot.set_value("context", process) naming = Naming.get(sobject, virtual_snapshot) if naming: naming_expr = naming.get_value("sandbox_dir_naming") alias_options = naming.get_value("sandbox_dir_alias") else: naming_expr = None alias_options = None if alias_options == "__all__": alias_options = alias_dict.keys() elif alias_options: alias_options = alias_options.split("|") else: alias_options = ['default'] for alias in alias_options: from pyasm.biz import DirNaming dir_naming = DirNaming(sobject=sobject, snapshot=virtual_snapshot) dir_naming.set_protocol("sandbox") dir_naming.set_naming(naming_expr) base_dir = dir_naming.get_dir(alias=alias) sandbox_div = DivWdg() sandboxes_div.add(sandbox_div) sandbox_div.add_class("spt_sandbox_option") sandbox_div.add_attr("spt_sandbox_dir", base_dir) if value == base_dir: sandbox_div.add_color("background", "background3") #sandbox_div.set_box_shadow() sandbox_div.add_class("spt_selected") else: sandbox_div.add_style("opacity", "0.5") sandbox_div.add_style("width: auto") sandbox_div.add_style("height: 55px") sandbox_div.add_style("padding: 5px") #sandbox_div.add_style("float: left") sandbox_div.add_style("margin: 15px") sandbox_div.add_border() if alias: alias_div = DivWdg() sandbox_div.add(alias_div) alias_div.add(alias) alias_div.add_style("font-size: 1.5em") alias_div.add_style("font-weight: bold") alias_div.add_style("margin-bottom: 15px") icon_wdg = IconWdg("Folder", IconWdg.FOLDER) sandbox_div.add(icon_wdg) sandbox_div.add(base_dir) return top
def get_display(my): smenu_div = DivWdg() smenu_div.add_class( "SPT_SMENU" ) smenu_div.add_class( "SPT_SMENU_%s" % my.menu_tag_suffix ) smenu_div.set_box_shadow() smenu_div.add_border() smenu_div.add_color("background", "background") smenu_div.add_color("color", "color") smenu_div.add_behavior( { 'type': 'load', 'cbjs_action': ''' spt.dom.load_js( ["ctx_menu.js"], function() { spt.dom.load_js( ["smart_menu.js"], function() { } ) } ); ''' } ) if my.setup_cbfn: smenu_div.set_attr( "SPT_SMENU_SETUP_CBFN", my.setup_cbfn ) smenu_div.set_z_start( 300 ) #smenu_div.add_looks( "smenu border curs_default" ) # smenu_div.add_styles( "padding-top: 3px; padding-bottom: 5px;" ) m_width = my.width - 2 smenu_div.add_style( ("width: %spx" % m_width) ) smenu_div.add_style("overflow-x: hidden") icon_width = 16 icon_col_width = 0 if my.allow_icons: icon_col_width = icon_width + 2 label_width = m_width - icon_col_width - icon_width menu_table = Table() menu_table.add_styles( "text-align: left; text-indent: 3px; border-collapse: collapse;" ) #menu_table.add_color("background", "background") menu_table.add_color("color", "color") options = my.opt_spec_list opt_count = 0 if options[0].get('type') != 'title': my._add_spacer_row(menu_table, 3, icon_width, icon_col_width, label_width) """ menu_table.add_relay_behavior( { 'type': 'mouseenter', 'bvr_match_class': 'SPT_SMENU_ENTRY', 'bgcolor': menu_table.get_color("side_bar_title", -15, default="background3"), 'cbjs_action': ''' bvr.src_el.setStyle("background-color", bvr.bgcolor); bvr.src_el.setStyle("color", bvr.bgcolor); spt.smenu.entry_over( evt, bvr ); ''' } ) menu_table.add_relay_behavior( { 'type': 'mouseleave', 'bvr_match_class': 'SPT_SMENU_ENTRY', 'cbjs_action': ''' bvr.src_el.setStyle("background-color", ""); spt.smenu.entry_out( evt, bvr ); ''' } ) """ for opt in options: # if entry is a title, then add a spacer before if opt.get('type') == 'title' and opt_count: my._add_spacer_row(menu_table, 6, icon_width, icon_col_width, label_width) tbody = menu_table.add_tbody() tbody.add_style("display","table-row-group") tr = menu_table.add_row() #tr.add_looks( "smenu" ) tr.add_class( "SPT_SMENU_ENTRY" ) tr.add_class( "SPT_SMENU_ENTRY_%s" % opt['type'].upper() ) if opt.has_key('enabled_check_setup_key'): tr.set_attr( "SPT_ENABLED_CHECK_SETUP_KEY", opt.get('enabled_check_setup_key') ) if opt.has_key('hide_when_disabled') and opt.get('hide_when_disabled'): tr.set_attr( "SPT_HIDE_WHEN_DISABLED", "true" ) if opt['type'] in [ 'action', 'toggle' ]: hover_bvr = {'type':'hover', 'add_looks': 'smenu_hilite', 'cbjs_action_over': 'spt.smenu.entry_over( evt, bvr );', 'cbjs_action_out': 'spt.smenu.entry_out( evt, bvr );' } if opt.has_key('hover_bvr_cb'): hover_bvr.update( opt.get('hover_bvr_cb') ) tr.add_behavior( hover_bvr ) tr.add_class("hand") if opt['type'] == 'action': if opt.has_key('bvr_cb') and type(opt['bvr_cb']) == dict: bvr = {} bvr.update( opt['bvr_cb'] ) bvr['cbjs_action_for_menu_item'] = bvr['cbjs_action'] bvr['cbjs_action'] = 'spt.smenu.cbjs_action_wrapper( evt, bvr );' bvr.update( { 'type': 'click_up' } ) tr.add_behavior( bvr ) if opt['type'] == 'submenu': hover_bvr = { 'type': 'hover', 'add_looks': 'smenu_hilite', 'cbjs_action_over': 'spt.smenu.submenu_entry_over( evt, bvr );', 'cbjs_action_out': 'spt.smenu.submenu_entry_out( evt, bvr );', 'submenu_tag': "SPT_SMENU_%s" % opt['submenu_tag_suffix'], } if opt.has_key('hover_bvr_cb'): hover_bvr.update( opt.get('hover_bvr_cb') ) tr.add_behavior( hover_bvr ) # now trap click on submenu, so that it doesn't make the current menu disappear ... tr.add_behavior( { 'type': 'click', 'cbjs_action': ';', 'activator_type': 'smart_menu' } ) tr.add_looks( "curs_default" ) # Left icon cell ... if my.allow_icons: td = menu_table.add_cell() td.add_styles("text-align: center; vertical-align: middle; width: %spx;" % icon_col_width) #td.add_looks("smenu_icon_column") td.add_color("color", "color3") td.add_color("background", "background3") if opt.has_key( 'icon' ): icon_wdg = IconWdg("", opt['icon']) icon_wdg.add_class("SPT_ENABLED_ICON_LOOK") td.add( icon_wdg ) # if disabled: # icon_wdg.add_style( "opacity: .4" ) # icon_wdg.add_style( "filter: alpha(opacity=40)" ) # Menu option label cell ... td = menu_table.add_cell() td.add_style("width", ("%spx" % label_width)) td.add_style("height", ("%spx" % icon_col_width)) #if opt.get('type') != 'title': # td.add_style( "padding-left: 6px" ) #td.add_style( "padding-top: 2px" ) td.add_style("padding: 6px 4px") if opt.has_key( 'label' ): label_str = opt.get('label').replace('"','"') td.add_class("SPT_LABEL") td.add( label_str ) td.set_attr( "SPT_ORIG_LABEL", label_str ) #td.add_looks("fnt_text") td.add_style("font-size: 1.0em") if opt.get('type') == 'title': #td.add_looks("smenu_title") td.add_color("background", "background2") td.add_color("color", "color2") td.add_style("font-weight", "bold") td.add_style("padding", "3px") elif opt.get('type') == 'separator': hr = HtmlElement("hr") hr.add_looks( "smenu_separator" ) td.add( hr ) td.add_class("SPT_ENABLED_LOOK") # if disabled: # td.add_style( "opacity: .2" ) # td.add_style( "filter: alpha(opacity=20)" ) # Submenu arrow icon cell ... td = menu_table.add_cell() td.add_style("width", ("%spx" % icon_width)) if opt['type'] == 'submenu': icon_wdg = IconWdg("", IconWdg.ARROWHEAD_DARK_RIGHT) td.add(icon_wdg) td.add_class("SPT_ENABLED_ICON_LOOK") # extend title entry styling into the submenu arrow cell and add some spacing after if opt.get('type') == 'title': #td.add_looks("smenu_title") td.add_color("background", "background2") td.add_color("color", "color2") td.add_style("font-weight", "bold") td.add_style("padding", "3px") my._add_spacer_row(menu_table, 3, icon_width, icon_col_width, label_width) # if disabled: # td.add_style( "opacity: .4" ) # td.add_style( "filter: alpha(opacity=40)" ) opt_count += 1 my._add_spacer_row(menu_table, 5, icon_width, icon_col_width, label_width) smenu_div.add( menu_table ) smenu_div.add_style( "display: none" ) smenu_div.add_style( "position: absolute" ) return smenu_div
def get_tables_wdg(self): div = DivWdg() div.set_name("Tables") div.add( "In order to fully register a database, you must bind it to a TACTIC project" ) div.add("<br/>") project_code = "mongodb" database = "test_database" db_resource = DbResource(server='localhost', vendor='MongoDb', database=database) try: connect = DbContainer.get(db_resource) except Exception as e: div.add("Could not connect") div.add_style("padding: 30px") div.add("<br/>" * 2) div.add(str(e)) return div # Bind project to this resource database_text = TextWdg("database") div.add("Database: ") div.add(database_text) div.add("<br/>" * 2) project_text = TextWdg("project") div.add("Project Code: ") div.add(project_text) div.add("<br/>") div.add("<hr/>") # connect and introspect the tables in this database tables = connect.get_tables() table = Table() div.add(table) table.set_max_width() for table_name in tables: table.add_row() search_type = "table/%s?project=%s" % (table_name, project_code) td = table.add_cell() icon = IconWdg("View Table", IconWdg.FOLDER_GO) td.add(icon) icon.add_behavior({ 'type': 'click_up', 'search_type': search_type, 'cbjs_action': ''' var class_name = 'tactic.ui.panel.ViewPanelWdg'; var kwargs = { search_type: bvr.search_type } spt.panel.load_popup("table", class_name, kwargs); ''' }) td = table.add_cell() td.add(table_name) td = table.add_cell() search = Search(search_type) count = search.get_count() td.add(" %s item/s" % count) columns = search.get_columns() td = table.add_cell() td.add(columns) # search_type td = table.add_cell() text = TextWdg("search_type") td.add(text) new_search_type = "%s/%s" % (project_code, table_name) text.set_value(new_search_type) register_div = DivWdg() div.add(register_div) register_div.add_style("padding: 20px") button = ActionButtonWdg(title="Register") register_div.add(button) return div
def get_content_wdg(self): div = DivWdg() div.add_class("spt_tool_top") #table = Table() from tactic.ui.container import ResizableTableWdg from table_layout_wdg import FastTableLayoutWdg #table = ResizableTableWdg() table = Table() table.add_style("table-layout", "fixed") table.add_style("width: 100%") div.add(table) table.add_row() td = table.add_cell() #td.add_style("width: 30%") kwargs = self.kwargs.copy() td.add_style("vertical-align: top") layout_div = DivWdg() layout_div.add_style("min-height: 500px") layout_div.add_style("height: auto") td.add(layout_div) #td.add_style("overflow: hidden") kwargs['height'] = 500 kwargs['show_shelf'] = False kwargs['show_search_limit'] = False kwargs['expand_on_load'] = True layout = FastTableLayoutWdg(**kwargs) layout_div.add(layout) layout.set_sobjects(self.sobjects) #from tactic.ui.panel import TileLayoutWdg #layout = TileLayoutWdg(**self.kwargs) #layout_div.add(layout) td = table.add_cell() td.add_border(color="#EEE") td.add_style("vertical-align: top") content = DivWdg() td.add(content) content.add_class("spt_tool_content") content.add_border(color="#EEE") content.add_style("margin: -1px") content.add_style("height: auto") #content.add_style("padding: 0px 20px") no_content_wdg = DivWdg() content.add(no_content_wdg) no_content_wdg.add("<br/>"*3) ''' The no content message displays tool icons and a message in format: <tools> <msg> ''' tool_icons = self.kwargs.get('tool_icon') if isinstance(tool_icons, basestring): tool_icon_lst = tool_icons.split("|") else: tool_icon_lst = None if tool_icon_lst: for icon in tool_icon_lst: icon = IconWdg(icon=icon) icon.add_style("padding", "5px") no_content_wdg.add(icon) no_content_wdg.add("</br></br>") tool_msg = self.kwargs.get('tool_msg') if tool_msg: no_content_wdg.add("<p>%s<p>" % tool_msg) else: no_content_wdg.add("Click the tool(s) to modify settings.") #no_content_wdg.add_style("opacity: 0.5") no_content_wdg.add_style("margin: 30px auto") no_content_wdg.add_color("color", "color3") no_content_wdg.add_color("background", "background3") no_content_wdg.add_style("text-align", "center") no_content_wdg.add_style("padding-top: 20px") no_content_wdg.add_style("padding-bottom: 20px") no_content_wdg.add_style("width: 350px") no_content_wdg.add_style("height: 110px") no_content_wdg.add_style("margin: 30px auto") no_content_wdg.add_border() return div
def get_display(my): top = DivWdg() title = DivWdg() top.add(title) top.add_color("background", "background") top.add_style("margin: 0px 10px 15px 10px") top.set_box_shadow() title.add("More Information") title.add_style("font-size: 16px") title.add_style("padding: 5px") title.add_gradient("background", "background") title.add_border() title.set_round_corners(corners=['TL','TR']) content_wdg = DivWdg() top.add(content_wdg) content_wdg.add_border() content_wdg.add_style("padding: 20px") content_wdg.add("<div style='font-size: 12px'>The following links will help you find out more information on how to set-up or use TACTIC.</div>") content_wdg.add("<hr/>") hover = title.get_color("background", -10) links_div = DivWdg() links_div.add_style("padding: 10px") content_wdg.add(links_div) # documentation linke link_div = DivWdg() link_div.add_style("padding-left: 10px") links_div.add(link_div) icon = IconWdg("Documentation", IconWdg.DOCUMENTATION) icon.set_box_shadow("2px 2px 5px") icon.add_border() icon.add_style("padding: 5px 3px 5px 7px") icon.set_round_corners() icon.add_color("background", "background3") link_div.add(icon) link_div.add(" "*2) link = HtmlElement.href("Documentation", "/doc/", target="_blank") link_div.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' spt.help.set_top(); spt.help.load_alias("main"); ''' } ) link_div.add_behavior( { 'type': 'hover', 'color': hover, 'cbjs_action_over': ''' bvr.src_el.setStyle("background", bvr.color); ''', 'cbjs_action_out': ''' bvr.src_el.setStyle("background", ""); ''' } ) link_div.add(link) link.add_color("color", "color") links_div.add("<br/>") link_div = DivWdg() link_div.add_style("padding-left: 10px") links_div.add(link_div) icon = IconWdg("Community", IconWdg.COMMUNITY) icon.set_box_shadow("2px 2px 5px") icon.add_border() icon.add_style("padding: 5px 3px 5px 7px") icon.set_round_corners() icon.set_round_corners() icon.add_color("background", "background3") link_div.add(icon) link_div.add(" "*2) link = HtmlElement.href("Community", "http://community.southpawtech.com", target="_blank") link_div.add(link) link.add_color("color", "color") link_div.add_behavior( { 'type': 'hover', 'color': hover, 'cbjs_action_over': ''' bvr.src_el.setStyle("background", bvr.color); ''', 'cbjs_action_out': ''' bvr.src_el.setStyle("background", ""); ''' } ) links_div.add("<br/>") # documentation link link_div = DivWdg() link_div.add_style("padding-left: 10px") links_div.add(link_div) icon = IconWdg("Support", IconWdg.WEBSITE) icon.set_box_shadow("2px 2px 5px") icon.add_border() icon.add_style("padding: 5px 3px 5px 7px") icon.set_round_corners() icon.add_color("background", "background3") link_div.add(icon) link_div.add(" "*2) link = HtmlElement.href("Support", "http://www.southpawtech.com", target="_blank") link_div.add(link) link.add_color("color", "color") link_div.add_behavior( { 'type': 'hover', 'color': hover, 'cbjs_action_over': ''' bvr.src_el.setStyle("background", bvr.color); ''', 'cbjs_action_out': ''' bvr.src_el.setStyle("background", ""); ''' } ) return top
def get_displayxx(my): show_menu = my.kwargs.get("show_menu") is_disabled = my.kwargs.get("is_disabled") show_title = my.kwargs.get("show_title") show_title = show_title in ['True', True] width = 35 if show_title: height = 26 else: height = 20 height = 30 top = my.top top.add_class("spt_button_top") top.add_style("overflow: hidden") #border = top.get_color("border") #top.add_border(-20) top.add_gradient("background", "background", 20, -35) top.add_style("border-width: 1px 0 1px 0") top.add_style("border-style: solid") top.add_style("border-color: %s" % top.get_color('border')) #top.add_style("margin-left: -1px") inner = my.inner top.add(inner) inner.add_color("color", "color3") inner.add_style("padding-top: 3px") inner.add_style("overflow: hidden") title = my.kwargs.get("title") inner.add_class("hand") inner.add_style("z-index: 20") #inner.add_style("overflow: hidden") #inner.add_style("opacity: 0.5") inner.add_attr("title", title) my.button.add_style("margin-top: 5px") inner.add(my.button) icon_str = my.kwargs.get("icon") icon = IconWdg(title, icon_str) my.button.add(icon) icon.add_class("spt_button_icon") my.show_arrow = my.kwargs.get("show_arrow") in [True, 'true'] if my.show_arrow or my.dialog: arrow = IconWdg(title, IconWdg.ARROW_MORE_INFO) inner.add(arrow) arrow.add_style("position: absolute") arrow.add_style("float: left") arrow.add_style("margin-left: 2px") arrow.add_style("margin-top: -10px") inner.add_style("font-size: 8px") inner.add_style("height: %spx" % height) inner.add_style("width: %spx" % width) inner.add_style("text-align: center") show_title = False if show_title: title_div = DivWdg() title_div.add(title) inner.add(title_div) inner.add_behavior( { 'type': 'click', 'width': width, 'cbjs_action': ''' var button = bvr.src_el; button.setStyle("border-style", "ridge"); button.setStyle("width", bvr.width-2); ''' } ) inner.add_behavior( { 'type': 'click_up', 'width': width, 'cbjs_action': ''' var button = bvr.src_el; button.setStyle("border-style", "none"); button.setStyle("width", bvr.width); ''' } ) inner.add_behavior( { 'type': 'hover', 'width': width, 'cbjs_action_over': ''' var button = bvr.src_el; var icon = button.getElement(".spt_button_icon"); icon.setStyle('opacity', '1'); ''', 'cbjs_action_out': ''' var button = bvr.src_el; button.setStyle("border-style", "none"); var icon = button.getElement(".spt_button_icon"); icon.setStyle('opacity', '0.5'); button.setStyle("width", bvr.width); ''' } ) if show_menu in ['true', True]: inner.add_style("float: left") arrow_div = DivWdg() top.add(arrow_div) arrow_div.add_style("opacity: 0.5") arrow_div.add_style("z-index: 100") arrow_div.add_style("height: %spx" % height) arrow_div.add_style("border-left: dotted 1px %s" % arrow_div.get_color("border") ) #arrow_div.add_style("margin-left: -15px") arrow_div.add_style("float: left") arrow = DivWdg(IconWdg("More Options", IconWdg.ARROW_MORE_INFO)) arrow.add_style("margin-top: 8px") arrow_div.add(arrow) arrow_div.add_style("position: relative") arrow_div.add_behavior( { 'type': 'hover', 'cbjs_action_over': ''' var button = bvr.src_el; var height = parseInt(button.getStyle("height").replace("px","")); var width = parseInt(button.getStyle("width").replace("px","")); button.setStyle('opacity', '1'); button.setStyle('border', 'solid 1px red'); button.setStyle("height", height-2); button.setStyle("width", width-2); ''', 'cbjs_action_out': ''' var button = bvr.src_el; var height = parseInt(button.getStyle("height").replace("px","")); var width = parseInt(button.getStyle("width").replace("px","")); button.setStyle('opacity', '0.5'); button.setStyle('border', ''); button.setStyle("height", height+2); button.setStyle("width", width+2); ''' } ) my.add_menu_wdg(arrow_div) if is_disabled in ['true', True]: disabled_div = DivWdg() disabled_div.add_class("spt_save_button_disabled") disabled_div.set_attr("title", "%s (Disabled)" % title) disabled_div.add_style("position: relative") disabled_div.add_style("height: %spx" % (height+3)) disabled_div.add_style("width: %spx" % width) #disabled_div.add_style("margin-left: -%spx" % width) disabled_div.add_style("margin-top: -%spx" % (height+3)) disabled_div.add_style("opacity", "0.6") disabled_div.add_style("background", "#AAA") inner.add_style("opacity", "1") top.add(disabled_div) if my.dialog: top.add(my.dialog) dialog_id = my.dialog.get_id() inner.add_behavior( { 'type': 'load', 'height': height, 'dialog_id': dialog_id, 'cbjs_action': ''' var pos = bvr.src_el.getPosition(); var el = $(bvr.dialog_id); el.setStyle("left", pos.x); el.setStyle("top", pos.y+bvr.height+13); ''' } ) my.inner.add_behavior( { 'type': 'click_up', 'dialog_id': dialog_id, 'cbjs_action': ''' var dialog = $(bvr.dialog_id); spt.toggle_show_hide(dialog); ''' } ) return top
def get_display(my): top = DivWdg() top.add_class("spt_top") dialog = DialogWdg() dialog_id = dialog.get_id() # create the button button = DivWdg() button.add_style("padding: 5px") button.add_style("width: 30px") button.add_style("text-align: center") button.add_style("float: left") button.add_gradient("background", "background") button.add_border() top.add(button) icon = IconWdg("Press Me", IconWdg.ZOOM) icon.add_style("float: left") button.add(icon) icon = IconWdg("Press Me", IconWdg.INFO_OPEN_SMALL) icon.add_style("margin-left: -9px") button.add(icon) button.add_behavior({ 'type': 'click_up', 'dialog_id': dialog_id, 'cbjs_action': ''' var pos = bvr.src_el.getPosition(); var el = $(bvr.dialog_id); el.setStyle("left", pos.x+1); el.setStyle("top", pos.y+32); el.setStyle("display", ""); ''' }) # defined the dialog top.add(dialog) dialog.add_title("Search Limit") table = Table() table.add_color("color", "color2") dialog.add(table) table.add_row() td = table.add_cell() td.add("Search Limit: ") td = table.add_cell() select = SelectWdg("search_limit") select.set_option("values", "5|10|20|50|100|200|Custom") td.add(select) save_button = ProdIconButtonWdg("Save") td.add(save_button) cancel_script = dialog.get_cancel_script() save_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var dialog_top = bvr.src_el.getParent(".spt_dialog_top"); var values = spt.api.get_input_values(dialog_top); var top = spt.get_parent(bvr.src_el, ".spt_top"); var input = top.getElement(".spt_search_limit"); input.value = values.search_limit; %s ''' % cancel_script }) text = TextWdg("search_limit") text.add_class("spt_search_limit") top.add(text) return top