Przeglądaj źródła

new feature: dynamic links 💥

version-14
Rushabh Mehta 11 lat temu
rodzic
commit
3fb3667204
16 zmienionych plików z 159 dodań i 52 usunięć
  1. +12
    -3
      frappe/core/doctype/custom_field/custom_field.js
  2. +2
    -2
      frappe/core/doctype/custom_field/custom_field.json
  3. +2
    -2
      frappe/core/doctype/docfield/docfield.json
  4. +9
    -0
      frappe/core/doctype/doctype/doctype.py
  5. +6
    -4
      frappe/core/doctype/event/event.json
  6. +5
    -3
      frappe/core/doctype/todo/todo.json
  7. +10
    -4
      frappe/model/base_document.py
  8. +1
    -0
      frappe/model/db_schema.py
  9. +20
    -0
      frappe/model/delete_doc.py
  10. +1
    -1
      frappe/model/document.py
  11. +26
    -0
      frappe/model/rename_doc.py
  12. +42
    -22
      frappe/public/js/frappe/form/control.js
  13. +15
    -5
      frappe/public/js/frappe/form/formatters.js
  14. +2
    -2
      frappe/public/js/frappe/form/script_manager.js
  15. +1
    -1
      frappe/public/js/frappe/ui/filters.js
  16. +5
    -3
      frappe/public/js/frappe/views/doclistview.js

+ 12
- 3
frappe/core/doctype/custom_field/custom_field.js Wyświetl plik

@@ -47,9 +47,18 @@ cur_frm.fields_dict['dt'].get_query = function(doc, dt, dn) {
} }


cur_frm.cscript.fieldtype = function(doc, dt, dn) { cur_frm.cscript.fieldtype = function(doc, dt, dn) {
if(doc.fieldtype == 'Link') cur_frm.fields_dict['options_help'].disp_area.innerHTML = 'Please enter name of the document you want this field to be linked to in <b>Options</b>.<br> Eg.: Customer';
else if(doc.fieldtype == 'Select') cur_frm.fields_dict['options_help'].disp_area.innerHTML = 'Please enter values in <b>Options</b>, with each option on a new line. <br>Eg.: <b>Field:</b> Country <br><b>Options:</b><br>China<br>India<br>United States<br><br><b>';
else cur_frm.fields_dict['options_help'].disp_area.innerHTML = '';
if(doc.fieldtype == 'Link') {
cur_frm.fields_dict['options_help'].disp_area.innerHTML =
__('Name of the Document Type (DocType) you want this field to be linked to. e.g. Customer');
} else if(doc.fieldtype == 'Select') {
cur_frm.fields_dict['options_help'].disp_area.innerHTML =
__('Options for select. Each option on a new line. e.g.: <br>Option 1<br>Option 2<br>Option 3<br>');
} else if(doc.fieldtype == 'Dynamic Link') {
cur_frm.fields_dict['options_help'].disp_area.innerHTML =
__('Fieldname which will be the DocType for this link field.');
} else {
cur_frm.fields_dict['options_help'].disp_area.innerHTML = '';
}
} }






+ 2
- 2
frappe/core/doctype/custom_field/custom_field.json Wyświetl plik

@@ -57,7 +57,7 @@
"no_copy": 0, "no_copy": 0,
"oldfieldname": "fieldtype", "oldfieldname": "fieldtype",
"oldfieldtype": "Select", "oldfieldtype": "Select",
"options": "Button\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nFloat\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime",
"options": "Button\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime",
"permlevel": 0, "permlevel": 0,
"reqd": 1, "reqd": 1,
"search_index": 0 "search_index": 0
@@ -257,7 +257,7 @@
], ],
"icon": "icon-glass", "icon": "icon-glass",
"idx": 1, "idx": 1,
"modified": "2014-05-26 03:21:02.832530",
"modified": "2014-06-20 05:54:17.225853",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Core", "module": "Core",
"name": "Custom Field", "name": "Custom Field",


+ 2
- 2
frappe/core/doctype/docfield/docfield.json Wyświetl plik

