mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 14:00:56 +01:00
Make .ics export less scary and attach .ics files to event mail
Summary: Ref T10747. - Remove the warning dialog since these files don't seem to do anything confusing/problematic in Calendar.app or Google Calendar. Those importers generally need to be defensive about how they handle random ".ics" files from arbitrary third parties anyway, and this makes testing imports easier since we have a GET-table ".ics" URI for public events. - Attach ".ics" files to email. Test Plan: - Clicked "Export as .ics", got an ICS file. - Used "bin/mail show-outbound" to review an ICS attachment, although I don't actually have real mail set up locally so this may still be a little funky. Reviewers: chad Reviewed By: chad Maniphest Tasks: T10747 Differential Revision: https://secure.phabricator.com/D16559
This commit is contained in:
parent
96f800249b
commit
3d6c3c2c45
5 changed files with 43 additions and 30 deletions
|
@ -59,7 +59,7 @@ final class PhabricatorCalendarApplication extends PhabricatorApplication {
|
|||
=> 'PhabricatorCalendarEventCancelController',
|
||||
'(?P<action>join|decline|accept)/(?P<id>[1-9]\d*)/'
|
||||
=> 'PhabricatorCalendarEventJoinController',
|
||||
'export/(?P<id>[1-9]\d*)/'
|
||||
'export/(?P<id>[1-9]\d*)/(?P<filename>[^/]*)'
|
||||
=> 'PhabricatorCalendarEventExportController',
|
||||
),
|
||||
),
|
||||
|
|
|
@ -19,36 +19,22 @@ final class PhabricatorCalendarEventExportController
|
|||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
$file_name = $event->getMonogram().'.ics';
|
||||
$file_name = $event->getICSFilename();
|
||||
$event_node = $event->newIntermediateEventNode($viewer);
|
||||
|
||||
$event_node = $event->newIntermediateEventNode($viewer);
|
||||
$document_node = id(new PhutilCalendarDocumentNode())
|
||||
->appendChild($event_node);
|
||||
|
||||
$document_node = id(new PhutilCalendarDocumentNode())
|
||||
->appendChild($event_node);
|
||||
$root_node = id(new PhutilCalendarRootNode())
|
||||
->appendChild($document_node);
|
||||
|
||||
$root_node = id(new PhutilCalendarRootNode())
|
||||
->appendChild($document_node);
|
||||
|
||||
$ics_data = id(new PhutilICSWriter())
|
||||
->writeICSDocument($root_node);
|
||||
|
||||
return id(new AphrontFileResponse())
|
||||
->setDownload($file_name)
|
||||
->setMimeType('text/calendar')
|
||||
->setContent($ics_data);
|
||||
}
|
||||
|
||||
return $this->newDialog()
|
||||
->setDisableWorkflowOnSubmit(true)
|
||||
->setTitle(pht('Export as .ics'))
|
||||
->appendParagraph(
|
||||
pht(
|
||||
'WARNING: This feature is a prototype and only supports a limited '.
|
||||
'set of features. Keep your expectations low!'))
|
||||
->addSubmitButton(pht('Download .ics'))
|
||||
->addCancelButton($event->getURI(), pht('Close'));
|
||||
$ics_data = id(new PhutilICSWriter())
|
||||
->writeICSDocument($root_node);
|
||||
|
||||
return id(new AphrontFileResponse())
|
||||
->setDownload($file_name)
|
||||
->setMimeType('text/calendar')
|
||||
->setContent($ics_data);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -193,14 +193,14 @@ final class PhabricatorCalendarEventViewController
|
|||
->setWorkflow(true));
|
||||
}
|
||||
|
||||
$export_uri = $this->getApplicationURI("event/export/{$id}/");
|
||||
$ics_name = $event->getICSFilename();
|
||||
$export_uri = $this->getApplicationURI("event/export/{$id}/{$ics_name}");
|
||||
|
||||
$curtain->addAction(
|
||||
id(new PhabricatorActionView())
|
||||
->setName(pht('Export as .ics'))
|
||||
->setIcon('fa-download')
|
||||
->setHref($export_uri)
|
||||
->setWorkflow(true));
|
||||
->setHref($export_uri));
|
||||
|
||||
return $curtain;
|
||||
}
|
||||
|
|
|
@ -285,6 +285,8 @@ final class PhabricatorCalendarEventEditor
|
|||
pht('EVENT DETAIL'),
|
||||
PhabricatorEnv::getProductionURI('/E'.$object->getID()));
|
||||
|
||||
$ics_attachment = $this->newICSAttachment($object);
|
||||
$body->addAttachment($ics_attachment);
|
||||
|
||||
return $body;
|
||||
}
|
||||
|
@ -303,5 +305,27 @@ final class PhabricatorCalendarEventEditor
|
|||
->setObject($object);
|
||||
}
|
||||
|
||||
private function newICSAttachment(
|
||||
PhabricatorCalendarEvent $event) {
|
||||
$actor = $this->getActor();
|
||||
|
||||
$event_node = $event->newIntermediateEventNode($actor);
|
||||
|
||||
$document_node = id(new PhutilCalendarDocumentNode())
|
||||
->appendChild($event_node);
|
||||
|
||||
$root_node = id(new PhutilCalendarRootNode())
|
||||
->appendChild($document_node);
|
||||
|
||||
$ics_data = id(new PhutilICSWriter())
|
||||
->writeICSDocument($root_node);
|
||||
|
||||
$ics_attachment = new PhabricatorMetaMTAAttachment(
|
||||
$ics_data,
|
||||
$event->getICSFilename(),
|
||||
'text/calendar');
|
||||
|
||||
return $ics_attachment;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -625,6 +625,9 @@ final class PhabricatorCalendarEvent extends PhabricatorCalendarDAO
|
|||
return null;
|
||||
}
|
||||
|
||||
public function getICSFilename() {
|
||||
return $this->getMonogram().'.ics';
|
||||
}
|
||||
|
||||
public function newIntermediateEventNode(PhabricatorUser $viewer) {
|
||||
$base_uri = new PhutilURI(PhabricatorEnv::getProductionURI('/'));
|
||||
|
|
Loading…
Reference in a new issue