def as_actions(items): """returns actions >>> from zoom.context import context as ctx >>> ctx.site = lambda: None >>> ctx.site.url = '' >>> as_actions(['New']) '<div class="actions"><ul><li><a class="action" href="<dz:request_path>/new" id="new-action">New</a></li></ul></div>' >>> as_actions(['New','Delete']) '<div class="actions"><ul><li><a class="action" href="<dz:request_path>/delete" id="delete-action">Delete</a></li><li><a class="action" href="<dz:request_path>/new" id="new-action">New</a></li></ul></div>' """ if not items: return '' result = [] for item in reversed(items): if type(item) == str: text = item url = url_for('./' + id_for(item)) elif hasattr(item, '__iter__'): text, url = item[:2] else: raise Exception('actions require str or (str,url)') result.append( a(text, Class='action', id=id_for(text) + '-action', href=url)) return div(ul(result), Class='actions')
def spinner(): """A progress spinner >>> isinstance(spinner(), str) True """ zoom.requires('spin') return div(id='spinner')
def app(request): """Return a page containing a list of available apps""" zoom.requires('fontawesome4') css = """ .app-icons ul { list-style-type: none; margin-top: 50px; } .app-icons li { display: inline; } .zoom-app-as-icon { width: 110px; height: 120px; text-align: center; float: left; } .zoom-app-as-icon:hover { background: #eee; } .zoom-app-icon { height: 50px; width: 50px; border-radius: 5px; margin-top: 16px; padding-top: 5px; line-height: 50px; text-align: center; box-shadow: inset 0px 49px 0px -24px #67828b; background-color: #5a7179; border: 1px solid #ffffff; display: inline-block; color: #ffffff; font-size: 15px; text-decoration: none; } .zoom-app-icon .fa { font-size: 2em; } """ if len(request.route) > 1 or request.data: return zoom.home() skip = 'home', 'logout', 'login' content = h.div(h.ul( a.as_icon for a in sorted(request.site.apps, key=lambda a: a.title.lower()) if a.name not in skip and a.visible and request.user.can_run(a)), classed='app-icons') return zoom.page(content, css=css)
def page(self, response, *args, **kwargs): if not isinstance(response, zoom.page): return response menu = side_menu(*self.items) search = getattr(response, 'search', None) actions = getattr(response, 'actions', []) content = response.content layout = h.div(h.div(menu, Class='col-md-3 side-nav') + h.div(content, Class='col-md-9'), classed='row') page_args = self.common_kwargs.copy() page_args.update(kwargs) return zoom.page(layout, search=search, actions=actions, *args, **page_args)
def view(): hr = '<hr>\n' content = zoom.Component( 'zoom.components.HeaderBar', c.HeaderBar(left=h.h2('HeaderBar Left'), right='HeaderBar right'), hr, 'zoom.components.spinner', h.div(c.spinner(), classed="clearfix", style="margin: 40px auto; width: 0;"), hr, 'zoom.components.dropzone', c.dropzone('/sample/components'), hr, ) return zoom.page(content, title='Components')
def dropzone(url, **kwargs): """Dropzone component A basic dropzone component that supports drag and drop uploading of files which are posted to the URL provided. >>> zoom.system.site = zoom.sites.Site() >>> zoom.system.site.packages = {} >>> zoom.system.request = zoom.utils.Bunch(app=zoom.utils.Bunch(name='hello', packages={})) >>> c = dropzone('/app/files') >>> isinstance(c, zoom.Component) True """ zoom.requires('dropzone') id = 'dropzone_' + uuid.uuid4().hex js = """ var %(id)s = new Dropzone("#%(id)s", {url: "%(url)s"}); """ % dict(id=id, url=url) html = div(classed='dropzone', id=id, **kwargs) return zoom.Component(html) #, js=js)
def standard_zoom_content_tags(): tags = 'stdout', 'alerts', 'content' content = ''.join('{{%s}}' % tag for tag in tags) return html.div(content, classed='content')
def get_alert(name, Class): """get an alert as an unordered list""" alerts = list(zoom.system.parts.parts.pop(name, [])) if alerts: return html.div(html.ul(alerts), Class='alert %s' % Class) return ''