Tree.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <?php
  2. namespace Dcat\Admin\Grid\Displayers;
  3. use Dcat\Admin\Admin;
  4. class Tree extends AbstractDisplayer
  5. {
  6. protected function setupScript()
  7. {
  8. $tableId = $this->grid->tableId();
  9. $model = $this->grid->model();
  10. $url = $model->generateTreeUrl();
  11. // 是否显示下一页按钮
  12. $pageName = $model->getChildrenPageName(':key');
  13. $perPage = $model->getPerPage();
  14. $showNextPage = $model->showAllChildrenNodes() ? 'false' : 'true';
  15. $script = <<<JS
  16. (function () {
  17. var req = 0;
  18. $('.{$tableId}-grid-load-children').off('click').click(function () {
  19. if (req) {
  20. return;
  21. }
  22. var key = $(this).data('key'),
  23. level = $(this).data('level'),
  24. trClass = '{$tableId}-tr-'+key,
  25. data = {
  26. _token: LA.token,
  27. '{$model->getParentIdQueryName()}': key,
  28. '{$model->getLevelQueryName()}': level + 1,
  29. };
  30. $('.'+trClass).toggle();
  31. if ($(this).data('inserted') == '0') {
  32. var row = $(this).closest('tr');
  33. request(1);
  34. $(this).data('inserted', 1);
  35. }
  36. $("i", this).toggleClass("fa-angle-right fa-angle-down");
  37. function request(page, after) {
  38. if (req) {
  39. return;
  40. }
  41. req = 1;
  42. LA.loading();
  43. data['{$pageName}'.replace(':key', key)] = page;
  44. $.ajax({
  45. url: '$url',
  46. type: 'GET',
  47. data: data,
  48. cache: false,
  49. headers: {'X-PJAX': true},
  50. success: function (resp) {
  51. after && after();
  52. LA.loading(false);
  53. req = 0;
  54. // 获取最后一行
  55. var children = $('.'+trClass);
  56. row = children.length ? children.last() : row;
  57. var _body = $('<div>'+resp+'</div>'),
  58. _tbody = _body.find('#{$tableId} tbody'),
  59. lastPage = _body.find('last-page').text(),
  60. nextPage = _body.find('next-page').text();
  61. // 标记子节点行
  62. _tbody.find('tr').each(function (_, v) {
  63. $(v).addClass(trClass);
  64. $(v).attr('data-level', level + 1)
  65. });
  66. var html = _tbody.html(),
  67. icon = '<svg style="fill:currentColor" t="1582877365167" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="32874" width="24" height="24"><path d="M162.8 515m-98.3 0a98.3 98.3 0 1 0 196.6 0 98.3 98.3 0 1 0-196.6 0Z" p-id="32875"></path><path d="M511.9 515m-98.3 0a98.3 98.3 0 1 0 196.6 0 98.3 98.3 0 1 0-196.6 0Z" p-id="32876"></path><path d="M762.8 515a98.3 98.3 0 1 0 196.6 0 98.3 98.3 0 1 0-196.6 0Z" p-id="32877"></path></svg>';
  68. if ({$showNextPage} && _tbody.find('tr').length == '{$perPage}' && lastPage >= page) {
  69. // 加载更多
  70. html += "<tr data-level='" + (level + 1) + "' data-page='" + nextPage
  71. + "' class='{$tableId}-load-next-" + key + " "
  72. + trClass + "'><td colspan='"+(row.find('td').length)
  73. + "' align='center' style='cursor: pointer'> <a>" + icon + "</a> </td></tr>";
  74. }
  75. // 附加子节点
  76. row.after(html);
  77. // 加载更多
  78. $('.{$tableId}-load-next-'+key).off('click').click(function () {
  79. var _t = $(this);
  80. request(_t.data('page'), function () {
  81. _t.remove();
  82. });
  83. });
  84. // 附加子节点js脚本以及触发子节点js脚本执行
  85. _body.find('script').each(function (_, v) {
  86. row.after(v);
  87. });
  88. $(document).trigger('pjax:script')
  89. },
  90. error:function(a, b, c){
  91. after && after();
  92. LA.loading(false);
  93. req = 0;
  94. if (a.status != 404) {
  95. LA.ajaxError(a, b, c)
  96. }
  97. }
  98. });
  99. }
  100. });
  101. })();
  102. JS;
  103. Admin::script($script);
  104. }
  105. public function display()
  106. {
  107. $this->setupScript();
  108. $key = $this->key();
  109. $tableId = $this->grid->tableId();
  110. $level = $this->grid->model()->getLevelFromRequest();
  111. $indents = str_repeat(' &nbsp; &nbsp; &nbsp; &nbsp; ', $level);
  112. return <<<EOT
  113. <a href="javascript:void(0)" class="{$tableId}-grid-load-children" data-level="{$level}" data-inserted="0" data-key="{$key}">
  114. {$indents}<i class="fa fa-angle-right"></i> &nbsp; {$this->value}
  115. </a>
  116. EOT;
  117. }
  118. protected function showNextPage()
  119. {
  120. $model = $this->grid->model();
  121. $showNextPage = $this->grid->allowPagination();
  122. if (! $model->showAllChildrenNodes() && $showNextPage) {
  123. $showNextPage =
  124. $model->getCurrentChildrenPage() < $model->paginator()->lastPage()
  125. && $model->buildData()->count() == $model->getPerPage();
  126. }
  127. return $showNextPage;
  128. }
  129. }