@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 PhabricatorCalendarImportEditController
4 extends PhabricatorCalendarController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $engine = id(new PhabricatorCalendarImportEditEngine())
8 ->setController($this);
9
10 $id = $request->getURIData('id');
11 if ($id) {
12
13 // edit a specific entry
14
15 $calendar_import = self::queryImportByID($request, $id);
16 if (!$calendar_import) {
17 return new Aphront404Response();
18 }
19
20 // pass the correct import engine to build the response
21 $engine->setImportEngine($calendar_import->getEngine());
22
23 } else {
24
25 // create an entry
26
27 $list_uri = $this->getApplicationURI('import/');
28
29 $import_type = $request->getStr('importType');
30 $import_engines = PhabricatorCalendarImportEngine::getAllImportEngines();
31 if (empty($import_engines[$import_type])) {
32 return $this->buildEngineTypeResponse($list_uri);
33 }
34
35 $import_engine = $import_engines[$import_type];
36
37 $engine
38 ->addContextParameter('importType', $import_type)
39 ->setImportEngine($import_engine);
40 }
41
42 return $engine->buildResponse();
43 }
44
45 private static function queryImportByID(AphrontRequest $request, int $id) {
46 return id(new PhabricatorCalendarImportQuery())
47 ->setViewer($request->getViewer())
48 ->withIDs(array($id))
49 ->requireCapabilities(
50 array(
51 PhabricatorPolicyCapability::CAN_VIEW,
52 PhabricatorPolicyCapability::CAN_EDIT,
53 ))
54 ->executeOne();
55 }
56
57 private function buildEngineTypeResponse($cancel_uri) {
58 $import_engines = PhabricatorCalendarImportEngine::getAllImportEngines();
59
60 $request = $this->getRequest();
61 $viewer = $this->getViewer();
62
63 $e_import = null;
64 $errors = array();
65 if ($request->isFormPost()) {
66 $e_import = pht('Required');
67 $errors[] = pht(
68 'To import events, you must select a source to import from.');
69 }
70
71 $type_control = id(new AphrontFormRadioButtonControl())
72 ->setLabel(pht('Import Type'))
73 ->setName('importType')
74 ->setError($e_import);
75
76 foreach ($import_engines as $import_engine) {
77 $type_control->addButton(
78 $import_engine->getImportEngineType(),
79 $import_engine->getImportEngineName(),
80 $import_engine->getImportEngineHint());
81 }
82
83 $crumbs = $this->buildApplicationCrumbs();
84 $crumbs->addTextCrumb(pht('New Import'));
85 $crumbs->setBorder(true);
86
87 $title = pht('Choose Import Type');
88 $header = id(new PHUIHeaderView())
89 ->setHeader(pht('New Import'))
90 ->setHeaderIcon('fa-upload');
91
92 $form = id(new AphrontFormView())
93 ->setUser($viewer)
94 ->appendChild($type_control)
95 ->appendChild(
96 id(new AphrontFormSubmitControl())
97 ->setValue(pht('Continue'))
98 ->addCancelButton($cancel_uri));
99
100 $box = id(new PHUIObjectBoxView())
101 ->setFormErrors($errors)
102 ->setHeaderText(pht('Import'))
103 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
104 ->setForm($form);
105
106 $view = id(new PHUITwoColumnView())
107 ->setHeader($header)
108 ->setFooter(
109 array(
110 $box,
111 ));
112
113 return $this->newPage()
114 ->setTitle($title)
115 ->setCrumbs($crumbs)
116 ->appendChild($view);
117 }
118
119}