v1.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace zin;
  3. require_once dirname(__DIR__) . DS . 'btn' . DS . 'v1.php';
  4. require_once dirname(__DIR__) . DS . 'storylist' . DS . 'v1.php';
  5. class linkedStoryList extends storyList
  6. {
  7. /**
  8. * @var mixed[]
  9. */
  10. protected static $defineProps = array
  11. (
  12. 'story' => '?object', // 被关联的需求。
  13. 'unlinkBtn' => '?array|bool', // 取消关联按钮。
  14. 'unlinkStoryTip' => '?string', // 取消关联提示信息。
  15. 'unlinkUrl' => '?string', // 取消关联需求链接
  16. 'newLinkBtn' => '?array|bool' // 底部新关联按钮。
  17. );
  18. /**
  19. * @var mixed[]
  20. */
  21. protected static $defaultProps = array
  22. (
  23. 'name' => 'linked-story-list'
  24. );
  25. public static function getPageJS()
  26. {
  27. return <<<'JS'
  28. window.unlinkStory = function(e)
  29. {
  30. const $this = $(e.target).closest('li').find('.unlinkStory');
  31. zui.Modal.confirm({message: window.unlinkStoryTip || $this.closest('ul').data('unlinkStoryTip'), icon:'icon-exclamation-sign', iconClass: 'warning-pale rounded-full icon-2x'}).then((res) =>
  32. {
  33. if(res) $.get($this.attr('data-url'), function(){$this.closest('li').remove()});
  34. });
  35. };
  36. JS;
  37. }
  38. /**
  39. * @var object|null
  40. */
  41. protected $story;
  42. /**
  43. * @var string|null
  44. */
  45. protected $unlinkUrl;
  46. /**
  47. * @var null|mixed[]|bool
  48. */
  49. protected $unlinkBtn = null;
  50. protected function beforeBuild()
  51. {
  52. $story = $this->prop('story');
  53. if(!$story) $story = data('story');
  54. if(!$story) return;
  55. $unlinkUrl = $this->prop('unlinkUrl');
  56. if($unlinkUrl === null) $unlinkUrl = createLink('story', 'linkStory', "storyID={$story->id}&type=remove&linkedID={id}&browseType=&queryID=0&storyType=$story->type");
  57. $canLink = hasPriv($story->type, 'linkStory');
  58. $unlinkBtn = $this->prop('unlinkBtn');
  59. if($unlinkBtn === null) $unlinkBtn = $canLink;
  60. $this->story = $story;
  61. $this->unlinkUrl = $unlinkUrl;
  62. $this->unlinkBtn = $unlinkBtn;
  63. }
  64. /**
  65. * @param object $story
  66. */
  67. protected function getItem($story)
  68. {
  69. global $lang;
  70. $item = parent::getItem($story);
  71. $unlinkBtn = $this->unlinkBtn;
  72. if($unlinkBtn)
  73. {
  74. if(!isset($item['actions'])) $item['actions'] = array();
  75. $btn = array
  76. (
  77. 'class' => 'unlinkStory unlink opacity-0 group-hover:opacity-100 text-primary',
  78. 'icon' => 'unlink',
  79. 'data-id' => $story->id,
  80. 'data-on' => 'click',
  81. 'data-url' => str_replace('{id}', "$story->id", $this->unlinkUrl),
  82. 'data-params' => 'event',
  83. 'data-call' => 'unlinkStory',
  84. 'hint' => $lang->story->unlink
  85. );
  86. if(is_array($unlinkBtn)) $btn = array_merge($btn, $unlinkBtn);
  87. $item['actions'][] = $btn;
  88. }
  89. return $item;
  90. }
  91. protected function build()
  92. {
  93. $list = parent::build();
  94. if($this->unlinkBtn)
  95. {
  96. $unlinkStoryTip = $this->prop('unlinkStoryTip');
  97. if($unlinkStoryTip === null && $this->story)
  98. {
  99. global $lang;
  100. $unlinkStoryTip = $this->story->type == 'story' ? str_replace($lang->SRCommon, $lang->URCommon, $lang->story->unlinkStory) : $lang->story->unlinkStory;
  101. }
  102. $list->add(setData('unlinkStoryTip', $unlinkStoryTip));
  103. }
  104. $newLinkBtn = $this->prop('newLinkBtn');
  105. if($newLinkBtn === null) $newLinkBtn = $this->unlinkBtn;
  106. if($newLinkBtn)
  107. {
  108. global $lang;
  109. $story = $this->story;
  110. if(!$story) return $list;
  111. $btn = new btn
  112. (
  113. set::url('story', 'linkStory', "storyID=$story->id&type=linkStories&linkedID=0&browseType=&queryID=0&storyType=$story->type"),
  114. set::icon('plus'),
  115. set::size('sm'),
  116. set::type('secondary'),
  117. setClass('my-2'),
  118. setData(array('toggle' => 'modal', 'size' => 'lg')),
  119. setID('linkButton'),
  120. is_array($newLinkBtn) ? set($newLinkBtn) : null,
  121. $lang->story->linkStory
  122. );
  123. return array($list, $btn);
  124. }
  125. return $list;
  126. }
  127. }