dwz.database.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. /**
  2. * @author ZhangHuihua@msn.com
  3. */
  4. (function($){
  5. var _lookup = {currentGroup:"", suffix:"", $target:null, pk:"id"};
  6. var _util = {
  7. _lookupPrefix: function(key){
  8. var strDot = _lookup.currentGroup ? "." : "";
  9. return _lookup.currentGroup + strDot + key + _lookup.suffix;
  10. },
  11. lookupPk: function(key){
  12. return this._lookupPrefix(key);
  13. },
  14. lookupField: function(key){
  15. return this.lookupPk(key);
  16. }
  17. };
  18. $.extend({
  19. bringBackSuggest: function(args){
  20. var $box = _lookup['$target'].parents(".unitBox:first");
  21. $box.find(":input").each(function(){
  22. var $input = $(this), inputName = $input.attr("name");
  23. for (var key in args) {
  24. var name = (_lookup.pk == key) ? _util.lookupPk(key) : _util.lookupField(key);
  25. if (name == inputName) {
  26. $input.val(args[key]);
  27. break;
  28. }
  29. }
  30. });
  31. },
  32. bringBack: function(args){
  33. $.bringBackSuggest(args);
  34. $.pdialog.closeCurrent();
  35. }
  36. });
  37. $.fn.extend({
  38. lookup: function(){
  39. return this.each(function(){
  40. var $this = $(this), options = {mask:true,
  41. width:$this.attr('width')||820, height:$this.attr('height')||400,
  42. maxable:eval($this.attr("maxable") || "true"),
  43. resizable:eval($this.attr("resizable") || "true")
  44. };
  45. $this.click(function(event){
  46. _lookup = $.extend(_lookup, {
  47. currentGroup: $this.attr("lookupGroup") || "",
  48. suffix: $this.attr("suffix") || "",
  49. $target: $this,
  50. pk: $this.attr("lookupPk") || "id"
  51. });
  52. var url = unescape($this.attr("href")).replaceTmById($(event.target).parents(".unitBox:first"));
  53. if (!url.isFinishedTm()) {
  54. alertMsg.error($this.attr("warn") || DWZ.msg("alertSelectMsg"));
  55. return false;
  56. }
  57. $.pdialog.open(url, "_blank", $this.attr("title") || $this.text(), options);
  58. return false;
  59. });
  60. });
  61. },
  62. multLookup: function(){
  63. return this.each(function(){
  64. var $this = $(this), args={};
  65. $this.click(function(event){
  66. var $unitBox = $this.parents(".unitBox:first");
  67. $unitBox.find("[name='"+$this.attr("multLookup")+"']").filter(":checked").each(function(){
  68. var _args = DWZ.jsonEval($(this).val());
  69. for (var key in _args) {
  70. var value = args[key] ? args[key]+"," : "";
  71. args[key] = value + _args[key];
  72. }
  73. });
  74. if ($.isEmptyObject(args)) {
  75. alertMsg.error($this.attr("warn") || DWZ.msg("alertSelectMsg"));
  76. return false;
  77. }
  78. $.bringBack(args);
  79. });
  80. });
  81. },
  82. suggest: function(){
  83. var op = {suggest$:"#suggest", suggestShadow$: "#suggestShadow"};
  84. var selectedIndex = -1;
  85. return this.each(function(){
  86. var $input = $(this).attr('autocomplete', 'off').keydown(function(event){
  87. if (event.keyCode == DWZ.keyCode.ENTER && $(op.suggest$).is(':visible')) return false; //屏蔽回车提交
  88. });
  89. var suggestFields=$input.attr('suggestFields').split(",");
  90. function _show(event){
  91. var offset = $input.offset();
  92. var iTop = offset.top+this.offsetHeight;
  93. var $suggest = $(op.suggest$);
  94. if ($suggest.size() == 0) $suggest = $('<div id="suggest"></div>').appendTo($('body'));
  95. $suggest.css({
  96. left:offset.left+'px',
  97. top:iTop+'px'
  98. }).show();
  99. _lookup = $.extend(_lookup, {
  100. currentGroup: $input.attr("lookupGroup") || "",
  101. suffix: $input.attr("suffix") || "",
  102. $target: $input,
  103. pk: $input.attr("lookupPk") || "id"
  104. });
  105. var url = unescape($input.attr("suggestUrl")).replaceTmById($(event.target).parents(".unitBox:first"));
  106. if (!url.isFinishedTm()) {
  107. alertMsg.error($input.attr("warn") || DWZ.msg("alertSelectMsg"));
  108. return false;
  109. }
  110. var postData = {};
  111. postData[$input.attr("postField")||"inputValue"] = $input.val();
  112. $.ajax({
  113. global:false,
  114. type:'POST', dataType:"json", url:url, cache: false,
  115. data: postData,
  116. success: function(response){
  117. if (!response) return;
  118. var html = '';
  119. $.each(response, function(i){
  120. var liAttr = '', liLabel = '';
  121. for (var i=0; i<suggestFields.length; i++){
  122. var str = this[suggestFields[i]];
  123. if (str) {
  124. if (liLabel) liLabel += '-';
  125. liLabel += str;
  126. }
  127. }
  128. for (var key in this) {
  129. if (liAttr) liAttr += ',';
  130. liAttr += key+":'"+this[key]+"'";
  131. }
  132. html += '<li lookupAttrs="'+liAttr+'">' + liLabel + '</li>';
  133. });
  134. var $lis = $suggest.html('<ul>'+html+'</ul>').find("li");
  135. $lis.hoverClass("selected").click(function(){
  136. _select($(this));
  137. });
  138. if ($lis.size() == 1 && event.keyCode != DWZ.keyCode.BACKSPACE) {
  139. _select($lis.eq(0));
  140. } else if ($lis.size() == 0){
  141. var jsonStr = "";
  142. for (var i=0; i<suggestFields.length; i++){
  143. if (_util.lookupField(suggestFields[i]) == event.target.name) {
  144. break;
  145. }
  146. if (jsonStr) jsonStr += ',';
  147. jsonStr += suggestFields[i]+":''";
  148. }
  149. jsonStr = "{"+_lookup.pk+":''," + jsonStr +"}";
  150. $.bringBackSuggest(DWZ.jsonEval(jsonStr));
  151. }
  152. },
  153. error: function(){
  154. $suggest.html('');
  155. }
  156. });
  157. $(document).bind("click", _close);
  158. return false;
  159. }
  160. function _select($item){
  161. var jsonStr = "{"+ $item.attr('lookupAttrs') +"}";
  162. $.bringBackSuggest(DWZ.jsonEval(jsonStr));
  163. }
  164. function _close(){
  165. $(op.suggest$).html('').hide();
  166. selectedIndex = -1;
  167. $(document).unbind("click", _close);
  168. }
  169. $input.focus(_show).click(false).keyup(function(event){
  170. var $items = $(op.suggest$).find("li");
  171. switch(event.keyCode){
  172. case DWZ.keyCode.ESC:
  173. case DWZ.keyCode.TAB:
  174. case DWZ.keyCode.SHIFT:
  175. case DWZ.keyCode.HOME:
  176. case DWZ.keyCode.END:
  177. case DWZ.keyCode.LEFT:
  178. case DWZ.keyCode.RIGHT:
  179. break;
  180. case DWZ.keyCode.ENTER:
  181. _close();
  182. break;
  183. case DWZ.keyCode.DOWN:
  184. if (selectedIndex >= $items.size()-1) selectedIndex = -1;
  185. else selectedIndex++;
  186. break;
  187. case DWZ.keyCode.UP:
  188. if (selectedIndex < 0) selectedIndex = $items.size()-1;
  189. else selectedIndex--;
  190. break;
  191. default:
  192. _show(event);
  193. }
  194. $items.removeClass("selected");
  195. if (selectedIndex>=0) {
  196. var $item = $items.eq(selectedIndex).addClass("selected");
  197. _select($item);
  198. }
  199. });
  200. });
  201. },
  202. itemDetail: function(){
  203. return this.each(function(){
  204. var $table = $(this).css("clear","both"), $tbody = $table.find("tbody");
  205. var fields=[];
  206. $table.find("tr:first th[type]").each(function(i){
  207. var $th = $(this);
  208. var field = {
  209. type: $th.attr("type") || "text",
  210. patternDate: $th.attr("dateFmt") || "yyyy-MM-dd",
  211. name: $th.attr("name") || "",
  212. defaultVal: $th.attr("defaultVal") || "",
  213. size: $th.attr("size") || "12",
  214. enumUrl: $th.attr("enumUrl") || "",
  215. lookupGroup: $th.attr("lookupGroup") || "",
  216. lookupUrl: $th.attr("lookupUrl") || "",
  217. lookupPk: $th.attr("lookupPk") || "id",
  218. suggestUrl: $th.attr("suggestUrl"),
  219. suggestFields: $th.attr("suggestFields"),
  220. postField: $th.attr("postField") || "",
  221. fieldClass: $th.attr("fieldClass") || "",
  222. fieldAttrs: $th.attr("fieldAttrs") || ""
  223. };
  224. fields.push(field);
  225. });
  226. $tbody.find("a.btnDel").click(function(){
  227. var $btnDel = $(this);
  228. if ($btnDel.is("[href^=javascript:]")){
  229. $btnDel.parents("tr:first").remove();
  230. initSuffix($tbody);
  231. return false;
  232. }
  233. function delDbData(){
  234. $.ajax({
  235. type:'POST', dataType:"json", url:$btnDel.attr('href'), cache: false,
  236. success: function(){
  237. $btnDel.parents("tr:first").remove();
  238. initSuffix($tbody);
  239. },
  240. error: DWZ.ajaxError
  241. });
  242. }
  243. if ($btnDel.attr("title")){
  244. alertMsg.confirm($btnDel.attr("title"), {okCall: delDbData});
  245. } else {
  246. delDbData();
  247. }
  248. return false;
  249. });
  250. var addButTxt = $table.attr('addButton') || "Add New";
  251. if (addButTxt) {
  252. var $addBut = $('<div class="button"><div class="buttonContent"><button type="button">'+addButTxt+'</button></div></div>').insertBefore($table).find("button");
  253. var $rowNum = $('<input type="text" name="dwz_rowNum" class="textInput" style="margin:2px;" value="1" size="2"/>').insertBefore($table);
  254. var trTm = "";
  255. $addBut.click(function(){
  256. if (! trTm) trTm = trHtml(fields);
  257. var rowNum = 1;
  258. try{rowNum = parseInt($rowNum.val())} catch(e){}
  259. for (var i=0; i<rowNum; i++){
  260. var $tr = $(trTm);
  261. $tr.appendTo($tbody).initUI().find("a.btnDel").click(function(){
  262. $(this).parents("tr:first").remove();
  263. initSuffix($tbody);
  264. return false;
  265. });
  266. }
  267. initSuffix($tbody);
  268. });
  269. }
  270. });
  271. /**
  272. * 删除时重新初始化下标
  273. */
  274. function initSuffix($tbody) {
  275. $tbody.find('>tr').each(function(i){
  276. $(':input, a.btnLook, a.btnAttach', this).each(function(){
  277. var $this = $(this), name = $this.attr('name'), val = $this.val();
  278. if (name) $this.attr('name', name.replaceSuffix(i));
  279. var lookupGroup = $this.attr('lookupGroup');
  280. if (lookupGroup) {$this.attr('lookupGroup', lookupGroup.replaceSuffix(i));}
  281. var suffix = $this.attr("suffix");
  282. if (suffix) {$this.attr('suffix', suffix.replaceSuffix(i));}
  283. if (val && val.indexOf("#index#") >= 0) $this.val(val.replace('#index#',i+1));
  284. });
  285. });
  286. }
  287. function tdHtml(field){
  288. var html = '', suffix = '';
  289. if (field.name.endsWith("[#index#]")) suffix = "[#index#]";
  290. else if (field.name.endsWith("[]")) suffix = "[]";
  291. var suffixFrag = suffix ? ' suffix="' + suffix + '" ' : '';
  292. var attrFrag = '';
  293. if (field.fieldAttrs){
  294. var attrs = DWZ.jsonEval(field.fieldAttrs);
  295. for (var key in attrs) {
  296. attrFrag += key+'="'+attrs[key]+'"';
  297. }
  298. }
  299. switch(field.type){
  300. case 'del':
  301. html = '<a href="javascript:void(0)" class="btnDel '+ field.fieldClass + '">删除</a>';
  302. break;
  303. case 'lookup':
  304. var suggestFrag = '';
  305. if (field.suggestFields) {
  306. suggestFrag = 'autocomplete="off" lookupGroup="'+field.lookupGroup+'"'+suffixFrag+' suggestUrl="'+field.suggestUrl+'" suggestFields="'+field.suggestFields+'"' + ' postField="'+field.postField+'"';
  307. }
  308. html = '<input type="hidden" name="'+field.lookupGroup+'.'+field.lookupPk+suffix+'"/>'
  309. + '<input type="text" name="'+field.name+'"'+suggestFrag+' lookupPk="'+field.lookupPk+'" size="'+field.size+'" class="'+field.fieldClass+'"/>'
  310. + '<a class="btnLook" href="'+field.lookupUrl+'" lookupGroup="'+field.lookupGroup+'" '+suggestFrag+' lookupPk="'+field.lookupPk+'" title="查找带回">查找带回</a>';
  311. break;
  312. case 'attach':
  313. html = '<input type="hidden" name="'+field.lookupGroup+'.'+field.lookupPk+suffix+'"/>'
  314. + '<input type="text" name="'+field.name+'" size="'+field.size+'" readonly="readonly" class="'+field.fieldClass+'"/>'
  315. + '<a class="btnAttach" href="'+field.lookupUrl+'" lookupGroup="'+field.lookupGroup+'" '+suffixFrag+' lookupPk="'+field.lookupPk+'" width="560" height="300" title="查找带回">查找带回</a>';
  316. break;
  317. case 'enum':
  318. $.ajax({
  319. type:"POST", dataType:"html", async: false,
  320. url:field.enumUrl,
  321. data:{inputName:field.name},
  322. success:function(response){
  323. html = response;
  324. }
  325. });
  326. break;
  327. case 'date':
  328. html = '<input type="text" name="'+field.name+'" value="'+field.defaultVal+'" class="date '+field.fieldClass+'" dateFmt="'+field.patternDate+'" size="'+field.size+'"/>'
  329. +'<a class="inputDateButton" href="javascript:void(0)">选择</a>';
  330. break;
  331. default:
  332. html = '<input type="'+field.type+'" name="'+field.name+'" value="'+field.defaultVal+'" size="'+field.size+'" class="'+field.fieldClass+'" '+attrFrag+'/>';
  333. break;
  334. }
  335. return '<td>'+html+'</td>';
  336. }
  337. function trHtml(fields){
  338. var html = '';
  339. $(fields).each(function(){
  340. html += tdHtml(this);
  341. });
  342. return '<tr class="unitBox">'+html+'</tr>';
  343. }
  344. },
  345. selectedTodo: function(){
  346. function _getIds(selectedIds, targetType){
  347. var ids = "";
  348. var $box = targetType == "dialog" ? $.pdialog.getCurrent() : navTab.getCurrentPanel();
  349. $box.find("input:checked").filter("[name='"+selectedIds+"']").each(function(i){
  350. var val = $(this).val();
  351. ids += i==0 ? val : ","+val;
  352. });
  353. return ids;
  354. }
  355. return this.each(function(){
  356. var $this = $(this);
  357. var selectedIds = $this.attr("rel") || "ids";
  358. var postType = $this.attr("postType") || "map";
  359. $this.click(function(){
  360. var targetType = $this.attr("targetType");
  361. var csrfName = $this.attr("csrfName");
  362. var csrfVal = $this.attr("csrfVal");
  363. var ids = _getIds(selectedIds, targetType);
  364. if (!ids) {
  365. alertMsg.error($this.attr("warn") || DWZ.msg("alertSelectMsg"));
  366. return false;
  367. }
  368. var _callback = $this.attr("callback") || (targetType == "dialog" ? dialogAjaxDone : navTabAjaxDone);
  369. if (! $.isFunction(_callback)) _callback = eval('(' + _callback + ')');
  370. function _doPost(){
  371. $.ajax({
  372. type:'POST', url:$this.attr('href'), dataType:'json', cache: false,
  373. data: function(){
  374. if (postType == 'map'){
  375. return $.map(ids.split(','), function(val, i) {
  376. return {name: selectedIds, value: val};
  377. })
  378. } else {
  379. var _data = {};
  380. _data[selectedIds] = ids;
  381. if (csrfName && csrfVal) {
  382. _data[csrfName] = csrfVal;
  383. }
  384. return _data;
  385. }
  386. }(),
  387. success: _callback,
  388. error: DWZ.ajaxError
  389. });
  390. }
  391. var title = $this.attr("title");
  392. if (title) {
  393. alertMsg.confirm(title, {okCall: _doPost});
  394. } else {
  395. _doPost();
  396. }
  397. return false;
  398. });
  399. });
  400. }
  401. });
  402. })(jQuery);