; (function () { var initializing = false, fnTest = /xyz/.test(function () { xyz; }) ? /\b_super\b/ : /.*/; this.Class = function () {}; Class.extend = function (prop) { var _super = this.prototype; initializing = true; var prototype = new this(); initializing = false; for (var name in prop) { prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? function (name, fn) { return function () { var tmp = this._super; this._super = _super[name]; var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; }(name, prop[name]) : prop[name]; } function Class() { this._type = "instance"; if (!initializing && this.init) this.init.apply(this, arguments); } Class.prototype = prototype; Class._type = "class"; Class.prototype.constructor = Class; Class.extend = arguments.callee; return Class; }; })(); if (!window.frappe) window.frappe = {}; frappe.provide = function (namespace) { var nsl = namespace.split('.'); var parent = window; for (var i = 0; i < nsl.length; i++) { var n = nsl[i]; if (!parent[n]) { parent[n] = {}; } parent = parent[n]; } return parent; }; frappe.provide("locals"); frappe.provide("frappe.flags"); frappe.provide("frappe.settings"); frappe.provide("frappe.utils"); frappe.provide("frappe.ui"); frappe.provide("frappe.modules"); frappe.provide("frappe.templates"); frappe.provide("frappe.test_data"); frappe.require = function (items, callback) { if (typeof items === "string") { items = [items]; } frappe.assets.execute(items, callback); }; frappe.assets = { check: function check() { if (window._version_number != localStorage.getItem("_version_number")) { frappe.assets.clear_local_storage(); console.log("Cleared App Cache."); } if (localStorage._last_load) { var not_updated_since = new Date() - new Date(localStorage._last_load); if (not_updated_since < 10000 || not_updated_since > 86400000) { frappe.assets.clear_local_storage(); } } else { frappe.assets.clear_local_storage(); } frappe.assets.init_local_storage(); }, init_local_storage: function init_local_storage() { localStorage._last_load = new Date(); localStorage._version_number = window._version_number; if (frappe.boot) localStorage.metadata_version = frappe.boot.metadata_version; }, clear_local_storage: function clear_local_storage() { $.each(["_last_load", "_version_number", "metadata_version", "page_info", "last_visited"], function (i, key) { localStorage.removeItem(key); }); for (var key in localStorage) { if (key.indexOf("desk_assets:") === 0 || key.indexOf("_page:") === 0 || key.indexOf("_doctype:") === 0 || key.indexOf("preferred_breadcrumbs:") === 0) { localStorage.removeItem(key); } } console.log("localStorage cleared"); }, executed_: [], execute: function execute(items, callback) { var to_fetch = []; for (var i = 0, l = items.length; i < l; i++) { if (!frappe.assets.exists(items[i])) { to_fetch.push(items[i]); } } if (to_fetch.length) { frappe.assets.fetch(to_fetch, function () { frappe.assets.eval_assets(items, callback); }); } else { frappe.assets.eval_assets(items, callback); } }, eval_assets: function eval_assets(items, callback) { for (var i = 0, l = items.length; i < l; i++) { var path = items[i]; if (frappe.assets.executed_.indexOf(path) === -1) { frappe.assets.handler[frappe.assets.extn(path)](frappe.assets.get(path), path); frappe.assets.executed_.push(path); } } callback(); }, exists: function exists(src) { if (frappe.assets.executed_.indexOf(src) !== -1) { return true; } if (frappe.boot.developer_mode) { return false; } if (frappe.assets.get(src)) { return true; } else { return false; } }, fetch: function fetch(items, _callback) { frappe.call({ type: "GET", method: "frappe.client.get_js", args: { "items": items }, callback: function callback(r) { $.each(items, function (i, src) { frappe.assets.add(src, r.message[i]); }); _callback(); }, freeze: true }); }, add: function add(src, txt) { if ('localStorage' in window) { try { frappe.assets.set(src, txt); } catch (e) { frappe.assets.clear_local_storage(); frappe.assets.set(src, txt); } } }, get: function get(src) { return localStorage.getItem("desk_assets:" + src); }, set: function set(src, txt) { localStorage.setItem("desk_assets:" + src, txt); }, extn: function extn(src) { if (src.indexOf('?') != -1) { src = src.split('?').slice(-1)[0]; } return src.split('.').slice(-1)[0]; }, handler: { js: function js(txt, src) { frappe.dom.eval(txt); }, css: function css(txt, src) { frappe.dom.set_style(txt); } } }; function format(str, args) { if (str == undefined) return str; this.unkeyed_index = 0; return str.replace(/\{(\w*)\}/g, function (match, key) { if (key === '') { key = this.unkeyed_index; this.unkeyed_index++; } if (key == +key) { return args[key] !== undefined ? args[key] : match; } }.bind(this)); } if (jQuery) { jQuery.format = format; } frappe.provide("frappe.form.formatters"); frappe.form.link_formatters = {}; frappe.form.formatters = { _right: function _right(value, options) { if (options && options.inline) { return value; } else { return "
" + value + "
"; } }, Data: function Data(value) { return value == null ? "" : value; }, Select: function Select(value) { return __(frappe.form.formatters["Data"](value)); }, Float: function Float(value, docfield, options, doc) { var precision = docfield.precision || cint(frappe.boot.sysdefaults.float_precision) || null; if (docfield.options && docfield.options.trim()) { docfield.precision = precision; return frappe.form.formatters.Currency(value, docfield, options, doc); } else { if (!(options || {}).always_show_decimals && !is_null(value)) { var temp = cstr(value).split("."); if (temp[1] == undefined || cint(temp[1]) === 0) { precision = 0; } } return frappe.form.formatters._right(value == null || value === "" ? "" : format_number(value, null, precision), options); } }, Int: function Int(value, docfield, options) { return frappe.form.formatters._right(value == null ? "" : cint(value), options); }, Percent: function Percent(value, docfield, options) { return frappe.form.formatters._right(flt(value, 2) + "%", options); }, Currency: function Currency(value, docfield, options, doc) { var currency = frappe.meta.get_field_currency(docfield, doc); var precision = docfield.precision || cint(frappe.boot.sysdefaults.currency_precision) || 2; if (precision > 2) { var parts = cstr(value).split('.'); var decimals = parts.length > 1 ? parts[1] : ''; if (decimals.length < 3) { precision = 2; } else if (decimals.length < precision) { precision = decimals.length; } } value = value == null || value === "" ? "" : format_currency(value, currency, precision); if (options && options.only_value) { return value; } else { return frappe.form.formatters._right(value, options); } }, Check: function Check(value) { if (value) { return ''; } else { return ''; } }, Link: function Link(value, docfield, options, doc) { var doctype = docfield._options || docfield.options; var original_value = value; if (value && value.match(/^['"].*['"]$/)) { value.replace(/^.(.*).$/, "$1"); } if (options && (options.for_print || options.only_value)) { return value; } if (frappe.form.link_formatters[doctype]) { value = frappe.form.link_formatters[doctype](value, doc); } if (!value) { return ""; } if (value[0] == "'" && value[value.length - 1] == "'") { return value.substring(1, value.length - 1); } if (docfield && docfield.link_onclick) { return repl('%(value)s', { onclick: docfield.link_onclick.replace(/"/g, '"'), value: value }); } else if (docfield && doctype) { return repl('%(label)s', { doctype: encodeURIComponent(doctype), name: encodeURIComponent(original_value), label: __(options && options.label || value) }); } else { return value; } }, Date: function Date(value) { if (value) { value = frappe.datetime.str_to_user(value); if (value === "Invalid date") { value = null; } } return value || ""; }, DateRange: function DateRange(value) { if ($.isArray(value)) { return __("{0} to {1}").format([frappe.datetime.str_to_user(value[0]), frappe.datetime.str_to_user(value[1])]); } else { return value || ""; } }, Datetime: function Datetime(value) { if (value) { var m = moment(frappe.datetime.convert_to_user_tz(value)); if (frappe.boot.sysdefaults.time_zone) { m = m.tz(frappe.boot.sysdefaults.time_zone); } return m.format(frappe.boot.sysdefaults.date_format.toUpperCase() + ', h:mm a z'); } else { return ""; } }, Text: function Text(value) { if (value) { var tags = ["' + v + ''; }); return html; }, Comment: function Comment(value) { var html = ""; $.each(JSON.parse(value || "[]"), function (i, v) { if (v) html += '' + v.comment + ''; }); return html; }, Assign: function Assign(value) { var html = ""; $.each(JSON.parse(value || "[]"), function (i, v) { if (v) html += '' + v + ''; }); return html; }, SmallText: function SmallText(value) { return frappe.form.formatters.Text(value); }, TextEditor: function TextEditor(value) { return frappe.form.formatters.Text(value); }, Code: function Code(value) { return "
" + (value == null ? "" : $("
").text(value).html()) + "
"; }, WorkflowState: function WorkflowState(value) { var workflow_state = frappe.get_doc("Workflow State", value); if (workflow_state) { return repl("\ %(value)s", { value: value, style: workflow_state.style.toLowerCase(), icon: workflow_state.icon }); } else { return "" + value + ""; } }, Email: function Email(value) { return $("
").text(value).html(); } }; frappe.form.get_formatter = function (fieldtype) { if (!fieldtype) fieldtype = "Data"; return frappe.form.formatters[fieldtype.replace(/ /g, "")] || frappe.form.formatters.Data; }; frappe.format = function (value, df, options, doc) { if (!df) df = { "fieldtype": "Data" }; var fieldtype = df.fieldtype || "Data"; if (fieldtype === "Dynamic Link") { fieldtype = "Link"; df._options = doc ? doc[df.options] : null; } var formatter = df.formatter || frappe.form.get_formatter(fieldtype); var formatted = formatter(value, df, options, doc); if (typeof formatted == "string") formatted = frappe.dom.remove_script_and_style(formatted); return formatted; }; frappe.get_format_helper = function (doc) { var helper = { get_formatted: function get_formatted(fieldname) { var df = frappe.meta.get_docfield(doc.doctype, fieldname); if (!df) { console.log("fieldname not found: " + fieldname); } return frappe.format(doc[fieldname], df, { inline: 1 }, doc); } }; $.extend(helper, doc); return helper; };frappe.templates['modal'] = ' '; frappe.provide('frappe.dom'); frappe.dom = { id_count: 0, freeze_count: 0, by_id: function by_id(id) { return document.getElementById(id); }, set_unique_id: function set_unique_id(ele) { var $ele = $(ele); if ($ele.attr('id')) { return $ele.attr('id'); } var id = 'unique-' + frappe.dom.id_count; $ele.attr('id', id); frappe.dom.id_count++; return id; }, eval: function _eval(txt) { if (!txt) return; var el = document.createElement('script'); el.appendChild(document.createTextNode(txt)); document.getElementsByTagName('head')[0].appendChild(el); }, remove_script_and_style: function remove_script_and_style(txt) { var div = document.createElement('div'); div.innerHTML = txt; var found = false; ["script", "style", "noscript", "title", "meta", "base", "head"].forEach(function (e, i) { var elements = div.getElementsByTagName(e); var i = elements.length; while (i--) { found = true; elements[i].parentNode.removeChild(elements[i]); } }); var elements = div.getElementsByTagName('link'); var i = elements.length; while (i--) { if (elements[i].getAttribute("rel") == "stylesheet") { found = true; elements[i].parentNode.removeChild(elements[i]); } } if (found) { return div.innerHTML; } else { return txt; } }, is_element_in_viewport: function is_element_in_viewport(el) { if (typeof jQuery === "function" && el instanceof jQuery) { el = el[0]; } var rect = el.getBoundingClientRect(); return rect.top >= 0 && rect.left >= 0; }, set_style: function set_style(txt, id) { if (!txt) return; var se = document.createElement('style'); se.type = "text/css"; if (id) { var element = document.getElementById(id); if (element) { element.parentNode.removeChild(element); } se.id = id; } if (se.styleSheet) { se.styleSheet.cssText = txt; } else { se.appendChild(document.createTextNode(txt)); } document.getElementsByTagName('head')[0].appendChild(se); }, add: function add(parent, newtag, className, cs, innerHTML, onclick) { if (parent && parent.substr) parent = frappe.dom.by_id(parent); var c = document.createElement(newtag); if (parent) parent.appendChild(c); if (className) { if (newtag.toLowerCase() == 'img') c.src = className;else c.className = className; } if (cs) frappe.dom.css(c, cs); if (innerHTML) c.innerHTML = innerHTML; if (onclick) c.onclick = onclick; return c; }, css: function css(ele, s) { if (ele && s) { $.extend(ele.style, s); } return ele; }, freeze: function freeze(msg, css_class) { if (!$('#freeze').length) { var freeze = $('').on("click", function () { if (cur_frm && cur_frm.cur_grid) { cur_frm.cur_grid.toggle_view(); return false; } }).appendTo("#body_div"); freeze.html(repl('

%(msg)s

', { msg: msg || "" })); setTimeout(function () { freeze.addClass("in"); }, 1); } else { $("#freeze").addClass("in"); } if (css_class) { $("#freeze").addClass(css_class); } frappe.dom.freeze_count++; }, unfreeze: function unfreeze() { if (!frappe.dom.freeze_count) return; frappe.dom.freeze_count--; if (!frappe.dom.freeze_count) { var freeze = $('#freeze').removeClass("in").remove(); } }, save_selection: function save_selection() { if (window.getSelection) { var sel = window.getSelection(); if (sel.getRangeAt && sel.rangeCount) { var ranges = []; for (var i = 0, len = sel.rangeCount; i < len; ++i) { ranges.push(sel.getRangeAt(i)); } return ranges; } } else if (document.selection && document.selection.createRange) { return document.selection.createRange(); } return null; }, restore_selection: function restore_selection(savedSel) { if (savedSel) { if (window.getSelection) { var sel = window.getSelection(); sel.removeAllRanges(); for (var i = 0, len = savedSel.length; i < len; ++i) { sel.addRange(savedSel[i]); } } else if (document.selection && savedSel.select) { savedSel.select(); } } }, is_touchscreen: function is_touchscreen() { return 'ontouchstart' in window; } }; frappe.ellipsis = function (text, max) { if (!max) max = 20; text = cstr(text); if (text.length > max) { text = text.substr(0, max) + '...'; } return text; }; frappe.run_serially = function (tasks) { var result = Promise.resolve(); tasks.forEach(function (task) { if (task) { result = result.then ? result.then(task) : Promise.resolve(); } }); return result; }; frappe.timeout = function (seconds) { return new Promise(function (resolve) { setTimeout(function () { return resolve(); }, seconds * 1000); }); }; frappe.scrub = function (text) { return text.replace(/ /g, "_").toLowerCase(); }; frappe.get_modal = function (title, content) { return $(frappe.render_template("modal", { title: title, content: content })).appendTo(document.body); }; (function ($) { $.fn.add_options = function (options_list) { for (var i = 0; i < options_list.length; i++) { var v = options_list[i]; if (is_null(v)) { var value = null; var label = null; } else { var is_value_null = is_null(v.value); var is_label_null = is_null(v.label); if (is_value_null && is_label_null) { var value = v; var label = __(v); } else { var value = is_value_null ? "" : v.value; var label = is_label_null ? __(value) : __(v.label); } } $('