@@ -34,7 +34,7 @@
"label": "Type", "label": "Type",
"oldfieldname": "fieldtype", "oldfieldname": "fieldtype",
"oldfieldtype": "Select", "oldfieldtype": "Select",
"options": "Attach\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nFloat\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime",
"options": "Attach\nButton\nCheck\nCode\nColumn Break\nCurrency\nData\nDate\nDatetime\nDynamic Link\nFloat\nHTML\nImage\nInt\nLink\nLong Text\nPassword\nPercent\nRead Only\nSection Break\nSelect\nSmall Text\nTable\nText\nText Editor\nTime",
"permlevel": 0, "permlevel": 0,
"reqd": 1, "reqd": 1,
"search_index": 1 "search_index": 1
@@ -304,7 +304,7 @@
"in_dialog": 1, "in_dialog": 1,
"issingle": 0, "issingle": 0,
"istable": 1, "istable": 1,
"modified": "2014-05-26 03:00:13.705058",
"modified": "2014-06-20 05:42:29.975498",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Core", "module": "Core",
"name": "DocField", "name": "DocField",


+ 9
- 0
frappe/core/doctype/doctype/doctype.py Wyświetl plik

@@ -157,6 +157,7 @@ class DocType(Document):
def validate_fields_for_doctype(doctype): def validate_fields_for_doctype(doctype):
validate_fields(frappe.get_meta(doctype).get("fields")) validate_fields(frappe.get_meta(doctype).get("fields"))


