diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index f3f406e8d5..9f83c2042e 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -1,195 +1,197 @@ array( 'path' => '/res/771b987d/rsrc/css/aphront/dialog-view.css', 'type' => 'css', 'requires' => array( ), ), 'aphront-form-view-css' => array( 'path' => '/res/17285e65/rsrc/css/aphront/form-view.css', 'type' => 'css', 'requires' => array( ), ), 'aphront-panel-view-css' => array( 'path' => '/res/d1ce0c3d/rsrc/css/aphront/panel-view.css', 'type' => 'css', 'requires' => array( ), ), 'aphront-side-nav-view-css' => array( 'path' => '/res/1a16f19a/rsrc/css/aphront/side-nav-view.css', 'type' => 'css', 'requires' => array( ), ), 'aphront-table-view-css' => array( 'path' => '/res/52b0191f/rsrc/css/aphront/table-view.css', 'type' => 'css', 'requires' => array( ), ), 'aphront-tokenizer-control-css' => array( 'path' => '/res/a3d23074/rsrc/css/aphront/tokenizer.css', 'type' => 'css', 'requires' => array( 0 => 'aphront-typeahead-control-css', ), ), 'aphront-typeahead-control-css' => array( 'path' => '/res/928df9f0/rsrc/css/aphront/typeahead.css', 'type' => 'css', 'requires' => array( ), ), 'phabricator-standard-page-view' => array( 'path' => '/res/0eef6905/rsrc/css/application/base/standard-page-view.css', 'type' => 'css', 'requires' => array( ), ), 'differential-changeset-view-css' => array( 'path' => '/res/921d3a0c/rsrc/css/application/differential/changeset-view.css', 'type' => 'css', 'requires' => array( ), ), 'differential-core-view-css' => array( 'path' => '/res/f750b85d/rsrc/css/application/differential/core.css', 'type' => 'css', 'requires' => array( ), ), 'differential-table-of-contents-css' => array( 'path' => '/res/ebf6641c/rsrc/css/application/differential/table-of-contents.css', 'type' => 'css', 'requires' => array( ), ), 'phabricator-directory-css' => array( 'path' => '/res/6a000601/rsrc/css/application/directory/phabricator-directory.css', 'type' => 'css', 'requires' => array( ), ), 'phabricator-core-buttons-css' => array( 'path' => '/res/6e348ba4/rsrc/css/core/buttons.css', 'type' => 'css', 'requires' => array( ), ), 'phabricator-core-css' => array( 'path' => '/res/39ce37c2/rsrc/css/core/core.css', 'type' => 'css', 'requires' => array( ), ), 'syntax-highlighting-css' => array( 'path' => '/res/fb673ece/rsrc/css/core/syntax.css', 'type' => 'css', 'requires' => array( ), ), 'javelin-behavior-aphront-basic-tokenizer' => array( - 'path' => '/res/12de8502/rsrc/js/application/core/behavior-tokenizer.js', + 'path' => '/res/8317d761/rsrc/js/application/core/behavior-tokenizer.js', 'type' => 'js', 'requires' => array( + 0 => 'javelin-lib-dev', ), ), 'javelin-behavior-differential-populate' => array( - 'path' => '/res/b419291a/rsrc/js/application/differential/behavior-populate.js', + 'path' => '/res/9982573c/rsrc/js/application/differential/behavior-populate.js', 'type' => 'js', 'requires' => array( + 0 => 'javelin-lib-dev', ), ), 'javelin-init-dev' => array( 'path' => '/res/c57a9e89/rsrc/js/javelin/init.dev.js', 'type' => 'js', 'requires' => array( ), ), 'javelin-init-prod' => array( 'path' => '/res/f0172c54/rsrc/js/javelin/init.min.js', 'type' => 'js', 'requires' => array( ), ), 'javelin-lib-dev' => array( 'path' => '/res/3e747182/rsrc/js/javelin/javelin.dev.js', 'type' => 'js', 'requires' => array( ), ), 'javelin-lib-prod' => array( 'path' => '/res/9438670e/rsrc/js/javelin/javelin.min.js', 'type' => 'js', 'requires' => array( ), ), 'javelin-typeahead-dev' => array( 'path' => '/res/c81c0f01/rsrc/js/javelin/typeahead.dev.js', 'type' => 'js', 'requires' => array( ), ), 'javelin-typeahead-prod' => array( - 'path' => '/res/871c9b0f/rsrc/js/javelin/typeahead.min.js', + 'path' => '/res/1da2d984/rsrc/js/javelin/typeahead.min.js', 'type' => 'js', 'requires' => array( ), ), )); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 1d3f88e9d0..f3dc42394c 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1,248 +1,250 @@ array( 'Aphront404Response' => 'aphront/response/404', 'AphrontAjaxResponse' => 'aphront/response/ajax', 'AphrontApplicationConfiguration' => 'aphront/applicationconfiguration', 'AphrontController' => 'aphront/controller', 'AphrontDatabaseConnection' => 'storage/connection/base', 'AphrontDefaultApplicationConfiguration' => 'aphront/default/configuration', 'AphrontDefaultApplicationController' => 'aphront/default/controller', 'AphrontDialogResponse' => 'aphront/response/dialog', 'AphrontDialogView' => 'view/dialog', 'AphrontErrorView' => 'view/form/error', 'AphrontFileResponse' => 'aphront/response/file', 'AphrontFormControl' => 'view/form/control/base', 'AphrontFormFileControl' => 'view/form/control/file', 'AphrontFormMarkupControl' => 'view/form/control/markup', 'AphrontFormSelectControl' => 'view/form/control/select', 'AphrontFormStaticControl' => 'view/form/control/static', 'AphrontFormSubmitControl' => 'view/form/control/submit', 'AphrontFormTextAreaControl' => 'view/form/control/textarea', 'AphrontFormTextControl' => 'view/form/control/text', 'AphrontFormTokenizerControl' => 'view/form/control/tokenizer', 'AphrontFormView' => 'view/form/base', 'AphrontMySQLDatabaseConnection' => 'storage/connection/mysql', 'AphrontNullView' => 'view/null', 'AphrontPageView' => 'view/page/base', 'AphrontPanelView' => 'view/layout/panel', 'AphrontQueryConnectionException' => 'storage/exception/connection', 'AphrontQueryConnectionLostException' => 'storage/exception/connectionlost', 'AphrontQueryCountException' => 'storage/exception/count', 'AphrontQueryException' => 'storage/exception/base', 'AphrontQueryObjectMissingException' => 'storage/exception/objectmissing', 'AphrontQueryParameterException' => 'storage/exception/parameter', 'AphrontQueryRecoverableException' => 'storage/exception/recoverable', 'AphrontRedirectResponse' => 'aphront/response/redirect', 'AphrontRequest' => 'aphront/request', 'AphrontResponse' => 'aphront/response/base', 'AphrontSideNavView' => 'view/layout/sidenav', 'AphrontTableView' => 'view/control/table', 'AphrontURIMapper' => 'aphront/mapper', 'AphrontView' => 'view/base', 'AphrontWebpageResponse' => 'aphront/response/webpage', 'CelerityAPI' => 'infratructure/celerity/api', 'CelerityResourceController' => 'infratructure/celerity/controller', 'CelerityResourceMap' => 'infratructure/celerity/map', 'CelerityStaticResourceResponse' => 'infratructure/celerity/response', 'ConduitAPIMethod' => 'applications/conduit/method/base', 'ConduitAPIRequest' => 'applications/conduit/protocol/request', 'ConduitAPI_conduit_connect_Method' => 'applications/conduit/method/conduit/connect', 'ConduitAPI_differential_creatediff_Method' => 'applications/conduit/method/differential/creatediff', 'ConduitAPI_differential_setdiffproperty_Method' => 'applications/conduit/method/differential/setdiffproperty', 'ConduitAPI_file_upload_Method' => 'applications/conduit/method/file/upload', 'ConduitAPI_user_find_Method' => 'applications/conduit/method/user/find', 'ConduitException' => 'applications/conduit/protocol/exception', 'DifferentialAction' => 'applications/differential/constants/action', 'DifferentialChangeType' => 'applications/differential/constants/changetype', 'DifferentialChangeset' => 'applications/differential/storage/changeset', 'DifferentialChangesetDetailView' => 'applications/differential/view/changesetdetailview', 'DifferentialChangesetListView' => 'applications/differential/view/changesetlistview', 'DifferentialChangesetParser' => 'applications/differential/parser/changeset', 'DifferentialChangesetViewController' => 'applications/differential/controller/changesetview', 'DifferentialController' => 'applications/differential/controller/base', 'DifferentialDAO' => 'applications/differential/storage/base', 'DifferentialDiff' => 'applications/differential/storage/diff', 'DifferentialDiffProperty' => 'applications/differential/storage/diffproperty', 'DifferentialDiffTableOfContentsView' => 'applications/differential/view/difftableofcontents', 'DifferentialDiffViewController' => 'applications/differential/controller/diffview', 'DifferentialHunk' => 'applications/differential/storage/hunk', 'DifferentialLintStatus' => 'applications/differential/constants/lintstatus', 'DifferentialRevision' => 'applications/differential/storage/revision', 'DifferentialRevisionControlSystem' => 'applications/differential/constants/revisioncontrolsystem', 'DifferentialRevisionEditController' => 'applications/differential/controller/revisionedit', + 'DifferentialRevisionListController' => 'applications/differential/controller/revisionlist', 'DifferentialRevisionStatus' => 'applications/differential/constants/revisionstatus', 'DifferentialUnitStatus' => 'applications/differential/constants/unitstatus', 'Javelin' => 'infratructure/javelin/api', 'LiskDAO' => 'storage/lisk/dao', 'PhabricatorConduitAPIController' => 'applications/conduit/controller/api', 'PhabricatorConduitConnectionLog' => 'applications/conduit/storage/connectionlog', 'PhabricatorConduitConsoleController' => 'applications/conduit/controller/console', 'PhabricatorConduitController' => 'applications/conduit/controller/base', 'PhabricatorConduitDAO' => 'applications/conduit/storage/base', 'PhabricatorConduitLogController' => 'applications/conduit/controller/log', 'PhabricatorConduitMethodCallLog' => 'applications/conduit/storage/methodcalllog', 'PhabricatorController' => 'applications/base/controller/base', 'PhabricatorDirectoryCategory' => 'applications/directory/storage/category', 'PhabricatorDirectoryCategoryDeleteController' => 'applications/directory/controller/categorydelete', 'PhabricatorDirectoryCategoryEditController' => 'applications/directory/controller/categoryedit', 'PhabricatorDirectoryCategoryListController' => 'applications/directory/controller/categorylist', 'PhabricatorDirectoryController' => 'applications/directory/controller/base', 'PhabricatorDirectoryDAO' => 'applications/directory/storage/base', 'PhabricatorDirectoryItem' => 'applications/directory/storage/item', 'PhabricatorDirectoryItemDeleteController' => 'applications/directory/controller/itemdelete', 'PhabricatorDirectoryItemEditController' => 'applications/directory/controller/itemedit', 'PhabricatorDirectoryItemListController' => 'applications/directory/controller/itemlist', 'PhabricatorDirectoryMainController' => 'applications/directory/controller/main', 'PhabricatorFile' => 'applications/files/storage/file', 'PhabricatorFileController' => 'applications/files/controller/base', 'PhabricatorFileDAO' => 'applications/files/storage/base', 'PhabricatorFileListController' => 'applications/files/controller/list', 'PhabricatorFileStorageBlob' => 'applications/files/storage/storageblob', 'PhabricatorFileURI' => 'applications/files/uri', 'PhabricatorFileUploadController' => 'applications/files/controller/upload', 'PhabricatorFileViewController' => 'applications/files/controller/view', 'PhabricatorLiskDAO' => 'applications/base/storage/lisk', 'PhabricatorPHID' => 'applications/phid/storage/phid', 'PhabricatorPHIDAllocateController' => 'applications/phid/controller/allocate', 'PhabricatorPHIDController' => 'applications/phid/controller/base', 'PhabricatorPHIDDAO' => 'applications/phid/storage/base', 'PhabricatorPHIDListController' => 'applications/phid/controller/list', 'PhabricatorPHIDType' => 'applications/phid/storage/type', 'PhabricatorPHIDTypeEditController' => 'applications/phid/controller/typeedit', 'PhabricatorPHIDTypeListController' => 'applications/phid/controller/typelist', 'PhabricatorPeopleController' => 'applications/people/controller/base', 'PhabricatorPeopleEditController' => 'applications/people/controller/edit', 'PhabricatorPeopleListController' => 'applications/people/controller/list', 'PhabricatorPeopleProfileController' => 'applications/people/controller/profile', 'PhabricatorStandardPageView' => 'view/page/standard', 'PhabricatorTypeaheadCommonDatasourceController' => 'applications/typeahead/controller/common', 'PhabricatorTypeaheadDatasourceController' => 'applications/typeahead/controller/base', 'PhabricatorUser' => 'applications/people/storage/user', 'PhabricatorUserDAO' => 'applications/people/storage/base', ), 'function' => array( '_qsprintf_check_scalar_type' => 'storage/qsprintf', '_qsprintf_check_type' => 'storage/qsprintf', 'celerity_generate_unique_node_id' => 'infratructure/celerity/api', 'celerity_register_resource_map' => 'infratructure/celerity/map', 'javelin_render_tag' => 'infratructure/javelin/markup', 'qsprintf' => 'storage/qsprintf', 'queryfx' => 'storage/queryfx', 'queryfx_all' => 'storage/queryfx', 'queryfx_one' => 'storage/queryfx', 'require_celerity_resource' => 'infratructure/celerity/api', 'vqsprintf' => 'storage/qsprintf', 'vqueryfx' => 'storage/queryfx', 'xsprintf_query' => 'storage/qsprintf', ), 'requires_class' => array( 'Aphront404Response' => 'AphrontResponse', 'AphrontAjaxResponse' => 'AphrontResponse', 'AphrontDefaultApplicationConfiguration' => 'AphrontApplicationConfiguration', 'AphrontDefaultApplicationController' => 'AphrontController', 'AphrontDialogResponse' => 'AphrontResponse', 'AphrontDialogView' => 'AphrontView', 'AphrontErrorView' => 'AphrontView', 'AphrontFileResponse' => 'AphrontResponse', 'AphrontFormControl' => 'AphrontView', 'AphrontFormFileControl' => 'AphrontFormControl', 'AphrontFormMarkupControl' => 'AphrontFormControl', 'AphrontFormSelectControl' => 'AphrontFormControl', 'AphrontFormStaticControl' => 'AphrontFormControl', 'AphrontFormSubmitControl' => 'AphrontFormControl', 'AphrontFormTextAreaControl' => 'AphrontFormControl', 'AphrontFormTextControl' => 'AphrontFormControl', 'AphrontFormTokenizerControl' => 'AphrontFormControl', 'AphrontFormView' => 'AphrontView', 'AphrontMySQLDatabaseConnection' => 'AphrontDatabaseConnection', 'AphrontNullView' => 'AphrontView', 'AphrontPageView' => 'AphrontView', 'AphrontPanelView' => 'AphrontView', 'AphrontQueryConnectionException' => 'AphrontQueryException', 'AphrontQueryConnectionLostException' => 'AphrontQueryRecoverableException', 'AphrontQueryCountException' => 'AphrontQueryException', 'AphrontQueryObjectMissingException' => 'AphrontQueryException', 'AphrontQueryParameterException' => 'AphrontQueryException', 'AphrontQueryRecoverableException' => 'AphrontQueryException', 'AphrontRedirectResponse' => 'AphrontResponse', 'AphrontSideNavView' => 'AphrontView', 'AphrontTableView' => 'AphrontView', 'AphrontWebpageResponse' => 'AphrontResponse', 'CelerityResourceController' => 'AphrontController', 'ConduitAPI_conduit_connect_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_creatediff_Method' => 'ConduitAPIMethod', 'ConduitAPI_differential_setdiffproperty_Method' => 'ConduitAPIMethod', 'ConduitAPI_file_upload_Method' => 'ConduitAPIMethod', 'ConduitAPI_user_find_Method' => 'ConduitAPIMethod', 'DifferentialChangeset' => 'DifferentialDAO', 'DifferentialChangesetDetailView' => 'AphrontView', 'DifferentialChangesetListView' => 'AphrontView', 'DifferentialChangesetViewController' => 'DifferentialController', 'DifferentialController' => 'PhabricatorController', 'DifferentialDAO' => 'PhabricatorLiskDAO', 'DifferentialDiff' => 'DifferentialDAO', 'DifferentialDiffProperty' => 'DifferentialDAO', 'DifferentialDiffTableOfContentsView' => 'AphrontView', 'DifferentialDiffViewController' => 'DifferentialController', 'DifferentialHunk' => 'DifferentialDAO', 'DifferentialRevision' => 'DifferentialDAO', 'DifferentialRevisionEditController' => 'DifferentialController', + 'DifferentialRevisionListController' => 'DifferentialController', 'PhabricatorConduitAPIController' => 'PhabricatorConduitController', 'PhabricatorConduitConnectionLog' => 'PhabricatorConduitDAO', 'PhabricatorConduitConsoleController' => 'PhabricatorConduitController', 'PhabricatorConduitController' => 'PhabricatorController', 'PhabricatorConduitDAO' => 'PhabricatorLiskDAO', 'PhabricatorConduitLogController' => 'PhabricatorConduitController', 'PhabricatorConduitMethodCallLog' => 'PhabricatorConduitDAO', 'PhabricatorController' => 'AphrontController', 'PhabricatorDirectoryCategory' => 'PhabricatorDirectoryDAO', 'PhabricatorDirectoryCategoryDeleteController' => 'PhabricatorDirectoryController', 'PhabricatorDirectoryCategoryEditController' => 'PhabricatorDirectoryController', 'PhabricatorDirectoryCategoryListController' => 'PhabricatorDirectoryController', 'PhabricatorDirectoryController' => 'PhabricatorController', 'PhabricatorDirectoryDAO' => 'PhabricatorLiskDAO', 'PhabricatorDirectoryItem' => 'PhabricatorDirectoryDAO', 'PhabricatorDirectoryItemDeleteController' => 'PhabricatorDirectoryController', 'PhabricatorDirectoryItemEditController' => 'PhabricatorDirectoryController', 'PhabricatorDirectoryItemListController' => 'PhabricatorDirectoryController', 'PhabricatorDirectoryMainController' => 'PhabricatorDirectoryController', 'PhabricatorFile' => 'PhabricatorFileDAO', 'PhabricatorFileController' => 'PhabricatorController', 'PhabricatorFileDAO' => 'PhabricatorLiskDAO', 'PhabricatorFileListController' => 'PhabricatorFileController', 'PhabricatorFileStorageBlob' => 'PhabricatorFileDAO', 'PhabricatorFileUploadController' => 'PhabricatorFileController', 'PhabricatorFileViewController' => 'PhabricatorFileController', 'PhabricatorLiskDAO' => 'LiskDAO', 'PhabricatorPHID' => 'PhabricatorPHIDDAO', 'PhabricatorPHIDAllocateController' => 'PhabricatorPHIDController', 'PhabricatorPHIDController' => 'PhabricatorController', 'PhabricatorPHIDDAO' => 'PhabricatorLiskDAO', 'PhabricatorPHIDListController' => 'PhabricatorPHIDController', 'PhabricatorPHIDType' => 'PhabricatorPHIDDAO', 'PhabricatorPHIDTypeEditController' => 'PhabricatorPHIDController', 'PhabricatorPHIDTypeListController' => 'PhabricatorPHIDController', 'PhabricatorPeopleController' => 'PhabricatorController', 'PhabricatorPeopleEditController' => 'PhabricatorPeopleController', 'PhabricatorPeopleListController' => 'PhabricatorPeopleController', 'PhabricatorPeopleProfileController' => 'PhabricatorPeopleController', 'PhabricatorStandardPageView' => 'AphrontPageView', 'PhabricatorTypeaheadCommonDatasourceController' => 'PhabricatorTypeaheadDatasourceController', 'PhabricatorTypeaheadDatasourceController' => 'PhabricatorController', 'PhabricatorUser' => 'PhabricatorUserDAO', 'PhabricatorUserDAO' => 'PhabricatorLiskDAO', ), 'requires_interface' => array( ), )); diff --git a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php index bab44a6b2e..900a8b320c 100644 --- a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php +++ b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php @@ -1,143 +1,144 @@ array( '$' => 'RepositoryListController', 'new/$' => 'RepositoryEditController', 'edit/(?\d+)/$' => 'RepositoryEditController', 'delete/(?\d+)/$' => 'RepositoryDeleteController', ), '/' => array( '$' => 'PhabricatorDirectoryMainController', ), '/directory/' => array( 'item/$' => 'PhabricatorDirectoryItemListController', 'item/edit/(?:(?\d+)/)?$' => 'PhabricatorDirectoryItemEditController', 'item/delete/(?\d+)/' => 'PhabricatorDirectoryItemDeleteController', 'category/$' => 'PhabricatorDirectoryCategoryListController', 'category/edit/(?:(?\d+)/)?$' => 'PhabricatorDirectoryCategoryEditController', 'category/delete/(?\d+)/' => 'PhabricatorDirectoryCategoryDeleteController', ), '/file/' => array( '$' => 'PhabricatorFileListController', 'upload/$' => 'PhabricatorFileUploadController', '(?info)/(?[^/]+)/' => 'PhabricatorFileViewController', '(?view)/(?[^/]+)/' => 'PhabricatorFileViewController', '(?download)/(?[^/]+)/' => 'PhabricatorFileViewController', ), '/phid/' => array( '$' => 'PhabricatorPHIDListController', 'type/$' => 'PhabricatorPHIDTypeListController', 'type/edit/(?:(?\d+)/)?$' => 'PhabricatorPHIDTypeEditController', 'new/$' => 'PhabricatorPHIDAllocateController', ), '/people/' => array( '$' => 'PhabricatorPeopleListController', 'edit/(?:(?\w+)/)?$' => 'PhabricatorPeopleEditController', ), '/p/(?\w+)/$' => 'PhabricatorPeopleProfileController', '/conduit/' => array( '$' => 'PhabricatorConduitConsoleController', 'method/(?[^/]+)$' => 'PhabricatorConduitConsoleController', 'log/$' => 'PhabricatorConduitLogController', ), '/api/(?[^/]+)$' => 'PhabricatorConduitAPIController', '/differential/' => array( + '$' => 'DifferentialRevisionListController', 'diff/(?\d+)/$' => 'DifferentialDiffViewController', 'changeset/(?\d+)/$' => 'DifferentialChangesetViewController', 'revision/edit/(?:(?\d+)/)?$' => 'DifferentialRevisionEditController', ), '/res/' => array( '(?[a-f0-9]{8})/(?.+\.(?:css|js))$' => 'CelerityResourceController', ), '/typeahead/' => array( 'common/(?\w+)/$' => 'PhabricatorTypeaheadCommonDatasourceController', ), ); } public function buildRequest() { $request = new AphrontRequest($this->getHost(), $this->getPath()); $request->setRequestData($_GET + $_POST); return $request; } public function handleException(Exception $ex) { $class = phutil_escape_html(get_class($ex)); $message = phutil_escape_html($ex->getMessage()); $content = '
'. '

Unhandled Exception "'.$class.'": '.$message.'

'. ''.phutil_escape_html((string)$ex).''. '
'; $view = new PhabricatorStandardPageView(); $view->appendChild($content); $response = new AphrontWebpageResponse(); $response->setContent($view->render()); return $response; } public function willSendResponse(AphrontResponse $response) { $request = $this->getRequest(); if ($response instanceof AphrontDialogResponse) { if (!$request->isAjax()) { $view = new PhabricatorStandardPageView(); $view->appendChild( '
'. $response->buildResponseString(). '
'); $response = new AphrontWebpageResponse(); $response->setContent($view->render()); return $response; } } return $response; } } diff --git a/src/applications/differential/controller/base/DifferentialController.php b/src/applications/differential/controller/base/DifferentialController.php index f896b73487..2db79be80f 100644 --- a/src/applications/differential/controller/base/DifferentialController.php +++ b/src/applications/differential/controller/base/DifferentialController.php @@ -1,34 +1,37 @@ setApplicationName('Differential'); $page->setBaseURI('/differential/'); $page->setTitle(idx($data, 'title')); $page->setGlyph("\xE2\x9A\x99"); $page->appendChild($view); $response = new AphrontWebpageResponse(); return $response->setContent($page->render()); } } diff --git a/src/applications/differential/controller/base/__init__.php b/src/applications/differential/controller/base/__init__.php index e554a20267..e2a4f7a73b 100644 --- a/src/applications/differential/controller/base/__init__.php +++ b/src/applications/differential/controller/base/__init__.php @@ -1,16 +1,17 @@ id = $data['id']; } public function processRequest() { $changeset = id(new DifferentialChangeset())->load($this->id); if (!$changeset) { return new Aphront404Response(); } $changeset->attachHunks($changeset->loadHunks()); $parser = new DifferentialChangesetParser(); $parser->setChangeset($changeset); $output = $parser->render(); $request = $this->getRequest(); if ($request->isAjax()) { return id(new AphrontAjaxResponse()) ->setContent($output); } $detail = new DifferentialChangesetDetailView(); $detail->setChangeset($changeset); $detail->appendChild($output); - // TODO: This is a bit of a hacky mess. $output = - '
'. - '
'. - '
'. - $detail->render(). - '
'. + '
'. + '
'. + $detail->render(). '
'. '
'; return $this->buildStandardPageResponse( array( $output ), array( 'title' => 'Changeset View', )); } } diff --git a/src/applications/differential/controller/diffview/DifferentialDiffViewController.php b/src/applications/differential/controller/diffview/DifferentialDiffViewController.php index 58fefe64a9..67829ec10b 100644 --- a/src/applications/differential/controller/diffview/DifferentialDiffViewController.php +++ b/src/applications/differential/controller/diffview/DifferentialDiffViewController.php @@ -1,52 +1,84 @@ id = $data['id']; } public function processRequest() { $diff = id(new DifferentialDiff())->load($this->id); if (!$diff) { return new Aphront404Response(); } + $action_panel = new AphrontPanelView(); + $action_panel->setHeader('Preview Diff'); + $action_panel->setWidth(AphrontPanelView::WIDTH_WIDE); + $action_panel->appendChild( + '

Review the diff for correctness. '. + 'When you are satisfied, either create a new revision '. + 'or update an existing revision.'); + + $action_form = new AphrontFormView(); + $action_form + ->setAction('/differential/revision/edit/') + ->appendChild( + id(new AphrontFormSelectControl()) + ->setLabel('Attach To') + ->setName('revisionID') + ->setValue('') + ->setOptions(array( + '' => "Create a new Revision...", + ))) + ->appendChild( + id(new AphrontFormSubmitControl()) + ->setValue('Continue')); + + $action_panel->appendChild($action_form); + + + $changesets = $diff->loadChangesets(); $changesets = msort($changesets, 'getSortKey'); $table_of_contents = id(new DifferentialDiffTableOfContentsView()) ->setChangesets($changesets); $details = id(new DifferentialChangesetListView()) ->setChangesets($changesets); return $this->buildStandardPageResponse( - array( - $table_of_contents, - $details, - ), + '

'. + implode( + "\n", + array( + $action_panel->render(), + $table_of_contents->render(), + $details->render(), + )). + '
', array( 'title' => 'Diff View', )); } } diff --git a/src/applications/differential/controller/diffview/__init__.php b/src/applications/differential/controller/diffview/__init__.php index 7303dd9ed7..efcd27da68 100644 --- a/src/applications/differential/controller/diffview/__init__.php +++ b/src/applications/differential/controller/diffview/__init__.php @@ -1,18 +1,21 @@ setApplicationName('Differential'); - $page->setBaseURI('/differential/'); - $page->setTitle(idx($data, 'title')); - $page->setGlyph("\xE2\x9A\x99"); - $page->appendChild($view); + $side_nav = new AphrontSideNavView(); + $side_nav->addNavItem( + phutil_render_tag( + 'a', + array( + 'href' => '/differential/', + ), + 'Active Revisions')); - $response = new AphrontWebpageResponse(); - return $response->setContent($page->render()); + + return $this->buildStandardPageResponse( + $side_nav, + array( + 'title' => 'Differential Home', + )); } } diff --git a/src/applications/differential/controller/revisionlist/__init__.php b/src/applications/differential/controller/revisionlist/__init__.php new file mode 100644 index 0000000000..e77e5b621b --- /dev/null +++ b/src/applications/differential/controller/revisionlist/__init__.php @@ -0,0 +1,15 @@ +changesets = $changesets; return $this; } public function render() { require_celerity_resource('differential-table-of-contents-css'); $rows = array(); $changesets = $this->changesets; foreach ($changesets as $changeset) { $file = $changeset->getFilename(); $display_file = $changeset->getDisplayFilename(); $type = $changeset->getChangeType(); $ftype = $changeset->getFileType(); if (DifferentialChangeType::isOldLocationChangeType($type)) { $link = phutil_escape_html($display_file); $away = $changeset->getAwayPaths(); if (count($away) > 1) { $meta = array(); if ($type == DifferentialChangeType::TYPE_MULTICOPY) { $meta[] = 'Deleted after being copied to multiple locations:'; } else { $meta[] = 'Copied to multiple locations:'; } foreach ($away as $path) { $meta[] = $path; } $meta = implode('
', $meta); } else { if ($type == DifferentialChangeType::TYPE_MOVE_AWAY) { $meta = 'Moved to '.reset($away); } else { $meta = 'Copied to '.reset($away); } } } else { $link = phutil_render_tag( 'a', array( 'href' => '#', // TODO: filename normalizer ), phutil_escape_html($display_file)); if ($type == DifferentialChangeType::TYPE_MOVE_HERE) { $meta = 'Moved from '.phutil_escape_html($changeset->getOldFile()); } else if ($type == DifferentialChangeType::TYPE_COPY_HERE) { $meta = 'Copied from '.phutil_escape_html($changeset->getOldFile()); } else { $meta = null; } } $line_count = $changeset->getAffectedLineCount(); if ($line_count == 0) { $lines = null; } else if ($line_count == 1) { $lines = ' (1 line)'; } else { $lines = ' ('.$line_count.' lines)'; } $char = DifferentialChangeType::getSummaryCharacterForChangeType($type); $chartitle = DifferentialChangeType::getFullNameForChangeType($type); $desc = DifferentialChangeType::getShortNameForFileType($ftype); if ($desc) { $desc = '('.$desc.')'; } $pchar = ($changeset->getOldProperties() === $changeset->getNewProperties()) ? null : 'M'; $rows[] = ''. ''.$char.''. ''.$pchar.''. ''.$desc.''. ''.$link.$lines.''. ''; if ($meta) { $rows[] = ''. - ''. + ''. ''.$meta.''. ''; } } return '
'. '

Table of Contents

'. ''. implode("\n", $rows). '
'. '
'; } } diff --git a/webroot/rsrc/css/aphront/form-view.css b/webroot/rsrc/css/aphront/form-view.css index 9a60901a46..03edd372da 100644 --- a/webroot/rsrc/css/aphront/form-view.css +++ b/webroot/rsrc/css/aphront/form-view.css @@ -1,79 +1,85 @@ /** * @provides aphront-form-view-css */ .aphront-form-view { background: #e7e7e7; border: 1px solid #c4c4c4; padding: 1em; } .aphront-form-view label { padding-top: 4px; width: 19%; float: left; text-align: right; font-weight: bold; font-size: 13px; color: #666666; } .aphront-form-input { margin-left: 20%; margin-right: 25%; width: 55%; } .aphront-form-error { width: 23%; float: right; color: #aa0000; font-weight: bold; padding-top: 4px; } .aphront-form-input input, .aphront-form-input textarea { font-size: 12px; width: 100%; } + .aphront-form-input textarea { height: 12em; } .aphront-form-control { padding: 4px; } .aphront-form-control-submit button, .aphront-form-control-submit a.button { float: right; - margin: 1em 0 0em 2%; + margin: 0.5em 0 0em 2%; +} + +.aphront-form-control-select .aphront-form-input { + padding-top: 2px; } + .aphront-form-view .aphront-form-caption { font-size: 11px; color: #444444; text-align: right; clear: both; margin-right: 25%; margin-left: 15%; } .aphront-error-view { width: 720px; margin: 1em auto; border: 1px solid #aa0000; padding: 1em; background: #f9b9bc; } .aphront-form-instructions { margin: 2em 3%; } .aphront-form-control-static .aphront-form-input { padding-top: 4px; font-size: 13px; } diff --git a/webroot/rsrc/css/aphront/panel-view.css b/webroot/rsrc/css/aphront/panel-view.css index 6b816b4f7c..1acd2f7560 100644 --- a/webroot/rsrc/css/aphront/panel-view.css +++ b/webroot/rsrc/css/aphront/panel-view.css @@ -1,35 +1,40 @@ /** * @provides aphront-panel-view-css */ .aphront-panel-view { background: #f3f3f3; border: 1px solid #c0c0c0; border-width: 1px 0 0; padding: 1em 2em; margin: 1em 2em; } .aphront-panel-view h1 { font-size: 14px; font-weight: bold; padding: 2px 0 8px; } .aphront-panel-view a.create-button { float: right; } +.aphront-panel-view p.aphront-panel-instructions { + margin: .5em 2em .75em; + font-size: 13px; +} + .aphront-panel-width-form { width: 720px; margin-right: auto; margin-left: auto; } .aphront-panel-width-wide { width: 1080px; margin-right: auto; margin-left: auto; } diff --git a/webroot/rsrc/css/application/differential/changeset-view.css b/webroot/rsrc/css/application/differential/changeset-view.css index a3d0eb14d0..3ad2468c3f 100644 --- a/webroot/rsrc/css/application/differential/changeset-view.css +++ b/webroot/rsrc/css/application/differential/changeset-view.css @@ -1,110 +1,121 @@ /** * @provides differential-changeset-view-css */ .differential-diff { background: #ffffff; font-family: "Menlo", "Consolas", "Monaco", monospace; font-size: 10px; width: 100%; } .differential-diff td { /* using monospace fonts makes ex/em most useful: * * Unfortunately, firefox 3.6 renders diffs columns for added and removed * files "way-too-wide" when given em as the dimension measurement, so we * use an eyeballed ex equivalent and reset it to the ch character width * measurement for browsers that support that css3 measurement. */ width: 88ex; width: 81ch; /* Disable ligatures in Firefox. Firefox 3 has fancypants ligature support, but it gets applied to monospaced fonts, which sucks because it means that the "fi" ligature only takes up one character, e.g. It's probably the font's fault that it even specifies ligatures (seriously, what the hell?) but that's hard to fix and this is "easy" to "fix": custom letter spacing disables ligatures, as long as it's at least 0.008333-repeating pixels of custom letter spacing. I have no idea where this number comes from, but note that .83333.. = 5/6. -epriestley */ letter-spacing: 0.0083334px; vertical-align: top; white-space: pre; padding: 0 8px 1px; line-height: 16px; overflow: hidden; } .differential-diff th { text-align: right; padding: 2px 6px; width: 44px; vertical-align: top; background: #eeeeee; color: #888888; cursor: pointer; border-style: solid; border-width: 0px 1px; border-color: #eeeeee #999999 #eeeeee #dddddd; font-weight: bold; font-family: "Verdana"; font-size: 11px; overflow: hidden; } .differential-diff td.old { background: #ffd0d0; color: #161111; } .differential-diff td.new { background: #d0ffd0; color: #111611; } .differential-diff td.old-full, .differential-diff td.old span.bright { background: #ffaaaa; color: #221111; } .differential-diff td.new-full, .differential-diff td.new span.bright { background: #aaffaa; color: #112211; } .differential-diff td.show-more, .differential-diff td.differential-shield { background: #ffffee; padding: 1em; text-align: center; font-family: "Verdana"; font-size: 11px; border: 1px solid #ccccaa; white-space: normal; } .differential-diff td.show-more { color: #999966; } .differential-diff td.differential-shield { text-align: center; max-width: 1160px; } .differential-diff td.differential-shield a { font-weight: bold; } .differential-meta-notice { border: 1px solid #ffdd99; background: #ffeeaa; font-family: "Verdana"; font-size: 11px; padding: 1em; margin: 0 0 6px 0; } + +.differential-changeset h1 { + font-size: 14px; + font-weight: bold; + padding: 2px 0 8px; +} + +.differential-changeset { + margin: 0.5em 0; + padding: 10px 0px 20px; +} diff --git a/webroot/rsrc/js/application/core/behavior-tokenizer.js b/webroot/rsrc/js/application/core/behavior-tokenizer.js index 78fd251977..825d44ed9c 100644 --- a/webroot/rsrc/js/application/core/behavior-tokenizer.js +++ b/webroot/rsrc/js/application/core/behavior-tokenizer.js @@ -1,27 +1,28 @@ /** * @provides javelin-behavior-aphront-basic-tokenizer + * @requires javelin-lib-dev */ JX.behavior('aphront-basic-tokenizer', function(config) { var root = JX.$(config.id); var datasource = new JX.TypeaheadPreloadedSource(config.src); var typeahead = new JX.Typeahead( root, JX.DOM.find(root, 'input', 'tokenizer')); typeahead.setDatasource(datasource); var tokenizer = new JX.Tokenizer(root); tokenizer.setTypeahead(typeahead); if (config.limit) { tokenizer.setLimit(config.limit); } if (config.value) { tokenizer.setInitialValue(config.value); } tokenizer.start(); }); diff --git a/webroot/rsrc/js/application/differential/behavior-populate.js b/webroot/rsrc/js/application/differential/behavior-populate.js index 14be5b2f8d..4c39fd17ae 100644 --- a/webroot/rsrc/js/application/differential/behavior-populate.js +++ b/webroot/rsrc/js/application/differential/behavior-populate.js @@ -1,22 +1,23 @@ /** * @provides javelin-behavior-differential-populate + * @requires javelin-lib-dev */ JX.behavior('differential-populate', function(config) { function onresponse(target, response) { JX.DOM.replace(JX.$(target), JX.HTML(response)); } var uri; for (var k in config.registry) { uri = config.uri + config.registry[k][0] + '/'; new JX.Request(uri, JX.bind(null, onresponse, k)) .setData({ against: config.registry[k][1], whitespace: config.whitespace }) .send(); } });