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.
 
 
 
 
 
 

119 line
3.5 KiB

  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. wn.provide("wn.ui.form.handlers");
  4. wn.ui.form.on = wn.ui.form.on_change = function(doctype, fieldname, handler) {
  5. if(!wn.ui.form.handlers[doctype]) {
  6. wn.ui.form.handlers[doctype] = {};
  7. }
  8. if(!wn.ui.form.handlers[doctype][fieldname]) {
  9. wn.ui.form.handlers[doctype][fieldname] = [];
  10. }
  11. wn.ui.form.handlers[doctype][fieldname].push(handler)
  12. }
  13. wn.ui.form.ScriptManager = Class.extend({
  14. init: function(opts) {
  15. $.extend(this, opts);
  16. },
  17. make: function(ControllerClass) {
  18. this.frm.cscript = $.extend(this.frm.cscript, new ControllerClass({frm: this.frm}));
  19. },
  20. trigger: function(event_name, doctype, name, callback) {
  21. var me = this;
  22. doctype = doctype || this.frm.doctype;
  23. name = name || this.frm.docname;
  24. handlers = this.get_handlers(event_name, doctype, name, callback);
  25. if(callback) handlers.push(callback);
  26. $.each(handlers, function(i, fn) {
  27. fn();
  28. })
  29. },
  30. get_handlers: function(event_name, doctype, name, callback) {
  31. var handlers = [];
  32. var me = this;
  33. if(wn.ui.form.handlers[doctype] && wn.ui.form.handlers[doctype][event_name]) {
  34. $.each(wn.ui.form.handlers[doctype][event_name], function(i, fn) {
  35. handlers.push(function() { fn(me.frm, doctype, name) });
  36. });
  37. }
  38. if(this.frm.cscript[event_name]) {
  39. handlers.push(function() { me.frm.cscript[event_name](me.frm.doc, doctype, name); });
  40. }
  41. if(this.frm.cscript["custom_" + event_name]) {
  42. handlers.push(function() { me.frm.cscript["custom_" + event_name](me.frm.doc, doctype, name); });
  43. }
  44. return handlers;
  45. },
  46. setup: function() {
  47. var doctype = this.frm.meta;
  48. // js
  49. var cs = doctype.__js;
  50. if(cs) {
  51. var tmp = eval(cs);
  52. }
  53. // css
  54. doctype.__css && wn.dom.set_style(doctype.__css);
  55. },
  56. log_error: function(caller, e) {
  57. show_alert("Error in Client Script.");
  58. console.group && console.group();
  59. console.log("----- error in client script -----");
  60. console.log("method: " + caller);
  61. console.log(e);
  62. console.log("error message: " + e.message);
  63. console.trace && console.trace();
  64. console.log("----- end of error message -----");
  65. console.group && console.groupEnd();
  66. },
  67. validate_link_and_fetch: function(df, docname, value, callback) {
  68. var me = this;
  69. if(value) {
  70. var fetch = '';
  71. if(this.frm && this.frm.fetch_dict[df.fieldname])
  72. fetch = this.frm.fetch_dict[df.fieldname].columns.join(', ');
  73. return wn.call({
  74. method:'webnotes.widgets.form.utils.validate_link',
  75. type: "GET",
  76. args: {
  77. 'value': value,
  78. 'options': df.options,
  79. 'fetch': fetch
  80. },
  81. no_spinner: true,
  82. callback: function(r) {
  83. if(r.message=='Ok') {
  84. if(r.fetch_values)
  85. me.set_fetch_values(df, docname, r.fetch_values);
  86. if(callback) callback(value);
  87. } else {
  88. if(callback) callback("");
  89. }
  90. }
  91. });
  92. } else if(callback) {
  93. callback(value);
  94. }
  95. },
  96. set_fetch_values: function(df, docname, fetch_values) {
  97. var fl = this.frm.fetch_dict[df.fieldname].fields;
  98. for(var i=0; i < fl.length; i++) {
  99. wn.model.set_value(df.parent, docname, fl[i], fetch_values[i], df.fieldtype);
  100. }
  101. },
  102. copy_from_first_row: function(parentfield, current_row, fieldnames) {
  103. var doclist = wn.model.get_doclist(this.frm.doc.doctype, this.frm.doc.name, {parentfield: parentfield});
  104. if(doclist.length===1 || doclist[0]===current_row) return;
  105. $.each(fieldnames, function(i, fieldname) {
  106. current_row[fieldname] = doclist[0][fieldname];
  107. });
  108. }
  109. });