List.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. MWF.xApplication.Org.List = new Class({
  2. Extends: MWF.widget.Common,
  3. Implements: [Options, Events],
  4. options: {
  5. "style": "default",
  6. "action": false,
  7. "data": {
  8. "name": "",
  9. "attributeList": [""]
  10. },
  11. "attr": []
  12. },
  13. _loadPath: function(){
  14. this.path = "/x_component_Org/$List/";
  15. this.cssPath = "/x_component_Org/$List/"+this.options.style+"/css.wcss";
  16. },
  17. initialize: function(node, content, options){
  18. this.setOptions(options);
  19. this._loadPath();
  20. this._loadCss();
  21. this.content = content;
  22. this.contentNode = $(node);
  23. this.items = [];
  24. this.selectedItems = [];
  25. },
  26. load: function(headers){
  27. //this.node = new Element("div", {"styles": this.css.node}).inject(this.contentNode);
  28. var html = "<table cellspacing='0' cellpadding='5' border='0' width='95%' align='center' style='line-height:normal'>";
  29. html += "<tr><th style='width:20px'></th>";
  30. headers.each(function(title){
  31. html += "<th style='"+title.style+"'>"+title.text+"</th>";
  32. }.bind(this));
  33. html += "</table>";
  34. this.contentNode.set("html", html);
  35. this.loadAction();
  36. this.table = new HtmlTable(this.contentNode.getFirst("table"));
  37. this.contentNode.getElements("th").setStyles(this.css.listTitle);
  38. },
  39. loadAction: function(){
  40. this.actionAreaNode = new Element("div", {"styles": this.css.actionAreaNode}).inject(this.contentNode, "top");
  41. if (this.options.action){
  42. this.actionNode = new Element("div", {"styles": this.css.actionNode}).inject(this.actionAreaNode);
  43. this.deleteAction = new Element("div", {"styles": this.css.deleteActionNode_disabled, "text": this.content.explorer.app.lp.delete}).inject(this.actionNode);
  44. this.addAction = new Element("div", {"styles": this.css.addActionNode, "text": this.content.explorer.app.lp.add}).inject(this.actionNode);
  45. this.addAction.addEvent("click", function(){
  46. this.addItem();
  47. }.bind(this));
  48. this.deleteAction.addEvent("click", function(e){
  49. this.deleteItem(e);
  50. }.bind(this));
  51. }
  52. },
  53. addItem: function(){
  54. var data = Object.clone(this.options.data);
  55. var tr = new MWF.xApplication.Org.List.Item(data, this.options.attr, this);
  56. this.items.push(tr);
  57. tr.edit(tr.tr.tds[1]);
  58. },
  59. deleteItem: function(e){
  60. if (this.selectedItems.length){
  61. var _self = this
  62. this.content.explorer.app.confirm("infor", e, this.content.explorer.app.lp.deleteAttributeTitle, this.content.explorer.app.lp.deleteAttribute, 350, 120, function(){
  63. this.close();
  64. var delCount = 0;
  65. var deleteCompleted = function(){
  66. if (delCount === _self.selectedItems.length){
  67. while (_self.selectedItems.length){
  68. var tr = _self.selectedItems[0];
  69. tr.destroy();
  70. }
  71. }
  72. };
  73. _self.selectedItems.each(function(item){
  74. item["delete"](function(){
  75. delCount++;
  76. deleteCompleted();
  77. });
  78. }.bind(this));
  79. }, function(){this.close();});
  80. }
  81. },
  82. push: function(data){
  83. // var rows = [""];
  84. // attr.each(function(n){
  85. // if (typeOf(n)==="function"){
  86. // rows.push(n.apply(data));
  87. // }else if(typeOf(n)==="string"){
  88. // rows.push(data[n]);
  89. // }else{
  90. // rows.push("");
  91. // }
  92. // }.bind(this));
  93. // var tr = this.table.push(rows, {"styles": this.css.contentTrNode});
  94. // tr.tds.each(function(td){td.setStyles(this.css.contentTdNode);}.bind(this));
  95. // tr.tds[0].setStyles(this.css.selectTdNode);
  96. this.items.push(new MWF.xApplication.Org.List.Item(data, this.options.attr, this));
  97. },
  98. setAction: function(){
  99. if (this.selectedItems.length){
  100. this.deleteAction.setStyles(this.css.deleteActionNode);
  101. }else{
  102. this.deleteAction.setStyles(this.css.deleteActionNode_disabled);
  103. }
  104. }
  105. });
  106. MWF.xApplication.Org.List.Item = new Class({
  107. initialize: function(data, attr, list){
  108. this.data = data;
  109. this.attr = attr;
  110. this.list = list;
  111. this.css = this.list.css;
  112. this.load();
  113. },
  114. load: function(){
  115. var rows = [""];
  116. this.attr.each(function(n){
  117. if (typeOf(n)==="object"){
  118. if (n.get){
  119. rows.push(n.get.apply(this.data));
  120. }else{
  121. rows.push("");
  122. }
  123. }else if(typeOf(n)==="string"){
  124. rows.push(this.data[n]);
  125. }else{
  126. rows.push("");
  127. }
  128. }.bind(this));
  129. this.tr = this.list.table.push(rows, {"styles": this.css.contentTrNode});
  130. var _self = this;
  131. this.tr.tds.each(function(td, i){
  132. td.setStyles(this.css.contentTdNode);
  133. if (i===0) this.selectTd = td;
  134. if (i>0){
  135. if (this.list.options.action){
  136. td.store("attr", this.attr[i-1]);
  137. td.addEvent("click", function(){
  138. _self.edit(this);
  139. });
  140. }
  141. }
  142. }.bind(this));
  143. if (this.list.options.action){
  144. this.selectTd.setStyles(this.css.selectTdNode);
  145. this.selectTd.addEvent("click", function(){
  146. if (!this.isSelected){
  147. this.selected();
  148. }else{
  149. this.unSelected();
  150. }
  151. }.bind(this));
  152. }else{
  153. this.selectTd.setStyles(this.css.blankTdNode);
  154. }
  155. },
  156. edit: function(td){
  157. var attr = td.retrieve("attr");
  158. var text = td.get("text");
  159. td.empty();
  160. var input = new Element("input", {"styles": this.css.inputNode, "value": text}).inject(td);
  161. td.removeEvents("click");
  162. var _self = this;
  163. input.focus();
  164. input.addEvents({
  165. "blur": function(){
  166. var value = this.get("value");
  167. if (value){
  168. if (typeOf(attr)==="object"){
  169. if (attr.set){
  170. attr.set.apply(_self.data, [value]);
  171. }
  172. }else if(typeOf(attr)==="string") {
  173. _self.data[attr] = value
  174. }
  175. }
  176. _self.editCompleted(td, value, text);
  177. }
  178. });
  179. },
  180. editCompleted: function(td, value, text){
  181. td.empty();
  182. if (!value && !text){
  183. if (td.cellIndex===1){
  184. this.destroy();
  185. }
  186. }else if (!value){
  187. if (td.cellIndex===1){
  188. td.set("text", text);
  189. }else{
  190. td.set("text", value);
  191. if (value!=text) this.save();
  192. }
  193. }else{
  194. td.set("text", value);
  195. if (value!=text) this.save();
  196. }
  197. var _self = this;
  198. td.addEvent("click", function(){
  199. _self.edit(this);
  200. });
  201. },
  202. "delete": function(callback){
  203. this.list.content.explorer.actions.deletePersonAttribute(this.data.id, function(){
  204. if (callback) callback();
  205. //this.destroy();
  206. }.bind(this));
  207. },
  208. destroy: function(){
  209. debugger;
  210. this.list.items.erase(this);
  211. if (this.isSelected) this.unSelected();
  212. this.list.setAction();
  213. this.tr.tr.destroy();
  214. MWF.release(this);
  215. },
  216. save: function(){
  217. this.list.content.explorer.actions.savePersonAttribute(this.data, function(json){
  218. this.data.id = json.data.id;
  219. }.bind(this), function(xhr, text, error){
  220. if (xhr) errorText = xhr.responseText;
  221. this.list.content.explorer.app.notice("request json error: "+errorText, "error");
  222. }.bind(this));
  223. },
  224. selected: function(){
  225. this.selectTd.setStyles(this.css.selectTdNode_selected);
  226. this.tr.tr.setStyles(this.css.contentTrNode_selected);
  227. this.list.selectedItems.push(this);
  228. this.isSelected = true;
  229. this.list.setAction();
  230. },
  231. unSelected: function(){
  232. this.selectTd.setStyles(this.css.selectTdNode);
  233. this.tr.tr.setStyles(this.css.contentTrNode);
  234. this.list.selectedItems.erase(this);
  235. this.isSelected = false;
  236. this.list.setAction();
  237. }
  238. });