@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 PhabricatorCalendarImportDropController
4 extends PhabricatorCalendarController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $request->getViewer();
8
9 if (!$request->validateCSRF()) {
10 return new Aphront400Response();
11 }
12
13 $cancel_uri = $this->getApplicationURI();
14
15 $ids = $request->getStrList('h');
16 if ($ids) {
17 $files = id(new PhabricatorFileQuery())
18 ->setViewer($viewer)
19 ->withIDs($ids)
20 ->setRaisePolicyExceptions(true)
21 ->execute();
22 } else {
23 $files = array();
24 }
25
26 if (!$files) {
27 return $this->newDialog()
28 ->setTitle(pht('Nothing Uploaded'))
29 ->appendParagraph(
30 pht(
31 'Drag and drop .ics files to upload them and import them into '.
32 'Calendar.'))
33 ->addCancelButton($cancel_uri, pht('Done'));
34 }
35
36 $engine = new PhabricatorCalendarICSFileImportEngine();
37 $imports = array();
38 foreach ($files as $file) {
39 $import = PhabricatorCalendarImport::initializeNewCalendarImport(
40 $viewer,
41 clone $engine);
42
43 $xactions = array();
44 $xactions[] = id(new PhabricatorCalendarImportTransaction())
45 ->setTransactionType(
46 PhabricatorCalendarImportICSFileTransaction::TRANSACTIONTYPE)
47 ->setNewValue($file->getPHID());
48
49 $editor = id(new PhabricatorCalendarImportEditor())
50 ->setActor($viewer)
51 ->setContinueOnNoEffect(true)
52 ->setContinueOnMissingFields(true)
53 ->setContentSourceFromRequest($request);
54
55 $editor->applyTransactions($import, $xactions);
56
57 $imports[] = $import;
58 }
59
60 $import_phids = mpull($imports, 'getPHID');
61 $events = id(new PhabricatorCalendarEventQuery())
62 ->setViewer($viewer)
63 ->withImportSourcePHIDs($import_phids)
64 ->execute();
65
66 if (count($events) == 1) {
67 // The user imported exactly one event. This is consistent with dropping
68 // a .ics file from an email; just take them to the event.
69 $event = head($events);
70 $next_uri = $event->getURI();
71 } else if (count($imports) > 1) {
72 // The user imported multiple different files. Take them to a summary
73 // list of generated import activity.
74 $source_phids = implode(',', $import_phids);
75 $next_uri = '/calendar/import/log/?importSourcePHIDs='.$source_phids;
76 } else {
77 // The user imported one file, which had zero or more than one event.
78 // Take them to the import detail page.
79 $import = head($imports);
80 $next_uri = $import->getURI();
81 }
82
83 return id(new AphrontRedirectResponse())->setURI($next_uri);
84 }
85
86}