You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

430 line
11 KiB

  1. // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. get_server_fields = function(method, arg, table_field, doc, dt, dn, allow_edit, call_back) {
  4. console.warn("This function 'get_server_fields' has been deprecated and will be removed soon.");
  5. frappe.dom.freeze();
  6. if($.isPlainObject(arg)) arg = JSON.stringify(arg);
  7. return $c('runserverobj',
  8. args={'method': method, 'docs': JSON.stringify(doc), 'arg': arg },
  9. function(r, rt) {
  10. frappe.dom.unfreeze();
  11. if (r.message) {
  12. var d = locals[dt][dn];
  13. var field_dict = r.message;
  14. for(var key in field_dict) {
  15. d[key] = field_dict[key];
  16. if (table_field)
  17. refresh_field(key, d.name, table_field);
  18. else
  19. refresh_field(key);
  20. }
  21. }
  22. if(call_back){
  23. doc = locals[doc.doctype][doc.name];
  24. call_back(doc, dt, dn);
  25. }
  26. }
  27. );
  28. }
  29. set_multiple = function (dt, dn, dict, table_field) {
  30. var d = locals[dt][dn];
  31. for(var key in dict) {
  32. d[key] = dict[key];
  33. if (table_field)
  34. refresh_field(key, d.name, table_field);
  35. else
  36. refresh_field(key);
  37. }
  38. }
  39. refresh_many = function (flist, dn, table_field) {
  40. for(var i in flist) {
  41. if (table_field)
  42. refresh_field(flist[i], dn, table_field);
  43. else
  44. refresh_field(flist[i]);
  45. }
  46. }
  47. set_field_tip = function(n,txt) {
  48. var df = frappe.meta.get_docfield(cur_frm.doctype, n, cur_frm.docname);
  49. if(df)df.description = txt;
  50. if(cur_frm && cur_frm.fields_dict) {
  51. if(cur_frm.fields_dict[n])
  52. cur_frm.fields_dict[n].comment_area.innerHTML = replace_newlines(txt);
  53. else
  54. console.log('[set_field_tip] Unable to set field tip: ' + n);
  55. }
  56. }
  57. refresh_field = function(n, docname, table_field) {
  58. // multiple
  59. if(typeof n==typeof [])
  60. refresh_many(n, docname, table_field);
  61. if (n && typeof n==='string' && table_field){
  62. var grid = cur_frm.fields_dict[table_field].grid,
  63. field = frappe.utils.filter_dict(grid.docfields, {fieldname: n});
  64. if (field && field.length){
  65. field = field[0];
  66. var meta = frappe.meta.get_docfield(field.parent, field.fieldname, docname);
  67. $.extend(field, meta);
  68. if (docname){
  69. cur_frm.fields_dict[table_field].grid.grid_rows_by_docname[docname].refresh_field(n);
  70. } else {
  71. cur_frm.fields_dict[table_field].grid.refresh();
  72. }
  73. }
  74. } else if(cur_frm) {
  75. cur_frm.refresh_field(n)
  76. }
  77. }
  78. set_field_options = function(n, txt) {
  79. cur_frm.set_df_property(n, 'options', txt)
  80. }
  81. set_field_permlevel = function(n, level) {
  82. cur_frm.set_df_property(n, 'permlevel', level)
  83. }
  84. toggle_field = function(n, hidden) {
  85. var df = frappe.meta.get_docfield(cur_frm.doctype, n, cur_frm.docname);
  86. if(df) {
  87. df.hidden = hidden;
  88. refresh_field(n);
  89. }
  90. else {
  91. console.log((hidden ? "hide_field" : "unhide_field") + " cannot find field " + n);
  92. }
  93. }
  94. hide_field = function(n) {
  95. if(cur_frm) {
  96. if(n.substr) toggle_field(n, 1);
  97. else { for(var i in n) toggle_field(n[i], 1) }
  98. }
  99. }
  100. unhide_field = function(n) {
  101. if(cur_frm) {
  102. if(n.substr) toggle_field(n, 0);
  103. else { for(var i in n) toggle_field(n[i], 0) }
  104. }
  105. }
  106. get_field_obj = function(fn) {
  107. return cur_frm.fields_dict[fn];
  108. }
  109. // set missing values in given doc
  110. set_missing_values = function(doc, dict) {
  111. // dict contains fieldname as key and "default value" as value
  112. var fields_to_set = {};
  113. for (var i in dict) {
  114. var v = dict[i];
  115. if (!doc[i]) {
  116. fields_to_set[i] = v;
  117. }
  118. }
  119. if (fields_to_set) { set_multiple(doc.doctype, doc.name, fields_to_set); }
  120. }
  121. _f.Frm.prototype.get_doc = function() {
  122. return locals[this.doctype][this.docname];
  123. }
  124. _f.Frm.prototype.set_currency_labels = function(fields_list, currency, parentfield) {
  125. // To set the currency in the label
  126. // For example Total Cost(INR), Total Cost(USD)
  127. var me = this;
  128. var doctype = parentfield ? this.fields_dict[parentfield].grid.doctype : this.doc.doctype;
  129. var field_label_map = {}
  130. var grid_field_label_map = {}
  131. $.each(fields_list, function(i, fname) {
  132. var docfield = frappe.meta.docfield_map[doctype][fname];
  133. if(docfield) {
  134. var label = __(docfield.label || "").replace(/\([^\)]*\)/g, "");
  135. if(parentfield) {
  136. grid_field_label_map[doctype + "-" + fname] =
  137. label.trim() + " (" + __(currency) + ")";
  138. } else {
  139. field_label_map[fname] = label.trim() + " (" + currency + ")";
  140. }
  141. }
  142. });
  143. $.each(field_label_map, function(fname, label) {
  144. me.fields_dict[fname].set_label(label);
  145. });
  146. $.each(grid_field_label_map, function(fname, label) {
  147. fname = fname.split("-");
  148. var df = frappe.meta.get_docfield(fname[0], fname[1], me.doc.name);
  149. if(df) df.label = label;
  150. });
  151. }
  152. _f.Frm.prototype.field_map = function(fnames, fn) {
  153. if(typeof fnames==='string') {
  154. if(fnames == '*') {
  155. fnames = keys(this.fields_dict);
  156. } else {
  157. fnames = [fnames];
  158. }
  159. }
  160. for (var i=0, l=fnames.length; i<l; i++) {
  161. var fieldname = fnames[i];
  162. var field = frappe.meta.get_docfield(cur_frm.doctype, fieldname, cur_frm.docname);
  163. if(field) {
  164. fn(field);
  165. cur_frm.refresh_field(fieldname);
  166. };
  167. }
  168. }
  169. _f.Frm.prototype.get_docfield = function(fieldname1, fieldname2) {
  170. if(fieldname2) {
  171. // for child
  172. var doctype = this.get_docfield(fieldname1).options;
  173. return frappe.meta.get_docfield(doctype, fieldname2, this.docname);
  174. } else {
  175. // for parent
  176. return frappe.meta.get_docfield(this.doctype, fieldname1, this.docname);
  177. }
  178. }
  179. _f.Frm.prototype.set_df_property = function(fieldname, property, value, docname, table_field) {
  180. if (!docname && !table_field){
  181. var field = this.get_docfield(fieldname);
  182. } else {
  183. var grid = cur_frm.fields_dict[table_field].grid,
  184. fname = frappe.utils.filter_dict(grid.docfields, {'fieldname': fieldname});
  185. if (fname && fname.length)
  186. var field = frappe.meta.get_docfield(fname[0].parent, fieldname, docname);
  187. }
  188. if(field) {
  189. field[property] = value;
  190. refresh_field(fieldname, table_field);
  191. };
  192. }
  193. _f.Frm.prototype.toggle_enable = function(fnames, enable) {
  194. cur_frm.field_map(fnames, function(field) {
  195. field.read_only = enable ? 0 : 1; });
  196. }
  197. _f.Frm.prototype.toggle_reqd = function(fnames, mandatory) {
  198. cur_frm.field_map(fnames, function(field) { field.reqd = mandatory ? true : false; });
  199. }
  200. _f.Frm.prototype.toggle_display = function(fnames, show) {
  201. cur_frm.field_map(fnames, function(field) { field.hidden = show ? 0 : 1; });
  202. }
  203. _f.Frm.prototype.call_server = function(method, args, callback) {
  204. return $c_obj(cur_frm.doc, method, args, callback);
  205. }
  206. _f.Frm.prototype.get_files = function() {
  207. return cur_frm.attachments
  208. ? frappe.utils.sort(cur_frm.attachments.get_attachments(), "file_name", "string")
  209. : [] ;
  210. }
  211. _f.Frm.prototype.set_query = function(fieldname, opt1, opt2) {
  212. if(opt2) {
  213. // on child table
  214. // set_query(fieldname, parent fieldname, query)
  215. this.fields_dict[opt1].grid.get_field(fieldname).get_query = opt2;
  216. } else {
  217. // on parent table
  218. // set_query(fieldname, query)
  219. this.fields_dict[fieldname].get_query = opt1;
  220. }
  221. }
  222. _f.Frm.prototype.set_value_if_missing = function(field, value) {
  223. this.set_value(field, value, true);
  224. }
  225. _f.Frm.prototype.clear_table = function(fieldname) {
  226. frappe.model.clear_table(this.doc, fieldname);
  227. }
  228. _f.Frm.prototype.add_child = function(fieldname, values) {
  229. var doc = frappe.model.add_child(this.doc, frappe.meta.get_docfield(this.doctype, fieldname).options, fieldname);
  230. if(values) {
  231. $.extend(doc, values);
  232. }
  233. return doc;
  234. }
  235. _f.Frm.prototype.set_value = function(field, value, if_missing) {
  236. var me = this;
  237. var _set = function(f, v) {
  238. var fieldobj = me.fields_dict[f];
  239. if(fieldobj) {
  240. if(!if_missing || !frappe.model.has_value(me.doctype, me.doc.name, f)) {
  241. if(fieldobj.df.fieldtype==="Table" && $.isArray(v)) {
  242. frappe.model.clear_table(me.doc, fieldobj.df.fieldname);
  243. for (var i=0, j=v.length; i < j; i++) {
  244. var d = v[i];
  245. var child = frappe.model.add_child(me.doc, fieldobj.df.options,
  246. fieldobj.df.fieldname, i+1);
  247. $.extend(child, d);
  248. }
  249. me.refresh_field(f);
  250. } else {
  251. frappe.model.set_value(me.doctype, me.doc.name, f, v);
  252. }
  253. }
  254. } else {
  255. msgprint("Field " + f + " not found.");
  256. throw "frm.set_value";
  257. }
  258. }
  259. if(typeof field=="string") {
  260. _set(field, value)
  261. } else if($.isPlainObject(field)) {
  262. for (var f in field) {
  263. var v = field[f];
  264. if(me.get_field(f)) {
  265. _set(f, v);
  266. }
  267. }
  268. }
  269. }
  270. _f.Frm.prototype.call = function(opts, args, callback) {
  271. var me = this;
  272. if(typeof opts==='string') {
  273. // called as frm.call('do_this', {with_arg: 'arg'});
  274. opts = {
  275. method: opts,
  276. doc: this.doc,
  277. args: args,
  278. callback: callback
  279. };
  280. }
  281. if(!opts.doc) {
  282. if(opts.method.indexOf(".")===-1)
  283. opts.method = frappe.model.get_server_module_name(me.doctype) + "." + opts.method;
  284. opts.original_callback = opts.callback;
  285. opts.callback = function(r) {
  286. if($.isPlainObject(r.message)) {
  287. if(opts.child) {
  288. // update child doc
  289. opts.child = locals[opts.child.doctype][opts.child.name];
  290. var std_field_list = ["doctype"].concat(frappe.model.std_fields_list);
  291. for (key in r.message) {
  292. if (std_field_list.indexOf(key)===-1) {
  293. opts.child[key] = r.message[key];
  294. }
  295. }
  296. me.fields_dict[opts.child.parentfield].refresh();
  297. } else {
  298. // update parent doc
  299. me.set_value(r.message);
  300. }
  301. }
  302. opts.original_callback && opts.original_callback(r);
  303. }
  304. } else {
  305. opts.original_callback = opts.callback;
  306. opts.callback = function(r) {
  307. if(!r.exc) me.refresh_fields();
  308. opts.original_callback && opts.original_callback(r);
  309. }
  310. }
  311. return frappe.call(opts);
  312. }
  313. _f.Frm.prototype.get_field = function(field) {
  314. return cur_frm.fields_dict[field];
  315. };
  316. _f.Frm.prototype.set_read_only = function() {
  317. var perm = [];
  318. var docperms = frappe.perm.get_perm(cur_frm.doc.doctype);
  319. for (var i=0, l=docperms.length; i<l; i++) {
  320. var p = docperms[i];
  321. perm[p.permlevel || 0] = {read:1};
  322. }
  323. cur_frm.perm = perm;
  324. }
  325. _f.Frm.prototype.trigger = function(event) {
  326. this.script_manager.trigger(event);
  327. };
  328. _f.Frm.prototype.get_formatted = function(fieldname) {
  329. return frappe.format(this.doc[fieldname],
  330. frappe.meta.get_docfield(this.doctype, fieldname, this.docname),
  331. {no_icon:true}, this.doc);
  332. }
  333. _f.Frm.prototype.open_grid_row = function() {
  334. return frappe.ui.form.get_open_grid_form();
  335. }
  336. _f.Frm.prototype.is_new = function() {
  337. return this.doc.__islocal;
  338. }
  339. _f.Frm.prototype.get_title = function() {
  340. if(this.meta.title_field) {
  341. return this.doc[this.meta.title_field];
  342. } else {
  343. return this.doc.name;
  344. }
  345. }
  346. _f.Frm.prototype.set_indicator_formatter = function(fieldname, get_color, get_text) {
  347. // get doctype from parent
  348. if(frappe.meta.docfield_map[this.doctype][fieldname]) {
  349. doctype = this.doctype;
  350. } else {
  351. frappe.meta.get_table_fields(this.doctype).every(function(df) {
  352. if(frappe.meta.docfield_map[df.options][fieldname]) {
  353. doctype = df.options;
  354. return false;
  355. } else {
  356. return true;
  357. }
  358. })
  359. }
  360. frappe.meta.get_docfield(doctype, fieldname, this.doc.name).formatter =
  361. function(value, df, options, doc) {
  362. if(value) {
  363. return repl('<a class="indicator %(color)s" href="#Form/%(doctype)s/%(name)s">%(label)s</a>', {
  364. color: get_color(doc),
  365. doctype: df.options,
  366. name: value,
  367. label: get_text ? get_text(doc) : value
  368. });
  369. } else {
  370. return '';
  371. }
  372. };
  373. }