Editable.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace Dcat\Admin\Grid\Displayers;
  3. use Dcat\Admin\Admin;
  4. class Editable extends AbstractDisplayer
  5. {
  6. protected $selector = 'grid-editable';
  7. public function display($refresh = false)
  8. {
  9. $this->addScript();
  10. $this->addStyle();
  11. $label = __('admin.save');
  12. return <<<HTML
  13. <div>
  14. <span class="{$this->selector}" contenteditable="true">
  15. {$this->value}
  16. </span>
  17. <span class="save hidden"
  18. data-value="{$this->value}"
  19. data-name="{$this->column->getName()}"
  20. data-id="{$this->getKey()}"
  21. data-refresh="{$refresh}"
  22. data-url="{$this->getUrl()}">
  23. {$label}
  24. </span>
  25. </div>
  26. HTML;
  27. }
  28. protected function getUrl()
  29. {
  30. return $this->resource().'/'.$this->getKey();
  31. }
  32. protected function addStyle()
  33. {
  34. $color = Admin::color()->link();
  35. Admin::style(
  36. <<<CSS
  37. .grid-editable{border-bottom:dashed 1px $color;color: $color;display: inline-block}
  38. .grid-editable+.save{margin-left: 0.55rem;color: $color}
  39. CSS
  40. );
  41. }
  42. protected function addScript()
  43. {
  44. $script = <<<JS
  45. $(".{$this->selector}").on("click", function() {
  46. $(this).next().removeClass("hidden");
  47. }).on('blur', function () {
  48. var icon = $(this).next();
  49. setTimeout(function () {
  50. icon.addClass("hidden")
  51. }, 200)
  52. });
  53. $('.{$this->selector}+.save').on("click",function() {
  54. var obj = $(this),
  55. url = obj.data('url'),
  56. name = obj.data('name'),
  57. refresh = obj.data('refresh'),
  58. old_value = obj.data('value'),
  59. value = obj.prev().html().replace(new RegExp("<br>","g"), '').replace(new RegExp("&nbsp;","g"), '').trim();
  60. var data = {
  61. _token: Dcat.token,
  62. _method: 'PUT'
  63. };
  64. data[name] = value;
  65. Dcat.NP.start();
  66. $.ajax({
  67. url: url,
  68. type: "POST",
  69. data: data,
  70. success: function (data) {
  71. if (data.status) {
  72. obj.attr('data-value',value).addClass("hidden").prev().html(value);
  73. Dcat.success(data.message);
  74. refresh && Dcat.reload()
  75. } else {
  76. obj.prev().html(old_value);
  77. Dcat.error(data.message);
  78. }
  79. },
  80. error:function(a,b,c) {
  81. obj.prev().html(old_value);
  82. Dcat.handleAjaxError(a, b, c);
  83. },
  84. complete:function(a,b) {
  85. Dcat.NP.done();
  86. }
  87. });
  88. return false;
  89. })
  90. JS;
  91. Admin::script($script);
  92. }
  93. }