Commit 59ce6bc7 by aa.gusti

datatable date

1 parent 8ec0c6d1
...@@ -500,6 +500,7 @@ def add_view_config(config, module, view_name): ...@@ -500,6 +500,7 @@ def add_view_config(config, module, view_name):
renderer=renderers) renderer=renderers)
except Exception as e: except Exception as e:
log.error(str(e)) log.error(str(e))
log.error(dict(row.__dict__))
config.scan('.') config.scan('.')
......
...@@ -46,7 +46,10 @@ def routes_callback(typ, **kwargs): ...@@ -46,7 +46,10 @@ def routes_callback(typ, **kwargs):
return None return None
value = splited_last value = splited_last
elif field == "class_view": elif field == "class_view":
if data["def_func"] == "list" and not data["class_view"]: if data["def_func"] == "list" and not data["class_view"] \
or splited_last not in ["add", "edit", "delete", "view", "act", "report"]:
log.debug(splited[-1:])
log.debug(data)
return "_".join(splited[1:]) return "_".join(splited[1:])
if splited_last == "menu": if splited_last == "menu":
......
...@@ -136,7 +136,7 @@ class BaseView(object): ...@@ -136,7 +136,7 @@ class BaseView(object):
self.list_buttons = (btn_add, btn_close) self.list_buttons = (btn_add, btn_close)
self.columns = None self.columns = None
self.form_params = dict(scripts="") self.form_params = dict(scripts="")
self.list_url = '' self.list_url = []
self.list_route = '' self.list_route = ''
self.list_schema = colander.Schema self.list_schema = colander.Schema
self.allow_view = True self.allow_view = True
...@@ -145,7 +145,9 @@ class BaseView(object): ...@@ -145,7 +145,9 @@ class BaseView(object):
self.allow_post = False self.allow_post = False
self.allow_unpost = False self.allow_unpost = False
self.state_save = False self.state_save = False
self.server_side = True
self.list_form = None self.list_form = None
self.form_list = None
self.filter_columns = False self.filter_columns = False
self.form_scripts = """ self.form_scripts = """
...@@ -243,16 +245,18 @@ class BaseView(object): ...@@ -243,16 +245,18 @@ class BaseView(object):
allow_unpost = kwargs.get("allow_unpost", self.allow_unpost) allow_unpost = kwargs.get("allow_unpost", self.allow_unpost)
state_save = kwargs.get("state_save", self.state_save) state_save = kwargs.get("state_save", self.state_save)
filter_columns = kwargs.get("filter_columns", self.filter_columns) filter_columns = kwargs.get("filter_columns", self.filter_columns)
server_side = kwargs.get("server_side", self.server_side)
schema = self.list_schema() schema = self.list_schema()
schema = schema.bind(request=self.req) schema = schema.bind(request=self.req)
list_url = kwargs.get("list_url", None)
new_buttons = kwargs.get("new_buttons") new_buttons = kwargs.get("new_buttons")
if not new_buttons: if not new_buttons:
new_buttons = self.new_buttons new_buttons = self.new_buttons
if not list_url: list_url = kwargs.get("list_url", self.list_url)
if not list_url and self.list_route:
list_url = self.req.route_url(self.list_route) list_url = self.req.route_url(self.list_route)
action_suffix = kwargs.get("action_suffix", "/grid/act") list_url = list_url and list_url[0:1] != "/" and "/" + list_url or list_url
action_suffix = list_url and kwargs.get("action_suffix", "/grid/act") or None
table = DeTable(schema, table = DeTable(schema,
action=list_url, action=list_url,
action_suffix=action_suffix, action_suffix=action_suffix,
...@@ -266,9 +270,14 @@ class BaseView(object): ...@@ -266,9 +270,14 @@ class BaseView(object):
state_save=state_save, state_save=state_save,
new_buttons=new_buttons, new_buttons=new_buttons,
filter_columns=filter_columns, filter_columns=filter_columns,
server_side=server_side
) )
resources = table.get_widget_resources() resources = table.get_widget_resources()
# resources=dict(css="", js="") # resources=dict(css="", js="")
if kwargs.get("is_object"):
return dict(form=table, scripts="", css=resources["css"],
js=resources["js"])
return dict(form=table.render(), scripts="", css=resources["css"], return dict(form=table.render(), scripts="", css=resources["css"],
js=resources["js"]) js=resources["js"])
...@@ -294,9 +303,13 @@ class BaseView(object): ...@@ -294,9 +303,13 @@ class BaseView(object):
def get_list(self, **kwargs): def get_list(self, **kwargs):
url = [] url = []
select_list = {} select_list = {}
list_schema = kwargs.get("list_schema")
if not list_schema:
list_schema = self.list_schema and self.list_schema or self.form_list
if not self.columns: if not self.columns:
columns = [] columns = []
for d in self.list_schema(): for d in list_schema():
global_search = True global_search = True
search_method = hasattr(d, "search_method") \ search_method = hasattr(d, "search_method") \
and getattr(d, "search_method") or "string_contains" and getattr(d, "search_method") or "string_contains"
...@@ -406,11 +419,17 @@ class BaseView(object): ...@@ -406,11 +419,17 @@ class BaseView(object):
def next_edit(self, form, **kwargs): def next_edit(self, form, **kwargs):
return self.route_list(**kwargs) return self.route_list(**kwargs)
def returned_form(self, form, table, **kwargs): def returned_form(self, form, table=None, **kwargs):
resources = form.get_widget_resources() resources = form.get_widget_resources()
readonly = "readonly" in kwargs and kwargs["readonly"] or False readonly = "readonly" in kwargs and kwargs["readonly"] or False
kwargs["readonly"] = readonly kwargs["readonly"] = readonly
is_object = kwargs.get("is_object", self.is_object) is_object = kwargs.get("is_object", self.is_object)
if dict == type(table):
resources["js"].extend(set(table["js"]) - set(resources["js"]))
resources["css"].extend(set(table["css"]) - set(resources["css"]))
table = table["form"]
# resources["js"] = list(resources["js"])
# resources["css"] = list(resources["css"])
if is_object: if is_object:
return dict(form=form, return dict(form=form,
table=table and table.render() or None, table=table and table.render() or None,
...@@ -566,10 +585,10 @@ class BaseView(object): ...@@ -566,10 +585,10 @@ class BaseView(object):
def view_add(self, **kwargs): def view_add(self, **kwargs):
# bindings = self.get_bindings() # bindings = self.get_bindings()
form = self.get_form(self.add_schema, **kwargs) form = self.get_form(self.add_schema, **kwargs)
table = self.get_item_table(**kwargs)
resources = form.get_widget_resources() resources = form.get_widget_resources()
is_object = kwargs.get("is_object", self.is_object) is_object = kwargs.get("is_object", self.is_object)
kwargs["is_object"] = is_object kwargs["is_object"] = is_object
table = self.get_item_table(**kwargs)
if self.req.POST: if self.req.POST:
if 'save' in self.req.POST: if 'save' in self.req.POST:
controls = self.req.POST.items() controls = self.req.POST.items()
...@@ -657,7 +676,11 @@ class BaseView(object): ...@@ -657,7 +676,11 @@ class BaseView(object):
return d return d
def get_item_table(self, row=None, **kwargs): def get_item_table(self, row=None, **kwargs):
return None if not self.form_list:
return None
self.list_schema = self.form_list
kwargs["is_object"] = True
return self.view_list(**kwargs)
def before_edit(self, form): def before_edit(self, form):
""" """
...@@ -748,6 +771,7 @@ class BaseView(object): ...@@ -748,6 +771,7 @@ class BaseView(object):
form = self.get_form( form = self.get_form(
self.edit_schema, buttons=(btn_delete, btn_cancel)) self.edit_schema, buttons=(btn_delete, btn_cancel))
table = self.get_item_table(row) table = self.get_item_table(row)
resources = form.get_widget_resources() resources = form.get_widget_resources()
form.set_appstruct(self.get_values(row)) form.set_appstruct(self.get_values(row))
kwargs["readonly"] = True kwargs["readonly"] = True
......
...@@ -140,7 +140,12 @@ class ListSchema(colander.Schema): ...@@ -140,7 +140,12 @@ class ListSchema(colander.Schema):
path = colander.SchemaNode( path = colander.SchemaNode(
colander.String(), title='Path', colander.String(), title='Path',
searchable=True) searchable=True)
template = colander.SchemaNode( class_view = colander.SchemaNode(
colander.String(),
searchable=False,
global_search=False,
)
def_func = colander.SchemaNode(
colander.String(), colander.String(),
searchable=False, searchable=False,
global_search=False, global_search=False,
......
...@@ -107,7 +107,7 @@ class DeTable(field.Field): ...@@ -107,7 +107,7 @@ class DeTable(field.Field):
filters='true', filters='true',
paginates='true', paginates='true',
params="", params="",
server_side='true', server_side=True,
state_save=True, state_save=True,
data=[], data=[],
allow_edit=True, allow_edit=True,
...@@ -123,6 +123,7 @@ class DeTable(field.Field): ...@@ -123,6 +123,7 @@ class DeTable(field.Field):
self.rows = kw.get("rows") self.rows = kw.get("rows")
self.action = action self.action = action
self.tableid = tableid self.tableid = tableid
self.data = data
new_buttons = kw.get("new_buttons") or () new_buttons = kw.get("new_buttons") or ()
...@@ -192,8 +193,7 @@ class DeTable(field.Field): ...@@ -192,8 +193,7 @@ class DeTable(field.Field):
table_widget = widget.TableWidget() table_widget = widget.TableWidget()
self.widget = table_widget self.widget = table_widget
self.server_side = json.dumps(server_side)
self.server_side = server_side
self.data = data self.data = data
columns = [] columns = []
headers = [] headers = []
...@@ -236,10 +236,13 @@ class DeTable(field.Field): ...@@ -236,10 +236,13 @@ class DeTable(field.Field):
if isinstance(f.widget, deform.widget.HiddenWidget): if isinstance(f.widget, deform.widget.HiddenWidget):
d["visible"] = False d["visible"] = False
if isinstance(f.widget, deform.widget.CheckboxWidget): elif isinstance(f.widget, deform.widget.CheckboxWidget):
d.update(self.widget_checkbox(f)) d.update(self.widget_checkbox(f))
elif isinstance(f.widget, deform.widget.SelectWidget):
d.update(self.widget_select(f))
else: else:
d["checkbox"] = False d["wg_checkbox"] = False
d["wg_select"] = False
if hasattr(f, "url"): if hasattr(f, "url"):
url = f.url url = f.url
d["render"] = """ d["render"] = """
...@@ -294,7 +297,6 @@ class DeTable(field.Field): ...@@ -294,7 +297,6 @@ class DeTable(field.Field):
# cols2.append(data) # cols2.append(data)
filter_scripts = self.get_filter_scripts(f) filter_scripts = self.get_filter_scripts(f)
self.filter_scripts = filter_scripts self.filter_scripts = filter_scripts
self.filter_form = filter_form self.filter_form = filter_form
...@@ -313,8 +315,8 @@ class DeTable(field.Field): ...@@ -313,8 +315,8 @@ class DeTable(field.Field):
def widget_checkbox(self, column): def widget_checkbox(self, column):
d = {} d = {}
d["checkbox"] = True d["wg_checkbox"] = True
d["check_val"] = [column.widget.true_val, column.widget.false_val] d["wg_checkbox_val"] = [column.widget.true_val, column.widget.false_val]
d["className"] = "text-center" d["className"] = "text-center"
d["width"] = "30pt" d["width"] = "30pt"
# d["render"] = """ # d["render"] = """
...@@ -329,6 +331,16 @@ class DeTable(field.Field): ...@@ -329,6 +331,16 @@ class DeTable(field.Field):
return d return d
def widget_select(self, column):
d = {}
d["wg_select"] = True
d["wg_select_val"] = column.widget.values
if column.widget.values:
for val in column.widget.values:
if hasattr(column, f"color_{val}"):
d[f"color_{val}"] = getattr(column, f"color_{val}")
return d
def action_url(self, f): def action_url(self, f):
act = "" act = ""
if self.allow_view: if self.allow_view:
...@@ -365,8 +377,8 @@ class DeTable(field.Field): ...@@ -365,8 +377,8 @@ class DeTable(field.Field):
txt = f'id="{col_id}" data-index={field_index} ' txt = f'id="{col_id}" data-index={field_index} '
html += '<div class="form-group">' html += '<div class="form-group">'
if isinstance(f.widget, deform.widget.CheckboxWidget): if isinstance(f.widget, deform.widget.CheckboxWidget):
check_val = [f.widget.true_val, f.widget.false_val] wg_check_val = [f.widget.true_val, f.widget.false_val]
radio_val = [["", 'Semua'], [check_val[0], 'Aktif'], [check_val[1], 'Pasif']] radio_val = [["", 'Semua'], [wg_check_val[0], 'Aktif'], [wg_check_val[1], 'Pasif']]
html += '<label class="" for="' + col_id + '">' + f.title + '</label>' html += '<label class="" for="' + col_id + '">' + f.title + '</label>'
html += '<div class="input-group" id="' + col_id + '">' html += '<div class="input-group" id="' + col_id + '">'
for rdo in range(len(radio_val)): for rdo in range(len(radio_val)):
...@@ -381,26 +393,43 @@ class DeTable(field.Field): ...@@ -381,26 +393,43 @@ class DeTable(field.Field):
html += f'{radio_val[rdo][1]}</label>' html += f'{radio_val[rdo][1]}</label>'
html += '</label>' html += '</label>'
html += '</div>' html += '</div>'
elif isinstance(f.widget, deform.widget.SelectWidget):
# elif isinstance(f.typ, colander.Date): wg_select_val = f.widget.values
# requirements = f.widget.requirements html += f'<select class="form-control {self.tableid}-control-filter"'
# for requirement in requirements: html += f'placeholder="{f.title}" {txt}/>'
# if type(requirement) == dict and "js" in requirement: html += '<option value="">Semua</option>'
# for req in requirement: for key in wg_select_val:
# html += f'<option value="{key}">{wg_select_val[key]}</option>'
# html += f'<input type="text" class="form-control {self.tableid}-control-filter hasDatePicker"' html += '</select>'
# html += f'placeholder="{f.title}" {txt}/>'
# html += """ elif isinstance(f.typ, colander.Date):
# <script type="text/javascript"> html += f'<div class="form-group" {txt}>'
# deform.addCallback( html += f'<div class="input-group">'
# '%s', html += f'<span class="input-group-addon">{f.title}</span>'
# function deform_cb(oid) { html += f'<span class="input-group-addon"><input type="date" class="form-control {self.tableid}-control-filter hasDatePicker"'
# $('#'+oid).datepicker(); html += f'data-index={field_index} placeholder="{f.title} Awal" '
# } html += f'name="{col_id}" id="{col_id}-min"/></span>'
# ); html += f'<span class="input-group-addon"><input type="date" class="form-control {self.tableid}-control-filter hasDatePicker"'
# </script> html += f'data-index={field_index} placeholder="{f.title} Akhir" '
# """ % self.tableid html += f'name="{col_id}" id="{col_id}-max" /></span>'
html += f'</div>'
html += f'</div>'
# html += """
# <script type="text/javascript">
# deform.addCallback(
# '%s',
# function deform_cb(oid) {
# $('#'+oid).datepicker();
# }
# );
# </script>
# """ % self.tableid
# requirements = f.widget.requirements
# for requirement in requirements:
# if type(requirement) == dict and "js" in requirement:
# for req in requirement:
#
else: else:
html += f'<input type="text" class="form-control {self.tableid}-control-filter"' html += f'<input type="text" class="form-control {self.tableid}-control-filter"'
html += f'placeholder="{f.title}" {txt}/>' html += f'placeholder="{f.title}" {txt}/>'
...@@ -410,6 +439,7 @@ class DeTable(field.Field): ...@@ -410,6 +439,7 @@ class DeTable(field.Field):
def get_filter_scripts(self, f): def get_filter_scripts(self, f):
return "" return ""
""" """
for (let co in ${tableid}Columns) { for (let co in ${tableid}Columns) {
if (${tableid}Columns[co].checkbox === true) { if (${tableid}Columns[co].checkbox === true) {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!