# this is separate because it is also called via custom field
def validate_fields(fields): def validate_fields(fields):
def check_illegal_characters(fieldname): def check_illegal_characters(fieldname):
for c in ['.', ',', ' ', '-', '&', '%', '=', '"', "'", '*', '$', for c in ['.', ',', ' ', '-', '&', '%', '=', '"', "'", '*', '$',
@@ -200,6 +201,13 @@ def validate_fields(fields):
if d.in_list_view and d.fieldtype!="Image" and (d.fieldtype in no_value_fields): if d.in_list_view and d.fieldtype!="Image" and (d.fieldtype in no_value_fields):
frappe.throw(_("'In List View' not allowed for type {0} in row {1}").format(d.fieldtype, d.idx)) frappe.throw(_("'In List View' not allowed for type {0} in row {1}").format(d.fieldtype, d.idx))


def check_dynamic_link_options(d):
if d.fieldtype=="Dynamic Link":
doctype_pointer = filter(lambda df: df.fieldname==d.options, fields)
if not doctype_pointer or (doctype_pointer[0].fieldtype!="Link") \
or (doctype_pointer[0].options!="DocType"):
frappe.throw(_("Options 'Dynamic Link' type of field must point to another Link Field with options as 'DocType'"))

for d in fields: for d in fields:
if not d.permlevel: d.permlevel = 0 if not d.permlevel: d.permlevel = 0
if not d.fieldname: if not d.fieldname:
@@ -208,6 +216,7 @@ def validate_fields(fields):
check_unique_fieldname(d.fieldname) check_unique_fieldname(d.fieldname)
check_illegal_mandatory(d) check_illegal_mandatory(d)
check_link_table_options(d) check_link_table_options(d)
check_dynamic_link_options(d)
check_hidden_and_mandatory(d) check_hidden_and_mandatory(d)
check_in_list_view(d) check_in_list_view(d)




+ 6
- 4
frappe/core/doctype/event/event.json Wyświetl plik

@@ -218,24 +218,26 @@
}, },
{ {
"fieldname": "ref_type", "fieldname": "ref_type",
"fieldtype": "Data",
"fieldtype": "Link",
"hidden": 0, "hidden": 0,
"label": "Ref Type", "label": "Ref Type",
"no_copy": 0, "no_copy": 0,
"oldfieldname": "ref_type", "oldfieldname": "ref_type",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "DocType",
"permlevel": 0, "permlevel": 0,
"read_only": 1,
"read_only": 0,
"search_index": 0 "search_index": 0
}, },
{ {
"fieldname": "ref_name", "fieldname": "ref_name",
"fieldtype": "Data",
"fieldtype": "Dynamic Link",
"hidden": 0, "hidden": 0,
"label": "Ref Name", "label": "Ref Name",
"no_copy": 0, "no_copy": 0,
"oldfieldname": "ref_name", "oldfieldname": "ref_name",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "ref_type",
"permlevel": 0, "permlevel": 0,
"read_only": 1, "read_only": 1,
"search_index": 0 "search_index": 0
@@ -244,7 +246,7 @@
"icon": "icon-calendar", "icon": "icon-calendar",
"idx": 1, "idx": 1,
"in_create": 1, "in_create": 1,
"modified": "2014-05-27 03:49:10.612463",
"modified": "2014-06-20 06:40:05.415405",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Core", "module": "Core",
"name": "Event", "name": "Event",


+ 5
- 3
frappe/core/doctype/todo/todo.json Wyświetl plik

@@ -91,13 +91,14 @@
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"fieldname": "reference_type", "fieldname": "reference_type",
"fieldtype": "Data",
"fieldtype": "Link",
"hidden": 0, "hidden": 0,
"in_filter": 0, "in_filter": 0,
"label": "Reference Type", "label": "Reference Type",
"no_copy": 0, "no_copy": 0,
"oldfieldname": "reference_type", "oldfieldname": "reference_type",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "DocType",
"permlevel": 0, "permlevel": 0,
"print_hide": 0, "print_hide": 0,
"report_hide": 0, "report_hide": 0,
@@ -107,13 +108,14 @@
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"fieldname": "reference_name", "fieldname": "reference_name",
"fieldtype": "Data",
"fieldtype": "Dynamic Link",
"hidden": 0, "hidden": 0,
"in_filter": 0, "in_filter": 0,
"label": "Reference Name", "label": "Reference Name",
"no_copy": 0, "no_copy": 0,
"oldfieldname": "reference_name", "oldfieldname": "reference_name",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "reference_type",
"permlevel": 0, "permlevel": 0,
"print_hide": 0, "print_hide": 0,
"report_hide": 0, "report_hide": 0,
@@ -158,7 +160,7 @@
"in_dialog": 0, "in_dialog": 0,
"issingle": 0, "issingle": 0,
"max_attachments": 0, "max_attachments": 0,
"modified": "2014-05-27 03:49:21.667888",
"modified": "2014-06-20 06:20:11.947183",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Core", "module": "Core",
"name": "ToDo", "name": "ToDo",


+ 10
- 4
frappe/model/base_document.py Wyświetl plik

@@ -264,11 +264,17 @@ class BaseDocument(object):
return "{}: {}".format(_(df.label), docname) return "{}: {}".format(_(df.label), docname)


invalid_links = [] invalid_links = []
for df in self.meta.get_link_fields():
doctype = df.options
for df in self.meta.get_link_fields() + self.meta.get("fields",
{"fieldtype":"Dynamic Link"}):


if not doctype:
frappe.throw(_("Options not set for link field {0}").format(df.fieldname))
if df.fieldtype=="Link":
doctype = df.options
if not doctype:
frappe.throw(_("Options not set for link field {0}").format(df.fieldname))
else:
doctype = self.get(df.options)
if not doctype:
frappe.throw(_("{0} must be set first").format(self.meta.get_label(df.options)))


docname = self.get(df.fieldname) docname = self.get(df.fieldname)
if docname: if docname:


+ 1
- 0
frappe/model/db_schema.py Wyświetl plik

@@ -29,6 +29,7 @@ type_map = {
,'Text': ('text', '') ,'Text': ('text', '')
,'Data': ('varchar', '255') ,'Data': ('varchar', '255')
,'Link': ('varchar', '255') ,'Link': ('varchar', '255')
,'Dynamic Link':('varchar', '255')
,'Password': ('varchar', '255') ,'Password': ('varchar', '255')
,'Select': ('varchar', '255') ,'Select': ('varchar', '255')
,'Read Only': ('varchar', '255') ,'Read Only': ('varchar', '255')


+ 20
- 0
frappe/model/delete_doc.py Wyświetl plik

@@ -8,6 +8,7 @@ import frappe.model.meta
import frappe.defaults import frappe.defaults
from frappe.utils.file_manager import remove_all from frappe.utils.file_manager import remove_all
from frappe import _ from frappe import _
from rename_doc import dynamic_link_queries


def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reload=False, ignore_permissions=False): def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reload=False, ignore_permissions=False):
""" """
@@ -48,6 +49,7 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa
# check if links exist # check if links exist
if not force: if not force:
check_if_doc_is_linked(doc) check_if_doc_is_linked(doc)
check_if_doc_is_dynamically_linked(doc)


delete_from_table(doctype, name, ignore_doctypes, doc) delete_from_table(doctype, name, ignore_doctypes, doc)


@@ -106,3 +108,21 @@ def check_if_doc_is_linked(doc, method="Delete"):
frappe.throw(_("Cannot delete or cancel because {0} {1} is linked with {2} {3}").format(doc.doctype, frappe.throw(_("Cannot delete or cancel because {0} {1} is linked with {2} {3}").format(doc.doctype,
doc.name, item.parent or item.name, item.parenttype if item.parent else link_dt), doc.name, item.parent or item.name, item.parenttype if item.parent else link_dt),
frappe.LinkExistsError) frappe.LinkExistsError)

def check_if_doc_is_dynamically_linked(doc):
for query in dynamic_link_queries:
for df in frappe.db.sql(query, as_dict=True):
if frappe.get_meta(df.parent).issingle:

# dynamic link in single doc
refdoc = frappe.get_singles_dict(df.parent)
if refdoc.get(df.options)==doc.doctype and refdoc.get(df.fieldname)==doc.name:
frappe.throw(_("Cannot delete or cancel because {0} {1} is linked with {2} {3}").format(doc.doctype,
doc.name, df.parent, df.parent), frappe.LinkExistsError)
else:

# dynamic link in table
for name in frappe.db.sql_list("""select name from `tab{parent}` where
{options}=%s and {fieldname}=%s""".format(**df), (doc.doctype, doc.name)):
frappe.throw(_("Cannot delete or cancel because {0} {1} is linked with {2} {3}").format(doc.doctype,
doc.name, df.parent, name), frappe.LinkExistsError)

+ 1
- 1
frappe/model/document.py Wyświetl plik

@@ -494,7 +494,7 @@ class Document(BaseDocument):
val1 = cint(val1) val1 = cint(val1)
val2 = cint(val2) val2 = cint(val2)
elif df.fieldtype in ("Data", "Text", "Small Text", "Long Text", elif df.fieldtype in ("Data", "Text", "Small Text", "Long Text",
"Text Editor", "Select", "Link"):
"Text Editor", "Select", "Link", "Dynamic Link"):
val1 = cstr(val1) val1 = cstr(val1)
val2 = cstr(val2) val2 = cstr(val2)




+ 26
- 0
frappe/model/rename_doc.py Wyświetl plik

@@ -33,6 +33,8 @@ def rename_doc(doctype, old, new, force=False, merge=False, ignore_permissions=F
link_fields = get_link_fields(doctype) link_fields = get_link_fields(doctype)
update_link_field_values(link_fields, old, new, doctype) update_link_field_values(link_fields, old, new, doctype)


rename_dynamic_links(doctype, old, new)

if doctype=='DocType': if doctype=='DocType':
rename_doctype(doctype, old, new, force) rename_doctype(doctype, old, new, force)


@@ -274,3 +276,27 @@ def update_parenttype_values(old, new):
update `tab%s` set parenttype=%s update `tab%s` set parenttype=%s
where parenttype=%s""" % (doctype, '%s', '%s'), where parenttype=%s""" % (doctype, '%s', '%s'),
(new, old)) (new, old))

