PageRenderTime 45ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/web/admin/enum.php

https://bitbucket.org/wez/mtrack/
PHP | 147 lines | 130 code | 15 blank | 2 comment | 6 complexity | 39d4b089264ec651764e2c56dadd4558 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0
  1. <?php # vim:ts=2:sw=2:et:
  2. /* For licensing and copyright terms, see the file named LICENSE */
  3. include '../../inc/common.php';
  4. MTrackACL::requireAnyRights('Enumerations', 'modify');
  5. $ename = mtrack_get_pathinfo();
  6. $enums = array(
  7. 'Priority' => '/ticket/enums/priority',
  8. 'TicketState' => '/ticket/enums/state',
  9. 'Severity' => '/ticket/enums/severity',
  10. 'Resolution' => '/ticket/enums/resolution',
  11. 'Classification' => '/ticket/enums/classification',
  12. );
  13. if (!isset($enums[$ename])) {
  14. throw new Exception("Invalid enum type");
  15. }
  16. mtrack_head("Administration - $ename");
  17. mtrack_admin_nav();
  18. $url = $enums[$ename];
  19. $col = json_encode(MTrackAPI::invoke('GET', $url)->result);
  20. echo <<<HTML
  21. <h1>Administer Ticket $ename</h1>
  22. <p>Drag to re-order!</p>
  23. <script>
  24. $(document).ready(function() {
  25. var MODEL = Backbone.Model.extend({
  26. url: function() {
  27. return ABSWEB + "api.php$url/" + this.id;
  28. }
  29. });
  30. var ECOL = Backbone.Collection.extend({
  31. model: MODEL
  32. });
  33. var COL = new ECOL($col);
  34. function capture_error(model, resp) {
  35. var err;
  36. if (!_.isObject(resp)) {
  37. err = resp;
  38. } else {
  39. err = resp.statusText;
  40. try {
  41. var r = JSON.parse(resp.responseText);
  42. err = r.message;
  43. } catch (e) {
  44. }
  45. }
  46. $('<div class="alert alert-danger">' +
  47. "<a class='close' data-dismiss='alert'>&times;</a>" +
  48. "<b>" + model.id + "</b>: " + err + '</div>').
  49. appendTo('#content');
  50. }
  51. $('#elist').sortable({
  52. placeholder: 'ticketDragTarget',
  53. start: function (evt, ui) {
  54. ui.placeholder.height(ui.item.height());
  55. ui.helper.addClass('draggingTicket');
  56. },
  57. stop: function (evt, ui) {
  58. ui.item.removeClass('draggingTicket');
  59. },
  60. update: function (evt, ui) {
  61. /* update the value of each model in the collection */
  62. $('#elist').children().each(function (idx, elt) {
  63. var E = $(elt).data('model');
  64. idx++; // want it to be 1 based
  65. if (E.get('value') != idx) {
  66. E.save({value: idx}, {error: capture_error});
  67. }
  68. });
  69. }
  70. });
  71. $('#elist').on('click', 'input[type=checkbox]', function () {
  72. var E = $(this).closest('li').data('model');
  73. E.set({deleted: $(this).prop('checked')});
  74. E.save();
  75. });
  76. function addOne(E) {
  77. var li = $('<li/>');
  78. var span = $('<div class="handle"/>');
  79. span.text(E.id);
  80. li.append(span);
  81. li.data('model', E);
  82. var cont = $('<div class="mark"/>');
  83. var cb = $('<input type="checkbox">');
  84. cb.attr('checked', E.get('deleted'));
  85. cont.append(cb);
  86. cont.append(" <span>Mark as deleted</span>");
  87. li.append(cont);
  88. li.appendTo('#elist');
  89. }
  90. COL.each(function (E) {
  91. addOne(E);
  92. });
  93. $('#newbtn').click(function () {
  94. var input = $('#newname');
  95. var name = input.val();
  96. input.val('');
  97. if (COL.get(name)) {
  98. return;
  99. }
  100. var E = new MODEL;
  101. E.save({
  102. id: name,
  103. value: COL.length,
  104. deleted: false
  105. }, {
  106. success: function (model, resp) {
  107. COL.add(model, {at: COL.length});
  108. addOne(model);
  109. },
  110. error: capture_error
  111. });
  112. });
  113. });
  114. </script>
  115. <style>
  116. ul.tickets {
  117. padding-top: 1em;
  118. }
  119. ul.tickets li div.mark {
  120. font-size: smaller;
  121. float: right;
  122. }
  123. input#newname {
  124. font-size: 1.4em;
  125. width: 20em;
  126. }
  127. </style>
  128. <ul id='elist' class='tickets'></ul>
  129. <input type="text" id="newname" placeholder="Add a new $ename">
  130. <button id='newbtn' class='btn btn-primary'><i class='icon-white icon-plus'></i> Add</button>
  131. HTML;
  132. mtrack_foot();