changesets = $changesets; return $this; } public function setEditable($editable) { $this->editable = $editable; return $this; } public function setRevision(DifferentialRevision $revision) { $this->revision = $revision; return $this; } public function setVsMap(array $vs_map) { $this->vsMap = $vs_map; return $this; } public function render() { require_celerity_resource('differential-changeset-view-css'); $vs_map = $this->vsMap; $changesets = $this->changesets; $output = array(); $mapping = array(); foreach ($changesets as $key => $changeset) { $file = $changeset->getFilename(); $class = 'differential-changeset'; if (!$this->editable) { $class .= ' differential-changeset-noneditable'; } $id = $changeset->getID(); if ($id) { $vs_id = idx($vs_map, $id); } else { $vs_id = null; } $detail_uri = new PhutilURI('/differential/changeset/'); $detail_uri->setQueryParams( array( 'id' => $id, 'vs' => $vs_id, 'whitespace' => 'TODO', )); $detail_button = phutil_render_tag( 'a', array( 'style' => 'float: right', 'class' => 'button small grey', 'href' => $detail_uri, 'target' => '_blank', ), 'Standalone View'); $uniq_id = celerity_generate_unique_node_id(); $detail = new DifferentialChangesetDetailView(); $detail->setChangeset($changeset); $detail->addButton($detail_button); $detail->appendChild( phutil_render_tag( 'div', array( 'id' => $uniq_id, ), '