New Build System: Rollup (#5010)
* JS build working * Css build working! * Uglify JS in production * fix codacy * Add frappe.commands.popen * FIx ESLint errors * Add socket.io to package.json * ignore subprocess warnings * Add babel-runtime * sleep 20 after bench start * remove set -e * [FIX] non-shell subprocess call * [FIX] use shell = False * split commands
This commit is contained in:
parent
ec3aedf358
commit
92e8856588
43 changed files with 2727 additions and 573 deletions
38
.eslintrc
38
.eslintrc
|
|
@ -4,6 +4,10 @@
|
|||
"node": true,
|
||||
"es6": true
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 6,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"extends": "eslint:recommended",
|
||||
"rules": {
|
||||
"indent": [
|
||||
|
|
@ -56,21 +60,6 @@
|
|||
"root": true,
|
||||
"globals": {
|
||||
"frappe": true,
|
||||
"$": true,
|
||||
"jQuery": true,
|
||||
"moment": true,
|
||||
"hljs": true,
|
||||
"Awesomplete": true,
|
||||
"Sortable": true,
|
||||
"Showdown": true,
|
||||
"Taggle": true,
|
||||
"Gantt": true,
|
||||
"Slick": true,
|
||||
"Webcam": true,
|
||||
"PhotoSwipe": true,
|
||||
"PhotoSwipeUI_Default": true,
|
||||
"fluxify": true,
|
||||
"io": true,
|
||||
"__": true,
|
||||
"_p": true,
|
||||
"_f": true,
|
||||
|
|
@ -94,7 +83,6 @@
|
|||
"format_number": true,
|
||||
"format_currency": true,
|
||||
"comment_when": true,
|
||||
"replace_newlines": true,
|
||||
"open_url_post": true,
|
||||
"toTitle": true,
|
||||
"lstrip": true,
|
||||
|
|
@ -103,7 +91,6 @@
|
|||
"replace_all": true,
|
||||
"flt": true,
|
||||
"precision": true,
|
||||
"md5": true,
|
||||
"CREATE": true,
|
||||
"AMEND": true,
|
||||
"CANCEL": true,
|
||||
|
|
@ -129,6 +116,23 @@
|
|||
"getCookie": true,
|
||||
"getCookies": true,
|
||||
"get_url_arg": true,
|
||||
|
||||
"md5": true,
|
||||
"$": true,
|
||||
"jQuery": true,
|
||||
"moment": true,
|
||||
"hljs": true,
|
||||
"Awesomplete": true,
|
||||
"Sortable": true,
|
||||
"Showdown": true,
|
||||
"Taggle": true,
|
||||
"Gantt": true,
|
||||
"Slick": true,
|
||||
"Webcam": true,
|
||||
"PhotoSwipe": true,
|
||||
"PhotoSwipeUI_Default": true,
|
||||
"fluxify": true,
|
||||
"io": true,
|
||||
"QUnit": true,
|
||||
"JsBarcode": true,
|
||||
"L": true,
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ install:
|
|||
- sudo apt-get purge -y mysql-common mysql-server mysql-client
|
||||
- nvm install v7.10.0
|
||||
- wget https://raw.githubusercontent.com/frappe/bench/master/playbooks/install.py
|
||||
|
||||
|
||||
- sudo python install.py --develop --user travis --without-bench-setup
|
||||
- sudo pip install -e ~/bench
|
||||
|
||||
|
|
@ -35,8 +35,8 @@ before_script:
|
|||
- bench setup-help
|
||||
- bench scheduler disable
|
||||
- bench start &
|
||||
- sleep 10
|
||||
- sleep 20
|
||||
|
||||
script:
|
||||
- set -e
|
||||
# - set -e
|
||||
- bench run-tests
|
||||
|
|
|
|||
26
frappe-html-plugin.js
Normal file
26
frappe-html-plugin.js
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
const path = require('path');
|
||||
|
||||
function scrub_html_template(content) {
|
||||
content = content.replace(/\s/g, ' ');
|
||||
content = content.replace(/(<!--.*?-->)/g, '');
|
||||
return content.replace("'", "\'"); // eslint-disable-line
|
||||
}
|
||||
|
||||
module.exports = function frappe_html() {
|
||||
return {
|
||||
name: 'frappe-html',
|
||||
transform(code, id) {
|
||||
if (!id.endsWith('.html')) return null;
|
||||
|
||||
var filepath = path.basename(id).split('.');
|
||||
filepath.splice(-1);
|
||||
|
||||
var key = filepath.join(".");
|
||||
var content = scrub_html_template(code);
|
||||
|
||||
return `
|
||||
frappe.templates['${key}'] = '${content}';
|
||||
`;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
@ -3,10 +3,10 @@
|
|||
|
||||
from __future__ import unicode_literals, print_function
|
||||
from frappe.utils.minify import JavascriptMinify
|
||||
import subprocess
|
||||
import warnings
|
||||
|
||||
from six import iteritems, text_type
|
||||
import subprocess
|
||||
|
||||
"""
|
||||
Build the `public` folders and setup languages
|
||||
|
|
@ -28,36 +28,18 @@ def bundle(no_compress, make_copy=False, restore=False, verbose=False):
|
|||
"""concat / minify js files"""
|
||||
# build js files
|
||||
setup()
|
||||
|
||||
make_asset_dirs(make_copy=make_copy, restore=restore)
|
||||
|
||||
# new nodejs build system
|
||||
command = 'node --use_strict ../apps/frappe/frappe/build.js --build'
|
||||
if not no_compress:
|
||||
command += ' --minify'
|
||||
subprocess.call(command.split(' '))
|
||||
|
||||
# build(no_compress, verbose)
|
||||
command = 'yarn run build' if no_compress else 'yarn run production'
|
||||
frappe_app_path = os.path.abspath(os.path.join(app_paths[0], '..'))
|
||||
subprocess.call(command.split(" "), cwd=frappe_app_path)
|
||||
|
||||
def watch(no_compress):
|
||||
"""watch and rebuild if necessary"""
|
||||
setup()
|
||||
|
||||
# new nodejs file watcher
|
||||
command = 'node --use_strict ../apps/frappe/frappe/build.js --watch'
|
||||
subprocess.call(command.split(' '))
|
||||
|
||||
# setup()
|
||||
|
||||
# import time
|
||||
# compile_less()
|
||||
# build(no_compress=True)
|
||||
|
||||
# while True:
|
||||
# compile_less()
|
||||
# if files_dirty():
|
||||
# build(no_compress=True)
|
||||
|
||||
# time.sleep(3)
|
||||
frappe_app_path = os.path.abspath(os.path.join(app_paths[0], '..'))
|
||||
subprocess.call('yarn run watch'.split(" "), cwd = frappe_app_path)
|
||||
|
||||
def make_asset_dirs(make_copy=False, restore=False):
|
||||
# don't even think of making assets_path absolute - rm -rf ahead.
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import cProfile
|
|||
import pstats
|
||||
import frappe
|
||||
import frappe.utils
|
||||
import subprocess # nosec
|
||||
from functools import wraps
|
||||
from six import StringIO
|
||||
|
||||
|
|
@ -46,6 +47,26 @@ def get_site(context):
|
|||
print('Please specify --site sitename')
|
||||
sys.exit(1)
|
||||
|
||||
def popen(command, *args, **kwargs):
|
||||
output = kwargs.get('output', True)
|
||||
cwd = kwargs.get('cwd')
|
||||
shell = kwargs.get('shell', True)
|
||||
raise_err = kwargs.get('raise_err')
|
||||
|
||||
proc = subprocess.Popen(command,
|
||||
stdout = None if output else subprocess.PIPE,
|
||||
stderr = None if output else subprocess.PIPE,
|
||||
shell = shell,
|
||||
cwd = cwd
|
||||
)
|
||||
|
||||
return_ = proc.wait()
|
||||
|
||||
if raise_err:
|
||||
raise subprocess.CalledProcessError(return_, command)
|
||||
|
||||
return return_
|
||||
|
||||
def call_command(cmd, context):
|
||||
return click.Context(cmd, obj=context).forward(cmd)
|
||||
|
||||
|
|
|
|||
|
|
@ -328,7 +328,7 @@ def console(context):
|
|||
frappe.connect()
|
||||
frappe.local.lang = frappe.db.get_default("lang")
|
||||
import IPython
|
||||
IPython.embed()
|
||||
IPython.embed(disable_banner = True)
|
||||
|
||||
@click.command('run-tests')
|
||||
@click.option('--app', help="For App")
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
"css/frappe-web.css": [
|
||||
"public/css/font-awesome.css",
|
||||
"public/css/octicons/octicons.css",
|
||||
"public/css/website.css",
|
||||
"public/css/avatar.css"
|
||||
"public/less/website.less",
|
||||
"public/less/avatar.less"
|
||||
],
|
||||
"js/frappe-web.min.js": [
|
||||
"public/js/frappe/class.js",
|
||||
|
|
@ -111,20 +111,20 @@
|
|||
"public/css/bootstrap.css",
|
||||
"public/css/font-awesome.css",
|
||||
"public/css/octicons/octicons.css",
|
||||
"public/css/desk.css",
|
||||
"public/css/flex.css",
|
||||
"public/css/indicator.css",
|
||||
"public/css/avatar.css",
|
||||
"public/css/navbar.css",
|
||||
"public/css/sidebar.css",
|
||||
"public/css/page.css",
|
||||
"public/css/tree.css",
|
||||
"public/css/desktop.css",
|
||||
"public/css/form.css",
|
||||
"public/css/mobile.css",
|
||||
"public/css/kanban.css",
|
||||
"public/css/controls.css",
|
||||
"public/css/chat.css"
|
||||
"public/less/desk.less",
|
||||
"public/less/flex.less",
|
||||
"public/less/indicator.less",
|
||||
"public/less/avatar.less",
|
||||
"public/less/navbar.less",
|
||||
"public/less/sidebar.less",
|
||||
"public/less/page.less",
|
||||
"public/less/tree.less",
|
||||
"public/less/desktop.less",
|
||||
"public/less/form.less",
|
||||
"public/less/mobile.less",
|
||||
"public/less/kanban.less",
|
||||
"public/less/controls.less",
|
||||
"public/less/chat.less"
|
||||
],
|
||||
"css/frappe-rtl.css": [
|
||||
"public/css/bootstrap-rtl.css",
|
||||
|
|
@ -140,7 +140,6 @@
|
|||
"public/js/lib/moment/moment-with-locales.min.js",
|
||||
"public/js/lib/moment/moment-timezone-with-data.min.js",
|
||||
"public/js/lib/socket.io.min.js",
|
||||
"public/js/lib/markdown.js",
|
||||
"public/js/lib/jSignature.min.js",
|
||||
"public/js/frappe/translate.js",
|
||||
"public/js/lib/datepicker/datepicker.min.js",
|
||||
|
|
@ -255,10 +254,10 @@
|
|||
"public/js/frappe/chat.js"
|
||||
],
|
||||
"css/module.min.css": [
|
||||
"public/css/module.css"
|
||||
"public/less/module.less"
|
||||
],
|
||||
"css/form.min.css": [
|
||||
"public/css/form_grid.css"
|
||||
"public/less/form_grid.less"
|
||||
],
|
||||
"js/form.min.js": [
|
||||
"public/js/frappe/form/templates/grid_form.html",
|
||||
|
|
@ -299,10 +298,10 @@
|
|||
"public/js/frappe/form/quick_entry.js"
|
||||
],
|
||||
"css/list.min.css": [
|
||||
"public/css/list.css",
|
||||
"public/css/calendar.css",
|
||||
"public/css/role_editor.css",
|
||||
"public/css/gantt.css"
|
||||
"public/less/list.less",
|
||||
"public/less/calendar.less",
|
||||
"public/less/role_editor.less",
|
||||
"public/less/gantt.less"
|
||||
],
|
||||
"js/list.min.js": [
|
||||
"public/js/frappe/ui/listing.html",
|
||||
|
|
@ -351,9 +350,9 @@
|
|||
"public/js/frappe/views/kanban/kanban_card.html"
|
||||
],
|
||||
"css/report.min.css": [
|
||||
"public/css/report.css",
|
||||
"public/less/report.less",
|
||||
"public/css/tree_grid.css",
|
||||
"public/css/frappe-datatable.css",
|
||||
"public/less/frappe-datatable.less",
|
||||
|
||||
"public/js/lib/slickgrid/slick.grid.css",
|
||||
"public/js/lib/slickgrid/slick-default-theme.css",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// used in documenation site built via document generator
|
||||
|
||||
$(function() {
|
||||
if(hljs) {
|
||||
if(window.hljs) {
|
||||
$('pre code').each(function(i, block) {
|
||||
hljs.highlightBlock(block);
|
||||
});
|
||||
|
|
@ -10,7 +10,7 @@ $(function() {
|
|||
// search
|
||||
$('.sidebar-navbar-items .octicon-search, .navbar .octicon-search').parent().on("click", function() {
|
||||
var modal = frappe.get_modal("Search",
|
||||
'<p><input class="search-input form-control" type="text" placeholder="Search text..." tabindex="1"></p>\
|
||||
'<p><input class="search-input form-control" type="text" placeholder="Search text..." tabindex="1"></p>\
|
||||
<p><a class="btn btn-sm btn-default btn-search" href="#" target="_blank" tabindex="2">Search via Google</a></p>');
|
||||
modal.find(".search-input").on("keyup", function(e) {
|
||||
if(e.which===13) {
|
||||
|
|
@ -49,4 +49,4 @@ frappe = {
|
|||
|
||||
return modal;
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -13,72 +13,71 @@ To subclass, use:
|
|||
})
|
||||
|
||||
*/
|
||||
// https://stackoverflow.com/a/15052240/5353542
|
||||
|
||||
/* Simple JavaScript Inheritance
|
||||
* By John Resig http://ejohn.org/
|
||||
/* Simple JavaScript Inheritance for ES 5.1
|
||||
* based on http://ejohn.org/blog/simple-javascript-inheritance/
|
||||
* (inspired by base2 and Prototype)
|
||||
* MIT Licensed.
|
||||
*/
|
||||
// Inspired by base2 and Prototype
|
||||
(function(global) {
|
||||
"use strict";
|
||||
var fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
|
||||
|
||||
; /* otherwise causes a concat bug? */
|
||||
|
||||
(function(){
|
||||
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
|
||||
// The base Class implementation (does nothing)
|
||||
this.Class = function(){};
|
||||
|
||||
// Create a new Class that inherits from this class
|
||||
Class.extend = function(prop) {
|
||||
var _super = this.prototype;
|
||||
|
||||
// Instantiate a base class (but only create the instance,
|
||||
// don't run the init constructor)
|
||||
initializing = true;
|
||||
var prototype = new this();
|
||||
initializing = false;
|
||||
|
||||
// Copy the properties over onto the new prototype
|
||||
for (var name in prop) {
|
||||
// Check if we're overwriting an existing function
|
||||
prototype[name] = typeof prop[name] == "function" &&
|
||||
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
|
||||
(function(name, fn){
|
||||
return function() {
|
||||
var tmp = this._super;
|
||||
|
||||
// Add a new ._super() method that is the same method
|
||||
// but on the super-class
|
||||
this._super = _super[name];
|
||||
|
||||
// The method only need to be bound temporarily, so we
|
||||
// remove it when we're done executing
|
||||
var ret = fn.apply(this, arguments);
|
||||
this._super = tmp;
|
||||
|
||||
return ret;
|
||||
};
|
||||
})(name, prop[name]) :
|
||||
prop[name];
|
||||
}
|
||||
|
||||
// The dummy class constructor
|
||||
function Class() {
|
||||
// All construction is actually done in the init method
|
||||
this._type = "instance";
|
||||
if ( !initializing && this.init )
|
||||
this.init.apply(this, arguments);
|
||||
}
|
||||
|
||||
// Populate our constructed prototype object
|
||||
Class.prototype = prototype;
|
||||
Class._type = "class";
|
||||
|
||||
// Enforce the constructor to be what we expect
|
||||
Class.prototype.constructor = Class;
|
||||
function Class(){}
|
||||
|
||||
// And make this class extendable
|
||||
Class.extend = arguments.callee;
|
||||
|
||||
return Class;
|
||||
// Create a new Class that inherits from this class
|
||||
Class.extend = function(props) {
|
||||
var _super = this.prototype;
|
||||
|
||||
// Set up the prototype to inherit from the base class
|
||||
// (but without running the init constructor)
|
||||
var proto = Object.create(_super);
|
||||
|
||||
// Copy the properties over onto the new prototype
|
||||
for (var name in props) {
|
||||
// Check if we're overwriting an existing function
|
||||
proto[name] = typeof props[name] === "function" &&
|
||||
typeof _super[name] == "function" && fnTest.test(props[name])
|
||||
? (function(name, fn){
|
||||
return function() {
|
||||
var tmp = this._super;
|
||||
|
||||
// Add a new ._super() method that is the same method
|
||||
// but on the super-class
|
||||
this._super = _super[name];
|
||||
|
||||
// The method only need to be bound temporarily, so we
|
||||
// remove it when we're done executing
|
||||
var ret = fn.apply(this, arguments);
|
||||
this._super = tmp;
|
||||
|
||||
return ret;
|
||||
};
|
||||
})(name, props[name])
|
||||
: props[name];
|
||||
}
|
||||
|
||||
// The new constructor
|
||||
var newClass = typeof proto.init === "function"
|
||||
? proto.hasOwnProperty("init")
|
||||
? proto.init // All construction is actually done in the init method
|
||||
: function SubClass(){ _super.init.apply(this, arguments); }
|
||||
: function EmptyClass(){};
|
||||
|
||||
// Populate our constructed prototype object
|
||||
newClass.prototype = proto;
|
||||
|
||||
// Enforce the constructor to be what we expect
|
||||
proto.constructor = newClass;
|
||||
|
||||
// And make this class extendable
|
||||
newClass.extend = Class.extend;
|
||||
|
||||
return newClass;
|
||||
};
|
||||
})();
|
||||
|
||||
// export
|
||||
global.Class = Class;
|
||||
})(this);
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// MIT License. See license.txt
|
||||
/* eslint-disable no-console */
|
||||
|
||||
frappe.start_app = function() {
|
||||
if(!frappe.Application)
|
||||
|
|
@ -7,7 +8,7 @@ frappe.start_app = function() {
|
|||
frappe.assets.check();
|
||||
frappe.provide('frappe.app');
|
||||
frappe.app = new frappe.Application();
|
||||
}
|
||||
};
|
||||
|
||||
$(document).ready(function() {
|
||||
if(!frappe.utils.supportsES6) {
|
||||
|
|
@ -35,7 +36,7 @@ frappe.Application = Class.extend({
|
|||
this.startup();
|
||||
},
|
||||
startup: function() {
|
||||
frappe.socketio.init()
|
||||
frappe.socketio.init();
|
||||
frappe.model.init();
|
||||
|
||||
if(frappe.boot.status==='failed') {
|
||||
|
|
@ -43,7 +44,7 @@ frappe.Application = Class.extend({
|
|||
message: frappe.boot.error,
|
||||
title: __('Session Start Failed'),
|
||||
indicator: 'red',
|
||||
})
|
||||
});
|
||||
throw 'boot failed';
|
||||
}
|
||||
|
||||
|
|
@ -109,20 +110,20 @@ frappe.Application = Class.extend({
|
|||
var email_list = frappe.sys_defaults.email_user_password.split(',');
|
||||
for (var u in email_list) {
|
||||
if (email_list[u]===frappe.user.name){
|
||||
this.set_password(email_list[u])
|
||||
this.set_password(email_list[u]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
set_password: function (user) {
|
||||
var me=this
|
||||
set_password: function(user) {
|
||||
var me=this;
|
||||
frappe.call({
|
||||
method: 'frappe.core.doctype.user.user.get_email_awaiting',
|
||||
args: {
|
||||
"user": user
|
||||
},
|
||||
callback: function (email_account) {
|
||||
callback: function(email_account) {
|
||||
email_account = email_account["message"];
|
||||
if (email_account) {
|
||||
var i = 0;
|
||||
|
|
@ -135,7 +136,7 @@ frappe.Application = Class.extend({
|
|||
},
|
||||
|
||||
email_password_prompt: function(email_account,user,i) {
|
||||
var me = this
|
||||
var me = this;
|
||||
var d = new frappe.ui.Dialog({
|
||||
title: __('Email Account setup please enter your password for: '+email_account[i]["email_id"]),
|
||||
fields: [
|
||||
|
|
@ -160,7 +161,7 @@ frappe.Application = Class.extend({
|
|||
"fieldname": "checking"
|
||||
}]
|
||||
});
|
||||
s.fields_dict.checking.$wrapper.html('<i class="fa fa-spinner fa-spin fa-4x"></i>')
|
||||
s.fields_dict.checking.$wrapper.html('<i class="fa fa-spinner fa-spin fa-4x"></i>');
|
||||
s.show();
|
||||
frappe.call({
|
||||
method: 'frappe.core.doctype.user.user.set_email_password',
|
||||
|
|
@ -169,21 +170,16 @@ frappe.Application = Class.extend({
|
|||
"user": user,
|
||||
"password": d.get_value("password")
|
||||
},
|
||||
callback: function (passed)
|
||||
{
|
||||
callback: function(passed) {
|
||||
s.hide();
|
||||
d.hide();//hide waiting indication
|
||||
if (!passed["message"])
|
||||
{
|
||||
if (!passed["message"]) {
|
||||
frappe.show_alert("Login Failed please try again", 5);
|
||||
me.email_password_prompt(email_account, user, i)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (i + 1 < email_account.length)
|
||||
{
|
||||
me.email_password_prompt(email_account, user, i);
|
||||
} else {
|
||||
if (i + 1 < email_account.length) {
|
||||
i = i + 1;
|
||||
me.email_password_prompt(email_account, user, i)
|
||||
me.email_password_prompt(email_account, user, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -195,7 +191,9 @@ frappe.Application = Class.extend({
|
|||
load_bootinfo: function() {
|
||||
if(frappe.boot) {
|
||||
frappe.modules = {};
|
||||
frappe.boot.desktop_icons.forEach(function(m) { frappe.modules[m.module_name]=m; });
|
||||
frappe.boot.desktop_icons.forEach(function(m) {
|
||||
frappe.modules[m.module_name]=m;
|
||||
});
|
||||
frappe.model.sync(frappe.boot.docs);
|
||||
$.extend(frappe._messages, frappe.boot.__messages);
|
||||
this.check_metadata_cache_status();
|
||||
|
|
@ -234,7 +232,7 @@ frappe.Application = Class.extend({
|
|||
// refresh notifications if user is back after sometime
|
||||
$(document).on("session_alive", function() {
|
||||
me.refresh_notifications();
|
||||
})
|
||||
});
|
||||
},
|
||||
|
||||
refresh_notifications: function() {
|
||||
|
|
@ -377,7 +375,7 @@ frappe.Application = Class.extend({
|
|||
}
|
||||
me.redirect_to_login();
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
handle_session_expired: function() {
|
||||
if(!frappe.app.session_expired_dialog) {
|
||||
|
|
@ -439,7 +437,7 @@ frappe.Application = Class.extend({
|
|||
},
|
||||
|
||||
trigger_primary_action: function() {
|
||||
if(cur_dialog && cur_dialog.display) {
|
||||
if(window.cur_dialog && cur_dialog.display) {
|
||||
// trigger primary
|
||||
cur_dialog.get_primary_btn().trigger("click");
|
||||
} else if(cur_frm && cur_frm.page.btn_primary.is(':visible')) {
|
||||
|
|
@ -449,13 +447,13 @@ frappe.Application = Class.extend({
|
|||
}
|
||||
},
|
||||
|
||||
set_rtl: function () {
|
||||
set_rtl: function() {
|
||||
if (["ar", "he", "fa"].indexOf(frappe.boot.lang) >= 0) {
|
||||
var ls = document.createElement('link');
|
||||
ls.rel="stylesheet";
|
||||
ls.href= "assets/css/frappe-rtl.css";
|
||||
document.getElementsByTagName('head')[0].appendChild(ls);
|
||||
$('body').addClass('frappe-rtl')
|
||||
$('body').addClass('frappe-rtl');
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -509,9 +507,9 @@ frappe.Application = Class.extend({
|
|||
// next note
|
||||
me.show_notes();
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
|
|
@ -567,17 +565,17 @@ frappe.get_desktop_icons = function(show_hidden, show_global) {
|
|||
var out = [];
|
||||
|
||||
var add_to_out = function(module) {
|
||||
var module = frappe.get_module(module.module_name, module);
|
||||
module = frappe.get_module(module.module_name, module);
|
||||
module.app_icon = frappe.ui.app_icon.get_html(module);
|
||||
out.push(module);
|
||||
}
|
||||
};
|
||||
|
||||
var show_module = function(m) {
|
||||
var out = true;
|
||||
if(m.type==="page") {
|
||||
out = m.link in frappe.boot.page_info;
|
||||
} else if(m._report) {
|
||||
out = m._report in frappe.boot.user.all_reports
|
||||
out = m._report in frappe.boot.user.all_reports;
|
||||
} else if(m._doctype) {
|
||||
//out = frappe.model.can_read(m._doctype);
|
||||
out = frappe.boot.user.can_read.includes(m._doctype);
|
||||
|
|
@ -588,7 +586,7 @@ frappe.get_desktop_icons = function(show_hidden, show_global) {
|
|||
} else if(m.module_name==='Setup' && frappe.user.has_role('System Manager')) {
|
||||
out = true;
|
||||
} else {
|
||||
out = frappe.boot.user.allow_modules.indexOf(m.module_name) !== -1
|
||||
out = frappe.boot.user.allow_modules.indexOf(m.module_name) !== -1;
|
||||
}
|
||||
}
|
||||
if(m.hidden && !show_hidden) {
|
||||
|
|
@ -598,22 +596,23 @@ frappe.get_desktop_icons = function(show_hidden, show_global) {
|
|||
out = false;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
};
|
||||
|
||||
let m;
|
||||
for (var i=0, l=frappe.boot.desktop_icons.length; i < l; i++) {
|
||||
var m = frappe.boot.desktop_icons[i];
|
||||
m = frappe.boot.desktop_icons[i];
|
||||
if ((['Setup', 'Core'].indexOf(m.module_name) === -1) && show_module(m)) {
|
||||
add_to_out(m);
|
||||
}
|
||||
}
|
||||
|
||||
if(frappe.user_roles.includes('System Manager')) {
|
||||
var m = frappe.get_module('Setup');
|
||||
m = frappe.get_module('Setup');
|
||||
if(show_module(m)) add_to_out(m);
|
||||
}
|
||||
|
||||
if(frappe.user_roles.includes('Administrator')) {
|
||||
var m = frappe.get_module('Core');
|
||||
m = frappe.get_module('Core');
|
||||
if(show_module(m)) add_to_out(m);
|
||||
}
|
||||
|
||||
|
|
@ -636,4 +635,4 @@ frappe.add_to_desktop = function(label, doctype, report) {
|
|||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
frappe.provide('frappe.views.list_view');
|
||||
|
||||
cur_list = null;
|
||||
window.cur_list = null;
|
||||
frappe.views.ListFactory = frappe.views.Factory.extend({
|
||||
make: function (route) {
|
||||
var me = this;
|
||||
|
|
@ -89,7 +89,7 @@ frappe.views.ListFactory = frappe.views.Factory.extend({
|
|||
cur_list = frappe.views.list_view[page_name];
|
||||
if (cur_list && cur_list.doctype !== route[1]) {
|
||||
// changing...
|
||||
cur_list = null;
|
||||
window.cur_list = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ frappe.get_gravatar = function(email_id, size = 0) {
|
|||
|
||||
// string commons
|
||||
|
||||
function repl(s, dict) {
|
||||
window.repl =function repl(s, dict) {
|
||||
if(s==null)return '';
|
||||
for(var key in dict) {
|
||||
s = s.split("%("+key+")s").join(dict[key]);
|
||||
|
|
@ -102,15 +102,15 @@ function repl(s, dict) {
|
|||
return s;
|
||||
}
|
||||
|
||||
function replace_all(s, t1, t2) {
|
||||
window.replace_all = function(s, t1, t2) {
|
||||
return s.split(t1).join(t2);
|
||||
}
|
||||
|
||||
function strip_html(txt) {
|
||||
window.strip_html = function(txt) {
|
||||
return txt.replace(/<[^>]*>/g, "");
|
||||
}
|
||||
|
||||
var strip = function(s, chars) {
|
||||
window.strip = function(s, chars) {
|
||||
if (s) {
|
||||
var s= lstrip(s, chars)
|
||||
s = rstrip(s, chars);
|
||||
|
|
@ -118,7 +118,7 @@ var strip = function(s, chars) {
|
|||
}
|
||||
}
|
||||
|
||||
var lstrip = function(s, chars) {
|
||||
window.lstrip = function lstrip(s, chars) {
|
||||
if(!chars) chars = ['\n', '\t', ' '];
|
||||
// strip left
|
||||
var first_char = s.substr(0,1);
|
||||
|
|
@ -129,7 +129,7 @@ var lstrip = function(s, chars) {
|
|||
return s;
|
||||
}
|
||||
|
||||
var rstrip = function(s, chars) {
|
||||
window.rstrip = function(s, chars) {
|
||||
if(!chars) chars = ['\n', '\t', ' '];
|
||||
var last_char = s.substr(s.length-1);
|
||||
while(in_list(chars, last_char)) {
|
||||
|
|
@ -139,13 +139,11 @@ var rstrip = function(s, chars) {
|
|||
return s;
|
||||
}
|
||||
|
||||
function getCookie(name) {
|
||||
return getCookies()[name];
|
||||
frappe.get_cookie = function getCookie(name) {
|
||||
return frappe.get_cookies()[name];
|
||||
}
|
||||
|
||||
frappe.get_cookie = getCookie;
|
||||
|
||||
function getCookies() {
|
||||
frappe.get_cookies = function getCookies() {
|
||||
var c = document.cookie, v = 0, cookies = {};
|
||||
if (document.cookie.match(/^\s*\$Version=(?:"1"|1);\s*(.*)/)) {
|
||||
c = RegExp.$1;
|
||||
|
|
|
|||
|
|
@ -240,3 +240,19 @@ function round_based_on_smallest_currency_fraction(value, currency, precision) {
|
|||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
Object.assign(window, {
|
||||
flt,
|
||||
cint,
|
||||
strip_number_groups,
|
||||
format_currency,
|
||||
get_currency_symbol,
|
||||
get_number_format,
|
||||
get_number_format_info,
|
||||
_round,
|
||||
roundNumber,
|
||||
precision,
|
||||
remainder,
|
||||
round_based_on_smallest_currency_fraction,
|
||||
in_list
|
||||
});
|
||||
|
|
@ -5,10 +5,11 @@ function prettyDate(time, mini) {
|
|||
time = new Date();
|
||||
}
|
||||
if (moment) {
|
||||
let ret;
|
||||
if (frappe.sys_defaults && frappe.sys_defaults.time_zone) {
|
||||
var ret = moment.tz(time, frappe.sys_defaults.time_zone).locale(frappe.boot.lang).fromNow(mini);
|
||||
ret = moment.tz(time, frappe.sys_defaults.time_zone).locale(frappe.boot.lang).fromNow(mini);
|
||||
} else {
|
||||
var ret = moment(time).locale(frappe.boot.lang).fromNow(mini);
|
||||
ret = moment(time).locale(frappe.boot.lang).fromNow(mini);
|
||||
}
|
||||
if (mini) {
|
||||
if (ret === moment().locale(frappe.boot.lang).fromNow(mini)) {
|
||||
|
|
@ -30,7 +31,7 @@ function prettyDate(time, mini) {
|
|||
}
|
||||
return ret;
|
||||
} else {
|
||||
if (!time) return ''
|
||||
if (!time) return '';
|
||||
var date = time;
|
||||
if (typeof (time) == "string")
|
||||
date = new Date((time || "").replace(/-/g, "/").replace(/[TZ]/g, " ").replace(/\.[0-9]*/, ""));
|
||||
|
|
@ -58,7 +59,7 @@ function prettyDate(time, mini) {
|
|||
}
|
||||
|
||||
|
||||
var comment_when = function (datetime, mini) {
|
||||
window.comment_when = function(datetime, mini) {
|
||||
var timestamp = frappe.datetime.str_to_user ?
|
||||
frappe.datetime.str_to_user(datetime) : datetime;
|
||||
return '<span class="frappe-timestamp '
|
||||
|
|
@ -68,12 +69,14 @@ var comment_when = function (datetime, mini) {
|
|||
};
|
||||
|
||||
frappe.provide("frappe.datetime");
|
||||
frappe.datetime.refresh_when = function () {
|
||||
frappe.datetime.refresh_when = function() {
|
||||
if (jQuery) {
|
||||
$(".frappe-timestamp").each(function () {
|
||||
$(".frappe-timestamp").each(function() {
|
||||
$(this).html(prettyDate($(this).attr("data-timestamp"), $(this).hasClass("mini")));
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
setInterval(function () { frappe.datetime.refresh_when() }, 60000); // refresh every minute
|
||||
setInterval(function() {
|
||||
frappe.datetime.refresh_when();
|
||||
}, 60000); // refresh every minute
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// MIT License. See license.txt
|
||||
|
||||
import showdown from 'showdown';
|
||||
|
||||
frappe.provide("frappe.tools");
|
||||
|
||||
frappe.tools.downloadify = function(data, roles, title) {
|
||||
|
|
@ -34,7 +36,7 @@ frappe.tools.downloadify = function(data, roles, title) {
|
|||
|
||||
frappe.markdown = function(txt) {
|
||||
if(!frappe.md2html) {
|
||||
frappe.md2html = new Showdown.converter();
|
||||
frappe.md2html = new showdown.Converter();
|
||||
}
|
||||
|
||||
while(txt.substr(0,1)==="\n") {
|
||||
|
|
@ -77,7 +79,7 @@ frappe.slickgrid_tools = {
|
|||
get_filtered_items: function(dataView) {
|
||||
var data = [];
|
||||
for (var i=0, len=dataView.getLength(); i<len; i++) {
|
||||
// remove single quotes at start and end of total labels when print/pdf
|
||||
// remove single quotes at start and end of total labels when print/pdf
|
||||
var obj = dataView.getItem(i);
|
||||
for (var item in obj) {
|
||||
if(obj.hasOwnProperty(item) && typeof(obj[item]) == "string"
|
||||
|
|
|
|||
|
|
@ -4,8 +4,15 @@
|
|||
frappe.provide("frappe.perm");
|
||||
|
||||
// backward compatibilty
|
||||
var READ = "read", WRITE = "write", CREATE = "create", DELETE = "delete";
|
||||
var SUBMIT = "submit", CANCEL = "cancel", AMEND = "amend";
|
||||
Object.assign(window, {
|
||||
READ: "read",
|
||||
WRITE: "write",
|
||||
CREATE: "create",
|
||||
DELETE: "delete",
|
||||
SUBMIT: "submit",
|
||||
CANCEL: "cancel",
|
||||
AMEND: "amend",
|
||||
});
|
||||
|
||||
$.extend(frappe.perm, {
|
||||
rights: ["read", "write", "create", "delete", "submit", "cancel", "amend",
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ $.extend(frappe.model, {
|
|||
if(isPlain) r.docs = [r.docs];
|
||||
|
||||
if(r.docs) {
|
||||
var last_parent_name = null;
|
||||
|
||||
for(var i=0, l=r.docs.length; i<l; i++) {
|
||||
var d = r.docs[i];
|
||||
|
|
@ -51,11 +50,11 @@ $.extend(frappe.model, {
|
|||
|
||||
// set docinfo (comments, assign, attachments)
|
||||
if(r.docinfo) {
|
||||
var doc;
|
||||
if(r.docs) {
|
||||
var doc = r.docs[0];
|
||||
doc = r.docs[0];
|
||||
} else {
|
||||
if(cur_frm)
|
||||
var doc = cur_frm.doc;
|
||||
if(cur_frm) doc = cur_frm.doc;
|
||||
}
|
||||
if(doc) {
|
||||
if(!frappe.model.docinfo[doc.doctype])
|
||||
|
|
@ -89,7 +88,7 @@ $.extend(frappe.model, {
|
|||
for (var x=0, y=value.length; x < y; x++) {
|
||||
var d = value[x];
|
||||
|
||||
if(!d.parent)
|
||||
if(typeof d=='object' && !d.parent)
|
||||
d.parent = doc.name;
|
||||
|
||||
frappe.model.add_to_locals(d);
|
||||
|
|
|
|||
|
|
@ -369,7 +369,7 @@ frappe.request.report_error = function(xhr, request_opts) {
|
|||
|
||||
request_opts = frappe.request.cleanup_request_opts(request_opts);
|
||||
|
||||
msg_dialog = frappe.msgprint({message:error_message, indicator:'red'});
|
||||
window.msg_dialog = frappe.msgprint({message:error_message, indicator:'red'});
|
||||
|
||||
msg_dialog.msg_area.find(".report-btn")
|
||||
.toggle(error_report_email ? true : false)
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ frappe.get_route = function(route) {
|
|||
var parts = route[route.length - 1].split("?");
|
||||
route[route.length - 1] = parts[0];
|
||||
if (parts.length > 1) {
|
||||
var query_params = get_query_params(parts[1]);
|
||||
var query_params = frappe.utils.get_query_params(parts[1]);
|
||||
frappe.route_options = $.extend(frappe.route_options || {}, query_params);
|
||||
}
|
||||
|
||||
|
|
@ -133,6 +133,7 @@ frappe.set_route = function() {
|
|||
frappe.route_options = a;
|
||||
return null;
|
||||
} else {
|
||||
a = String(a);
|
||||
if (a && a.match(/[%'"]/)) {
|
||||
// if special chars, then encode
|
||||
a = encodeURIComponent(a);
|
||||
|
|
@ -170,7 +171,7 @@ $(window).on('hashchange', function() {
|
|||
return;
|
||||
|
||||
// hide open dialog
|
||||
if(cur_dialog && cur_dialog.hide_on_page_refresh) {
|
||||
if(window.cur_dialog && cur_dialog.hide_on_page_refresh) {
|
||||
cur_dialog.hide();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
frappe.provide('frappe.ui');
|
||||
|
||||
var cur_dialog;
|
||||
window.cur_dialog = null;
|
||||
|
||||
frappe.ui.open_dialogs = [];
|
||||
frappe.ui.Dialog = frappe.ui.FieldGroup.extend({
|
||||
|
|
@ -49,9 +49,9 @@ frappe.ui.Dialog = frappe.ui.FieldGroup.extend({
|
|||
if(frappe.ui.open_dialogs[frappe.ui.open_dialogs.length-1]===me) {
|
||||
frappe.ui.open_dialogs.pop();
|
||||
if(frappe.ui.open_dialogs.length) {
|
||||
cur_dialog = frappe.ui.open_dialogs[frappe.ui.open_dialogs.length-1];
|
||||
window.cur_dialog = frappe.ui.open_dialogs[frappe.ui.open_dialogs.length-1];
|
||||
} else {
|
||||
cur_dialog = null;
|
||||
window.cur_dialog = null;
|
||||
}
|
||||
}
|
||||
me.onhide && me.onhide();
|
||||
|
|
@ -60,7 +60,7 @@ frappe.ui.Dialog = frappe.ui.FieldGroup.extend({
|
|||
.on("shown.bs.modal", function() {
|
||||
// focus on first input
|
||||
me.display = true;
|
||||
cur_dialog = me;
|
||||
window.cur_dialog = me;
|
||||
frappe.ui.open_dialogs.push(me);
|
||||
me.focus_on_first_input();
|
||||
me.on_page_show && me.on_page_show();
|
||||
|
|
@ -100,7 +100,6 @@ frappe.ui.Dialog = frappe.ui.FieldGroup.extend({
|
|||
this.get_primary_btn().removeClass('disabled');
|
||||
},
|
||||
make_head: function() {
|
||||
var me = this;
|
||||
this.set_title(this.title);
|
||||
},
|
||||
set_title: function(t) {
|
||||
|
|
@ -109,15 +108,15 @@ frappe.ui.Dialog = frappe.ui.FieldGroup.extend({
|
|||
show: function() {
|
||||
// show it
|
||||
if ( this.animate ) {
|
||||
this.$wrapper.addClass('fade')
|
||||
this.$wrapper.addClass('fade');
|
||||
} else {
|
||||
this.$wrapper.removeClass('fade')
|
||||
this.$wrapper.removeClass('fade');
|
||||
}
|
||||
this.$wrapper.modal("show");
|
||||
this.primary_action_fulfilled = false;
|
||||
this.is_visible = true;
|
||||
},
|
||||
hide: function(from_event) {
|
||||
hide: function() {
|
||||
this.$wrapper.modal("hide");
|
||||
this.is_visible = false;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ frappe.ui.keys.on('esc', function(e) {
|
|||
});
|
||||
|
||||
frappe.ui.keys.on('enter', function(e) {
|
||||
if(cur_dialog && cur_dialog.confirm_dialog) {
|
||||
if(window.cur_dialog && cur_dialog.confirm_dialog) {
|
||||
cur_dialog.get_primary_btn().trigger('click');
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
frappe.provide('frappe.pages');
|
||||
frappe.provide('frappe.views');
|
||||
|
||||
var cur_page = null;
|
||||
window.cur_page = null;
|
||||
frappe.views.Container = Class.extend({
|
||||
_intro: "Container contains pages inside `#container` and manages \
|
||||
page creation, switching",
|
||||
|
|
@ -59,7 +59,7 @@ frappe.views.Container = Class.extend({
|
|||
}
|
||||
|
||||
// hide dialog
|
||||
if(cur_dialog && cur_dialog.display && !cur_dialog.keep_open) {
|
||||
if(window.cur_dialog && cur_dialog.display && !cur_dialog.keep_open) {
|
||||
cur_dialog.hide();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -52,10 +52,10 @@ frappe.views.pageview = {
|
|||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
frappe.views.Page = Class.extend({
|
||||
init: function(name, wrapper) {
|
||||
init: function(name) {
|
||||
this.name = name;
|
||||
var me = this;
|
||||
// web home page
|
||||
|
|
@ -85,7 +85,7 @@ frappe.views.Page = Class.extend({
|
|||
|
||||
// set events
|
||||
$(this.wrapper).on('show', function() {
|
||||
cur_frm = null;
|
||||
window.cur_frm = null;
|
||||
me.trigger_page_event('on_page_show');
|
||||
me.trigger_page_event('refresh');
|
||||
});
|
||||
|
|
@ -96,7 +96,7 @@ frappe.views.Page = Class.extend({
|
|||
me.wrapper[eventname](me.wrapper);
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
frappe.show_not_found = function(page_name) {
|
||||
frappe.show_message_page({
|
||||
|
|
@ -104,7 +104,7 @@ frappe.show_not_found = function(page_name) {
|
|||
message: __("Sorry! I could not find what you were looking for."),
|
||||
img: "/assets/frappe/images/ui/bubble-tea-sorry.svg"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
frappe.show_not_permitted = function(page_name) {
|
||||
frappe.show_message_page({
|
||||
|
|
@ -113,7 +113,7 @@ frappe.show_not_permitted = function(page_name) {
|
|||
img: "/assets/frappe/images/ui/bubble-tea-sorry.svg",
|
||||
// icon: "octicon octicon-circle-slash"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
frappe.show_message_page = function(opts) {
|
||||
// opts can include `page_name`, `message`, `icon` or `img`
|
||||
|
|
@ -136,11 +136,11 @@ frappe.show_message_page = function(opts) {
|
|||
<a class="btn btn-default btn-sm btn-home" href="#">%(home)s</a>\
|
||||
</div>\
|
||||
</div>', {
|
||||
img: opts.img || "",
|
||||
message: opts.message || "",
|
||||
home: __("Home")
|
||||
})
|
||||
img: opts.img || "",
|
||||
message: opts.message || "",
|
||||
home: __("Home")
|
||||
})
|
||||
);
|
||||
|
||||
frappe.container.change_to(opts.page_name);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
frappe.provide("frappe.treeview_settings");
|
||||
frappe.provide('frappe.views.trees');
|
||||
cur_tree = null;
|
||||
window.cur_tree = null;
|
||||
|
||||
frappe.views.TreeFactory = frappe.views.Factory.extend({
|
||||
make: function(route) {
|
||||
|
|
|
|||
|
|
@ -1,33 +1,34 @@
|
|||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// MIT License. See license.txt
|
||||
/* eslint-disable no-console */
|
||||
|
||||
window.get_server_fields = function(method, arg, table_field, doc, dt, dn, allow_edit, call_back) {
|
||||
console.warn("This function 'get_server_fields' has been deprecated and will be removed soon.");
|
||||
frappe.dom.freeze();
|
||||
if($.isPlainObject(arg)) arg = JSON.stringify(arg);
|
||||
return $c('runserverobj', {'method': method, 'docs': JSON.stringify(doc), 'arg': arg },
|
||||
function(r, rt) {
|
||||
frappe.dom.unfreeze();
|
||||
if (r.message) {
|
||||
var d = locals[dt][dn];
|
||||
var field_dict = r.message;
|
||||
for(var key in field_dict) {
|
||||
d[key] = field_dict[key];
|
||||
if (table_field)
|
||||
refresh_field(key, d.name, table_field);
|
||||
else
|
||||
refresh_field(key);
|
||||
function(r) {
|
||||
frappe.dom.unfreeze();
|
||||
if (r.message) {
|
||||
var d = locals[dt][dn];
|
||||
var field_dict = r.message;
|
||||
for(var key in field_dict) {
|
||||
d[key] = field_dict[key];
|
||||
if (table_field)
|
||||
refresh_field(key, d.name, table_field);
|
||||
else
|
||||
refresh_field(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(call_back){
|
||||
doc = locals[doc.doctype][doc.name];
|
||||
call_back(doc, dt, dn);
|
||||
}
|
||||
});
|
||||
}
|
||||
if(call_back){
|
||||
doc = locals[doc.doctype][doc.name];
|
||||
call_back(doc, dt, dn);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
window.set_multiple = function (dt, dn, dict, table_field) {
|
||||
window.set_multiple = function(dt, dn, dict, table_field) {
|
||||
var d = locals[dt][dn];
|
||||
for(var key in dict) {
|
||||
d[key] = dict[key];
|
||||
|
|
@ -36,16 +37,16 @@ window.set_multiple = function (dt, dn, dict, table_field) {
|
|||
else
|
||||
refresh_field(key);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
window.refresh_many = function (flist, dn, table_field) {
|
||||
window.refresh_many = function(flist, dn, table_field) {
|
||||
for(var i in flist) {
|
||||
if (table_field)
|
||||
refresh_field(flist[i], dn, table_field);
|
||||
else
|
||||
refresh_field(flist[i]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
window.set_field_tip = function(n,txt) {
|
||||
var df = frappe.meta.get_docfield(cur_frm.doctype, n, cur_frm.docname);
|
||||
|
|
@ -53,13 +54,13 @@ window.set_field_tip = function(n,txt) {
|
|||
|
||||
if(cur_frm && cur_frm.fields_dict) {
|
||||
if(cur_frm.fields_dict[n])
|
||||
cur_frm.fields_dict[n].comment_area.innerHTML = replace_newlines(txt);
|
||||
cur_frm.fields_dict[n].comment_area.innerHTML = window.replace_newlines(txt);
|
||||
else
|
||||
console.log('[set_field_tip] Unable to set field tip: ' + n);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
refresh_field = function(n, docname, table_field) {
|
||||
window.refresh_field = function(n, docname, table_field) {
|
||||
// multiple
|
||||
if(typeof n==typeof [])
|
||||
refresh_many(n, docname, table_field);
|
||||
|
|
@ -78,50 +79,53 @@ refresh_field = function(n, docname, table_field) {
|
|||
}
|
||||
}
|
||||
} else if(cur_frm) {
|
||||
cur_frm.refresh_field(n)
|
||||
cur_frm.refresh_field(n);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
window.set_field_options = function(n, txt) {
|
||||
cur_frm.set_df_property(n, 'options', txt)
|
||||
}
|
||||
cur_frm.set_df_property(n, 'options', txt);
|
||||
};
|
||||
|
||||
window.set_field_permlevel = function(n, level) {
|
||||
cur_frm.set_df_property(n, 'permlevel', level)
|
||||
}
|
||||
cur_frm.set_df_property(n, 'permlevel', level);
|
||||
};
|
||||
|
||||
toggle_field = function(n, hidden) {
|
||||
window.toggle_field = function(n, hidden) {
|
||||
var df = frappe.meta.get_docfield(cur_frm.doctype, n, cur_frm.docname);
|
||||
if(df) {
|
||||
df.hidden = hidden;
|
||||
refresh_field(n);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
console.log((hidden ? "hide_field" : "unhide_field") + " cannot find field " + n);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
hide_field = function(n) {
|
||||
window.hide_field = function(n) {
|
||||
if(cur_frm) {
|
||||
if(n.substr) toggle_field(n, 1);
|
||||
else { for(var i in n) toggle_field(n[i], 1) }
|
||||
else {
|
||||
for(var i in n) toggle_field(n[i], 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
unhide_field = function(n) {
|
||||
window.unhide_field = function(n) {
|
||||
if(cur_frm) {
|
||||
if(n.substr) toggle_field(n, 0);
|
||||
else { for(var i in n) toggle_field(n[i], 0) }
|
||||
else {
|
||||
for(var i in n) toggle_field(n[i], 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
get_field_obj = function(fn) {
|
||||
window.get_field_obj = function(fn) {
|
||||
return cur_frm.fields_dict[fn];
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.get_doc = function() {
|
||||
return locals[this.doctype][this.docname];
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.set_currency_labels = function(fields_list, currency, parentfield) {
|
||||
// To set the currency in the label
|
||||
|
|
@ -129,13 +133,13 @@ _f.Frm.prototype.set_currency_labels = function(fields_list, currency, parentfie
|
|||
|
||||
var me = this;
|
||||
var doctype = parentfield ? this.fields_dict[parentfield].grid.doctype : this.doc.doctype;
|
||||
var field_label_map = {}
|
||||
var grid_field_label_map = {}
|
||||
var field_label_map = {};
|
||||
var grid_field_label_map = {};
|
||||
|
||||
$.each(fields_list, function(i, fname) {
|
||||
var docfield = frappe.meta.docfield_map[doctype][fname];
|
||||
if(docfield) {
|
||||
var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
|
||||
var label = __(docfield.label || "").replace(/\([^\)]*\)/g, ""); // eslint-disable-line
|
||||
if(parentfield) {
|
||||
grid_field_label_map[doctype + "-" + fname] =
|
||||
label.trim() + " (" + __(currency) + ")";
|
||||
|
|
@ -154,7 +158,7 @@ _f.Frm.prototype.set_currency_labels = function(fields_list, currency, parentfie
|
|||
var df = frappe.meta.get_docfield(fname[0], fname[1], me.doc.name);
|
||||
if(df) df.label = label;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.field_map = function(fnames, fn) {
|
||||
if(typeof fnames==='string') {
|
||||
|
|
@ -172,7 +176,7 @@ _f.Frm.prototype.field_map = function(fnames, fn) {
|
|||
this.refresh_field(fieldname);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.get_docfield = function(fieldname1, fieldname2) {
|
||||
if(fieldname2) {
|
||||
|
|
@ -183,45 +187,51 @@ _f.Frm.prototype.get_docfield = function(fieldname1, fieldname2) {
|
|||
// for parent
|
||||
return frappe.meta.get_docfield(this.doctype, fieldname1, this.docname);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.set_df_property = function(fieldname, property, value, docname, table_field) {
|
||||
var df;
|
||||
if (!docname && !table_field){
|
||||
var df = this.get_docfield(fieldname);
|
||||
df = this.get_docfield(fieldname);
|
||||
} else {
|
||||
var grid = this.fields_dict[table_field].grid,
|
||||
fname = frappe.utils.filter_dict(grid.docfields, {'fieldname': fieldname});
|
||||
if (fname && fname.length)
|
||||
var df = frappe.meta.get_docfield(fname[0].parent, fieldname, docname);
|
||||
df = frappe.meta.get_docfield(fname[0].parent, fieldname, docname);
|
||||
}
|
||||
if(df && df[property] != value) {
|
||||
df[property] = value;
|
||||
refresh_field(fieldname, table_field);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.toggle_enable = function(fnames, enable) {
|
||||
this.field_map(fnames, function(field) {
|
||||
field.read_only = enable ? 0 : 1; });
|
||||
}
|
||||
field.read_only = enable ? 0 : 1;
|
||||
});
|
||||
};
|
||||
|
||||
_f.Frm.prototype.toggle_reqd = function(fnames, mandatory) {
|
||||
this.field_map(fnames, function(field) { field.reqd = mandatory ? true : false; });
|
||||
}
|
||||
this.field_map(fnames, function(field) {
|
||||
field.reqd = mandatory ? true : false;
|
||||
});
|
||||
};
|
||||
|
||||
_f.Frm.prototype.toggle_display = function(fnames, show) {
|
||||
this.field_map(fnames, function(field) { field.hidden = show ? 0 : 1; });
|
||||
}
|
||||
this.field_map(fnames, function(field) {
|
||||
field.hidden = show ? 0 : 1;
|
||||
});
|
||||
};
|
||||
|
||||
_f.Frm.prototype.call_server = function(method, args, callback) {
|
||||
return $c_obj(this.doc, method, args, callback);
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.get_files = function() {
|
||||
return this.attachments
|
||||
? frappe.utils.sort(this.attachments.get_attachments(), "file_name", "string")
|
||||
: [] ;
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.set_query = function(fieldname, opt1, opt2) {
|
||||
if(opt2) {
|
||||
|
|
@ -235,15 +245,15 @@ _f.Frm.prototype.set_query = function(fieldname, opt1, opt2) {
|
|||
this.fields_dict[fieldname].get_query = opt1;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.set_value_if_missing = function(field, value) {
|
||||
return this.set_value(field, value, true);
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.clear_table = function(fieldname) {
|
||||
frappe.model.clear_table(this.doc, fieldname);
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.add_child = function(fieldname, values) {
|
||||
var doc = frappe.model.add_child(this.doc, frappe.meta.get_docfield(this.doctype, fieldname).options, fieldname);
|
||||
|
|
@ -261,7 +271,7 @@ _f.Frm.prototype.add_child = function(fieldname, values) {
|
|||
$.extend(doc, d);
|
||||
}
|
||||
return doc;
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.set_value = function(field, value, if_missing) {
|
||||
var me = this;
|
||||
|
|
@ -290,10 +300,10 @@ _f.Frm.prototype.set_value = function(field, value, if_missing) {
|
|||
frappe.msgprint(__("Field {0} not found.",[f]));
|
||||
throw "frm.set_value";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if(typeof field=="string") {
|
||||
return _set(field, value)
|
||||
return _set(field, value);
|
||||
} else if($.isPlainObject(field)) {
|
||||
let tasks = [];
|
||||
for (let f in field) {
|
||||
|
|
@ -304,7 +314,7 @@ _f.Frm.prototype.set_value = function(field, value, if_missing) {
|
|||
}
|
||||
return frappe.run_serially(tasks);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.call = function(opts, args, callback) {
|
||||
var me = this;
|
||||
|
|
@ -341,18 +351,18 @@ _f.Frm.prototype.call = function(opts, args, callback) {
|
|||
}
|
||||
}
|
||||
opts.original_callback && opts.original_callback(r);
|
||||
}
|
||||
};
|
||||
} else {
|
||||
opts.original_callback = opts.callback;
|
||||
opts.callback = function(r) {
|
||||
if(!r.exc) me.refresh_fields();
|
||||
|
||||
opts.original_callback && opts.original_callback(r);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
return frappe.call(opts);
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.get_field = function(field) {
|
||||
return this.fields_dict[field];
|
||||
|
|
@ -367,7 +377,7 @@ _f.Frm.prototype.set_read_only = function() {
|
|||
perm[p.permlevel || 0] = {read:1, print:1, cancel:1};
|
||||
}
|
||||
this.perm = perm;
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.trigger = function(event) {
|
||||
return this.script_manager.trigger(event);
|
||||
|
|
@ -377,15 +387,15 @@ _f.Frm.prototype.get_formatted = function(fieldname) {
|
|||
return frappe.format(this.doc[fieldname],
|
||||
frappe.meta.get_docfield(this.doctype, fieldname, this.docname),
|
||||
{no_icon:true}, this.doc);
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.open_grid_row = function() {
|
||||
return frappe.ui.form.get_open_grid_form();
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.is_new = function() {
|
||||
return this.doc.__islocal;
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.get_title = function() {
|
||||
if(this.meta.title_field) {
|
||||
|
|
@ -393,7 +403,7 @@ _f.Frm.prototype.get_title = function() {
|
|||
} else {
|
||||
return this.doc.name;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.get_selected = function() {
|
||||
// returns list of children that are selected. returns [parentfield, name] for each
|
||||
|
|
@ -405,7 +415,7 @@ _f.Frm.prototype.get_selected = function() {
|
|||
}
|
||||
});
|
||||
return selected;
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.has_mapper = function() {
|
||||
// hackalert!
|
||||
|
|
@ -415,7 +425,7 @@ _f.Frm.prototype.has_mapper = function() {
|
|||
true: false;
|
||||
}
|
||||
return this._has_mapper;
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.set_indicator_formatter = function(fieldname, get_color, get_text) {
|
||||
// get doctype from parent
|
||||
|
|
@ -430,7 +440,7 @@ _f.Frm.prototype.set_indicator_formatter = function(fieldname, get_color, get_te
|
|||
} else {
|
||||
return true;
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
frappe.meta.docfield_map[doctype][fieldname].formatter =
|
||||
|
|
@ -446,7 +456,7 @@ _f.Frm.prototype.set_indicator_formatter = function(fieldname, get_color, get_te
|
|||
return '';
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.can_create = function(doctype) {
|
||||
// return true or false if the user can make a particlar doctype
|
||||
|
|
@ -472,7 +482,7 @@ _f.Frm.prototype.can_create = function(doctype) {
|
|||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.make_new = function(doctype) {
|
||||
// make new doctype from the current form
|
||||
|
|
@ -498,7 +508,7 @@ _f.Frm.prototype.make_new = function(doctype) {
|
|||
// frappe.set_route('Form', doctype, new_doc.name);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_f.Frm.prototype.update_in_all_rows = function(table_fieldname, fieldname, value) {
|
||||
// update the child value in all tables where it is missing
|
||||
|
|
@ -508,4 +518,4 @@ _f.Frm.prototype.update_in_all_rows = function(table_fieldname, fieldname, value
|
|||
if(!cl[i][fieldname]) cl[i][fieldname] = value;
|
||||
}
|
||||
refresh_field("items");
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -108,3 +108,22 @@ function remove_from_list(list, val) {
|
|||
}
|
||||
return list
|
||||
}
|
||||
|
||||
Object.assign(window, {
|
||||
fmt_money,
|
||||
toTitle,
|
||||
is_null,
|
||||
set_value_in,
|
||||
copy_dict,
|
||||
replace_newlines,
|
||||
validate_email,
|
||||
validate_spl_chars,
|
||||
cstr,
|
||||
nth,
|
||||
esc_quotes,
|
||||
has_words,
|
||||
has_common,
|
||||
add_lists,
|
||||
docstring,
|
||||
remove_from_list,
|
||||
});
|
||||
|
|
@ -18,10 +18,10 @@ frappe.provide("frappe.listview_parent_route");
|
|||
frappe.settings.no_history = 1;
|
||||
|
||||
// constants
|
||||
var NEWLINE = '\n';
|
||||
var TAB = 9;
|
||||
var UP_ARROW = 38;
|
||||
var DOWN_ARROW = 40;
|
||||
window.NEWLINE = '\n';
|
||||
window.TAB = 9;
|
||||
window.UP_ARROW = 38;
|
||||
window.DOWN_ARROW = 40;
|
||||
|
||||
// proxy for user globals defined in desk.js
|
||||
|
||||
|
|
@ -29,10 +29,10 @@ var DOWN_ARROW = 40;
|
|||
// ============
|
||||
|
||||
// form
|
||||
var _f = {};
|
||||
var _p = {};
|
||||
var _r = {};
|
||||
window._f = {};
|
||||
window._p = {};
|
||||
window._r = {};
|
||||
|
||||
// API globals
|
||||
var frms={};
|
||||
var cur_frm=null;
|
||||
window.frms={};
|
||||
window.cur_frm=null;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// MIT License. See license.txt
|
||||
/* eslint-disable no-console */
|
||||
|
||||
function $c(command, args, callback, error, no_spinner, freeze_msg, btn) {
|
||||
console.warn("This function '$c' has been deprecated and will be removed soon.");
|
||||
|
|
@ -11,7 +12,7 @@ function $c(command, args, callback, error, no_spinner, freeze_msg, btn) {
|
|||
btn: btn,
|
||||
freeze: freeze_msg,
|
||||
show_spinner: !no_spinner
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// For calling an object
|
||||
|
|
@ -29,7 +30,7 @@ function $c_obj(doc, method, arg, callback, no_spinner, freeze_msg, btn) {
|
|||
if(typeof doc=='string') {
|
||||
args.doctype = doc;
|
||||
} else {
|
||||
args.docs = doc
|
||||
args.docs = doc;
|
||||
}
|
||||
|
||||
return frappe.request.call({
|
||||
|
|
@ -47,7 +48,7 @@ function $c_obj_csv(doc, method, arg) {
|
|||
console.warn("This function '$c_obj_csv' has been deprecated and will be removed soon.");
|
||||
// single
|
||||
|
||||
var args = {}
|
||||
var args = {};
|
||||
args.cmd = 'runserverobj';
|
||||
args.as_csv = 1;
|
||||
args.method = method;
|
||||
|
|
@ -62,7 +63,7 @@ function $c_obj_csv(doc, method, arg) {
|
|||
open_url_post(frappe.request.url, args);
|
||||
}
|
||||
|
||||
function open_url_post(URL, PARAMS, new_window) {
|
||||
window.open_url_post = function open_url_post(URL, PARAMS, new_window) {
|
||||
if (window.cordova) {
|
||||
let url = URL + 'api/method/' + PARAMS.cmd + frappe.utils.make_query_string(PARAMS, false);
|
||||
window.location.href = url;
|
||||
|
|
@ -70,7 +71,7 @@ function open_url_post(URL, PARAMS, new_window) {
|
|||
// call a url as POST
|
||||
_open_url_post(URL, PARAMS, new_window);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function _open_url_post(URL, PARAMS, new_window) {
|
||||
var temp=document.createElement("form");
|
||||
|
|
@ -94,3 +95,7 @@ function _open_url_post(URL, PARAMS, new_window) {
|
|||
temp.submit();
|
||||
return temp;
|
||||
}
|
||||
|
||||
Object.assign(window, {
|
||||
$c, $c_obj, $c_obj_csv
|
||||
});
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
+ subrows
|
||||
|
||||
*/
|
||||
function Layout(parent, width) {
|
||||
window.Layout = function Layout(parent, width) {
|
||||
if(parent&&parent.substr) { parent = $i(parent); }
|
||||
|
||||
this.wrapper = $a(parent, 'div', '', {display:'none'});
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ frappe.template.compile = function(str, name) {
|
|||
// {% endif %} --> {% } %}
|
||||
str = str.replace(/{%\s?endfor\s?%}/g, "{% }; %}");
|
||||
|
||||
fn_str = "var _p=[],print=function(){_p.push.apply(_p,arguments)};" +
|
||||
var fn_str = "var _p=[],print=function(){_p.push.apply(_p,arguments)};" +
|
||||
|
||||
// Introduce the data as local variables using with(){}
|
||||
"with(obj){\n_p.push('" +
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ classes should alter those!
|
|||
|
||||
.slick-row.loading {
|
||||
opacity: 0.5;
|
||||
filter: alpha(opacity = 50);
|
||||
/* filter: alpha(opacity = 50); */
|
||||
}
|
||||
|
||||
.slick-cell.invalid {
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ classes should alter those!
|
|||
display: inline-block;
|
||||
background: blue;
|
||||
opacity: 0.15;
|
||||
filter: alpha(opacity = 15);
|
||||
/* filter: alpha(opacity = 15); */
|
||||
cursor: move;
|
||||
}
|
||||
|
||||
|
|
@ -147,7 +147,7 @@ classes should alter those!
|
|||
height: 2px;
|
||||
background: blue;
|
||||
opacity: 0.7;
|
||||
filter: alpha(opacity = 70);
|
||||
/* filter: alpha(opacity = 70); */
|
||||
}
|
||||
|
||||
.slick-selection {
|
||||
|
|
|
|||
|
|
@ -71,8 +71,8 @@
|
|||
$("#comment-form").toggle();
|
||||
var full_name = "", user_id = "";
|
||||
if(frappe.is_user_logged_in()) {
|
||||
full_name = getCookie("full_name");
|
||||
user_id = getCookie("user_id");
|
||||
full_name = frappe.get_cookie("full_name");
|
||||
user_id = frappe.get_cookie("user_id");
|
||||
if(user_id != "Guest") {
|
||||
$("[name='comment_by']").val(user_id);
|
||||
$("[name='comment_by_fullname']").val(full_name);
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ login.bind_events = function() {
|
|||
var args = {};
|
||||
args.cmd = "frappe.core.doctype.user.user.sign_up";
|
||||
args.email = ($("#signup_email").val() || "").trim();
|
||||
args.redirect_to = get_url_arg("redirect-to") || '';
|
||||
args.redirect_to = frappe.utils.get_url_arg("redirect-to") || '';
|
||||
args.full_name = ($("#signup_fullname").val() || "").trim();
|
||||
if(!args.email || !valid_email(args.email) || !args.full_name) {
|
||||
login.set_indicator("{{ _("Valid email and name required") }}", 'red');
|
||||
|
|
@ -161,13 +161,13 @@ login.login_handlers = (function() {
|
|||
200: function(data) {
|
||||
if(data.message == 'Logged In'){
|
||||
login.set_indicator("{{ _("Success") }}", 'green');
|
||||
window.location.href = get_url_arg("redirect-to") || data.home_page;
|
||||
window.location.href = frappe.utils.get_url_arg("redirect-to") || data.home_page;
|
||||
} else if(data.message=="No App") {
|
||||
login.set_indicator("{{ _("Success") }}", 'green');
|
||||
if(localStorage) {
|
||||
var last_visited =
|
||||
localStorage.getItem("last_visited")
|
||||
|| get_url_arg("redirect-to");
|
||||
|| frappe.utils.get_url_arg("redirect-to");
|
||||
localStorage.removeItem("last_visited");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,8 +14,8 @@
|
|||
|
||||
<script>
|
||||
frappe.ready(function() {
|
||||
if(get_url_arg("search")) {
|
||||
var txt = get_url_arg("search");
|
||||
if(frappe.utils.get_url_arg("search")) {
|
||||
var txt = frappe.utils.get_url_arg("search");
|
||||
$(".item-search-results").html("{{ _('Search results for') }}: " + encodeURIComponent(txt));
|
||||
$(".item-search").toggle(false);
|
||||
$(".clear").toggle(true);
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// MIT License. See license.txt
|
||||
/* eslint-disable no-console */
|
||||
|
||||
frappe.provide("website");
|
||||
frappe.provide("frappe.awesome_bar_path");
|
||||
cur_frm = null;
|
||||
window.cur_frm = null;
|
||||
|
||||
$.extend(frappe, {
|
||||
boot: {
|
||||
|
|
@ -17,10 +18,11 @@ $.extend(frappe, {
|
|||
async: false,
|
||||
dataType: "text",
|
||||
success: function(data) {
|
||||
var el;
|
||||
if(url.split(".").splice(-1) == "js") {
|
||||
var el = document.createElement('script');
|
||||
el = document.createElement('script');
|
||||
} else {
|
||||
var el = document.createElement('style');
|
||||
el = document.createElement('style');
|
||||
}
|
||||
el.appendChild(document.createTextNode(data));
|
||||
document.getElementsByTagName('head')[0].appendChild(el);
|
||||
|
|
@ -28,13 +30,15 @@ $.extend(frappe, {
|
|||
}
|
||||
});
|
||||
},
|
||||
hide_message: function(text) {
|
||||
hide_message: function() {
|
||||
$('.message-overlay').remove();
|
||||
},
|
||||
call: function(opts) {
|
||||
// opts = {"method": "PYTHON MODULE STRING", "args": {}, "callback": function(r) {}}
|
||||
frappe.prepare_call(opts);
|
||||
if(opts.freeze) { frappe.freeze(); }
|
||||
if(opts.freeze) {
|
||||
frappe.freeze();
|
||||
}
|
||||
return $.ajax({
|
||||
type: opts.type || "POST",
|
||||
url: "/",
|
||||
|
|
@ -42,13 +46,13 @@ $.extend(frappe, {
|
|||
dataType: "json",
|
||||
headers: { "X-Frappe-CSRF-Token": frappe.csrf_token },
|
||||
statusCode: opts.statusCode || {
|
||||
404: function(xhr) {
|
||||
404: function() {
|
||||
frappe.msgprint(__("Not found"));
|
||||
},
|
||||
403: function(xhr) {
|
||||
403: function() {
|
||||
frappe.msgprint(__("Not permitted"));
|
||||
},
|
||||
200: function(data, xhr) {
|
||||
200: function(data) {
|
||||
if(opts.callback)
|
||||
opts.callback(data);
|
||||
if(opts.success)
|
||||
|
|
@ -160,7 +164,7 @@ $.extend(frappe, {
|
|||
+text+'</div>').appendTo(document.body);
|
||||
},
|
||||
get_sid: function() {
|
||||
var sid = getCookie("sid");
|
||||
var sid = frappe.get_cookie("sid");
|
||||
return sid && sid !== "Guest";
|
||||
},
|
||||
get_modal: function(title, body_html) {
|
||||
|
|
@ -183,7 +187,7 @@ $.extend(frappe, {
|
|||
msgprint: function(html, title) {
|
||||
if(html.substr(0,1)==="[") html = JSON.parse(html);
|
||||
if($.isArray(html)) {
|
||||
html = html.join("<hr>")
|
||||
html = html.join("<hr>");
|
||||
}
|
||||
|
||||
return frappe.get_modal(title || "Message", html).modal("show");
|
||||
|
|
@ -205,7 +209,9 @@ $.extend(frappe, {
|
|||
args: {doctype: doctype, docname: docname, perm_type: perm_type},
|
||||
callback: function(r) {
|
||||
if(!r.exc && r.message.has_permission) {
|
||||
if(callback) { return callback(r); }
|
||||
if(callback) {
|
||||
return callback(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
@ -233,7 +239,9 @@ $.extend(frappe, {
|
|||
freeze.html(repl('<div class="freeze-message-container"><div class="freeze-message">%(msg)s</div></div>',
|
||||
{msg: msg || ""}));
|
||||
|
||||
setTimeout(function() { freeze.addClass("in") }, 1);
|
||||
setTimeout(function() {
|
||||
freeze.addClass("in");
|
||||
}, 1);
|
||||
|
||||
} else {
|
||||
$("#freeze").addClass("in");
|
||||
|
|
@ -246,7 +254,9 @@ $.extend(frappe, {
|
|||
if(!frappe.freeze_count) {
|
||||
var freeze = $('#freeze').removeClass("in");
|
||||
setTimeout(function() {
|
||||
if(!frappe.freeze_count) { freeze.remove(); }
|
||||
if(!frappe.freeze_count) {
|
||||
freeze.remove();
|
||||
}
|
||||
}, 150);
|
||||
}
|
||||
},
|
||||
|
|
@ -258,7 +268,7 @@ $.extend(frappe, {
|
|||
},
|
||||
|
||||
highlight_code_blocks: function() {
|
||||
if(hljs) {
|
||||
if(window.hljs) {
|
||||
$('pre code').each(function(i, block) {
|
||||
hljs.highlightBlock(block);
|
||||
});
|
||||
|
|
@ -282,7 +292,7 @@ $.extend(frappe, {
|
|||
});
|
||||
|
||||
window.location.href = location.pathname + "?" + $.param(args);
|
||||
}
|
||||
};
|
||||
|
||||
$(".filter").on("change", function() {
|
||||
search();
|
||||
|
|
@ -316,7 +326,7 @@ $.extend(frappe, {
|
|||
$(this).addClass("active");
|
||||
return false;
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
get_navbar_search: function() {
|
||||
return $(".navbar .search, .sidebar .search");
|
||||
|
|
@ -333,28 +343,29 @@ $.extend(frappe, {
|
|||
// Utility functions
|
||||
|
||||
function valid_email(id) {
|
||||
// eslint-disable-next-line
|
||||
return (id.toLowerCase().search("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")==-1) ? 0 : 1;
|
||||
}
|
||||
|
||||
var validate_email = valid_email;
|
||||
window.validate_email = valid_email;
|
||||
|
||||
function cstr(s) {
|
||||
return s==null ? '' : s+'';
|
||||
}
|
||||
|
||||
function is_null(v) {
|
||||
window.is_null = function is_null(v) {
|
||||
if(v===null || v===undefined || cstr(v).trim()==="") return true;
|
||||
}
|
||||
};
|
||||
|
||||
function is_html(txt) {
|
||||
window.is_html = function is_html(txt) {
|
||||
if(txt.indexOf("<br>")==-1 && txt.indexOf("<p")==-1
|
||||
&& txt.indexOf("<img")==-1 && txt.indexOf("<div")==-1) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
function ask_to_login() {
|
||||
window.ask_to_login = function ask_to_login() {
|
||||
if(!frappe.is_user_logged_in()) {
|
||||
if(localStorage) {
|
||||
localStorage.setItem("last_visited",
|
||||
|
|
@ -362,12 +373,12 @@ function ask_to_login() {
|
|||
}
|
||||
window.location.href = "login";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// check if logged in?
|
||||
$(document).ready(function() {
|
||||
window.full_name = getCookie("full_name");
|
||||
var logged_in = getCookie("sid") && getCookie("sid") !== "Guest";
|
||||
window.full_name = frappe.get_cookie("full_name");
|
||||
var logged_in = frappe.get_cookie("sid") && frappe.get_cookie("sid") !== "Guest";
|
||||
$("#website-login").toggleClass("hide", logged_in ? true : false);
|
||||
$("#website-post-login").toggleClass("hide", logged_in ? false : true);
|
||||
$(".logged-in").toggleClass("hide", logged_in ? false : true);
|
||||
|
|
@ -375,7 +386,7 @@ $(document).ready(function() {
|
|||
frappe.bind_navbar_search();
|
||||
|
||||
// switch to app link
|
||||
if(getCookie("system_user")==="yes" && logged_in) {
|
||||
if(frappe.get_cookie("system_user")==="yes" && logged_in) {
|
||||
frappe.add_switch_to_desk();
|
||||
}
|
||||
|
||||
|
|
@ -389,12 +400,12 @@ $(document).on("page-change", function() {
|
|||
$('.dropdown-toggle').dropdown();
|
||||
|
||||
//multilevel dropdown fix
|
||||
$('.dropdown-menu .dropdown-submenu .dropdown-toggle').on('click', function (e) {
|
||||
$('.dropdown-menu .dropdown-submenu .dropdown-toggle').on('click', function(e) {
|
||||
e.stopPropagation();
|
||||
$(this).parent().parent().parent().addClass('open');
|
||||
})
|
||||
});
|
||||
|
||||
$.extend(frappe, getCookies());
|
||||
$.extend(frappe, frappe.get_cookies());
|
||||
frappe.session = {'user': frappe.user_id};
|
||||
|
||||
frappe.datetime.refresh_when();
|
||||
|
|
@ -410,7 +421,7 @@ $(document).on("page-change", function() {
|
|||
});
|
||||
|
||||
|
||||
$(document).ready(function ( ) {
|
||||
$(document).ready(function( ) {
|
||||
// frappe.Chat
|
||||
// const chat = new frappe.Chat();
|
||||
// chat.render();
|
||||
|
|
|
|||
|
|
@ -55,11 +55,11 @@
|
|||
init: function() {
|
||||
var me = this;
|
||||
|
||||
this.key = get_url_arg("key");
|
||||
this.reference_name = get_url_arg("reference_name");
|
||||
this.reference_doctype = get_url_arg("reference_doctype");
|
||||
this.sender = get_url_arg("email");
|
||||
this.rating = get_url_arg("rating") || 0;
|
||||
this.key = frappe.utils.get_url_arg("key");
|
||||
this.reference_name = frappe.utils.get_url_arg("reference_name");
|
||||
this.reference_doctype = frappe.utils.get_url_arg("reference_doctype");
|
||||
this.sender = frappe.utils.get_url_arg("email");
|
||||
this.rating = frappe.utils.get_url_arg("rating") || 0;
|
||||
|
||||
// set ratings
|
||||
this.set_ratings_icon(this.rating)
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
<script>
|
||||
|
||||
frappe.ready(function() {
|
||||
if(get_url_arg("key")) {
|
||||
if(frappe.utils.get_url_arg("key")) {
|
||||
$("#old_password").parent().toggle(false);
|
||||
}
|
||||
|
||||
|
|
@ -54,7 +54,7 @@ frappe.ready(function() {
|
|||
|
||||
$("#update").click(function() {
|
||||
var args = {
|
||||
key: get_url_arg("key") || "",
|
||||
key: frappe.utils.get_url_arg("key") || "",
|
||||
old_password: $("#old_password").val(),
|
||||
new_password: $("#new_password").val(),
|
||||
logout_all_sessions: +($("#logout_all_sessions").is(":checked"))
|
||||
|
|
@ -110,7 +110,7 @@ frappe.ready(function() {
|
|||
window.timout_password_strength = null;
|
||||
|
||||
var args = {
|
||||
key: get_url_arg("key") || "",
|
||||
key: frappe.utils.get_url_arg("key") || "",
|
||||
old_password: $("#old_password").val(),
|
||||
new_password: $("#new_password").val()
|
||||
}
|
||||
|
|
|
|||
30
package.json
30
package.json
|
|
@ -1,7 +1,9 @@
|
|||
{
|
||||
"name": "frappe",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
"build": "rollup -c",
|
||||
"production": "FRAPPE_ENV=production rollup -c",
|
||||
"watch": "rollup -c -w --silent"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
@ -15,20 +17,20 @@
|
|||
"homepage": "https://frappe.io",
|
||||
"dependencies": {
|
||||
"cookie": "^0.3.1",
|
||||
"express": "^4.15.3",
|
||||
"redis": "^2.7.1",
|
||||
"socket.io": "^2.0.1",
|
||||
"superagent": "^3.5.2",
|
||||
"touch": "^3.1.0"
|
||||
"express": "^4.16.2",
|
||||
"redis": "^2.8.0",
|
||||
"showdown": "^1.8.6",
|
||||
"socket.io": "^2.0.4",
|
||||
"superagent": "^3.8.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-core": "^6.26.0",
|
||||
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
||||
"babel-preset-env": "^1.6.0",
|
||||
"babel-preset-minify": "^0.2.0",
|
||||
"chokidar": "^1.7.0",
|
||||
"chromedriver": "^2.32.3",
|
||||
"less": "^2.7.2",
|
||||
"nightwatch": "^0.9.16"
|
||||
"babel-runtime": "^6.26.0",
|
||||
"rollup": "^0.55.3",
|
||||
"rollup-plugin-buble": "^0.19.2",
|
||||
"rollup-plugin-commonjs": "^8.3.0",
|
||||
"rollup-plugin-less": "^0.1.3",
|
||||
"rollup-plugin-multi-entry": "^2.0.2",
|
||||
"rollup-plugin-node-resolve": "^3.0.2",
|
||||
"rollup-plugin-uglify": "^3.0.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
172
rollup.config.js
Normal file
172
rollup.config.js
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
const {
|
||||
get_build_json_path,
|
||||
get_app_path,
|
||||
apps_list,
|
||||
assets_path,
|
||||
get_public_path,
|
||||
bench_path
|
||||
} = require('./rollup.utils');
|
||||
|
||||
const less = require('rollup-plugin-less');
|
||||
const multi_entry = require('rollup-plugin-multi-entry');
|
||||
const commonjs = require('rollup-plugin-commonjs');
|
||||
const node_resolve = require('rollup-plugin-node-resolve');
|
||||
const buble = require('rollup-plugin-buble');
|
||||
const uglify = require('rollup-plugin-uglify');
|
||||
const frappe_html = require('./frappe-html-plugin');
|
||||
|
||||
const production = process.env.FRAPPE_ENV === 'production';
|
||||
|
||||
make_js_css_dirs();
|
||||
build_libs();
|
||||
|
||||
function get_app_config(app) {
|
||||
const build_map = get_build_json(app);
|
||||
if (!build_map) return [];
|
||||
|
||||
const js_config = Object.keys(build_map)
|
||||
.filter(output_file =>
|
||||
output_file.endsWith('.js') &&
|
||||
// libs is built separately (to be deprecated)
|
||||
!output_file.endsWith('libs.min.js')
|
||||
)
|
||||
.map(output_file => {
|
||||
|
||||
const input_files = build_map[output_file].map(
|
||||
// make paths absolute
|
||||
input_path => path.resolve(get_app_path(app), input_path)
|
||||
);
|
||||
|
||||
return get_js_config(output_file, input_files);
|
||||
});
|
||||
|
||||
const less_config = Object.keys(build_map)
|
||||
.filter(output_file =>
|
||||
output_file.endsWith('.css')
|
||||
)
|
||||
.map(output_file => {
|
||||
|
||||
const input_files = build_map[output_file].map(
|
||||
input_path => path.resolve(get_app_path(app), input_path)
|
||||
);
|
||||
|
||||
return get_css_config(output_file, input_files);
|
||||
});
|
||||
|
||||
return [].concat(js_config, less_config);
|
||||
}
|
||||
|
||||
function get_js_config(output_file, input_files) {
|
||||
|
||||
const plugins = [
|
||||
// enables array of inputs
|
||||
multi_entry(),
|
||||
// .html -> .js
|
||||
frappe_html(),
|
||||
// ES6 -> ES5
|
||||
buble({
|
||||
objectAssign: 'Object.assign',
|
||||
transforms: {
|
||||
dangerousForOf: true
|
||||
}
|
||||
}),
|
||||
commonjs(),
|
||||
node_resolve(),
|
||||
production && uglify()
|
||||
];
|
||||
|
||||
return {
|
||||
input: input_files,
|
||||
plugins: plugins,
|
||||
output: {
|
||||
file: path.resolve(assets_path, output_file),
|
||||
format: 'iife',
|
||||
name: 'Rollup',
|
||||
globals: {
|
||||
'sortablejs': 'window.Sortable',
|
||||
'clusterize.js': 'window.Clusterize'
|
||||
}
|
||||
},
|
||||
context: 'window',
|
||||
onwarn: (e) => {
|
||||
if (e.code === 'EVAL') return;
|
||||
},
|
||||
external: ['jquery']
|
||||
};
|
||||
}
|
||||
|
||||
function get_css_config(output_file, input_files) {
|
||||
|
||||
const plugins = [
|
||||
// enables array of inputs
|
||||
multi_entry(),
|
||||
// less -> css
|
||||
less({
|
||||
output: path.resolve(assets_path, output_file),
|
||||
option: {
|
||||
// so that other .less files can import variables.less from frappe directly
|
||||
paths: [path.resolve(get_public_path('frappe'), 'less')],
|
||||
compress: production
|
||||
},
|
||||
include: [path.resolve(bench_path, '**/*.less'), path.resolve(bench_path, '**/*.css')]
|
||||
})
|
||||
];
|
||||
|
||||
return {
|
||||
input: input_files,
|
||||
plugins: plugins,
|
||||
output: {
|
||||
// this file is always empty, remove it later?
|
||||
file: path.resolve(assets_path, `css/rollup.manifest.css`),
|
||||
format: 'cjs',
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function make_js_css_dirs() {
|
||||
const paths = [
|
||||
path.resolve(assets_path, 'js'),
|
||||
path.resolve(assets_path, 'css')
|
||||
];
|
||||
paths.forEach(path => {
|
||||
if (!fs.existsSync(path)) {
|
||||
fs.mkdirSync(path);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function build_libs() {
|
||||
const libs_path = 'js/libs.min.js';
|
||||
const input_files = get_build_json('frappe')[libs_path];
|
||||
|
||||
const libs_content = input_files.map(file_name => {
|
||||
const full_path = path.resolve(get_app_path('frappe'), file_name);
|
||||
return `/* ${file_name} */\n` + fs.readFileSync(full_path);
|
||||
}).join('\n\n');
|
||||
|
||||
const target_path = path.resolve(assets_path, libs_path);
|
||||
fs.writeFileSync(target_path, libs_content);
|
||||
console.log('✨ Built libs.min.js'); // eslint-disable-line
|
||||
}
|
||||
|
||||
function get_all_apps_config() {
|
||||
let configs = [];
|
||||
apps_list.forEach(app => {
|
||||
configs = configs.concat(get_app_config(app));
|
||||
});
|
||||
return configs;
|
||||
}
|
||||
|
||||
function get_build_json(app) {
|
||||
try {
|
||||
return require(get_build_json_path(app));
|
||||
} catch (e) {
|
||||
// build.json does not exist
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = get_all_apps_config();
|
||||
56
rollup.utils.js
Normal file
56
rollup.utils.js
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
const frappe_path = process.cwd();
|
||||
const bench_path = path.resolve(frappe_path, '..', '..');
|
||||
const sites_path = path.resolve(bench_path, 'sites');
|
||||
const apps_list =
|
||||
fs.readFileSync(
|
||||
path.resolve(sites_path, 'apps.txt'), { encoding: 'utf-8' }
|
||||
).split('\n').filter(Boolean);
|
||||
const assets_path = path.resolve(sites_path, 'assets');
|
||||
|
||||
const app_paths = apps_list.reduce((out, app) => {
|
||||
out[app] = path.resolve(bench_path, 'apps', app, app)
|
||||
return out;
|
||||
}, {});
|
||||
const public_paths = apps_list.reduce((out, app) => {
|
||||
out[app] = path.resolve(app_paths[app], 'public');
|
||||
return out;
|
||||
}, {});
|
||||
const public_js_paths = apps_list.reduce((out, app) => {
|
||||
out[app] = path.resolve(app_paths[app], 'public/js');
|
||||
return out;
|
||||
}, {});
|
||||
|
||||
const bundle_map = apps_list.reduce((out, app) => {
|
||||
const public_js_path = public_js_paths[app];
|
||||
if ( fs.existsSync(public_js_path) ) {
|
||||
const all_files = fs.readdirSync(public_js_path);
|
||||
const js_files = all_files.filter(file => file.endsWith('.js'));
|
||||
|
||||
for (let js_file of js_files) {
|
||||
const filename = path.basename(js_file).split('.')[0];
|
||||
out[path.join(app, 'js', filename)] = path.resolve(public_js_path, js_file);
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}, {});
|
||||
|
||||
const get_public_path = app => public_paths[app];
|
||||
|
||||
const get_build_json_path = app => path.resolve(get_public_path(app), 'build.json');
|
||||
|
||||
const get_app_path = app => app_paths[app];
|
||||
|
||||
module.exports = {
|
||||
sites_path,
|
||||
bundle_map,
|
||||
get_public_path,
|
||||
get_build_json_path,
|
||||
get_app_path,
|
||||
apps_list,
|
||||
assets_path,
|
||||
bench_path
|
||||
};
|
||||
Loading…
Add table
Reference in a new issue