2013-08-05 19:46:39 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Render a simple preview panel for a bound Remarkup text control.
|
|
|
|
*/
|
|
|
|
final class PHUIRemarkupPreviewPanel extends AphrontTagView {
|
|
|
|
|
|
|
|
private $header;
|
|
|
|
private $loadingText;
|
|
|
|
private $controlID;
|
|
|
|
private $previewURI;
|
2013-08-05 19:47:26 +02:00
|
|
|
private $skin = 'default';
|
2013-08-05 19:46:39 +02:00
|
|
|
|
|
|
|
protected function canAppendChild() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setPreviewURI($preview_uri) {
|
|
|
|
$this->previewURI = $preview_uri;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setControlID($control_id) {
|
|
|
|
$this->controlID = $control_id;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setHeader($header) {
|
|
|
|
$this->header = $header;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setLoadingText($loading_text) {
|
|
|
|
$this->loadingText = $loading_text;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2013-08-05 19:47:26 +02:00
|
|
|
public function setSkin($skin) {
|
|
|
|
static $skins = array(
|
|
|
|
'default' => true,
|
|
|
|
'document' => true,
|
|
|
|
);
|
|
|
|
|
|
|
|
if (empty($skins[$skin])) {
|
|
|
|
$valid = implode(', ', array_keys($skins));
|
|
|
|
throw new Exception("Invalid skin '{$skin}'. Valid skins are: {$valid}.");
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->skin = $skin;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2013-08-05 19:46:39 +02:00
|
|
|
public function getTagName() {
|
|
|
|
return 'div';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getTagAttributes() {
|
2013-08-05 19:47:26 +02:00
|
|
|
$classes = array();
|
|
|
|
$classes[] = 'phui-remarkup-preview';
|
|
|
|
|
|
|
|
if ($this->skin) {
|
|
|
|
$classes[] = 'phui-remarkup-preview-skin-'.$this->skin;
|
|
|
|
}
|
|
|
|
|
2013-08-05 19:46:39 +02:00
|
|
|
return array(
|
2013-08-05 19:47:26 +02:00
|
|
|
'class' => $classes,
|
2013-08-05 19:46:39 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function getTagContent() {
|
|
|
|
if ($this->previewURI === null) {
|
|
|
|
throw new Exception("Call setPreviewURI() before rendering!");
|
|
|
|
}
|
|
|
|
if ($this->controlID === null) {
|
|
|
|
throw new Exception("Call setControlID() before rendering!");
|
|
|
|
}
|
|
|
|
|
|
|
|
$preview_id = celerity_generate_unique_node_id();
|
|
|
|
|
|
|
|
require_celerity_resource('phui-remarkup-preview-css');
|
|
|
|
Javelin::initBehavior(
|
|
|
|
'remarkup-preview',
|
|
|
|
array(
|
|
|
|
'previewID' => $preview_id,
|
|
|
|
'controlID' => $this->controlID,
|
|
|
|
'uri' => $this->previewURI,
|
|
|
|
));
|
|
|
|
|
|
|
|
$loading = phutil_tag(
|
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'class' => 'phui-preview-loading-text',
|
|
|
|
),
|
|
|
|
nonempty($this->loadingText, pht('Loading preview...')));
|
|
|
|
|
|
|
|
$header = null;
|
|
|
|
if ($this->header) {
|
|
|
|
$header = phutil_tag(
|
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'class' => 'phui-preview-header',
|
|
|
|
),
|
|
|
|
$this->header);
|
|
|
|
}
|
|
|
|
|
|
|
|
$preview = phutil_tag(
|
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'id' => $preview_id,
|
|
|
|
'class' => 'phabricator-remarkup',
|
|
|
|
),
|
|
|
|
$loading);
|
|
|
|
|
2013-08-05 19:47:26 +02:00
|
|
|
$content = array($header, $preview);
|
|
|
|
|
|
|
|
switch ($this->skin) {
|
|
|
|
case 'document':
|
|
|
|
$content = id(new PHUIDocumentView())->appendChild($content);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $content;
|
2013-08-05 19:46:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|