mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 00:42:41 +01:00
Show missing Phriction documents as red links, invisible documents with a lock
Summary: Ref T7691 (errata). This shows links to Phriction documents in red if they're missing, and links to Phriction documents in grey with a lock icon if the user doesn't have the correct permissions to see the document. Test Plan: Tested a bunch of different configurations: ``` [[ ./../ ]] Back to Main Document [[ ./../subdocument_2]] Mmmm more documents [[ ./../invisible_document]] Mmmm more documents [[ ./../ | Explicit Title ]] Back to Main Document [[ ./../subdocument_2 | Explicit Title ]] Mmmm more documents [[ ./../invisible_document | Explicit Title ]] Mmmm more documents [[ ]] Absolute link [[ subdocument_2 ]] Absolute link [[ invisible_document ]] Absolute link [[ | Explicit Title ]] Absolute link [[ subdocument_2 | Explicit Title ]] Absolute link [[ invisible_document | Explicit Title ]] Absolute link ``` Got the expected result: {F1221106} Reviewers: epriestley, chad, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin Maniphest Tasks: T7691 Differential Revision: https://secure.phabricator.com/D15733
This commit is contained in:
parent
dd1023e5a8
commit
27227b8010
3 changed files with 124 additions and 26 deletions
|
@ -88,7 +88,7 @@ return array(
|
|||
'rsrc/css/application/phortune/phortune-credit-card-form.css' => '8391eb02',
|
||||
'rsrc/css/application/phortune/phortune.css' => '9149f103',
|
||||
'rsrc/css/application/phrequent/phrequent.css' => 'ffc185ad',
|
||||
'rsrc/css/application/phriction/phriction-document-css.css' => 'd1861e06',
|
||||
'rsrc/css/application/phriction/phriction-document-css.css' => '55446c91',
|
||||
'rsrc/css/application/policy/policy-edit.css' => '815c66f7',
|
||||
'rsrc/css/application/policy/policy-transaction-detail.css' => '82100a43',
|
||||
'rsrc/css/application/policy/policy.css' => '957ea14c',
|
||||
|
@ -807,7 +807,7 @@ return array(
|
|||
'phortune-credit-card-form-css' => '8391eb02',
|
||||
'phortune-css' => '9149f103',
|
||||
'phrequent-css' => 'ffc185ad',
|
||||
'phriction-document-css' => 'd1861e06',
|
||||
'phriction-document-css' => '55446c91',
|
||||
'phui-action-panel-css' => '91c7b835',
|
||||
'phui-badge-view-css' => '3baef8db',
|
||||
'phui-big-info-view-css' => 'bd903741',
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
final class PhrictionRemarkupRule extends PhutilRemarkupRule {
|
||||
|
||||
const KEY_RULE_PHRICTION_LINK = 'phriction.link';
|
||||
|
||||
public function getPriority() {
|
||||
return 175.0;
|
||||
}
|
||||
|
@ -48,37 +50,123 @@ final class PhrictionRemarkupRule extends PhutilRemarkupRule {
|
|||
}
|
||||
}
|
||||
|
||||
$name = trim(idx($matches, 2, $link));
|
||||
$name = trim(idx($matches, 2, ''));
|
||||
if (empty($matches[2])) {
|
||||
$name = explode('/', trim($name, '/'));
|
||||
$name = end($name);
|
||||
$name = null;
|
||||
}
|
||||
|
||||
$uri = new PhutilURI($link);
|
||||
$slug = $uri->getPath();
|
||||
$fragment = $uri->getFragment();
|
||||
$slug = PhabricatorSlug::normalize($slug);
|
||||
$slug = PhrictionDocument::getSlugURI($slug);
|
||||
$href = (string)id(new PhutilURI($slug))->setFragment($fragment);
|
||||
// Link is now used for slug detection, so append a slash if one
|
||||
// is needed.
|
||||
$link = rtrim($link, '/').'/';
|
||||
|
||||
$text_mode = $this->getEngine()->isTextMode();
|
||||
$mail_mode = $this->getEngine()->isHTMLMailMode();
|
||||
$engine = $this->getEngine();
|
||||
$token = $engine->storeText('x');
|
||||
$metadata = $engine->getTextMetadata(
|
||||
self::KEY_RULE_PHRICTION_LINK,
|
||||
array());
|
||||
$metadata[] = array(
|
||||
'token' => $token,
|
||||
'link' => $link,
|
||||
'explicitName' => $name,
|
||||
);
|
||||
$engine->setTextMetadata(self::KEY_RULE_PHRICTION_LINK, $metadata);
|
||||
|
||||
if ($this->getEngine()->getState('toc')) {
|
||||
$text = $name;
|
||||
} else if ($text_mode || $mail_mode) {
|
||||
return PhabricatorEnv::getProductionURI($href);
|
||||
} else {
|
||||
$text = $this->newTag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $href,
|
||||
'class' => 'phriction-link',
|
||||
),
|
||||
$name);
|
||||
return $token;
|
||||
}
|
||||
|
||||
public function didMarkupText() {
|
||||
$engine = $this->getEngine();
|
||||
$metadata = $engine->getTextMetadata(
|
||||
self::KEY_RULE_PHRICTION_LINK,
|
||||
array());
|
||||
|
||||
if (!$metadata) {
|
||||
return;
|
||||
}
|
||||
|
||||
return $this->getEngine()->storeText($text);
|
||||
$slugs = ipull($metadata, 'link');
|
||||
|
||||
// We have to make two queries here to distinguish between
|
||||
// documents the user can't see, and documents that don't
|
||||
// exist.
|
||||
$visible_documents = id(new PhrictionDocumentQuery())
|
||||
->setViewer($engine->getConfig('viewer'))
|
||||
->withSlugs($slugs)
|
||||
->needContent(true)
|
||||
->execute();
|
||||
$existant_documents = id(new PhrictionDocumentQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withSlugs($slugs)
|
||||
->execute();
|
||||
|
||||
$visible_documents = mpull($visible_documents, null, 'getSlug');
|
||||
$existant_documents = mpull($existant_documents, null, 'getSlug');
|
||||
|
||||
foreach ($metadata as $spec) {
|
||||
$link = $spec['link'];
|
||||
$name = $spec['explicitName'];
|
||||
$class = 'phriction-link';
|
||||
|
||||
if (idx($existant_documents, $link) === null) {
|
||||
// The target document doesn't exist.
|
||||
if ($name === null) {
|
||||
$name = explode('/', trim($link, '/'));
|
||||
$name = end($name);
|
||||
}
|
||||
$class = 'phriction-link-missing';
|
||||
} else if (idx($visible_documents, $link) === null) {
|
||||
// The document exists, but the user can't see it.
|
||||
if ($name === null) {
|
||||
$name = explode('/', trim($link, '/'));
|
||||
$name = end($name);
|
||||
}
|
||||
$class = 'phriction-link-lock';
|
||||
} else {
|
||||
if ($name === null) {
|
||||
// Use the title of the document if no name is set.
|
||||
$name = $visible_documents[$link]
|
||||
->getContent()
|
||||
->getTitle();
|
||||
}
|
||||
}
|
||||
|
||||
$uri = new PhutilURI($link);
|
||||
$slug = $uri->getPath();
|
||||
$fragment = $uri->getFragment();
|
||||
$slug = PhabricatorSlug::normalize($slug);
|
||||
$slug = PhrictionDocument::getSlugURI($slug);
|
||||
$href = (string)id(new PhutilURI($slug))->setFragment($fragment);
|
||||
|
||||
$text_mode = $this->getEngine()->isTextMode();
|
||||
$mail_mode = $this->getEngine()->isHTMLMailMode();
|
||||
|
||||
if ($this->getEngine()->getState('toc')) {
|
||||
$text = $name;
|
||||
} else if ($text_mode || $mail_mode) {
|
||||
return PhabricatorEnv::getProductionURI($href);
|
||||
} else {
|
||||
if ($class === 'phriction-link-lock') {
|
||||
$name = array(
|
||||
$this->newTag(
|
||||
'i',
|
||||
array(
|
||||
'class' => 'phui-icon-view phui-font-fa fa-lock',
|
||||
),
|
||||
''),
|
||||
' ',
|
||||
$name,
|
||||
);
|
||||
}
|
||||
$text = $this->newTag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $href,
|
||||
'class' => $class,
|
||||
),
|
||||
$name);
|
||||
$this->getEngine()->overwriteStoredText($spec['token'], $text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -36,3 +36,13 @@
|
|||
.phui-document-content .phriction-link {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.phui-document-content .phriction-link-missing {
|
||||
font-weight: bold;
|
||||
color: {$red};
|
||||
}
|
||||
|
||||
.phui-document-content .phriction-link-lock {
|
||||
font-weight: bold;
|
||||
color: {$greytext};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue