def table(self): _html = DIV() if self.create_url and self.create_url != '': _a = A('', _href=self.create_url, _class='button', _style='margin-bottom: 1rem;') _span = SPAN(_class='icon is-small') _span.append(I(_class='fas fa-plus')) _a.append(_span) _a.append(SPAN('New')) _html.append(_a) _table = TABLE(_id='datatables_table', _class='compact stripe hover cell-border order-column', _style='padding-top: 1rem;') _thead = THEAD() _tr = TR() for field in self.fields: _tr.append(TH(field.label, _class='datatables-header')) _tr.append( TH('ACTIONS', _class='datatables-header has-text-centered', _style='color: black; width: 1px; white-space: nowrap;')) _thead.append(_tr) _table.append(_thead) _table.append(TBODY()) _html.append(_table) return str(_html)
def render_table_header(self): up = I(**self.param.grid_class_style.get("grid-sorter-icon-up")) dw = I(**self.param.grid_class_style.get("grid-sorter-icon-down")) columns = [] sort_order = request.query.get("orderby", "") for index, field in enumerate(self.param.fields): if field.readable and (field.type != "id" or self.param.show_id): key = "%s.%s" % (field.tablename, field.name) heading = ( self.param.headings[index] if index < len(self.param.headings) else field.label ) heading = title(heading) # add the sort order query parm sort_query_parms = dict(self.query_parms) attrs = {} if isinstance(field, FieldVirtual): col = DIV(heading) elif key == sort_order: sort_query_parms["orderby"] = "~" + key url = URL(self.endpoint, vars=sort_query_parms) attrs = self.attributes_plugin.link(url=url) col = A(heading, up, **attrs) else: sort_query_parms["orderby"] = key url = URL(self.endpoint, vars=sort_query_parms) attrs = self.attributes_plugin.link(url=url) col = A(heading, dw if "~" + key == sort_order else "", **attrs) columns.append((key, col)) thead = THEAD(_class=self.param.grid_class_style.classes.get("grid-thead", "")) for key, col in columns: col_class = " grid-col-%s" % key thead.append( TH( col, _class=self.param.grid_class_style.classes.get("grid-th", "") + col_class, _style=self.param.grid_class_style.styles.get("grid-th"), ) ) if ( self.param.details or self.param.editable or self.param.deletable or self.param.pre_action_buttons or self.param.post_action_buttons ): thead.append( TH("", **self.param.grid_class_style.get("grid-th-action-button")) ) return thead
def render_table_header(self): _thead = THEAD() for index, field in enumerate(self.fields): if field.name not in [x.name for x in self.hidden_fields] and ( field.name != 'id' or (field.name == 'id' and self.show_id)): try: heading = self.headings[index] except: if field.table == self.tablename: heading = field.label else: heading = str(field.table) # add the sort order query parm sort_query_parms = dict(self.query_parms) sort_query_parms['sort'] = index current_sort_dir = 'asc' if '%s.%s' % (field.tablename, field.name) in self.storage_values['orderby']: sort_query_parms['sort'] = -index _h = A(heading.replace('_', ' ').upper(), _href=URL(self.endpoint, vars=sort_query_parms)) _h.append(SPAN(I(_class='fas fa-sort-up'), _class='is-pulled-right')) elif '~%s.%s' % (field.tablename, field.name) in self.storage_values['orderby']: _h = A(heading.replace('_', ' ').upper(), _href=URL(self.endpoint, vars=sort_query_parms)) _h.append(SPAN(I(_class='fas fa-sort-down'), _class='is-pulled-right')) else: _h = A(heading.replace('_', ' ').upper(), _href=URL(self.endpoint, vars=sort_query_parms)) if 'sort_dir' in sort_query_parms: current_sort_dir = sort_query_parms['sort_dir'] del sort_query_parms['sort_dir'] if index == int(request.query.get('sort', 0)) and current_sort_dir == 'asc': sort_query_parms['sort_dir'] = 'desc' _th = TH() _th.append(_h) _thead.append(_th) if self.editable or self.deletable: _thead.append(TH('ACTIONS', _style='text-align: center; width: 1px; white-space: nowrap;')) return _thead
def render_table_header(self): up = I(**self.param.grid_class_style.get("grid-sorter-icon-up")) dw = I(**self.param.grid_class_style.get("grid-sorter-icon-down")) columns = [] sort_order = request.query.get("orderby", "") for index, field in enumerate(self.param.fields): if field.readable and (field.type != "id" or self.param.show_id): key = "%s.%s" % (field.tablename, field.name) heading = (self.param.headings[index] if index < len(self.param.headings) else field.label) heading = title(heading) # add the sort order query parm sort_query_parms = dict(self.query_parms) if key == sort_order: sort_query_parms["orderby"] = "~" + key href = URL(self.endpoint, vars=sort_query_parms) col = A(heading, up, _href=href) else: sort_query_parms["orderby"] = key href = URL(self.endpoint, vars=sort_query_parms) col = A(heading, dw if "~" + key == sort_order else "", _href=href) columns.append((key, col)) thead = THEAD() for key, col in columns: col_class = "grid-col-%s" % key thead.append( TH( col, _class=self.param.grid_class_style.classes.get( "grid-th", "") + col_class, _style=self.param.grid_class_style.styles.get("grid-th"), )) if self.param.details or self.param.editable or self.param.deletable: thead.append( TH("", **self.param.grid_class_style.get('grid-th-action-button'))) return thead
def sql2table( tbl, db, tbl_query=None, order_by=None, rows_on_page=13, caller="index", csv=False, pagi=False, links=[], hlinks=[], fld_links={}, fld_skip=[ 0, ], fld_length=15, page_d={}, show_thead=True, ): def stop_button(): return A('!', _title='stop', _role='button', _style="background-color:lightgray;color:black;") if not tbl in db.tables: return f"unknown tbl: {tbl}" if tbl_query is None: tbl_query = db[tbl].id > 0 if tbl_query and not isinstance(tbl_query, pydal.objects.Query): return f"bad tbl_query! tbl: {tbl}" if order_by is None: order_by = ~db[tbl].id try: pg = int(page_d.get("page", 1)) except (ValueError, TypeError): pg = 1 table_items = len(db(tbl_query).select()) if rows_on_page > table_items: rows_on_page = table_items if table_items == 0: show_thead = False max_pages, rem = divmod(table_items, rows_on_page) if table_items else (0, 0) if rem: max_pages += 1 limitby = ((pg - 1) * rows_on_page, pg * rows_on_page) if not pagi: rows_on_page = table_items limitby = (0, table_items) rows = db(tbl_query).select(orderby=order_by, limitby=limitby) ij_start = -len(links) ff = [f for f in db[tbl].fields] hh = [db[tbl][f].label for f in ff] def h_func(x, jj): if jj < 0: if len(hlinks) >= -jj: return hlinks[len(hlinks) + jj] return "act" if jj in fld_skip: return '' if not x is None and isinstance(x, str) and len(x) > fld_length: x = x[:fld_length] + '...' return f"{x}" def r_func(x, ii, r, t, f_nm): if ii < 0: if len(links) >= -ii: return links[len(links) + ii](t, r.id) return "act" if ii in fld_skip: return '' if ii in fld_links: return fld_links[ii](t, x, r.id) if f_nm in fld_links: return fld_links[f_nm](t, x, r.id) if not x is None and isinstance(x, str) and len(x) > fld_length: x = x[:fld_length] + '~' return f"{x}" return DIV( SPAN("table_name: ", ), SPAN(f"{tbl}", _style="color:red"), SPAN(f"; {table_items} rows, {rows_on_page} rows_on_page, {pg} page "), DIV( # <div> SPAN( A( "prev", _role="button", _href=URL( caller, vars=dict(page=pg - 1 if pg > 1 else pg), ), ) if pg > 1 else stop_button(), A( "next", _role="button", _href=URL( caller, vars=dict(page=pg + 1 if pg < max_pages else pg), ), ) if pg < max_pages else stop_button(), ) if pagi else "", SPAN( A( "csv", _role="button", _title="table to csv file", _href=URL( "some_func", vars=dict(t_=tbl, c="a"), ), ), A( "xls", _role="button", _title="table to xls file", _href=URL( "some_func", vars=dict(t_=tbl, c="b"), ), ), ) if csv else "", ), # </div> TABLE( THEAD( TR(*[ TD(H6(h_func(hh[j], j))) for j in range(ij_start, len(hh)) ])) if show_thead else "", TBODY(*[ TR(*[ TD(r_func(row[ff[i]], i, row, tbl, ff[i])) for i in range(ij_start, len(ff)) ]) for row in rows ]), ), )