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.

list_selector.js 3.4 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. ListSelector = function(title, intro, list, onupdate, selectable) {
  2. var me = this; this.list = list; this.selectable = selectable;
  3. this.dialog = new Dialog(400,600,title);
  4. this.items = [];
  5. // intro
  6. if(intro) {
  7. intro_area = $a(this.dialog.body, 'div', 'help_box', {margin:'16px', marginBottom:'0px', width:'312px'});
  8. intro_area.innerHTML = intro;
  9. }
  10. // body
  11. this.body = $a(this.dialog.body, 'div', '', {margin:'16px', position: 'relative'});
  12. // items
  13. this.render();
  14. // ---------------------------------------
  15. // update button
  16. var btn = $btn(this.dialog.body, 'Update', function() { me.update() }, {margin:'0px 0px 16px 16px'}, 'green', 1);
  17. this.update = function() {
  18. if(me.selected_item) $bg(me.selected_item, '#FFF');
  19. var ret = [];
  20. for(var i=0; i<me.items.length; i++) {
  21. // [label, idx, selected, det]
  22. ret.push([me.items[i].label, me.items[i].idx, (me.items[i].check ? (me.items[i].check.checked ? 1 : 0) : 0), me.items[i].det]);
  23. }
  24. me.dialog.hide();
  25. // call the user with (done!)
  26. onupdate(ret);
  27. }
  28. this.dialog.show();
  29. }
  30. // ---------------------------------------
  31. ListSelector.prototype.render = function(to_hide) {
  32. this.body.innerHTML = ''; this.items = [];
  33. // sort
  34. this.list.sort(function(a,b) { return a[1] > b[1]; });
  35. // items
  36. for(i=0; i<this.list.length; i++) {
  37. // make checkbox for if selectable
  38. this.list[i][1]=i;
  39. this.items.push(new ListSelectorItem(this, this.list[i], i));
  40. if(i==to_hide) $dh(this.items[i].body);
  41. }
  42. }
  43. // ---------------------------------------
  44. ListSelector.prototype.insert_at = function(item, new_idx) {
  45. for(var i=0;i<this.list.length; i++) {
  46. if(this.list[i][1] >= new_idx) this.list[i][1]++;
  47. }
  48. for(var i=0;i<this.list.length; i++) {
  49. if(this.list[i][1] >= item.idx) this.list[i][1]--;
  50. }
  51. this.list[item.idx][1] = new_idx;
  52. var n = new_idx - ((new_idx > item.idx) ? 1 : 0);
  53. this.render(n);
  54. this.items[n].body.onmousedown();
  55. $(this.items[n].body).slideDown();
  56. }
  57. // =====================================
  58. ListSelectorItem = function(ls, det, idx) {
  59. this.det = det; this.ls = ls; this.idx = idx;
  60. this.body = $a(ls.body, 'div', '', {padding: '8px', margin:'4px 0px',
  61. border:'1px solid #AAA', position: 'relative', width:'320px', height:'14px', cursor:'move'});
  62. if(ls.selectable) {
  63. // with checkbox
  64. this.make_with_checkbox();
  65. } else {
  66. // no checkbox (only label)
  67. this.body.innerHTML = det[0];
  68. }
  69. this.set_drag();
  70. }
  71. // ---------------------------------------
  72. ListSelectorItem.prototype.make_with_checkbox = function() {
  73. this.body.tab = make_table(this.body, 1, 2, null, ['28px',null], {verticalAlign:'top'});
  74. this.check = $a_input($td(this.body.tab, 0, 0), 'checkbox');
  75. if(this.det[2]) this.check.checked = 1;
  76. $td(this.body.tab, 0, 1).innerHTML = this.det[0];
  77. }
  78. // ---------------------------------------
  79. ListSelectorItem.prototype.set_drag = function() {
  80. var me = this;
  81. this.body.item = this;
  82. // color on mousedown
  83. this.body.onmousedown = function() {
  84. $bg(this, '#FFC');
  85. if(me.ls.selected_item && me.ls.selected_item != this) $bg(me.ls.selected_item, '#FFF');
  86. me.ls.selected_item = this;
  87. }
  88. // setup draggable
  89. $(this.body).draggable({
  90. opacity: 0.6,
  91. helper: 'clone',
  92. containment: 'parent',
  93. scroll: false,
  94. cursor: 'move',
  95. drag:function(event, ui){
  96. me.ls.drag_item = this.item;
  97. }
  98. });
  99. $(this.body).droppable({
  100. drop: function(event, ui) {
  101. me.ls.insert_at(me.ls.drag_item, me.idx + (me.ls.drag_item.idx < me.idx ? 1 : 0));
  102. }
  103. });
  104. }