Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
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
            ]),
        ),
    )