mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 16:52:41 +01:00
Improve feed stories with "style", and build basic status update stories.
Summary: Straightfoward iteration on feed. Test Plan: https://secure.phabricator.com/file/view/PHID-FILE-d07077119dc834e76618/ Reviewed By: codeblock Reviewers: jungejason, aran, tuomaspelkonen, codeblock CC: aran, codeblock, epriestley Differential Revision: 631
This commit is contained in:
parent
f8c541b819
commit
d665268074
14 changed files with 358 additions and 63 deletions
|
@ -293,6 +293,17 @@ celerity_register_resource_map(array(
|
|||
),
|
||||
'disk' => '/rsrc/js/javelin/lib/behavior.js',
|
||||
),
|
||||
0 =>
|
||||
array(
|
||||
'uri' => '/res/1da00bfe/rsrc/js/javelin/lib/__tests__/URI.js',
|
||||
'type' => 'js',
|
||||
'requires' =>
|
||||
array(
|
||||
0 => 'javelin-uri',
|
||||
1 => 'javelin-php-serializer',
|
||||
),
|
||||
'disk' => '/rsrc/js/javelin/lib/__tests__/URI.js',
|
||||
),
|
||||
'javelin-behavior-aphront-basic-tokenizer' =>
|
||||
array(
|
||||
'uri' => '/res/5e183bd5/rsrc/js/application/core/behavior-tokenizer.js',
|
||||
|
@ -476,17 +487,6 @@ celerity_register_resource_map(array(
|
|||
),
|
||||
'disk' => '/rsrc/js/application/differential/behavior-show-all-comments.js',
|
||||
),
|
||||
0 =>
|
||||
array(
|
||||
'uri' => '/res/1da00bfe/rsrc/js/javelin/lib/__tests__/URI.js',
|
||||
'type' => 'js',
|
||||
'requires' =>
|
||||
array(
|
||||
0 => 'javelin-uri',
|
||||
1 => 'javelin-php-serializer',
|
||||
),
|
||||
'disk' => '/rsrc/js/javelin/lib/__tests__/URI.js',
|
||||
),
|
||||
'javelin-behavior-differential-show-more' =>
|
||||
array(
|
||||
'uri' => '/res/a766c717/rsrc/js/application/differential/behavior-show-more.js',
|
||||
|
@ -1024,6 +1024,15 @@ celerity_register_resource_map(array(
|
|||
),
|
||||
'disk' => '/rsrc/js/application/core/DragAndDropFileUpload.js',
|
||||
),
|
||||
'phabricator-feed-css' =>
|
||||
array(
|
||||
'uri' => '/res/80952af2/rsrc/css/application/feed/feed.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
),
|
||||
'disk' => '/rsrc/css/application/feed/feed.css',
|
||||
),
|
||||
'phabricator-keyboard-shortcut' =>
|
||||
array(
|
||||
'uri' => '/res/beed38cd/rsrc/js/application/core/KeyboardShortcut.js',
|
||||
|
@ -1071,7 +1080,7 @@ celerity_register_resource_map(array(
|
|||
),
|
||||
'phabricator-remarkup-css' =>
|
||||
array(
|
||||
'uri' => '/res/a6acb5f0/rsrc/css/core/remarkup.css',
|
||||
'uri' => '/res/e0c44a00/rsrc/css/core/remarkup.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
|
@ -1101,7 +1110,7 @@ celerity_register_resource_map(array(
|
|||
),
|
||||
'phabricator-slowvote-css' =>
|
||||
array(
|
||||
'uri' => '/res/0a95e217/rsrc/css/application/slowvote/slowvote.css',
|
||||
'uri' => '/res/94d20443/rsrc/css/application/slowvote/slowvote.css',
|
||||
'type' => 'css',
|
||||
'requires' =>
|
||||
array(
|
||||
|
@ -1183,6 +1192,30 @@ celerity_register_resource_map(array(
|
|||
'uri' => '/res/pkg/307df223/javelin.pkg.js',
|
||||
'type' => 'js',
|
||||
),
|
||||
'8e9024dc' =>
|
||||
array (
|
||||
'name' => 'core.pkg.css',
|
||||
'symbols' =>
|
||||
array (
|
||||
0 => 'phabricator-core-css',
|
||||
1 => 'phabricator-core-buttons-css',
|
||||
2 => 'phabricator-standard-page-view',
|
||||
3 => 'aphront-dialog-view-css',
|
||||
4 => 'aphront-form-view-css',
|
||||
5 => 'aphront-panel-view-css',
|
||||
6 => 'aphront-side-nav-view-css',
|
||||
7 => 'aphront-table-view-css',
|
||||
8 => 'aphront-crumbs-view-css',
|
||||
9 => 'aphront-tokenizer-control-css',
|
||||
10 => 'aphront-typeahead-control-css',
|
||||
11 => 'aphront-list-filter-view-css',
|
||||
12 => 'phabricator-directory-css',
|
||||
13 => 'phabricator-remarkup-css',
|
||||
14 => 'syntax-highlighting-css',
|
||||
),
|
||||
'uri' => '/res/pkg/8e9024dc/core.pkg.css',
|
||||
'type' => 'css',
|
||||
),
|
||||
'95b66c1a' =>
|
||||
array (
|
||||
'name' => 'differential.pkg.css',
|
||||
|
@ -1230,42 +1263,18 @@ celerity_register_resource_map(array(
|
|||
'uri' => '/res/pkg/da416e1c/differential.pkg.js',
|
||||
'type' => 'js',
|
||||
),
|
||||
'fd3dc470' =>
|
||||
array (
|
||||
'name' => 'core.pkg.css',
|
||||
'symbols' =>
|
||||
array (
|
||||
0 => 'phabricator-core-css',
|
||||
1 => 'phabricator-core-buttons-css',
|
||||
2 => 'phabricator-standard-page-view',
|
||||
3 => 'aphront-dialog-view-css',
|
||||
4 => 'aphront-form-view-css',
|
||||
5 => 'aphront-panel-view-css',
|
||||
6 => 'aphront-side-nav-view-css',
|
||||
7 => 'aphront-table-view-css',
|
||||
8 => 'aphront-crumbs-view-css',
|
||||
9 => 'aphront-tokenizer-control-css',
|
||||
10 => 'aphront-typeahead-control-css',
|
||||
11 => 'aphront-list-filter-view-css',
|
||||
12 => 'phabricator-directory-css',
|
||||
13 => 'phabricator-remarkup-css',
|
||||
14 => 'syntax-highlighting-css',
|
||||
),
|
||||
'uri' => '/res/pkg/fd3dc470/core.pkg.css',
|
||||
'type' => 'css',
|
||||
),
|
||||
),
|
||||
'reverse' =>
|
||||
array (
|
||||
'aphront-crumbs-view-css' => 'fd3dc470',
|
||||
'aphront-dialog-view-css' => 'fd3dc470',
|
||||
'aphront-form-view-css' => 'fd3dc470',
|
||||
'aphront-list-filter-view-css' => 'fd3dc470',
|
||||
'aphront-panel-view-css' => 'fd3dc470',
|
||||
'aphront-side-nav-view-css' => 'fd3dc470',
|
||||
'aphront-table-view-css' => 'fd3dc470',
|
||||
'aphront-tokenizer-control-css' => 'fd3dc470',
|
||||
'aphront-typeahead-control-css' => 'fd3dc470',
|
||||
'aphront-crumbs-view-css' => '8e9024dc',
|
||||
'aphront-dialog-view-css' => '8e9024dc',
|
||||
'aphront-form-view-css' => '8e9024dc',
|
||||
'aphront-list-filter-view-css' => '8e9024dc',
|
||||
'aphront-panel-view-css' => '8e9024dc',
|
||||
'aphront-side-nav-view-css' => '8e9024dc',
|
||||
'aphront-table-view-css' => '8e9024dc',
|
||||
'aphront-tokenizer-control-css' => '8e9024dc',
|
||||
'aphront-typeahead-control-css' => '8e9024dc',
|
||||
'differential-changeset-view-css' => '95b66c1a',
|
||||
'differential-core-view-css' => '95b66c1a',
|
||||
'differential-revision-add-comment-css' => '95b66c1a',
|
||||
|
@ -1302,13 +1311,13 @@ celerity_register_resource_map(array(
|
|||
'javelin-util' => '307df223',
|
||||
'javelin-vector' => '307df223',
|
||||
'javelin-workflow' => 'd0713563',
|
||||
'phabricator-core-buttons-css' => 'fd3dc470',
|
||||
'phabricator-core-css' => 'fd3dc470',
|
||||
'phabricator-directory-css' => 'fd3dc470',
|
||||
'phabricator-core-buttons-css' => '8e9024dc',
|
||||
'phabricator-core-css' => '8e9024dc',
|
||||
'phabricator-directory-css' => '8e9024dc',
|
||||
'phabricator-keyboard-shortcut' => 'd0713563',
|
||||
'phabricator-keyboard-shortcut-manager' => 'd0713563',
|
||||
'phabricator-remarkup-css' => 'fd3dc470',
|
||||
'phabricator-standard-page-view' => 'fd3dc470',
|
||||
'syntax-highlighting-css' => 'fd3dc470',
|
||||
'phabricator-remarkup-css' => '8e9024dc',
|
||||
'phabricator-standard-page-view' => '8e9024dc',
|
||||
'syntax-highlighting-css' => '8e9024dc',
|
||||
),
|
||||
));
|
||||
|
|
|
@ -345,6 +345,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorFeedStoryData' => 'applications/feed/storage/story',
|
||||
'PhabricatorFeedStoryPublisher' => 'applications/feed/publisher',
|
||||
'PhabricatorFeedStoryReference' => 'applications/feed/storage/storyreference',
|
||||
'PhabricatorFeedStoryStatus' => 'applications/feed/story/status',
|
||||
'PhabricatorFeedStoryUnknown' => 'applications/feed/story/unknown',
|
||||
'PhabricatorFeedStoryView' => 'applications/feed/view/story',
|
||||
'PhabricatorFeedStreamController' => 'applications/feed/controller/stream',
|
||||
|
@ -426,7 +427,6 @@ phutil_register_library_map(array(
|
|||
'PhabricatorOwnersPackage' => 'applications/owners/storage/package',
|
||||
'PhabricatorOwnersPath' => 'applications/owners/storage/path',
|
||||
'PhabricatorPHID' => 'applications/phid/storage/phid',
|
||||
'PhabricatorPHIDAllocateController' => 'applications/phid/controller/allocate',
|
||||
'PhabricatorPHIDConstants' => 'applications/phid/constants',
|
||||
'PhabricatorPHIDController' => 'applications/phid/controller/base',
|
||||
'PhabricatorPHIDDAO' => 'applications/phid/storage/base',
|
||||
|
@ -858,6 +858,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorFeedDAO' => 'PhabricatorLiskDAO',
|
||||
'PhabricatorFeedStoryData' => 'PhabricatorFeedDAO',
|
||||
'PhabricatorFeedStoryReference' => 'PhabricatorFeedDAO',
|
||||
'PhabricatorFeedStoryStatus' => 'PhabricatorFeedStory',
|
||||
'PhabricatorFeedStoryUnknown' => 'PhabricatorFeedStory',
|
||||
'PhabricatorFeedStoryView' => 'PhabricatorFeedView',
|
||||
'PhabricatorFeedStreamController' => 'PhabricatorFeedController',
|
||||
|
@ -927,7 +928,6 @@ phutil_register_library_map(array(
|
|||
'PhabricatorOwnersPackage' => 'PhabricatorOwnersDAO',
|
||||
'PhabricatorOwnersPath' => 'PhabricatorOwnersDAO',
|
||||
'PhabricatorPHID' => 'PhabricatorPHIDDAO',
|
||||
'PhabricatorPHIDAllocateController' => 'PhabricatorPHIDController',
|
||||
'PhabricatorPHIDController' => 'PhabricatorController',
|
||||
'PhabricatorPHIDDAO' => 'PhabricatorLiskDAO',
|
||||
'PhabricatorPHIDListController' => 'PhabricatorPHIDController',
|
||||
|
|
|
@ -20,16 +20,73 @@ final class PhabricatorFeedStreamController extends PhabricatorFeedController {
|
|||
|
||||
public function processRequest() {
|
||||
|
||||
$request = $this->getRequest();
|
||||
$viewer = $request->getUser();
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
$story = id(new PhabricatorFeedStoryPublisher())
|
||||
->setRelatedPHIDs(array($viewer->getPHID()))
|
||||
->setStoryType('PhabricatorFeedStoryStatus')
|
||||
->setStoryTime(time())
|
||||
->setStoryAuthorPHID($viewer->getPHID())
|
||||
->setStoryData(
|
||||
array(
|
||||
'content' => $request->getStr('status')
|
||||
))
|
||||
->publish();
|
||||
|
||||
return id(new AphrontRedirectResponse())->setURI(
|
||||
$request->getRequestURI());
|
||||
}
|
||||
|
||||
$query = new PhabricatorFeedQuery();
|
||||
$stories = $query->execute();
|
||||
|
||||
$views = array();
|
||||
foreach ($stories as $story) {
|
||||
$views[] = $story->renderView();
|
||||
$handles = array();
|
||||
$objects = array();
|
||||
if ($stories) {
|
||||
$handle_phids = array_mergev(mpull($stories, 'getRequiredHandlePHIDs'));
|
||||
$object_phids = array_mergev(mpull($stories, 'getRequiredObjectPHIDs'));
|
||||
|
||||
$handles = id(new PhabricatorObjectHandleData($handle_phids))
|
||||
->loadHandles();
|
||||
|
||||
$objects = id(new PhabricatorObjectHandleData($object_phids))
|
||||
->loadObjects();
|
||||
}
|
||||
|
||||
$views = array();
|
||||
foreach ($stories as $story) {
|
||||
$story->setHandles($handles);
|
||||
$story->setObjects($objects);
|
||||
|
||||
$view = $story->renderView();
|
||||
$view->setViewer($viewer);
|
||||
|
||||
$views[] = $view->render();
|
||||
}
|
||||
|
||||
$post_form = id(new AphrontFormView())
|
||||
->setUser($viewer)
|
||||
->appendChild(
|
||||
id(new AphrontFormTextAreaControl())
|
||||
->setLabel('Pithy Wit')
|
||||
->setName('status'))
|
||||
->appendChild(
|
||||
id(new AphrontFormSubmitControl())
|
||||
->setValue('Publish'));
|
||||
|
||||
$post = new AphrontPanelView();
|
||||
$post->setWidth(AphrontPanelView::WIDTH_FORM);
|
||||
$post->setHeader('High Horse Soapbox');
|
||||
$post->appendChild($post_form);
|
||||
|
||||
$page = array();
|
||||
$page[] = $post;
|
||||
$page[] = $views;
|
||||
|
||||
return $this->buildStandardPageResponse(
|
||||
$views,
|
||||
$page,
|
||||
array(
|
||||
'title' => 'Feed',
|
||||
));
|
||||
|
|
|
@ -6,8 +6,17 @@
|
|||
|
||||
|
||||
|
||||
phutil_require_module('phabricator', 'aphront/response/redirect');
|
||||
phutil_require_module('phabricator', 'applications/feed/controller/base');
|
||||
phutil_require_module('phabricator', 'applications/feed/publisher');
|
||||
phutil_require_module('phabricator', 'applications/feed/query');
|
||||
phutil_require_module('phabricator', 'applications/phid/handle/data');
|
||||
phutil_require_module('phabricator', 'view/form/base');
|
||||
phutil_require_module('phabricator', 'view/form/control/submit');
|
||||
phutil_require_module('phabricator', 'view/form/control/textarea');
|
||||
phutil_require_module('phabricator', 'view/layout/panel');
|
||||
|
||||
phutil_require_module('phutil', 'utils');
|
||||
|
||||
|
||||
phutil_require_source('PhabricatorFeedStreamController.php');
|
||||
|
|
|
@ -39,4 +39,12 @@ class PhabricatorFeedStoryData extends PhabricatorFeedDAO {
|
|||
PhabricatorPHIDConstants::PHID_TYPE_STRY);
|
||||
}
|
||||
|
||||
public function getEpoch() {
|
||||
return $this->chronologicalKey >> 32;
|
||||
}
|
||||
|
||||
public function getValue($key, $default = null) {
|
||||
return idx($this->storyData, $key, $default);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -10,5 +10,7 @@ phutil_require_module('phabricator', 'applications/feed/storage/base');
|
|||
phutil_require_module('phabricator', 'applications/phid/constants');
|
||||
phutil_require_module('phabricator', 'applications/phid/storage/phid');
|
||||
|
||||
phutil_require_module('phutil', 'utils');
|
||||
|
||||
|
||||
phutil_require_source('PhabricatorFeedStoryData.php');
|
||||
|
|
|
@ -20,10 +20,43 @@ abstract class PhabricatorFeedStory {
|
|||
|
||||
private $data;
|
||||
|
||||
private $handles;
|
||||
private $objects;
|
||||
|
||||
final public function __construct(PhabricatorFeedStoryData $data) {
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
abstract public function renderView();
|
||||
|
||||
public function getRequiredHandlePHIDs() {
|
||||
return array();
|
||||
}
|
||||
|
||||
public function getRequiredObjectPHIDs() {
|
||||
return array();
|
||||
}
|
||||
|
||||
final public function setHandles(array $handles) {
|
||||
$this->handles = $handles;
|
||||
return $this;
|
||||
}
|
||||
|
||||
final public function setObjects(array $objects) {
|
||||
$this->objects = $objects;
|
||||
return $this;
|
||||
}
|
||||
|
||||
final protected function getHandles() {
|
||||
return $this->handles;
|
||||
}
|
||||
|
||||
final protected function getObjects() {
|
||||
return $this->objects;
|
||||
}
|
||||
|
||||
final protected function getStoryData() {
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2011 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
class PhabricatorFeedStoryStatus extends PhabricatorFeedStory {
|
||||
|
||||
public function getRequiredHandlePHIDs() {
|
||||
return array(
|
||||
$this->getStoryData()->getAuthorPHID(),
|
||||
);
|
||||
}
|
||||
|
||||
public function getRequiredObjectPHIDs() {
|
||||
return array(
|
||||
$this->getStoryData()->getAuthorPHID(),
|
||||
);
|
||||
}
|
||||
|
||||
public function renderView() {
|
||||
$data = $this->getStoryData();
|
||||
|
||||
$handles = $this->getHandles();
|
||||
$author_phid = $data->getAuthorPHID();
|
||||
|
||||
$objects = $this->getObjects();
|
||||
|
||||
$view = new PhabricatorFeedStoryView();
|
||||
|
||||
$view->setTitle(
|
||||
'<strong>'.$handles[$author_phid]->renderLink().'</strong>');
|
||||
$view->setEpoch($data->getEpoch());
|
||||
|
||||
if (!empty($objects[$author_phid])) {
|
||||
$image_phid = $objects[$author_phid]->getProfileImagePHID();
|
||||
$image_uri = PhabricatorFileURI::getViewURIForPHID($image_phid);
|
||||
$view->setImage($image_uri);
|
||||
}
|
||||
|
||||
$content = phutil_escape_html($data->getValue('content'));
|
||||
$content = str_replace("\n", '<br />', $content);
|
||||
|
||||
$view->appendChild($content);
|
||||
|
||||
|
||||
return $view;
|
||||
}
|
||||
|
||||
}
|
16
src/applications/feed/story/status/__init__.php
Normal file
16
src/applications/feed/story/status/__init__.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is automatically generated. Lint this module to rebuild it.
|
||||
* @generated
|
||||
*/
|
||||
|
||||
|
||||
|
||||
phutil_require_module('phabricator', 'applications/feed/story/base');
|
||||
phutil_require_module('phabricator', 'applications/feed/view/story');
|
||||
phutil_require_module('phabricator', 'applications/files/uri');
|
||||
|
||||
phutil_require_module('phutil', 'markup');
|
||||
|
||||
|
||||
phutil_require_source('PhabricatorFeedStoryStatus.php');
|
|
@ -19,7 +19,19 @@
|
|||
class PhabricatorFeedStoryUnknown extends PhabricatorFeedStory {
|
||||
|
||||
public function renderView() {
|
||||
return new PhabricatorFeedStoryView();
|
||||
$data = $this->getStoryData();
|
||||
|
||||
$view = new PhabricatorFeedStoryView();
|
||||
|
||||
$view->setTitle('Unknown Story');
|
||||
$view->setEpoch($data->getEpoch());
|
||||
|
||||
$view->appendChild(
|
||||
'This is an unrenderable feed story of type '.
|
||||
'"'.phutil_escape_html($data->getStoryType()).'".');
|
||||
|
||||
|
||||
return $view;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,5 +9,7 @@
|
|||
phutil_require_module('phabricator', 'applications/feed/story/base');
|
||||
phutil_require_module('phabricator', 'applications/feed/view/story');
|
||||
|
||||
phutil_require_module('phutil', 'markup');
|
||||
|
||||
|
||||
phutil_require_source('PhabricatorFeedStoryUnknown.php');
|
||||
|
|
|
@ -18,15 +18,75 @@
|
|||
|
||||
class PhabricatorFeedStoryView extends PhabricatorFeedView {
|
||||
|
||||
private $title;
|
||||
private $image;
|
||||
private $phid;
|
||||
private $epoch;
|
||||
private $viewer;
|
||||
|
||||
public function setViewer(PhabricatorUser $viewer) {
|
||||
$this->viewer = $viewer;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setEpoch($epoch) {
|
||||
$this->epoch = $epoch;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setImage($image) {
|
||||
$this->image = $image;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function render() {
|
||||
|
||||
$head = phutil_render_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'phabricator-feed-story-head',
|
||||
),
|
||||
nonempty($this->title, 'Untitled Story'));
|
||||
|
||||
$body = phutil_render_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'phabricator-feed-story-body',
|
||||
),
|
||||
$this->renderChildren());
|
||||
|
||||
if ($this->epoch) {
|
||||
$foot = phabricator_datetime($this->epoch, $this->viewer);
|
||||
} else {
|
||||
$foot = '';
|
||||
}
|
||||
|
||||
$foot = phutil_render_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'phabricator-feed-story-foot',
|
||||
),
|
||||
$foot);
|
||||
|
||||
$image_style = null;
|
||||
if ($this->image) {
|
||||
$image_style = 'background-image: url('.$this->image.')';
|
||||
}
|
||||
|
||||
require_celerity_resource('phabricator-feed-css');
|
||||
|
||||
return phutil_render_tag(
|
||||
'div',
|
||||
array(
|
||||
'style' => 'border: 1px dashed black; '.
|
||||
'padding: 1em; margin: 1em; '.
|
||||
'background: #ffeedd;',
|
||||
'class' => 'phabricator-feed-story',
|
||||
'style' => $image_style,
|
||||
),
|
||||
'This is a feed story!');
|
||||
$head.$body.$foot);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,8 +7,11 @@
|
|||
|
||||
|
||||
phutil_require_module('phabricator', 'applications/feed/view/base');
|
||||
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
||||
phutil_require_module('phabricator', 'view/utils');
|
||||
|
||||
phutil_require_module('phutil', 'markup');
|
||||
phutil_require_module('phutil', 'utils');
|
||||
|
||||
|
||||
phutil_require_source('PhabricatorFeedStoryView.php');
|
||||
|
|
22
webroot/rsrc/css/application/feed/feed.css
Normal file
22
webroot/rsrc/css/application/feed/feed.css
Normal file
|
@ -0,0 +1,22 @@
|
|||
/**
|
||||
* @provides phabricator-feed-css
|
||||
*/
|
||||
|
||||
.phabricator-feed-story {
|
||||
padding-left: 64px;
|
||||
margin: .5em 0 1em;
|
||||
background: 5px 2px no-repeat;
|
||||
}
|
||||
|
||||
.phabricator-feed-story-head {
|
||||
}
|
||||
|
||||
.phabricator-feed-story-body {
|
||||
padding: .5em 0;
|
||||
color: #444444;
|
||||
}
|
||||
|
||||
.phabricator-feed-story-foot {
|
||||
color: #888888;
|
||||
font-size: 11px;
|
||||
}
|
Loading…
Reference in a new issue