v1.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. namespace zin;
  3. require_once dirname(__DIR__) . DS . 'relatedlist' . DS . 'v1.php';
  4. class relatedObjectList extends relatedList
  5. {
  6. /**
  7. * @var mixed[]
  8. */
  9. protected static $defineProps = array
  10. (
  11. 'objectID' => '?int', //主动关联对象ID
  12. 'objectType' => '?string', //主动关联对象类型
  13. 'relatedObjects' => '?array', //被关联对象列表
  14. 'browseType' => '?string="byRelation"' //浏览类型 byRelation|byObject
  15. );
  16. public static function getPageCSS()
  17. {
  18. return <<<'CSS'
  19. li.objectItem div.listitem span.is-empty {display: none !important;}
  20. CSS;
  21. }
  22. public static function getPageJS()
  23. {
  24. global $lang;
  25. return <<<JS
  26. window.removeObject = function(e)
  27. {
  28. const obj = \$(e.target).closest('li').find('.removeObject');
  29. const ul = obj.closest('ul');
  30. const count = ul.closest('li').find('.listitem .item-content span').text();
  31. zui.Modal.confirm({message: `{$lang->custom->removeObjectTip}`, icon:'icon-exclamation-sign', iconClass: 'warning-pale rounded-full icon-2x'}).then((res) =>
  32. {
  33. if(res)
  34. {
  35. \$.get(obj.attr('data-url'), function()
  36. {
  37. obj.closest('li').remove();
  38. ul.closest('li').find('.listitem .item-content span').text(count - 1);
  39. if(ul.find('li').length == 0) ul.closest('li').remove();
  40. });
  41. }
  42. });
  43. };
  44. JS;
  45. }
  46. /**
  47. * @return object
  48. * @param int $relatedObjectID
  49. * @param string $relatedObjectType
  50. * @param mixed[] $relatedObjectInfo
  51. * @param string $relationName
  52. * @param string $relationType
  53. * @param string $browseType
  54. */
  55. protected function getObjectItem($relatedObjectID, $relatedObjectType, $relatedObjectInfo, $relationName, $relationType, $browseType)
  56. {
  57. global $config, $lang, $app;
  58. $objectID = $this->prop('objectID');
  59. $objectType = $this->prop('objectType');
  60. $title = $relatedObjectInfo['title'];
  61. $itemType = $relationName;
  62. if($browseType == 'byRelation')
  63. {
  64. $relatedObjectTypeList = $config->custom->relateObjectList;
  65. if(helper::hasFeature('devops')) $relatedObjectTypeList['commit'] = $config->custom->relateObjectList['repocommit'];
  66. if(!isset($relatedObjectTypeList[$relatedObjectType])) $relatedObjectTypeList[$relatedObjectType] = $app->loadLang($relatedObjectType)->$relatedObjectType->common;
  67. $itemType = $relatedObjectTypeList[$relatedObjectType];
  68. }
  69. $item = new stdClass();
  70. $item->id = $relatedObjectID;
  71. $item->title = "#$relatedObjectID $title";
  72. $item->type = $itemType;
  73. $item->url = !empty($relatedObjectInfo['url']) ? $relatedObjectInfo['url'] : null;
  74. $item->titleAttrs = !empty($relatedObjectInfo['url']) && !in_array($relatedObjectType, array('repocommit', 'commit', 'mr', 'release', 'build')) ? array('data-toggle' => 'modal', 'data-size' => 'lg') : null;
  75. $item->titleAttrs = !empty($relatedObjectInfo['url']) && $relatedObjectType == 'build' ? array('data-app' => zget($relatedObjectInfo, 'tab', '')) : null;
  76. if(isset($relatedObjectInfo['status'])) $item->status = $relatedObjectInfo['status'];
  77. if(hasPriv('custom', 'removeObjects'))
  78. {
  79. $disabled = $relationType == 'default' ? 'disabled' : '';
  80. $removeObjectUrl = createLink('custom', 'removeObjects', "objectID=$objectID&objectType=$objectType&relationName=$relationName&relatedObjectID=$relatedObjectID&relatedObjectType=$relatedObjectType");
  81. $btn = array
  82. (
  83. 'class' => "removeObject text-primary $disabled",
  84. 'icon' => 'unlink',
  85. 'data-on' => 'click',
  86. 'data-url' => $removeObjectUrl,
  87. 'data-params' => 'event',
  88. 'data-call' => $disabled ? null : 'removeObject',
  89. 'hint' => $disabled ? $lang->custom->defaultRelation : $lang->custom->removeObjects
  90. );
  91. $item->actions = array($btn);
  92. }
  93. return $item;
  94. }
  95. /**
  96. * @param object $item
  97. * @param string $type
  98. * @param mixed[] $group
  99. */
  100. protected function getCommonItem($type, $group, $item)
  101. {
  102. global $app;
  103. $isEn = $app->getClientLang() == 'en';
  104. $title = '';
  105. if(isset($item->title)) $title = $item->title;
  106. if(isset($item->name)) $title = $item->name;
  107. $info = array
  108. (
  109. 'title' => $title,
  110. 'hint' => $title,
  111. 'titleAttrs' => $item->titleAttrs,
  112. 'leading' => array('html' => wg(idLabel::create($item->type, array('class' => 'text-clip text-left', 'style' => $isEn ? '' : array('max-width' => '45px'))))->render()),
  113. 'url' => $item->url,
  114. 'class' => 'objectItem',
  115. 'actions' => isset($item->actions) ? $item->actions : array()
  116. );
  117. return $info;
  118. }
  119. protected function created()
  120. {
  121. $relatedObjects = $this->prop('relatedObjects', data('relatedObjects'));
  122. if(!$relatedObjects) return;
  123. $browseType = $this->prop('browseType', data('browseType'));
  124. global $config, $app;
  125. $data = array();
  126. if($browseType == 'byRelation')
  127. {
  128. foreach($relatedObjects as $relationNameAndType => $relatedObjectList)
  129. {
  130. $nameAndType = explode('_', $relationNameAndType, 2);
  131. $relationType = $nameAndType[0]; //default是内置关系,custom是用户自定义关系
  132. $relationName = $nameAndType[1];
  133. $relatedObjectItems = array();
  134. foreach($relatedObjectList as $relatedObjectType => $relatedObjectPairs)
  135. {
  136. foreach($relatedObjectPairs as $relatedObjectID => $relatedObjectInfo) $relatedObjectItems[] = $this->getObjectItem($relatedObjectID, $relatedObjectType, $relatedObjectInfo, (string)$relationName, $relationType, $browseType);
  137. }
  138. $data[$relationNameAndType] = array
  139. (
  140. 'title' => $relationName,
  141. 'items' => $relatedObjectItems
  142. );
  143. }
  144. }
  145. if($browseType == 'byObject')
  146. {
  147. foreach($relatedObjects as $relatedObjectType => $relatedObjectList)
  148. {
  149. $relatedObjectItems = array();
  150. foreach($relatedObjectList as $relationNameAndType => $relatedObjectPairs)
  151. {
  152. $nameAndType = explode('_', $relationNameAndType, 2);
  153. $relationType = $nameAndType[0]; //default是内置关系,custom是用户自定义关系
  154. $relationName = $nameAndType[1];
  155. foreach($relatedObjectPairs as $relatedObjectID => $relatedObjectInfo) $relatedObjectItems[] = $this->getObjectItem($relatedObjectID, $relatedObjectType, $relatedObjectInfo, (string)$relationName, $relationType, $browseType);
  156. }
  157. $relatedObjectTypePairs = $config->custom->relateObjectList;
  158. if(helper::hasFeature('devops')) $relatedObjectTypePairs['commit'] = $config->custom->relateObjectList['repocommit'];
  159. if(!isset($relatedObjectTypePairs[$relatedObjectType])) $relatedObjectTypePairs[$relatedObjectType] = $app->loadLang($relatedObjectType)->$relatedObjectType->common;
  160. $data[$relatedObjectType] = array
  161. (
  162. 'title' => $relatedObjectTypePairs[$relatedObjectType],
  163. 'items' => $relatedObjectItems
  164. );
  165. }
  166. }
  167. $this->setProp('data', $data);
  168. }
  169. protected function build()
  170. {
  171. global $lang, $app;
  172. $list = parent::build();
  173. $list->add(set::hoverItemActions());
  174. $objectID = $this->prop('objectID');
  175. $objectType = $this->prop('objectType');
  176. $relatedObjects = $this->prop('relatedObjects', data('relatedObjects'));
  177. $btn = hasPriv('custom', 'relateObject') ? btn
  178. (
  179. set::url('custom', 'relateObject', "objectID=$objectID&objectType=$objectType&relatedObjectType=$objectType"),
  180. set::icon('plus'),
  181. set::size('sm'),
  182. set::type('secondary'),
  183. setClass('my-2'),
  184. setData(array('toggle' => 'modal', 'size' => 'lg')),
  185. setID('linkButton'),
  186. $lang->custom->relateObject
  187. ) : null;
  188. $graphBtn = hasPriv('custom', 'showRelationGraph') && !empty($relatedObjects) ? btn
  189. (
  190. set::url('custom', 'showRelationGraph', "objectID=$objectID&objectType=$objectType"),
  191. set::icon('treemap'),
  192. set::size('sm'),
  193. set::type('secondary'),
  194. setClass('my-2'),
  195. setClass($btn ? 'pull-right' : ''),
  196. setData(array('toggle' => 'modal', 'size' => 'lg')),
  197. setID('graphButton'),
  198. $app->loadLang('custom')->custom->relationGraph
  199. ) : null;
  200. return array($btn, $graphBtn, $list);
  201. }
  202. }