No Description

select.js 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, doc, util, dd, dict) {
  2. var m_rd="必选的",readOnly = "readOnly",
  3. showOnly = "showOnly",
  4. modelName = 'select',
  5. mModelName = "mselect",
  6. tInt = "int",
  7. tBool = "bool",
  8. tString = "string",
  9. def = "defVal",
  10. placeholder = "placeholder",
  11. required = "required",
  12. tree = "tree",
  13. queried = "queried",
  14. handCode = { an: "code", av: "" },
  15. spanCode = { an: "code", av: "" },
  16. spanDictCode = { an: "dictCode", av: "" },
  17. pa = [""],
  18. jhref = { an: "href", av: "javascript:;" },
  19. dd_hand = { an: "class", av: "dd-hand" },
  20. icon_drop = { tn: "i", attrs: [{ an: "class", av: "icon icon-drop" }] },
  21. icon_close = { tn: "i", attrs: [{ an: "class", av: "icon icon-close" }] },
  22. a_placeHolder = { tn: "a", attrs: [jhref, { an: "class", av: placeholder }], chs: pa },
  23. hand = {
  24. tn: "a",
  25. attrs: [
  26. dd_hand,
  27. jhref,
  28. handCode,
  29. ],
  30. chs: [
  31. icon_drop,
  32. { tn: "span", attrs: [spanCode, spanDictCode] },
  33. icon_close,
  34. a_placeHolder,
  35. ]
  36. },
  37. seim = { an: "class", av: "select-item" },
  38. sebi = { an: "class", av: "branch-item" },
  39. buildTreeDrop = function(isQueried, items, pa) {
  40. items.forEach(function(item) {
  41. if(isQueried || item.enabled) {
  42. var li = {
  43. tn: "li",
  44. attrs: [{ an: "code", av: item.code }, { an: "caption", av: item.caption }],
  45. chs: []
  46. };
  47. if(item.children && item.children.length) {
  48. var bhand = {
  49. tn: "a",
  50. attrs: [{ an: "code", av: item.code }],
  51. chs: [{ tn: "span", chs: [item.caption] }]
  52. };
  53. li.attrs.push(sebi);
  54. li.chs.push(bhand);
  55. var ul={tn:"ul",chs:[]};
  56. li.chs.push(ul);
  57. buildTreeDrop(isQueried, item.children, ul.chs);
  58. } else {
  59. li.attrs.push(seim);
  60. li.chs.push(item.caption);
  61. }
  62. pa.push(li);
  63. }
  64. });
  65. },
  66. buildShown = function($e, dictCode, clss) {
  67. return clss[tree] ? function(evt) {
  68. var items = dict.get(dictCode);
  69. var drop = { tn: "div", attrs: [{ an: "class", av: "dd-drop" }], chs: [] };
  70. if(items) {
  71. var ul = { tn: "ul", chs: [] };
  72. buildTreeDrop(clss[queried], items, ul.chs);
  73. drop.chs.push(ul);
  74. } else {
  75. drop.chs.push("loading.........");
  76. }
  77. util.appendChild($e[0], drop);
  78. } : function(evt) {
  79. var items = dict.get(dictCode);
  80. var drop = { tn: "div", attrs: [{ an: "class", av: "dd-drop" }], chs: [] };
  81. if(items) {
  82. var ul = { tn: "ul", chs: [] };
  83. items.forEach(function(item) {
  84. if(clss[queried] || item.enabled) {
  85. this.push({
  86. tn: "li",
  87. attrs: [seim, { an: "code", av: item.code }, { an: "caption", av: item.caption }],
  88. chs: [item.caption]
  89. });
  90. }
  91. }, ul.chs);
  92. drop.chs.push(ul);
  93. } else {
  94. drop.chs.push("loading.........");
  95. }
  96. util.appendChild($e[0], drop);
  97. };
  98. };
  99. form.register(function($e) {
  100. var cls = util.classCheck($e[0], [readOnly, showOnly, modelName, tInt, tBool, required, tree, queried]),
  101. rv;
  102. if(cls[modelName]) {
  103. var n = $e.attr("name") || $e.attr("id"),
  104. ve, rules = [];
  105. if(!n) {
  106. throw "Attribute[name] is invalid";
  107. }
  108. var dv = $e.attr(def) || "",
  109. dictCode = $e.attr("dictCode") || "";
  110. rv = dv;
  111. if(!dictCode) { throw "Attribute[dictCode] is invalid"; }
  112. $e.empty().addClass("dd-ctn").addClass("dd-clean");
  113. handCode.av = spanCode.av = dv;
  114. spanDictCode.av = dictCode;
  115. pa[0] = $e.attr(placeholder) || "请选择......";
  116. util.appendChild($e[0], hand);
  117. var $h = $e.children("a");
  118. var $span = $h.children("span");
  119. var select_change = function(nv, cap, evt) {
  120. if(rv != nv) {
  121. rv = nv;
  122. $h.attr("code", rv);
  123. $span.attr("code", rv).text(cap).removeClass("invalid-dict");
  124. if(evt) {
  125. $e.addClass("dd-hold-once");
  126. }
  127. }
  128. };
  129. if(!(cls[readOnly] || cls[showOnly])) {
  130. $e.on("shown.dropdown", buildShown($e, dictCode, cls));
  131. $e.find(".icon-close").on("click", function(evt) {
  132. select_change("", "", evt);
  133. });
  134. $e.on("click", "div .select-item", function() {
  135. select_change(this.getAttribute("code"), this.getAttribute("caption"));
  136. });
  137. if(cls[tree]) {
  138. $e.on("click", "div .branch-item>a", function(evt) {
  139. $(this).toggleClass("open");
  140. $e.addClass("dd-hold-once");
  141. });
  142. }
  143. }
  144. if(rv) {
  145. dict.transfer($span, dictCode, rv);
  146. } else {
  147. dict.apply(dictCode, util.noop);
  148. }
  149. return {
  150. name: n,
  151. get: function() {
  152. if((!cls[showOnly]) && rv) {
  153. return cls[tBool] ? '1' === rv : cls[tInt] ? parseInt(rv) : rv;
  154. }
  155. },
  156. set: function(data) {
  157. if(data) {
  158. var cc = data === true ? "1" : ("" + data);
  159. select_change(cc, "");
  160. dict.transfer($span, dictCode, cc);
  161. } else if(data === false || data === 0) {
  162. select_change("0", "");
  163. dict.transfer($span, dictCode, cc);
  164. } else {
  165. select_change("", "");
  166. }
  167. },
  168. validate: function() {
  169. if(cls[required]) {
  170. if(!rv) {
  171. this.invalid(m_rd);
  172. return m_rd;
  173. }
  174. }
  175. return util.validate(rules, this);
  176. },
  177. addRules: function(rule) {
  178. util.addRules(rules, rule);
  179. },
  180. reset: function() {
  181. this.set(dv);
  182. },
  183. valid: function() { util.valid($e); },
  184. invalid: function(reson) {
  185. util.invalid($e);
  186. util.error(reson);
  187. }
  188. };
  189. }
  190. });
  191. var selCap={an:"class",av:"select-caption"}, mhand = {
  192. tn: "a",
  193. attrs: [dd_hand],
  194. chs: [icon_drop, { tn: "ul" }, a_placeHolder]
  195. };
  196. form.register(function($e) {
  197. var cls = util.classCheck($e[0], [readOnly, showOnly, mModelName, tInt, required, tree, queried]);
  198. if(cls[mModelName]) {
  199. var n = $e.attr("name") || $e.attr("id"),
  200. rules = [];
  201. if(!n) {
  202. throw "Attribute[name] is invalid";
  203. }
  204. var dv = [],
  205. rv = [],
  206. tmp = ($e.attr(def) || "").split(","),
  207. dictCode = $e.attr("dictCode") || "";
  208. if(!dictCode) { throw "Attribute[dictCode] is invalid"; }
  209. tmp.forEach(function(item) {
  210. if(item) {
  211. item = item.trim();
  212. if(item) {
  213. dv.push(item);
  214. rv.push(item);
  215. }
  216. }
  217. });
  218. $e.empty().addClass("dd-ctn").addClass("dd-clean");
  219. pa[0] = $e.attr(placeholder) || "请选择......";
  220. var lis = mhand.chs[1].chs = [];
  221. dv.forEach(function(item) {
  222. lis.push({
  223. tn: "li",
  224. attrs: [{ an: "code", av: item }],
  225. chs: [icon_close, { tn: "span", attrs: [{ an: "code", av: item},selCap] }]
  226. });
  227. });
  228. util.appendChild($e[0], mhand);
  229. var $ul = $e.find("ul");
  230. var mselect_add = function(nv, cp) {
  231. if(rv.indexOf(nv) > -1) {
  232. return false;
  233. }
  234. rv.push(nv);
  235. var li = {
  236. tn: "li",
  237. attrs: [{ an: "code", av: nv }],
  238. chs: [icon_close,
  239. {
  240. tn: "span",
  241. attrs: [{ an: "code", av: nv },selCap],
  242. chs: [cp]
  243. }
  244. ]
  245. };
  246. util.appendChild($ul[0], li);
  247. return true;
  248. };
  249. var mselect_change = function(na) {
  250. rv = [], nlis = [];
  251. $ul.empty();
  252. na.forEach(function(item) {
  253. rv.push("" + item);
  254. });
  255. if(rv.length) {
  256. rv.forEach(function(item) {
  257. nlis.push({
  258. tn: "li",
  259. attrs: [{ an: "code", av: nv },selCap],
  260. chs: [icon_close, {
  261. tn: "span",
  262. attrs: [{ an: "code", av: item.code }, { an: "dict", av: dictCode }, { an: "class", av: "hand-dict" }]
  263. }]
  264. });
  265. });
  266. util.appendChild($ul[0], nlis);
  267. dict.doTransfer();
  268. }
  269. };
  270. if(lis.length) {
  271. $ul.find("span").each(function() {
  272. dict.transfer($(this), dictCode);
  273. });
  274. } else {
  275. dict.apply(dictCode, util.noop);
  276. }
  277. if(!(cls[readOnly] || cls[showOnly])) {
  278. $e.on("shown.dropdown", buildShown($e, dictCode, cls));
  279. $ul.on("click", "li>i", function(e) {
  280. $e.addClass("dd-hold-one");
  281. var idx = rv.indexOf(this.parentNode.getAttribute("code"));
  282. if(idx > -1) {
  283. rv.splice(idx, 1);
  284. }
  285. $(this).parent().remove();
  286. });
  287. $e.on("click", "div .select-item", function() {
  288. if(!mselect_add(this.getAttribute("code"), this.getAttribute("caption"))) {
  289. $e.addClass("dd-hold-once");
  290. }
  291. });
  292. if(cls[tree]) {
  293. $e.on("click", "div .branch-item>a", function(evt) {
  294. $(this).toggleClass("open");
  295. $e.addClass("dd-hold-once");
  296. });
  297. }
  298. }
  299. return {
  300. name: n,
  301. get: function() {
  302. if((!cls[showOnly]) && rv.length) {
  303. var ret = [];
  304. rv.forEach(function(item) {
  305. ret.push(cls[tInt] ? parseInt(item) : item);
  306. });
  307. return ret;
  308. }
  309. },
  310. set: function(data) {
  311. mselect_change(data ? (data.length ? data : []) : []);
  312. },
  313. validate: function() {
  314. if(cls[required]) {
  315. if(!rv.length) {
  316. this.invalid(m_rd);
  317. return m_rd;
  318. }
  319. }
  320. return util.validate(rules, this);
  321. },
  322. addRules: function(rule) {
  323. util.addRules(rules, rule);
  324. },
  325. reset: function(data) {
  326. this.set(dv);
  327. },
  328. valid: function() { util.valid($e); },
  329. invalid: function(reson) {
  330. util.invalid($e);
  331. util.error(reson);
  332. }
  333. };
  334. }
  335. });
  336. });