From 6c80e565322180bd852281f3b626a9c5b1cffe19 Mon Sep 17 00:00:00 2001
From: Prateeksha Singh
Date: Thu, 2 Aug 2018 19:32:18 +0530
Subject: [PATCH] implement webform list using Datatable
---
frappe/public/build.json | 3 +-
.../doctype/web_form/templates/web_form.html | 10 ++--
frappe/website/doctype/web_form/web_form.py | 4 ++
frappe/website/js/web_form.js | 52 ++++++++++++++++++-
frappe/www/list.py | 7 ++-
5 files changed, 69 insertions(+), 7 deletions(-)
diff --git a/frappe/public/build.json b/frappe/public/build.json
index f9f1462776..99b783425d 100755
--- a/frappe/public/build.json
+++ b/frappe/public/build.json
@@ -9,7 +9,8 @@
"public/less/form.less",
"public/less/controls.less",
"public/less/chat.less",
- "public/less/form_grid.less"
+ "public/less/form_grid.less",
+ "node_modules/frappe-datatable/dist/frappe-datatable.css"
],
"concat:js/moment-bundle.min.js": [
"node_modules/moment/min/moment-with-locales.min.js",
diff --git a/frappe/website/doctype/web_form/templates/web_form.html b/frappe/website/doctype/web_form/templates/web_form.html
index 301c8186a0..bb3ebccab2 100644
--- a/frappe/website/doctype/web_form/templates/web_form.html
+++ b/frappe/website/doctype/web_form/templates/web_form.html
@@ -62,8 +62,12 @@
{% elif is_list %}
- {% include "templates/includes/list/list.html" %}
-
+
{% else %}
@@ -180,7 +184,7 @@ window.web_form_settings = {
login_required: {{ 1 if login_required else 0 }},
max_attachment_size:{{ max_attachment_size }},
moment_date_format: "{{ frappe.date_format.upper() }}",
- is_list: {{ frappe.utils.cint(is_list) }},
+ is_list: {{ frappe.utils.cint(is_list) }}
}
{% if row_template %}web_form_settings.web_form_row_template = "{{ row_template }}";{% endif %}
diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py
index b70aa7f3bc..4e470c94ab 100644
--- a/frappe/website/doctype/web_form/web_form.py
+++ b/frappe/website/doctype/web_form/web_form.py
@@ -508,3 +508,7 @@ def get_form_data(doctype, docname, web_form_name):
out.links = links
return out
+
+@frappe.whitelist()
+def get_in_list_view_fields(doctype):
+ return [df.as_dict() for df in frappe.get_meta(doctype).fields if df.in_list_view]
diff --git a/frappe/website/js/web_form.js b/frappe/website/js/web_form.js
index facd90daaa..609a6226d8 100644
--- a/frappe/website/js/web_form.js
+++ b/frappe/website/js/web_form.js
@@ -1,8 +1,10 @@
import WebForm from './webform';
+import DataTable from 'frappe-datatable';
frappe.ready(function() {
if(web_form_settings.is_list) {
- $('body').css('display', 'block');
+ $('body').show();
+ make_datatable('.web-form-list .results', web_form_settings.web_form_doctype);
return;
}
@@ -159,4 +161,52 @@ frappe.ready(function() {
});
});
+window.web_list_start = 0;
+window.web_list_page_length = 20;
+window.web_list_datatable;
+
+window.make_datatable = function make_datatable(container, doctype) {
+ return new Promise(resolve => {
+ frappe.call({
+ method: 'frappe.website.doctype.web_form.web_form.get_in_list_view_fields',
+ args: { doctype },
+ callback: (r) => {
+ const docfields = r.message;
+
+ frappe.call({
+ method: 'frappe.client.get_list',
+ args: { doctype, fields: docfields.map(df => df.fieldname) },
+ callback: (r) => {
+ const data = r.message || [];
+
+ window.web_list_datatable = new DataTable(container, {
+ columns: docfields.map(df => ({ name: df.label, id: df.fieldname })),
+ data,
+ layout: 'fluid'
+ });
+
+ $(".web-form-list .btn-more").on('click', () => {
+ window.web_list_start += window.web_list_page_length;
+ frappe.call({
+ method: 'frappe.client.get_list',
+ args: {
+ doctype,
+ fields: docfields.map(df => df.fieldname),
+ limit_start: window.web_list_start
+ },
+ callback: (r) => {
+ const data = r.message || [];
+
+ window.web_list_datatable.appendRows(data);
+ }
+ });
+ });
+
+ resolve(window.web_list_datatable);
+ }
+ });
+ }
+ });
+ });
+}
diff --git a/frappe/www/list.py b/frappe/www/list.py
index 80e59f530d..9977eeb257 100644
--- a/frappe/www/list.py
+++ b/frappe/www/list.py
@@ -2,7 +2,7 @@
# MIT License. See license.txt
from __future__ import unicode_literals
-import frappe
+import frappe, json
from frappe.utils import cint, quoted
from frappe.website.render import resolve_path
from frappe.model.document import get_controller, Document
@@ -86,10 +86,13 @@ def get(doctype, txt=None, limit_start=0, limit=20, **kwargs):
rendered_row = frappe.render_template(row_template, new_context, is_path=True)
result.append(rendered_row)
+ from frappe.utils.response import json_handler
+
return {
+ "raw_result": json.dumps(raw_result, default=json_handler),
"result": result,
"show_more": show_more,
- "next_start": next_start
+ "next_start": next_start,
}
def set_route(context):