GridHelper.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. <?php
  2. namespace App\Module\Admin\AdminControllers\Helper;
  3. use Dcat\Admin\Grid;
  4. use UCore\DcatAdmin\AdminController;
  5. /**
  6. * 表格辅助类
  7. * 提供通用的表格列配置方法
  8. */
  9. class GridHelper
  10. {
  11. /**
  12. * @var Grid
  13. */
  14. protected Grid $grid;
  15. /**
  16. * @var AdminController
  17. */
  18. protected AdminController $controller;
  19. public function __construct(Grid $grid, AdminController $controller)
  20. {
  21. $this->grid = $grid;
  22. $this->controller = $controller;
  23. }
  24. /**
  25. * 添加ID列
  26. *
  27. * @param string $field
  28. * @param string $label
  29. * @return Grid\Column
  30. */
  31. public function columnId(string $field = 'id', string $label = 'ID'): Grid\Column
  32. {
  33. return $this->grid->column($field, $label)->sortable();
  34. }
  35. /**
  36. * 添加创建时间列
  37. *
  38. * @param string $field
  39. * @param string $label
  40. * @return Grid\Column
  41. */
  42. public function columnCreatedAt(string $field = 'created_at', string $label = '创建时间'): Grid\Column
  43. {
  44. return $this->grid->column($field, $label)->sortable();
  45. }
  46. /**
  47. * 添加更新时间列
  48. *
  49. * @param string $field
  50. * @param string $label
  51. * @return Grid\Column
  52. */
  53. public function columnUpdatedAt(string $field = 'updated_at', string $label = '更新时间'): Grid\Column
  54. {
  55. return $this->grid->column($field, $label)->sortable();
  56. }
  57. /**
  58. * 添加状态列
  59. *
  60. * @param string $field
  61. * @param string $label
  62. * @param array $options
  63. * @return Grid\Column
  64. */
  65. public function columnStatus(string $field = 'status', string $label = '状态', array $options = []): Grid\Column
  66. {
  67. $defaultOptions = [
  68. 0 => '禁用',
  69. 1 => '启用',
  70. ];
  71. $options = array_merge($defaultOptions, $options);
  72. return $this->grid->column($field, $label)
  73. ->using($options)
  74. ->dot([
  75. 0 => 'danger',
  76. 1 => 'success',
  77. ], 'warning');
  78. }
  79. /**
  80. * 添加操作列
  81. *
  82. * @param string $label
  83. * @param callable|null $callback
  84. * @return Grid\Column
  85. */
  86. public function columnActions(string $label = '操作', ?callable $callback = null): Grid\Column
  87. {
  88. $column = $this->grid->column('actions', $label);
  89. if ($callback) {
  90. $column->display($callback);
  91. }
  92. return $column;
  93. }
  94. /**
  95. * 添加图片列
  96. *
  97. * @param string $field
  98. * @param string $label
  99. * @param int $width
  100. * @param int $height
  101. * @return Grid\Column
  102. */
  103. public function columnImage(string $field, string $label, int $width = 50, int $height = 50): Grid\Column
  104. {
  105. return $this->grid->column($field, $label)->image('', $width, $height);
  106. }
  107. /**
  108. * 添加链接列
  109. *
  110. * @param string $field
  111. * @param string $label
  112. * @param string $target
  113. * @return Grid\Column
  114. */
  115. public function columnLink(string $field, string $label, string $target = '_blank'): Grid\Column
  116. {
  117. return $this->grid->column($field, $label)->link($target);
  118. }
  119. /**
  120. * 添加标签列
  121. *
  122. * @param string $field
  123. * @param string $label
  124. * @param array $colors
  125. * @return Grid\Column
  126. */
  127. public function columnLabel(string $field, string $label, array $colors = []): Grid\Column
  128. {
  129. $column = $this->grid->column($field, $label)->label();
  130. if (!empty($colors)) {
  131. $column->using($colors);
  132. }
  133. return $column;
  134. }
  135. /**
  136. * 添加进度条列
  137. *
  138. * @param string $field
  139. * @param string $label
  140. * @param string $style
  141. * @param int $max
  142. * @return Grid\Column
  143. */
  144. public function columnProgressBar(string $field, string $label, string $style = 'primary', int $max = 100): Grid\Column
  145. {
  146. return $this->grid->column($field, $label)->progressBar($style, 'sm', $max);
  147. }
  148. /**
  149. * 添加开关列
  150. *
  151. * @param string $field
  152. * @param string $label
  153. * @return Grid\Column
  154. */
  155. public function columnSwitch(string $field, string $label): Grid\Column
  156. {
  157. return $this->grid->column($field, $label)->switch();
  158. }
  159. /**
  160. * 添加复选框列
  161. *
  162. * @param string $field
  163. * @param string $label
  164. * @return Grid\Column
  165. */
  166. public function columnCheckbox(string $field = 'id', string $label = ''): Grid\Column
  167. {
  168. return $this->grid->column($field, $label)->checkbox();
  169. }
  170. /**
  171. * 添加排序列
  172. *
  173. * @param string $field
  174. * @param string $label
  175. * @return Grid\Column
  176. */
  177. public function columnSort(string $field = 'sort', string $label = '排序'): Grid\Column
  178. {
  179. return $this->grid->column($field, $label)->sortable()->editable();
  180. }
  181. /**
  182. * 添加金额列
  183. *
  184. * @param string $field
  185. * @param string $label
  186. * @param string $currency
  187. * @param int $decimals
  188. * @return Grid\Column
  189. */
  190. public function columnMoney(string $field, string $label, string $currency = '¥', int $decimals = 2): Grid\Column
  191. {
  192. return $this->grid->column($field, $label)->display(function ($value) use ($currency, $decimals) {
  193. return $currency . number_format($value, $decimals);
  194. });
  195. }
  196. /**
  197. * 添加百分比列
  198. *
  199. * @param string $field
  200. * @param string $label
  201. * @param int $decimals
  202. * @return Grid\Column
  203. */
  204. public function columnPercentage(string $field, string $label, int $decimals = 2): Grid\Column
  205. {
  206. return $this->grid->column($field, $label)->display(function ($value) use ($decimals) {
  207. return number_format($value, $decimals) . '%';
  208. });
  209. }
  210. /**
  211. * 添加文件大小列
  212. *
  213. * @param string $field
  214. * @param string $label
  215. * @return Grid\Column
  216. */
  217. public function columnFileSize(string $field, string $label): Grid\Column
  218. {
  219. return $this->grid->column($field, $label)->display(function ($value) {
  220. return $this->formatBytes($value);
  221. });
  222. }
  223. /**
  224. * 格式化字节数
  225. *
  226. * @param int $bytes
  227. * @return string
  228. */
  229. protected function formatBytes(int $bytes): string
  230. {
  231. if ($bytes === 0) {
  232. return '0 B';
  233. }
  234. $units = ['B', 'KB', 'MB', 'GB', 'TB'];
  235. $power = floor(log($bytes, 1024));
  236. return round($bytes / pow(1024, $power), 2) . ' ' . $units[$power];
  237. }
  238. /**
  239. * 添加JSON列
  240. *
  241. * @param string $field
  242. * @param string $label
  243. * @return Grid\Column
  244. */
  245. public function columnJson(string $field, string $label): Grid\Column
  246. {
  247. return $this->grid->column($field, $label)->display(function ($value) {
  248. if (is_array($value)) {
  249. return '<pre>' . json_encode($value, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . '</pre>';
  250. }
  251. return $value;
  252. });
  253. }
  254. /**
  255. * 添加截断文本列
  256. *
  257. * @param string $field
  258. * @param string $label
  259. * @param int $limit
  260. * @return Grid\Column
  261. */
  262. public function columnLimit(string $field, string $label, int $limit = 50): Grid\Column
  263. {
  264. return $this->grid->column($field, $label)->limit($limit);
  265. }
  266. /**
  267. * 添加复制按钮列
  268. *
  269. * @param string $field
  270. * @param string $label
  271. * @return Grid\Column
  272. */
  273. public function columnCopyable(string $field, string $label): Grid\Column
  274. {
  275. return $this->grid->column($field, $label)->copyable();
  276. }
  277. /**
  278. * 添加二维码列
  279. *
  280. * @param string $field
  281. * @param string $label
  282. * @return Grid\Column
  283. */
  284. public function columnQrcode(string $field, string $label): Grid\Column
  285. {
  286. return $this->grid->column($field, $label)->qrcode();
  287. }
  288. }