seitime-frappe/frappe/public/js/lib/microtemplate.js
Faris Ansari 7595fb75ba
New ListView 💥 + DataTable (#4577)
* first cut

* Code refactoring, styling

* Added Sorting

* Revert query_report to use slickgrid

* cleanup

* Edit cell working

* Add regrid, remove datatable

* Add clusterize

* Update lib, fix get_checked_items

* New ReportView

* wip

* Enable editing, fix styles

* update lib

* wip

* fix refresh rows and editable cells

* Refresh list_view every 3s, decouple refreshing logic

* Report editing fixes

* Cleanup loading fields, add column then refresh list

* [wip] New List View

* [working] Render results

* ListView is now BaseList, add new ListView and GanttView

* Create new page for each ListView

* GanttView working

* CalendarView working

* KanbanView working

* Cache list_view based on page_name

* Gantt view buttons on mobile

* Add ReportView

* Refresh datatable on render

* Setup like

* [start][filters] clean up FilterList

* [filters] refactor FilterList

* [filters] minor fix

* [filters] fix remove filter

* filter utils

* more utils, remove apply

* rewrite as class, remove 'me' references

* [filter] implement on_change to decouple parent functions

* Integrate new filters with new BaseList

* Setup freeze area for ListView

* Set breadcrumbs on setup_page

* Trigger list update from events

* Setup footnote area

* Fix Kanban Board filters

* Add filters to standard filters, then filter_list

* Remove old files

* Fix ImageView

* Some more fixes for BaseList.init

* Fix order_by on load

* Report View: remember columns

* Fix for hidden filters

* Fix for delete items

* InboxView

* Shift select checkboxes

* Fix ESLint errors

* More refactoring

- Move ListMenu to Listview
- New FileView
- Ability to add custom breadcrumbs

* FileManager working

* Tags, set filters from route options

* Custom Reports Working

* List Sidebar reports

* Report Name as title

* Fix ESLint errors

* Fix UI tests

* Fix Kanban test

* Format ID column

* [fix] Kanban cards title

* Checkbox fix

* Fix Activity Page

* Update rows in Report in place

* Child Table columns in Report View
2017-12-27 11:24:25 +05:30

137 lines
3.9 KiB
JavaScript

// Simple JavaScript Templating
// Adapted from John Resig - http://ejohn.org/ - MIT Licensed
frappe.template = {compiled: {}, debug:{}};
frappe.template.compile = function(str, name) {
var key = name || str;
if(!frappe.template.compiled[key]) {
if(str.indexOf("'")!==-1) {
str.replace(/'/g, "\\'");
//console.warn("Warning: Single quotes (') may not work in templates");
}
// replace jinja style tags
str = str.replace(/{{/g, "{%=").replace(/}}/g, "%}");
// {% if not test %} --> {% if (!test) { %}
str = str.replace(/{%\s?if\s?\s?not\s?([^\(][^%{]+)\s?%}/g, "{% if (! $1) { %}")
// {% if test %} --> {% if (test) { %}
str = str.replace(/{%\s?if\s?([^\(][^%{]+)\s?%}/g, "{% if ($1) { %}");
// {% for item in list %}
// --> {% for (var i=0, len=list.length; i<len; i++) { var item = list[i]; %}
function replacer(match, p1, p2, offset, string) {
var i = frappe.utils.get_random(3);
var len = frappe.utils.get_random(3);
return "{% for (var "+i+"=0, "+len+"="+p2+".length; "+i+"<"+len+"; "+i+"++) { var "
+p1+" = "+p2+"["+i+"]; "+p1+"._index = "+i+"; %}";
}
str = str.replace(/{%\s?for\s([a-z._]+)\sin\s([a-z._]+)\s?%}/g, replacer);
// {% endfor %} --> {% } %}
str = str.replace(/{%\s?endif\s?%}/g, "{% }; %}");
// {% else %} --> {% } else { %}
str = str.replace(/{%\s?else\s?%}/g, "{% } else { %}");
// {% endif %} --> {% } %}
str = str.replace(/{%\s?endfor\s?%}/g, "{% }; %}");
fn_str = "var _p=[],print=function(){_p.push.apply(_p,arguments)};" +
// Introduce the data as local variables using with(){}
"with(obj){\n_p.push('" +
// Convert the template into pure JavaScript
str
.replace(/[\r\t\n]/g, " ")
.split("{%").join("\t")
.replace(/((^|%})[^\t]*)'/g, "$1\r")
.replace(/\t=(.*?)%}/g, "',$1,'")
.split("\t").join("');\n")
.split("%}").join("\n_p.push('")
.split("\r").join("\\'")
+ "');}return _p.join('');";
frappe.template.debug[name] = fn_str;
try {
frappe.template.compiled[key] = new Function("obj", fn_str);
} catch (e) {
console.log("Error in Template:");
console.log(fn_str);
if(e.lineNumber) {
console.log("Error in Line "+e.lineNumber+", Col "+e.columnNumber+":");
console.log(fn_str.split("\n")[e.lineNumber - 1]);
}
}
}
return frappe.template.compiled[key];
};
frappe.render = function(str, data, name) {
return frappe.template.compile(str, name)(data);
};
frappe.render_template = function(name, data) {
if(name.indexOf(' ')!==-1) {
var template = name;
} else {
var template = frappe.templates[name];
}
if(data===undefined) {
data = {};
}
return frappe.render(template, data, name);
}
frappe.render_grid = function(opts) {
// build context
if(opts.grid) {
opts.columns = opts.grid.getColumns();
if(opts.report) {
opts.data = frappe.slickgrid_tools.get_filtered_items(opts.report.dataView);
} else if(opts.grid) {
opts.data = opts.grid.getData().getItems();
}
}
// show landscape view if columns more than 10
if (opts.columns && opts.columns.length > 10) {
opts.landscape = true;
} else {
opts.landscape = false;
}
// render content
if(!opts.content) {
opts.content = frappe.render_template("print_grid", opts);
}
// render HTML wrapper page
opts.base_url = frappe.urllib.get_base_url();
opts.print_css = frappe.boot.print_css;
var html = frappe.render_template("print_template", opts);
var w = window.open();
if(!w) {
frappe.msgprint(__("Please enable pop-ups in your browser"))
}
w.document.write(html);
w.document.close();
},
frappe.render_tree = function(opts) {
opts.base_url = frappe.urllib.get_base_url();
opts.landscape = false;
opts.print_css = frappe.boot.print_css;
var tree = frappe.render_template("print_tree", opts);
var w = window.open();
if(!w) {
frappe.msgprint(__("Please enable pop-ups in your browser"))
}
w.document.write(tree);
w.document.close();
}