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.
 
 
 
 
 
 

289 lines
8.2 KiB

  1. // Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com)
  2. //
  3. // MIT License (MIT)
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a
  6. // copy of this software and associated documentation files (the "Software"),
  7. // to deal in the Software without restriction, including without limitation
  8. // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. // and/or sell copies of the Software, and to permit persons to whom the
  10. // Software is furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  16. // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  17. // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
  19. // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  20. // OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21. //
  22. // Local DB
  23. //-----------
  24. var locals = {'DocType':{}};
  25. var LocalDB={};
  26. var READ = 0; var WRITE = 1; var CREATE = 2; var SUBMIT = 3; var CANCEL = 4; var AMEND = 5;
  27. LocalDB.getchildren = function(child_dt, parent, parentfield, parenttype) {
  28. var l = [];
  29. for(var key in locals[child_dt]) {
  30. var d = locals[child_dt][key];
  31. if((d.parent == parent)&&(d.parentfield == parentfield)) {
  32. if(parenttype) {
  33. if(d.parenttype==parenttype)l.push(d);
  34. } else { // ignore for now
  35. l.push(d);
  36. }
  37. }
  38. }
  39. l.sort(function(a,b){return (cint(a.idx)-cint(b.idx))}); return l;
  40. }
  41. // Add Doc
  42. // ======================================================================================
  43. LocalDB.add=function(dt, dn) {
  44. if(!locals[dt]) locals[dt] = {}; if(locals[dt][dn]) delete locals[dt][dn];
  45. locals[dt][dn] = {'name':dn, 'doctype':dt, 'docstatus':0};
  46. return locals[dt][dn];
  47. }
  48. // Delete Doc
  49. // ======================================================================================
  50. LocalDB.delete_doc=function(dt, dn) {
  51. var doc = get_local(dt, dn);
  52. if(!doc) return;
  53. for(var ndt in locals) { // all doctypes
  54. if(locals[ndt]) {
  55. for(var ndn in locals[ndt]) {
  56. var doc = locals[ndt][ndn];
  57. if(doc && doc.parenttype==dt && (doc.parent==dn||doc.__oldparent==dn)) {
  58. delete locals[ndt][ndn];
  59. }
  60. }
  61. }
  62. }
  63. delete locals[dt][dn];
  64. }
  65. function get_local(dt, dn) { return locals[dt] ? locals[dt][dn] : null; }
  66. // Sync Records from Server
  67. // ======================================================================================
  68. LocalDB.sync = function(list) {
  69. if(keys(list._kl))
  70. list = expand_doclist(list);
  71. if(list.length) {
  72. LocalDB.clear_locals(list[0].doctype, list[0].name);
  73. } else {
  74. return;
  75. }
  76. for(var i=0;i<list.length;i++) {
  77. var d = list[i];
  78. if(!d.name) // get name (local if required)
  79. d.name = LocalDB.get_localname(d.doctype);
  80. LocalDB.add(d.doctype, d.name);
  81. locals[d.doctype][d.name] = d;
  82. // reset cur_frm.doc (as new doc is loaded from the server)
  83. if(cur_frm && cur_frm.doctype==d.doctype && cur_frm.docname==d.name) {
  84. cur_frm.doc = d;
  85. }
  86. if(d.doctype=='DocField')
  87. wn.meta.add_field(d);
  88. if(d.localname) {
  89. wn.model.new_names[d.localname] = d.name;
  90. $(document).trigger('rename', [d.doctype, d.localname, d.name]);
  91. delete locals[d.doctype][d.localname];
  92. }
  93. }
  94. }
  95. LocalDB.clear_locals = function(dt, dn) {
  96. var doclist = make_doclist(dt, dn, 1);
  97. // console.dir(['in clear', doclist]);
  98. $.each(doclist, function(i, v) {
  99. v && delete locals[v.doctype][v.name];
  100. });
  101. }
  102. // Get Local Name
  103. // ======================================================================================
  104. local_name_idx = {};
  105. LocalDB.get_localname=function(doctype) {
  106. if(!local_name_idx[doctype]) local_name_idx[doctype] = 1;
  107. var n = 'New '+ get_doctype_label(doctype) + ' ' + local_name_idx[doctype];
  108. local_name_idx[doctype]++;
  109. return n;
  110. }
  111. // Create Local Doc
  112. // ======================================================================================
  113. LocalDB.set_default_values = function(doc) {
  114. var doctype = doc.doctype;
  115. var docfields = wn.meta.docfield_list[doctype];
  116. if(!docfields) {
  117. return;
  118. }
  119. var fields_to_refresh = [];
  120. for(var fid=0;fid<docfields.length;fid++) {
  121. var f = docfields[fid];
  122. if(!in_list(no_value_fields, f.fieldtype) && doc[f.fieldname]==null) {
  123. var v = LocalDB.get_default_value(f.fieldname, f.fieldtype, f['default']);
  124. if(v) {
  125. doc[f.fieldname] = v;
  126. fields_to_refresh.push(f.fieldname);
  127. }
  128. }
  129. }
  130. return fields_to_refresh;
  131. }
  132. // ======================================================================================
  133. LocalDB.create = function(doctype, n) {
  134. if(!n) n = LocalDB.get_localname(doctype);
  135. var doc = LocalDB.add(doctype, n)
  136. doc.__islocal=1; doc.owner = user;
  137. LocalDB.set_default_values(doc);
  138. return n;
  139. }
  140. // ======================================================================================
  141. LocalDB.delete_record = function(dt, dn) {
  142. delete locals[dt][dn];
  143. }
  144. // ======================================================================================
  145. LocalDB.get_default_value = function(fn, ft, df) {
  146. if(df=='_Login' || df=='__user')
  147. return user;
  148. else if(df=='_Full Name')
  149. return user_fullname;
  150. else if(ft=='Date'&& (df=='Today' || df=='__today')) {
  151. return get_today(); }
  152. else if(df)
  153. return df;
  154. else if(user_defaults[fn])
  155. return user_defaults[fn][0];
  156. else if(sys_defaults[fn])
  157. return sys_defaults[fn];
  158. }
  159. // ======================================================================================
  160. LocalDB.add_child = function(doc, childtype, parentfield) {
  161. // create row doc
  162. var n = LocalDB.create(childtype);
  163. var d = locals[childtype][n];
  164. d.parent = doc.name;
  165. d.parentfield = parentfield;
  166. d.parenttype = doc.doctype;
  167. return d;
  168. }
  169. // ======================================================================================
  170. LocalDB.no_copy_list = ['amended_from','amendment_date','cancel_reason'];
  171. LocalDB.copy=function(dt, dn, from_amend) {
  172. var newdoc = LocalDB.create(dt);
  173. for(var key in locals[dt][dn]) {
  174. // dont copy name and blank fields
  175. var df = wn.meta.get_docfield(dt, key);
  176. if(key!=='name' && key.substr(0,2)!='__' &&
  177. !(df && ((!from_amend && cint(df.no_copy)==1) || in_list(LocalDB.no_copy_list, df.fieldname)))) {
  178. locals[dt][newdoc][key] = locals[dt][dn][key];
  179. }
  180. }
  181. return locals[dt][newdoc];
  182. }
  183. // ======================================================================================
  184. function make_doclist(dt, dn) {
  185. if(!locals[dt]) { return []; }
  186. var dl = [];
  187. dl[0] = locals[dt][dn];
  188. // get children
  189. for(var ndt in locals) { // all doctypes
  190. if(locals[ndt]) {
  191. for(var ndn in locals[ndt]) {
  192. var doc = locals[ndt][ndn];
  193. if(doc && doc.parenttype==dt && doc.parent==dn) {
  194. dl.push(doc)
  195. }
  196. }
  197. }
  198. }
  199. return dl;
  200. }
  201. // Meta Data
  202. // ======================================================================================
  203. var Meta={};
  204. var local_dt = {};
  205. // Make Unique Copy of DocType for each record for client scripting
  206. Meta.make_local_dt = function(dt, dn) {
  207. var dl = make_doclist('DocType', dt);
  208. if(!local_dt[dt]) local_dt[dt]={};
  209. if(!local_dt[dt][dn]) local_dt[dt][dn]={};
  210. for(var i=0;i<dl.length;i++) {
  211. var d = dl[i];
  212. if(d.doctype=='DocField') {
  213. var key = d.fieldname ? d.fieldname : d.label;
  214. local_dt[dt][dn][key] = copy_dict(d);
  215. local_dt[dt][dn][key].__copy = true;
  216. }
  217. }
  218. }
  219. Meta.set_field_property=function(fn, key, val, doc) {
  220. if(!doc && (cur_frm.doc))doc = cur_frm.doc;
  221. try{
  222. local_dt[doc.doctype][doc.name][fn][key] = val;
  223. refresh_field(fn);
  224. } catch(e) {
  225. alert("Client Script Error: Unknown values for " + doc.name + ',' + fn +'.'+ key +'='+ val);
  226. }
  227. }
  228. Meta.get_field = function(dt, fn, dn) {
  229. try {
  230. return local_dt[dt][dn][fn];
  231. } catch(e) {
  232. return null;
  233. }
  234. }
  235. // Get Dt label
  236. // ======================================================================================
  237. function get_doctype_label(dt) {
  238. return dt
  239. }
  240. function get_label_doctype(label) {
  241. return label
  242. }
  243. // Global methods for API
  244. // ======================================================================================
  245. var getchildren = LocalDB.getchildren;
  246. var createLocal = LocalDB.create;