@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final class PhabricatorProjectsEditEngineExtension
4 extends PhabricatorEditEngineExtension {
5
6 const EXTENSIONKEY = 'projects.projects';
7
8 const EDITKEY_ADD = 'projects.add';
9 const EDITKEY_SET = 'projects.set';
10 const EDITKEY_REMOVE = 'projects.remove';
11
12 public function getExtensionPriority() {
13 return 500;
14 }
15
16 public function isExtensionEnabled() {
17 return PhabricatorApplication::isClassInstalled(
18 PhabricatorProjectApplication::class);
19 }
20
21 public function getExtensionName() {
22 return pht('Projects');
23 }
24
25 public function supportsObject(
26 PhabricatorEditEngine $engine,
27 PhabricatorApplicationTransactionInterface $object) {
28
29 return ($object instanceof PhabricatorProjectInterface);
30 }
31
32 public function buildCustomEditFields(
33 PhabricatorEditEngine $engine,
34 PhabricatorApplicationTransactionInterface $object) {
35
36 $edge_type = PhabricatorTransactions::TYPE_EDGE;
37 $project_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
38
39 $object_phid = $object->getPHID();
40 if ($object_phid) {
41 $project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
42 $object_phid,
43 $project_edge_type);
44 $project_phids = array_reverse($project_phids);
45 } else {
46 $project_phids = array();
47 }
48
49 $viewer = $engine->getViewer();
50
51 $projects_field = id(new PhabricatorProjectsEditField())
52 ->setKey('projectPHIDs')
53 ->setLabel(pht('Project Tags'))
54 ->setEditTypeKey('projects')
55 ->setAliases(array('project', 'projects', 'tag', 'tags'))
56 ->setIsCopyable(true)
57 ->setUseEdgeTransactions(true)
58 ->setCommentActionLabel(pht('Change Project Tags'))
59 ->setCommentActionOrder(8000)
60 ->setDescription(pht('Select project tags for the object.'))
61 ->setTransactionType($edge_type)
62 ->setMetadataValue('edge:type', $project_edge_type)
63 ->setValue($project_phids)
64 ->setViewer($viewer);
65
66 $projects_datasource = id(new PhabricatorProjectDatasource())
67 ->setViewer($viewer);
68
69 $edit_add = $projects_field->getConduitEditType(self::EDITKEY_ADD)
70 ->setConduitDescription(pht('Add project tags.'));
71
72 $edit_set = $projects_field->getConduitEditType(self::EDITKEY_SET)
73 ->setConduitDescription(
74 pht('Set project tags, overwriting current value.'));
75
76 $edit_rem = $projects_field->getConduitEditType(self::EDITKEY_REMOVE)
77 ->setConduitDescription(pht('Remove project tags.'));
78
79 $projects_field->getBulkEditType(self::EDITKEY_ADD)
80 ->setBulkEditLabel(pht('Add project tags'))
81 ->setDatasource($projects_datasource);
82
83 $projects_field->getBulkEditType(self::EDITKEY_SET)
84 ->setBulkEditLabel(pht('Set project tags to'))
85 ->setDatasource($projects_datasource);
86
87 $projects_field->getBulkEditType(self::EDITKEY_REMOVE)
88 ->setBulkEditLabel(pht('Remove project tags'))
89 ->setDatasource($projects_datasource);
90
91 return array(
92 $projects_field,
93 );
94 }
95
96}