Relation.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace Dcat\Admin\Show;
  3. use Dcat\Admin\Admin;
  4. use Dcat\Admin\Grid;
  5. use Dcat\Admin\Show;
  6. use Illuminate\Support\Fluent;
  7. class Relation extends Field
  8. {
  9. /**
  10. * Relation name.
  11. *
  12. * @var string
  13. */
  14. protected $name;
  15. /**
  16. * Relation panel builder.
  17. *
  18. * @var \Closure
  19. */
  20. protected $builder;
  21. /**
  22. * Relation panel title.
  23. *
  24. * @var string
  25. */
  26. protected $title;
  27. /**
  28. * Parent model.
  29. *
  30. * @var Fluent
  31. */
  32. protected $model;
  33. /**
  34. * Relation constructor.
  35. *
  36. * @param string $name
  37. * @param \Closure $builder
  38. * @param string $title
  39. */
  40. public function __construct($name, $builder, $title = '')
  41. {
  42. $this->name = $name;
  43. $this->builder = $builder;
  44. $this->title = $this->formatLabel($title);
  45. }
  46. /**
  47. * Set parent model for relation.
  48. *
  49. * @param Fluent $model
  50. *
  51. * @return $this
  52. */
  53. public function setModel(Fluent $model)
  54. {
  55. $this->model = $model;
  56. return $this;
  57. }
  58. /**
  59. * Render this relation panel.
  60. *
  61. * @return string
  62. */
  63. public function render()
  64. {
  65. $view = call_user_func($this->builder, $this->model);
  66. if ($view instanceof Show) {
  67. return $this->renderTitle() . $view->render();
  68. }
  69. if (!$view instanceof Grid) {
  70. return $this->renderTitle() . $view;
  71. }
  72. $view->setName($this->name)
  73. ->disableFilterButton()
  74. ->disableBatchDelete()
  75. ->disableFilter();
  76. $filter = $view->getFilter()
  77. ->expand()
  78. ->withoutInputBorder()
  79. ->hiddenResetButtonText()
  80. ->expand()
  81. ->style('padding:0 0 5px;left:-5px;');
  82. $filter = "<div class='row'><div class='col-md-12'>{$filter->render()}</div></div>";
  83. return $this->renderTitle() . $filter . $view->render();
  84. }
  85. /**
  86. * @return string
  87. */
  88. protected function renderTitle()
  89. {
  90. return <<<EOF
  91. <div class="row">
  92. <div class="col-md-12" style="margin-bottom:.75rem;font-size:18px;text-transform:uppercase">
  93. <span class="show-relation-grid-title">{$this->title}</span>
  94. </div>
  95. </div>
  96. EOF;
  97. }
  98. }