doublebox-bootstrap.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. (function ($, window, document, undefined) {
  2. var pluginName = "bootstrapDualListbox",
  3. defaults = {
  4. bootstrap2Compatible: false,
  5. filterTextClear: "show all",
  6. filterPlaceHolder: "Filter",
  7. moveSelectedLabel: "Move selected",
  8. moveAllLabel: "Move all",
  9. removeSelectedLabel: "Remove selected",
  10. removeAllLabel: "Remove all",
  11. moveOnSelect: true,
  12. preserveSelectionOnMove: false,
  13. selectedListLabel: false,
  14. nonSelectedListLabel: false,
  15. helperSelectNamePostfix: "_helper",
  16. selectorMinimalHeight: 100,
  17. showFilterInputs: true,
  18. nonSelectedFilter: "",
  19. selectedFilter: "",
  20. filterOnValues: false,
  21. doubleMove: false
  22. },
  23. isBuggyAndroid = /android/i.test(navigator.userAgent.toLowerCase());
  24. function BootstrapDualListbox(element, options) {
  25. this.element = $(element);
  26. this.settings = $.extend({},
  27. defaults, options);
  28. this._defaults = defaults;
  29. this._name = pluginName;
  30. this.init()
  31. }
  32. function triggerChangeEvent(dualListbox) {
  33. dualListbox.element.trigger("change")
  34. }
  35. function updateSelectionStates(dualListbox) {
  36. dualListbox.element.find("option").each(function (index, item) {
  37. var $item = $(item);
  38. if (typeof ($item.data("original-index")) === "undefined") {
  39. $item.data("original-index", dualListbox.elementCount++)
  40. }
  41. if (typeof ($item.data("_selected")) === "undefined") {
  42. $item.data("_selected", false)
  43. }
  44. })
  45. }
  46. function changeSelectionState(dualListbox, original_index, selected) {
  47. dualListbox.element.find("option").each(function (index, item) {
  48. var $item = $(item);
  49. if ($item.data("original-index") === original_index) {
  50. $item.prop("selected", selected)
  51. }
  52. })
  53. }
  54. function formatString(s, args) {
  55. return s.replace(/\{(\d+)\}/g,
  56. function (match, number) {
  57. return typeof args[number] !== "undefined" ? args[number] : match
  58. })
  59. }
  60. function refreshInfo(dualListbox) {
  61. if (!dualListbox.settings.infoText) {
  62. return
  63. }
  64. var visible1 = dualListbox.elements.select1.find("option").length,
  65. visible2 = dualListbox.elements.select2.find("option").length,
  66. all1 = dualListbox.element.find("option").length - dualListbox.selectedElements,
  67. all2 = dualListbox.selectedElements,
  68. content = "";
  69. if (all1 === 0) {
  70. content = dualListbox.settings.infoTextEmpty
  71. } else {
  72. if (visible1 === all1) {
  73. content = formatString(dualListbox.settings.infoText, [visible1, all1])
  74. } else {
  75. content = formatString(dualListbox.settings.infoTextFiltered, [visible1, all1])
  76. }
  77. }
  78. dualListbox.elements.info1.html(content);
  79. dualListbox.elements.box1.toggleClass("filtered", !(visible1 === all1 || all1 === 0));
  80. if (all2 === 0) {
  81. content = dualListbox.settings.infoTextEmpty
  82. } else {
  83. if (visible2 === all2) {
  84. content = formatString(dualListbox.settings.infoText, [visible2, all2])
  85. } else {
  86. content = formatString(dualListbox.settings.infoTextFiltered, [visible2, all2])
  87. }
  88. }
  89. dualListbox.elements.info2.html(content);
  90. dualListbox.elements.box2.toggleClass("filtered", !(visible2 === all2 || all2 === 0))
  91. }
  92. function refreshSelects(dualListbox) {
  93. dualListbox.selectedElements = 0;
  94. dualListbox.elements.select1.empty();
  95. dualListbox.elements.select2.empty();
  96. dualListbox.element.find("option").each(function (index, item) {
  97. var $item = $(item);
  98. if ($item.prop("selected")) {
  99. dualListbox.selectedElements++;
  100. dualListbox.elements.select2.append($item.clone(true).prop("selected", $item.data("_selected")))
  101. } else if($item.attr("isshow")==="1") {
  102. dualListbox.elements.select1.append($item.clone(true).prop("selected", $item.data("_selected")))
  103. }
  104. });
  105. if (dualListbox.settings.showFilterInputs) {
  106. filter(dualListbox, 1);
  107. filter(dualListbox, 2)
  108. }
  109. refreshInfo(dualListbox)
  110. }
  111. function filter(dualListbox, selectIndex) {
  112. if (!dualListbox.settings.showFilterInputs) {
  113. return
  114. }
  115. saveSelections(dualListbox, selectIndex);
  116. dualListbox.elements["select" + selectIndex].empty().scrollTop(0);
  117. var regex = new RegExp($.trim(dualListbox.elements["filterInput" + selectIndex].val()), "gi"),
  118. options = dualListbox.element;
  119. if (selectIndex === 1) {
  120. options = options.find("option[isshow='1']").not(":selected")
  121. } else {
  122. options = options.find("option:selected")
  123. }
  124. options.each(function (index, item) {
  125. var $item = $(item),
  126. isFiltered = true;
  127. if (item.text.match(regex) || (dualListbox.settings.filterOnValues && $item.attr("value").match(regex))) {
  128. isFiltered = false;
  129. dualListbox.elements["select" + selectIndex].append($item.clone(true).prop("selected", $item.data("_selected")))
  130. }
  131. dualListbox.element.find("option").eq($item.data("original-index")).data("filtered" + selectIndex, isFiltered)
  132. });
  133. refreshInfo(dualListbox)
  134. }
  135. function saveSelections(dualListbox, selectIndex) {
  136. dualListbox.elements["select" + selectIndex].find("option").each(function (index, item) {
  137. var $item = $(item);
  138. dualListbox.element.find("option").eq($item.data("original-index")).data("_selected", $item.prop("selected"))
  139. })
  140. }
  141. function sortOptions(select) {
  142. select.find("option").sort(function (a, b) {
  143. return ($(a).data("original-index") > $(b).data("original-index")) ? 1 : -1
  144. }).appendTo(select)
  145. }
  146. function clearSelections(dualListbox) {
  147. dualListbox.elements.select1.find("option").each(function () {
  148. dualListbox.element.find("option").data("_selected", false)
  149. })
  150. }
  151. function move(dualListbox) {
  152. if (dualListbox.settings.preserveSelectionOnMove === "all" && !dualListbox.settings.moveOnSelect) {
  153. saveSelections(dualListbox, 1);
  154. saveSelections(dualListbox, 2)
  155. } else {
  156. if (dualListbox.settings.preserveSelectionOnMove === "moved" && !dualListbox.settings.moveOnSelect) {
  157. saveSelections(dualListbox, 1)
  158. }
  159. }
  160. dualListbox.elements.select1.find("option:selected").each(function (index, item) {
  161. var $item = $(item);
  162. if (!$item.data("filtered1")) {
  163. changeSelectionState(dualListbox, $item.data("original-index"), true)
  164. }
  165. });
  166. refreshSelects(dualListbox);
  167. triggerChangeEvent(dualListbox);
  168. sortOptions(dualListbox.elements.select2)
  169. }
  170. function remove(dualListbox) {
  171. if (dualListbox.settings.preserveSelectionOnMove === "all" && !dualListbox.settings.moveOnSelect) {
  172. saveSelections(dualListbox, 1);
  173. saveSelections(dualListbox, 2)
  174. } else {
  175. if (dualListbox.settings.preserveSelectionOnMove === "moved" && !dualListbox.settings.moveOnSelect) {
  176. saveSelections(dualListbox, 2)
  177. }
  178. }
  179. dualListbox.elements.select2.find("option:selected").each(function (index, item) {
  180. var $item = $(item);
  181. if (!$item.data("filtered2")) {
  182. changeSelectionState(dualListbox, $item.data("original-index"), false)
  183. }
  184. });
  185. refreshSelects(dualListbox);
  186. triggerChangeEvent(dualListbox);
  187. sortOptions(dualListbox.elements.select1)
  188. }
  189. function moveAll(dualListbox) {
  190. if (dualListbox.settings.preserveSelectionOnMove === "all" && !dualListbox.settings.moveOnSelect) {
  191. saveSelections(dualListbox, 1);
  192. saveSelections(dualListbox, 2)
  193. } else {
  194. if (dualListbox.settings.preserveSelectionOnMove === "moved" && !dualListbox.settings.moveOnSelect) {
  195. saveSelections(dualListbox, 1)
  196. }
  197. }
  198. dualListbox.element.find("option[isshow='1']").each(function (index, item) {
  199. var $item = $(item);
  200. if (!$item.data("filtered1")) {
  201. $item.prop("selected", true)
  202. }
  203. });
  204. refreshSelects(dualListbox);
  205. triggerChangeEvent(dualListbox)
  206. }
  207. function removeAll(dualListbox) {
  208. if (dualListbox.settings.preserveSelectionOnMove === "all" && !dualListbox.settings.moveOnSelect) {
  209. saveSelections(dualListbox, 1);
  210. saveSelections(dualListbox, 2)
  211. } else {
  212. if (dualListbox.settings.preserveSelectionOnMove === "moved" && !dualListbox.settings.moveOnSelect) {
  213. saveSelections(dualListbox, 2)
  214. }
  215. }
  216. dualListbox.element.find("option").each(function (index, item) {
  217. var $item = $(item);
  218. if (!$item.data("filtered2")) {
  219. $item.prop("selected", false)
  220. }
  221. });
  222. refreshSelects(dualListbox);
  223. triggerChangeEvent(dualListbox)
  224. }
  225. function upSort(dualListbox) {
  226. dualListbox.elements.select2.find("option:selected").each(function (index, item) {
  227. var $item = $(item);
  228. var $target = $item.prev();
  229. $item.insertBefore($target)
  230. })
  231. }
  232. function downSort(dualListbox) {
  233. dualListbox.elements.select2.find("option:selected").each(function (index, item) {
  234. var $item = $(item);
  235. var $target = $item.next();
  236. $item.insertAfter($target)
  237. })
  238. }
  239. function bindEvents(dualListbox) {
  240. dualListbox.elements.form.submit(function (e) {
  241. if (dualListbox.elements.filterInput1.is(":focus")) {
  242. e.preventDefault();
  243. dualListbox.elements.filterInput1.focusout()
  244. } else {
  245. if (dualListbox.elements.filterInput2.is(":focus")) {
  246. e.preventDefault();
  247. dualListbox.elements.filterInput2.focusout()
  248. }
  249. }
  250. });
  251. dualListbox.element.on("bootstrapDualListbox.refresh",
  252. function (e, mustClearSelections) {
  253. dualListbox.refresh(mustClearSelections)
  254. });
  255. dualListbox.elements.filterClear1.on("click",
  256. function () {
  257. dualListbox.setNonSelectedFilter("", true)
  258. });
  259. dualListbox.elements.filterClear2.on("click",
  260. function () {
  261. dualListbox.setSelectedFilter("", true)
  262. });
  263. dualListbox.elements.moveButton.on("click",
  264. function () {
  265. move(dualListbox)
  266. });
  267. dualListbox.elements.moveAllButton.on("click",
  268. function () {
  269. moveAll(dualListbox)
  270. });
  271. dualListbox.elements.removeButton.on("click",
  272. function () {
  273. remove(dualListbox)
  274. });
  275. dualListbox.elements.removeAllButton.on("click",
  276. function () {
  277. removeAll(dualListbox)
  278. });
  279. dualListbox.elements.upButton.on("click",
  280. function () {
  281. upSort(dualListbox)
  282. });
  283. dualListbox.elements.downButton.on("click",
  284. function () {
  285. downSort(dualListbox)
  286. });
  287. dualListbox.elements.filterInput1.on("change keyup",
  288. function () {
  289. filter(dualListbox, 1)
  290. });
  291. dualListbox.elements.filterInput2.on("change keyup",
  292. function () {
  293. filter(dualListbox, 2)
  294. });
  295. dualListbox.elements.filterInput2.on("change keyup",
  296. function () {
  297. filter(dualListbox, 2)
  298. })
  299. }
  300. BootstrapDualListbox.prototype = {
  301. init: function () {
  302. this.container = $("" + '<div class="bootstrap-duallistbox-container">' +
  303. ' <div class="box1">' + " <label></label>" + ' <span class="info-container">' + ' <span class="info"></span>' + ' <button type="button" class="btn clear1 pull-right"></button>' + " </span>" + ' <input class="filter form-control ue-form" type="text">' + ' <select multiple="multiple"></select>' + " </div>" + ' <div class="btn-box" style="margin-top:70px">' + ' <button type="button" class="btn db-btn move">' + " <i></i>" + " </button>" + ' <button type="button" class="btn db-btn moveall">' + " <i></i>" + " <i></i>" + " </button>" + ' <p class="clearfix" style="margin-bottom:5px"></p>' + ' <button type="button" class="btn db-btn remove">' + " <i></i>" + " </button>" + ' <button type="button" class="btn db-btn removeall">' + " <i></i>" + " <i></i>" + " </button>" + " </div>" + ' <div class="box2">' + " <label></label>" + ' <span class="info-container">' + ' <span class="info"></span>' + ' <button type="button" class="btn clear2 pull-right"></button>' + " </span>" + ' <input class="filter form-control ue-form" type="text">' + ' <select multiple="multiple"></select>' + " </div>"
  304. //+' <div class="settingUp-btns">' + ' ' +
  305. //'<button class="btn db-btn upBtn">' + " <i></i>" + " </button>" + ' <button class="btn db-btn downBtn">' + " <i></i>" + " </button>" + " </div>"
  306. + "</div>").insertBefore(this.element);
  307. this.elements = {
  308. originalSelect: this.element,
  309. box1: $(".box1", this.container),
  310. box2: $(".box2", this.container),
  311. filterInput1: $(".box1 .filter", this.container),
  312. filterInput2: $(".box2 .filter", this.container),
  313. filterClear1: $(".box1 .clear1", this.container),
  314. filterClear2: $(".box2 .clear2", this.container),
  315. label1: $(".box1 > label", this.container),
  316. label2: $(".box2 > label", this.container),
  317. info1: $(".box1 .info", this.container),
  318. info2: $(".box2 .info", this.container),
  319. select1: $(".box1 select", this.container),
  320. select2: $(".box2 select", this.container),
  321. moveButton: $(".btn-box .move", this.container),
  322. removeButton: $(".btn-box .remove", this.container),
  323. moveAllButton: $(".btn-box .moveall", this.container),
  324. removeAllButton: $(".btn-box .removeall", this.container),
  325. upButton: $(".settingUp-btns .upBtn", this.container),
  326. downButton: $(".settingUp-btns .downBtn", this.container),
  327. form: $($(".box1 .filter", this.container)[0].form)
  328. };
  329. this.originalSelectName = this.element.attr("name") || "";
  330. var select1Id = "bootstrap-duallistbox-nonselected-list_" + this.originalSelectName,
  331. select2Id = "bootstrap-duallistbox-selected-list_" + this.originalSelectName;
  332. this.elements.select1.attr("id", select1Id);
  333. this.elements.select2.attr("id", select2Id);
  334. this.elements.label1.attr("for", select1Id);
  335. this.elements.label2.attr("for", select2Id);
  336. this.selectedElements = 0;
  337. this.elementCount = 0;
  338. this.setBootstrap2Compatible(this.settings.bootstrap2Compatible);
  339. this.setFilterTextClear(this.settings.filterTextClear);
  340. this.setFilterPlaceHolder(this.settings.filterPlaceHolder);
  341. this.setMoveSelectedLabel(this.settings.moveSelectedLabel);
  342. this.setMoveAllLabel(this.settings.moveAllLabel);
  343. this.setRemoveSelectedLabel(this.settings.removeSelectedLabel);
  344. this.setRemoveAllLabel(this.settings.removeAllLabel);
  345. this.setMoveOnSelect(this.settings.moveOnSelect);
  346. this.setPreserveSelectionOnMove(this.settings.preserveSelectionOnMove);
  347. this.setSelectedListLabel(this.settings.selectedListLabel);
  348. this.setNonSelectedListLabel(this.settings.nonSelectedListLabel);
  349. this.setHelperSelectNamePostfix(this.settings.helperSelectNamePostfix);
  350. this.setSelectOrMinimalHeight(this.settings.selectorMinimalHeight);
  351. this.setDoubleMove(this.settings.doubleMove);
  352. updateSelectionStates(this);
  353. this.setShowFilterInputs(this.settings.showFilterInputs);
  354. this.setNonSelectedFilter(this.settings.nonSelectedFilter);
  355. this.setSelectedFilter(this.settings.selectedFilter);
  356. this.setInfoText(this.settings.infoText);
  357. this.setInfoTextFiltered(this.settings.infoTextFiltered);
  358. this.setInfoTextEmpty(this.settings.infoTextEmpty);
  359. this.setFilterOnValues(this.settings.filterOnValues);
  360. this.element.hide();
  361. bindEvents(this);
  362. refreshSelects(this);
  363. return this.element
  364. },
  365. setBootstrap2Compatible: function (value, refresh) {
  366. this.settings.bootstrap2Compatible = value;
  367. if (value) {
  368. this.container.removeClass("row").addClass("row-fluid bs2compatible");
  369. this.container.find(".box1, .box2").removeClass("col-md-5");
  370. this.container.find(".btn-box").removeClass("col-md-2");
  371. this.container.find(".clear1, .clear2").removeClass("btn-default btn-xs").addClass("btn-mini");
  372. this.container.find("input, select").removeClass("form-control");
  373. this.container.find(".btn").removeClass("btn-default");
  374. this.container.find(".moveall > i, .move > i").removeClass("glyphicon glyphicon-arrow-right").addClass("icon-arrow-right");
  375. this.container.find(".removeall > i, .remove > i").removeClass("glyphicon glyphicon-arrow-left").addClass("icon-arrow-left");
  376. this.container.find(".upBtn > i").removeClass("glyphicon glyphicon-arrow-up").addClass("icon-arrow-up");
  377. this.container.find(".downBtn > i").removeClass("glyphicon glyphicon-arrow-down").addClass("icon-arrow-down");
  378. } else {
  379. this.container.removeClass("row-fluid bs2compatible")//.addClass("row");
  380. //this.container.find(".box1, .box2").addClass("col-md-5");
  381. this.container.find(".box1, .box2").css("width","41%");
  382. //this.container.find(".btn-box").addClass("col-md-2");
  383. this.container.find(".btn-box").css("width", "17%");
  384. this.container.find(".clear1, .clear2").removeClass("btn-mini").addClass("btn-default btn-xs");
  385. this.container.find("input, select").addClass("form-control");
  386. this.container.find(".btn").addClass("btn-default");
  387. this.container.find(".moveall > i, .move > i").removeClass("icon-arrow-right").addClass("glyphicon glyphicon-arrow-right");
  388. this.container.find(".removeall > i, .remove > i").removeClass("icon-arrow-left").addClass("glyphicon glyphicon-arrow-left");
  389. this.container.find(".upBtn > i").removeClass("icon-arrow-up").addClass("glyphicon glyphicon-arrow-up");
  390. this.container.find(".downBtn > i").removeClass("icon-arrow-down").addClass("glyphicon glyphicon-arrow-down");
  391. }
  392. if (refresh) {
  393. refreshSelects(this)
  394. }
  395. return this.element
  396. },
  397. setFilterTextClear: function (value, refresh) {
  398. this.settings.filterTextClear = value;
  399. this.elements.filterClear1.html(value);
  400. this.elements.filterClear2.html(value);
  401. if (refresh) {
  402. refreshSelects(this)
  403. }
  404. return this.element
  405. },
  406. setFilterPlaceHolder: function (value, refresh) {
  407. this.settings.filterPlaceHolder = value;
  408. this.elements.filterInput1.attr("placeholder", value);
  409. this.elements.filterInput2.attr("placeholder", value);
  410. if (refresh) {
  411. refreshSelects(this)
  412. }
  413. return this.element
  414. },
  415. setMoveSelectedLabel: function (value, refresh) {
  416. this.settings.moveSelectedLabel = value;
  417. this.elements.moveButton.attr("title", value);
  418. if (refresh) {
  419. refreshSelects(this)
  420. }
  421. return this.element
  422. },
  423. setMoveAllLabel: function (value, refresh) {
  424. this.settings.moveAllLabel = value;
  425. this.elements.moveAllButton.attr("title", value);
  426. if (refresh) {
  427. refreshSelects(this)
  428. }
  429. return this.element
  430. },
  431. setRemoveSelectedLabel: function (value, refresh) {
  432. this.settings.removeSelectedLabel = value;
  433. this.elements.removeButton.attr("title", value);
  434. if (refresh) {
  435. refreshSelects(this)
  436. }
  437. return this.element
  438. },
  439. setRemoveAllLabel: function (value, refresh) {
  440. this.settings.removeAllLabel = value;
  441. this.elements.removeAllButton.attr("title", value);
  442. if (refresh) {
  443. refreshSelects(this)
  444. }
  445. return this.element
  446. },
  447. setMoveOnSelect: function (value, refresh) {
  448. if (isBuggyAndroid) {
  449. value = true
  450. }
  451. this.settings.moveOnSelect = value;
  452. if (this.settings.moveOnSelect) {
  453. this.container.addClass("moveonselect");
  454. var self = this;
  455. this.elements.select1.on("change",
  456. function () {
  457. move(self)
  458. });
  459. this.elements.select2.on("change",
  460. function () {
  461. remove(self)
  462. })
  463. } else {
  464. this.container.removeClass("moveonselect");
  465. this.elements.select1.off("change");
  466. this.elements.select2.off("change")
  467. }
  468. if (refresh) {
  469. refreshSelects(this)
  470. }
  471. return this.element
  472. },
  473. setDoubleMove: function (value, refresh) {
  474. if (isBuggyAndroid) {
  475. value = false
  476. }
  477. this.settings.doubleMove = value;
  478. if (this.settings.doubleMove) {
  479. var self = this;
  480. this.elements.select1.on("dblclick",
  481. function () {
  482. move(self)
  483. });
  484. this.elements.select2.on("dblclick",
  485. function () {
  486. remove(self)
  487. })
  488. } else {
  489. this.elements.select1.off("dblclick");
  490. this.elements.select2.off("dblclick")
  491. }
  492. if (refresh) {
  493. refreshSelects(this)
  494. }
  495. return this.element
  496. },
  497. setPreserveSelectionOnMove: function (value, refresh) {
  498. if (isBuggyAndroid) {
  499. value = false
  500. }
  501. this.settings.preserveSelectionOnMove = value;
  502. if (refresh) {
  503. refreshSelects(this)
  504. }
  505. return this.element
  506. },
  507. setSelectedListLabel: function (value, refresh) {
  508. this.settings.selectedListLabel = value;
  509. if (value) {
  510. this.elements.label2.show().html(value)
  511. } else {
  512. this.elements.label2.hide().html(value)
  513. }
  514. if (refresh) {
  515. refreshSelects(this)
  516. }
  517. return this.element
  518. },
  519. setNonSelectedListLabel: function (value, refresh) {
  520. this.settings.nonSelectedListLabel = value;
  521. if (value) {
  522. this.elements.label1.show().html(value)
  523. } else {
  524. this.elements.label1.hide().html(value)
  525. }
  526. if (refresh) {
  527. refreshSelects(this)
  528. }
  529. return this.element
  530. },
  531. setHelperSelectNamePostfix: function (value, refresh) {
  532. this.settings.helperSelectNamePostfix = value;
  533. if (value) {
  534. this.elements.select1.attr("name", this.originalSelectName + value + "1");
  535. this.elements.select2.attr("name", this.originalSelectName + value + "2")
  536. } else {
  537. this.elements.select1.removeAttr("name");
  538. this.elements.select2.removeAttr("name")
  539. }
  540. if (refresh) {
  541. refreshSelects(this)
  542. }
  543. return this.element
  544. },
  545. setSelectOrMinimalHeight: function (value, refresh) {
  546. this.settings.selectorMinimalHeight = value;
  547. var height = this.element.height();
  548. if (this.element.height() < value) {
  549. height = value
  550. }
  551. this.elements.select1.height(height);
  552. this.elements.select2.height(height);
  553. if (refresh) {
  554. refreshSelects(this)
  555. }
  556. return this.element
  557. },
  558. setShowFilterInputs: function (value, refresh) {
  559. if (!value) {
  560. this.setNonSelectedFilter("");
  561. this.setSelectedFilter("");
  562. refreshSelects(this);
  563. this.elements.filterInput1.hide();
  564. this.elements.filterInput2.hide()
  565. } else {
  566. this.elements.filterInput1.show();
  567. this.elements.filterInput2.show()
  568. }
  569. this.settings.showFilterInputs = value;
  570. if (refresh) {
  571. refreshSelects(this)
  572. }
  573. return this.element
  574. },
  575. setNonSelectedFilter: function (value, refresh) {
  576. if (this.settings.showFilterInputs) {
  577. this.settings.nonSelectedFilter = value;
  578. this.elements.filterInput1.val(value);
  579. if (refresh) {
  580. refreshSelects(this)
  581. }
  582. return this.element
  583. }
  584. },
  585. setSelectedFilter: function (value, refresh) {
  586. if (this.settings.showFilterInputs) {
  587. this.settings.selectedFilter = value;
  588. this.elements.filterInput2.val(value);
  589. if (refresh) {
  590. refreshSelects(this)
  591. }
  592. return this.element
  593. }
  594. },
  595. setInfoText: function (value, refresh) {
  596. this.settings.infoText = value;
  597. if (refresh) {
  598. refreshSelects(this)
  599. }
  600. return this.element
  601. },
  602. setInfoTextFiltered: function (value, refresh) {
  603. this.settings.infoTextFiltered = value;
  604. if (refresh) {
  605. refreshSelects(this)
  606. }
  607. return this.element
  608. },
  609. setInfoTextEmpty: function (value, refresh) {
  610. this.settings.infoTextEmpty = value;
  611. if (refresh) {
  612. refreshSelects(this)
  613. }
  614. return this.element
  615. },
  616. setFilterOnValues: function (value, refresh) {
  617. this.settings.filterOnValues = value;
  618. if (refresh) {
  619. refreshSelects(this)
  620. }
  621. return this.element
  622. },
  623. getContainer: function () {
  624. return this.container
  625. },
  626. refresh: function (mustClearSelections) {
  627. updateSelectionStates(this);
  628. if (!mustClearSelections) {
  629. saveSelections(this, 1);
  630. saveSelections(this, 2)
  631. } else {
  632. clearSelections(this)
  633. }
  634. refreshSelects(this)
  635. },
  636. destroy: function () {
  637. this.container.remove();
  638. this.element.show();
  639. $.data(this, "plugin_" + pluginName, null);
  640. return this.element
  641. }
  642. };
  643. $.fn[pluginName] = function (options) {
  644. var args = arguments;
  645. if (options === undefined || typeof options === "object") {
  646. return this.each(function () {
  647. if (!$(this).is("select")) {
  648. $(this).find("select").each(function (index, item) {
  649. $(item).bootstrapDualListbox(options)
  650. })
  651. } else {
  652. if (!$.data(this, "plugin_" + pluginName)) {
  653. $.data(this, "plugin_" + pluginName, new BootstrapDualListbox(this, options))
  654. }
  655. }
  656. })
  657. } else {
  658. if (typeof options === "string" && options[0] !== "_" && options !== "init") {
  659. var returns;
  660. this.each(function () {
  661. var instance = $.data(this, "plugin_" + pluginName);
  662. if (instance instanceof BootstrapDualListbox && typeof instance[options] === "function") {
  663. returns = instance[options].apply(instance, Array.prototype.slice.call(args, 1))
  664. }
  665. });
  666. return returns !== undefined ? returns : this
  667. }
  668. }
  669. }
  670. })(jQuery, window, document); (function (root, factory) {
  671. if (typeof exports === "object") {
  672. module.exports = factory(root, require("jquery"))
  673. } else {
  674. if (typeof define === "function" && define.amd) {
  675. define(["jquery"],
  676. function (jQuery) {
  677. return factory(root, jQuery)
  678. })
  679. } else {
  680. factory(root, root.jQuery)
  681. }
  682. }
  683. }(this,
  684. function (window, $, undefined) {
  685. $.fn.doublebox = function (options) {
  686. var box = this.bootstrapDualListbox(options);
  687. var items = "";
  688. box.selectElement = function () {
  689. if (options.nonSelectedList != null) {
  690. for (var i in options.nonSelectedList) {
  691. if (options.nonSelectedList.hasOwnProperty(i)) {
  692. items += "<option value='" + options.nonSelectedList[i][options.optionValue] + "'>" + options.nonSelectedList[i][options.optionText] + "</option>"
  693. }
  694. }
  695. }
  696. if (options.selectedList != null) {
  697. for (var i in options.selectedList) {
  698. if (options.selectedList.hasOwnProperty(i)) {
  699. items += "<option value='" + options.selectedList[i][options.optionValue] + "' selected>" + options.selectedList[i][options.optionText] + "</option>"
  700. }
  701. }
  702. }
  703. box.append(items);
  704. box.bootstrapDualListbox("refresh")
  705. };
  706. box.getSelectedOptions = function () {
  707. var items = $("#bootstrap-duallistbox-selected-list_doublebox>option").map(function () {
  708. return $(this).val()
  709. }).get().join(",");
  710. return items
  711. };
  712. box.selectElement();
  713. return box;
  714. }
  715. }));