dynamic_link_queries = [
"""select parent, fieldname, options from tabDocField where fieldtype='Dynamic Link'""",
"""select dt as parent, fieldname, options from `tabCustom Field` where fieldtype='Dynamic Link'""",
]

def rename_dynamic_links(doctype, old, new):
for query in dynamic_link_queries:
for df in frappe.db.sql(query, as_dict=True):

# dynamic link in single, just one value to check
if frappe.get_meta(df.parent).issingle:
refdoc = frappe.get_singles_dict(df.parent)
if refdoc.get(df.options)==doctype and refdoc.get(df.fieldname)==old:

frappe.db.sql("""update tabSingles set value=%s where
field=%s and value=%s""", (new, df.fieldname, old))
else:
# replace for each value where renamed
for to_change in frappe.db.sql_list("""select name from `tab{parent}` where
{options}=%s and {fieldname}=%s""".format(**df), (doctype, old)):

frappe.db.sql("""update `tab{parent}` set {fieldname}=%s
where name=%s""".format(**df), (new, to_change))

+ 42
- 22
frappe/public/js/frappe/form/control.js Wyświetl plik

@@ -1,7 +1,7 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// MIT License. See license.txt // MIT License. See license.txt


frappe.ui.form.make_control = function(opts) {
frappe.ui.form.make_control = function (opts) {
var control_class_name = "Control" + opts.df.fieldtype.replace(/ /g, ""); var control_class_name = "Control" + opts.df.fieldtype.replace(/ /g, "");
if(frappe.ui.form[control_class_name]) { if(frappe.ui.form[control_class_name]) {
return new frappe.ui.form[control_class_name](opts); return new frappe.ui.form[control_class_name](opts);
@@ -802,32 +802,36 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
this.setup_buttons(); this.setup_buttons();
this.setup_autocomplete(); this.setup_autocomplete();
}, },
get_options: function() {
return this.df.options;
},
setup_buttons: function() { setup_buttons: function() {
var me = this; var me = this;


// magnifier - search // magnifier - search
this.$input_area.find(".btn-search").on("click", function() { this.$input_area.find(".btn-search").on("click", function() {
var doctype = me.get_options();
if(!doctype) return;
new frappe.ui.form.LinkSelector({ new frappe.ui.form.LinkSelector({
doctype: me.df.options,
doctype: doctype,
target: me, target: me,
txt: me.get_value() txt: me.get_value()
}); });
}); });


// open // open
if(frappe.model.can_read(me.df.options)) {
this.$input_area.find(".btn-open").on("click", function() {
var value = me.get_value();
if(value && me.df.options) frappe.set_route("Form", me.df.options, value);
});
} else {
this.$input_area.find(".btn-open").remove();
}
this.$input_area.find(".btn-open").on("click", function() {
var value = me.get_value();
if(value && me.get_options())
frappe.set_route("Form", me.get_options(), value);
});


// new // new
if(frappe.model.can_create(me.df.options)) {
if(this.df.fieldtype==="Dynamic Link" || frappe.model.can_create(me.df.options)) {
this.$input_area.find(".btn-new").on("click", function() { this.$input_area.find(".btn-new").on("click", function() {
me.frm.new_doc(me.df.options, me);
var doctype = me.get_options();
if(!doctype) return;
me.frm.new_doc(doctype, me);
}); });
} else { } else {
this.$input_area.find(".btn-new").remove(); this.$input_area.find(".btn-new").remove();
@@ -854,18 +858,20 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
this.$input.autocomplete({ this.$input.autocomplete({
minLength: 0, minLength: 0,
source: function(request, response) { source: function(request, response) {
if (!me.$input.cache[me.df.options]) {
me.$input.cache[me.df.options] = {};
var doctype = me.get_options();
if(!doctype) return;
if (!me.$input.cache[doctype]) {
me.$input.cache[doctype] = {};
} }


if (me.$input.cache[me.df.options][request.term]!=null) {
if (me.$input.cache[doctype][request.term]!=null) {
// immediately show from cache // immediately show from cache
response(me.$input.cache[me.df.options][request.term]);
response(me.$input.cache[doctype][request.term]);
} }


var args = { var args = {
'txt': request.term, 'txt': request.term,
'doctype': me.df.options,
'doctype': doctype,
}; };


me.set_custom_query(args); me.set_custom_query(args);
@@ -876,13 +882,13 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
no_spinner: true, no_spinner: true,
args: args, args: args,
callback: function(r) { callback: function(r) {
if(frappe.model.can_create(me.df.options)) {
if(frappe.model.can_create(doctype)) {
r.results.push({ r.results.push({
value: "<i class='icon-plus'></i> <em>" + __("Create a new {0}", [me.df.options]) + "</em>", value: "<i class='icon-plus'></i> <em>" + __("Create a new {0}", [me.df.options]) + "</em>",
make_new: true make_new: true
}); });
}; };
me.$input.cache[me.df.options][request.term] = r.results;
me.$input.cache[doctype][request.term] = r.results;
response(r.results); response(r.results);
}, },
}); });
@@ -901,10 +907,13 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
select: function(event, ui) { select: function(event, ui) {
me.autocomplete_open = false; me.autocomplete_open = false;
if(ui.item.make_new) { if(ui.item.make_new) {
var doctype = me.get_options();
if(!doctype) return;

if (me.frm) { if (me.frm) {
me.frm.new_doc(me.df.options, me);
me.frm.new_doc(doctype, me);
} else { } else {
new_doc(me.df.options);
new_doc(doctype);
} }
return false; return false;
} }
@@ -968,10 +977,21 @@ frappe.ui.form.ControlLink = frappe.ui.form.ControlData.extend({
return; return;
} }


this.frm.script_manager.validate_link_and_fetch(this.df, this.docname, value, callback);
this.frm.script_manager.validate_link_and_fetch(this.df, this.get_options(),
this.docname, value, callback);
}, },
}); });


frappe.ui.form.ControlDynamicLink = frappe.ui.form.ControlLink.extend({
get_options: function() {
var options = frappe.model.get_value(this.df.parent, this.docname, this.df.options);
if(!options) {
msgprint(__("Please set {0} first",
[frappe.meta.get_docfield(this.df.parent, this.df.options, this.docname).label]));
}
return options;
},
});


frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({ frappe.ui.form.ControlCode = frappe.ui.form.ControlText.extend({
make_input: function() { make_input: function() {


+ 15
- 5
frappe/public/js/frappe/form/formatters.js Wyświetl plik

@@ -33,6 +33,7 @@ frappe.form.formatters = {
return value ? "<i class='icon-check'></i>" : "<i class='icon-check-empty'></i>"; return value ? "<i class='icon-check'></i>" : "<i class='icon-check-empty'></i>";
}, },
Link: function(value, docfield, options) { Link: function(value, docfield, options) {
var doctype = docfield._options || docfield.options;
if(options && options.for_print) if(options && options.for_print)
return value; return value;
if(!value) if(!value)
@@ -40,13 +41,13 @@ frappe.form.formatters = {
if(docfield && docfield.link_onclick) { if(docfield && docfield.link_onclick) {
return repl('<a onclick="%(onclick)s">%(value)s</a>', return repl('<a onclick="%(onclick)s">%(value)s</a>',
{onclick: docfield.link_onclick.replace(/"/g, '&quot;'), value:value}); {onclick: docfield.link_onclick.replace(/"/g, '&quot;'), value:value});
} else if(docfield && docfield.options) {
} else if(docfield && doctype) {
return repl('%(icon)s<a href="#Form/%(doctype)s/%(name)s">%(label)s</a>', { return repl('%(icon)s<a href="#Form/%(doctype)s/%(name)s">%(label)s</a>', {
doctype: encodeURIComponent(docfield.options),
doctype: encodeURIComponent(doctype),
name: encodeURIComponent(value), name: encodeURIComponent(value),
label: value, label: value,
icon: (options && options.no_icon) ? "" : icon: (options && options.no_icon) ? "" :
('<i class="icon-fixed-width '+frappe.boot.doctype_icons[docfield.options]+'"></i> ')
('<i class="icon-fixed-width '+frappe.boot.doctype_icons[doctype]+'"></i> ')
}); });
} else { } else {
return value; return value;
@@ -119,11 +120,20 @@ frappe.form.formatters = {
} }


frappe.form.get_formatter = function(fieldtype) { frappe.form.get_formatter = function(fieldtype) {
if(!fieldtype) fieldtype = "Data";
if(!fieldtype)
fieldtype = "Data";
return frappe.form.formatters[fieldtype.replace(/ /g, "")] || frappe.form.formatters.Data; return frappe.form.formatters[fieldtype.replace(/ /g, "")] || frappe.form.formatters.Data;
} }


frappe.format = function(value, df, options, doc) { frappe.format = function(value, df, options, doc) {
if(!df) df = {"fieldtype":"Data"}; if(!df) df = {"fieldtype":"Data"};
return frappe.form.get_formatter(df.fieldtype)(value, df, options, doc);
var fieldtype = df.fieldtype || "Data";

// format Dynamic Link as a Link
if(fieldtype==="Dynamic Link") {
fieldtype = "Link";
df._options = doc ? doc[df.options] : null;
}

return frappe.form.get_formatter(fieldtype)(value, df, options, doc);
} }

+ 2
- 2
frappe/public/js/frappe/form/script_manager.js Wyświetl plik

@@ -80,7 +80,7 @@ frappe.ui.form.ScriptManager = Class.extend({
console.log("----- end of error message -----"); console.log("----- end of error message -----");
console.group && console.groupEnd(); console.group && console.groupEnd();
}, },
validate_link_and_fetch: function(df, docname, value, callback) {
validate_link_and_fetch: function(df, doctype, docname, value, callback) {
var me = this; var me = this;


if(value) { if(value) {
@@ -94,7 +94,7 @@ frappe.ui.form.ScriptManager = Class.extend({
type: "GET", type: "GET",
args: { args: {
'value': value, 'value': value,
'options': df.options,
'options': doctype,
'fetch': fetch 'fetch': fetch
}, },
no_spinner: true, no_spinner: true,


+ 1
- 1
frappe/public/js/frappe/ui/filters.js Wyświetl plik

@@ -255,7 +255,7 @@ frappe.ui.Filter = Class.extend({
if(df.fieldtype=='Check') { if(df.fieldtype=='Check') {
df.fieldtype='Select'; df.fieldtype='Select';
df.options='No\nYes'; df.options='No\nYes';
} else if(['Text','Small Text','Text Editor','Code','Tag','Comments'].indexOf(df.fieldtype)!=-1) {
} else if(['Text','Small Text','Text Editor','Code','Tag','Comments','Dynamic Link'].indexOf(df.fieldtype)!=-1) {
df.fieldtype = 'Data'; df.fieldtype = 'Data';
} else if(df.fieldtype=='Link' && this.$w.find('.condition').val()!="=") { } else if(df.fieldtype=='Link' && this.$w.find('.condition').val()!="=") {
df.fieldtype = 'Data'; df.fieldtype = 'Data';


+ 5
- 3
frappe/public/js/frappe/views/doclistview.js Wyświetl plik

@@ -87,9 +87,11 @@ frappe.views.DocListView = frappe.ui.Listing.extend({
this.make_help(); this.make_help();
this.$page.find(".show_filters").css({"padding":"15px", "margin":"0px -15px"}); this.$page.find(".show_filters").css({"padding":"15px", "margin":"0px -15px"});
var me = this; var me = this;
// this.$w.on("render-complete", function() {
// me.set_sidebar_height();
// });
this.$w.on("render-complete", function() {
if(me.data.length===1) {
frappe.set_route("Form", me.doctype, me.data[0].name);
}
});
}, },


set_sidebar_height: function() { set_sidebar_height: function() {


Ładowanie…
Anuluj
Zapisz