diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -42,7 +42,6 @@ 'rsrc/css/application/config/config-options.css' => '0ede4c9b', 'rsrc/css/application/config/config-page.css' => '8798e14f', 'rsrc/css/application/config/config-template.css' => '8e6c6fcd', - 'rsrc/css/application/config/config-welcome.css' => '035aa483', 'rsrc/css/application/config/setup-issue.css' => 'f794cfc3', 'rsrc/css/application/config/unhandled-exception.css' => '4c96257a', 'rsrc/css/application/conpherence/durable-column.css' => '86396117', @@ -549,7 +548,6 @@ 'conduit-api-css' => '7bc725c4', 'config-options-css' => '0ede4c9b', 'config-page-css' => '8798e14f', - 'config-welcome-css' => '035aa483', 'conpherence-durable-column-view' => '86396117', 'conpherence-menu-css' => '90bdf85c', 'conpherence-message-pane-css' => '5c7b7b17', diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2210,7 +2210,6 @@ 'PhabricatorConfigTransactionQuery' => 'applications/config/query/PhabricatorConfigTransactionQuery.php', 'PhabricatorConfigValidationException' => 'applications/config/exception/PhabricatorConfigValidationException.php', 'PhabricatorConfigVersionController' => 'applications/config/controller/PhabricatorConfigVersionController.php', - 'PhabricatorConfigWelcomeController' => 'applications/config/controller/PhabricatorConfigWelcomeController.php', 'PhabricatorConpherenceApplication' => 'applications/conpherence/application/PhabricatorConpherenceApplication.php', 'PhabricatorConpherenceColumnVisibleSetting' => 'applications/settings/setting/PhabricatorConpherenceColumnVisibleSetting.php', 'PhabricatorConpherenceNotificationsSetting' => 'applications/settings/setting/PhabricatorConpherenceNotificationsSetting.php', @@ -2646,7 +2645,6 @@ 'PhabricatorGuideModule' => 'applications/guides/module/PhabricatorGuideModule.php', 'PhabricatorGuideModuleController' => 'applications/guides/controller/PhabricatorGuideModuleController.php', 'PhabricatorGuideQuickStartModule' => 'applications/guides/module/PhabricatorGuideQuickStartModule.php', - 'PhabricatorGuideWelcomeModule' => 'applications/guides/module/PhabricatorGuideWelcomeModule.php', 'PhabricatorHTTPParameterTypeTableView' => 'applications/config/view/PhabricatorHTTPParameterTypeTableView.php', 'PhabricatorHandleList' => 'applications/phid/handle/pool/PhabricatorHandleList.php', 'PhabricatorHandleObjectSelectorDataView' => 'applications/phid/handle/view/PhabricatorHandleObjectSelectorDataView.php', @@ -6964,7 +6962,6 @@ 'PhabricatorConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorConfigValidationException' => 'Exception', 'PhabricatorConfigVersionController' => 'PhabricatorConfigController', - 'PhabricatorConfigWelcomeController' => 'PhabricatorConfigController', 'PhabricatorConpherenceApplication' => 'PhabricatorApplication', 'PhabricatorConpherenceColumnVisibleSetting' => 'PhabricatorInternalSetting', 'PhabricatorConpherenceNotificationsSetting' => 'PhabricatorSelectSetting', @@ -7464,7 +7461,6 @@ 'PhabricatorGuideModule' => 'Phobject', 'PhabricatorGuideModuleController' => 'PhabricatorGuideController', 'PhabricatorGuideQuickStartModule' => 'PhabricatorGuideModule', - 'PhabricatorGuideWelcomeModule' => 'PhabricatorGuideModule', 'PhabricatorHTTPParameterTypeTableView' => 'AphrontView', 'PhabricatorHandleList' => array( 'Phobject', diff --git a/src/applications/config/application/PhabricatorConfigApplication.php b/src/applications/config/application/PhabricatorConfigApplication.php --- a/src/applications/config/application/PhabricatorConfigApplication.php +++ b/src/applications/config/application/PhabricatorConfigApplication.php @@ -44,7 +44,6 @@ 'edit/(?P[\w\.\-]+)/' => 'PhabricatorConfigEditController', 'group/(?P[^/]+)/' => 'PhabricatorConfigGroupController', 'version/' => 'PhabricatorConfigVersionController', - 'welcome/' => 'PhabricatorConfigWelcomeController', 'database/'. '(?:(?P[^/]+)/'. '(?:(?P[^/]+)/'. diff --git a/src/applications/config/controller/PhabricatorConfigController.php b/src/applications/config/controller/PhabricatorConfigController.php --- a/src/applications/config/controller/PhabricatorConfigController.php +++ b/src/applications/config/controller/PhabricatorConfigController.php @@ -7,33 +7,47 @@ } public function buildSideNavView($filter = null, $for_app = false) { - $user = $this->getRequest()->getUser(); + $guide_href = new PhutilURI('/guides/'); $nav = new AphrontSideNavFilterView(); $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); $nav->addLabel(pht('Configuration')); - $nav->addFilter('/', pht('Core Settings')); - $nav->addFilter('application/', pht('Application Settings')); - $nav->addFilter('history/', pht('Settings History')); - $nav->addFilter('version/', pht('Version Information')); - $nav->addFilter('all/', pht('All Settings')); + $nav->addFilter('/', + pht('Core Settings'), null, 'fa-gear'); + $nav->addFilter('application/', + pht('Application Settings'), null, 'fa-globe'); + $nav->addFilter('history/', + pht('Settings History'), null, 'fa-history'); + $nav->addFilter('version/', + pht('Version Information'), null, 'fa-download'); + $nav->addFilter('all/', + pht('All Settings'), null, 'fa-list-ul'); $nav->addLabel(pht('Setup')); - $nav->addFilter('issue/', pht('Setup Issues')); - $nav->addFilter('welcome/', pht('Installation Guide')); + $nav->addFilter('issue/', + pht('Setup Issues'), null, 'fa-warning'); + $nav->addFilter(null, + pht('Installation Guide'), $guide_href, 'fa-book'); $nav->addLabel(pht('Database')); - $nav->addFilter('database/', pht('Database Status')); - $nav->addFilter('dbissue/', pht('Database Issues')); + $nav->addFilter('database/', + pht('Database Status'), null, 'fa-heartbeat'); + $nav->addFilter('dbissue/', + pht('Database Issues'), null, 'fa-exclamation-circle'); $nav->addLabel(pht('Cache')); - $nav->addFilter('cache/', pht('Cache Status')); + $nav->addFilter('cache/', + pht('Cache Status'), null, 'fa-home'); $nav->addLabel(pht('Cluster')); - $nav->addFilter('cluster/databases/', pht('Database Servers')); - $nav->addFilter('cluster/notifications/', pht('Notification Servers')); - $nav->addFilter('cluster/repositories/', pht('Repository Servers')); + $nav->addFilter('cluster/databases/', + pht('Database Servers'), null, 'fa-database'); + $nav->addFilter('cluster/notifications/', + pht('Notification Servers'), null, 'fa-bell-o'); + $nav->addFilter('cluster/repositories/', + pht('Repository Servers'), null, 'fa-code'); $nav->addLabel(pht('Modules')); $modules = PhabricatorConfigModule::getAllModules(); foreach ($modules as $key => $module) { - $nav->addFilter('module/'.$key.'/', $module->getModuleName()); + $nav->addFilter('module/'.$key.'/', + $module->getModuleName(), null, 'fa-puzzle-piece'); } return $nav; diff --git a/src/applications/config/controller/PhabricatorConfigWelcomeController.php b/src/applications/config/controller/PhabricatorConfigWelcomeController.php deleted file mode 100644 --- a/src/applications/config/controller/PhabricatorConfigWelcomeController.php +++ /dev/null @@ -1,411 +0,0 @@ -getViewer(); - - $nav = $this->buildSideNavView(); - $nav->selectFilter('welcome/'); - - $title = pht('Installation Guide'); - - $header = id(new PHUIHeaderView()) - ->setHeader($title) - ->setProfileHeader(true); - - $crumbs = $this - ->buildApplicationCrumbs() - ->addTextCrumb($title) - ->setBorder(true); - - $content = id(new PhabricatorConfigPageView()) - ->setHeader($header) - ->setContent($this->buildWelcomeScreen($request)); - - return $this->newPage() - ->setTitle($title) - ->setCrumbs($crumbs) - ->setNavigation($nav) - ->appendChild($content) - ->addClass('white-background'); - } - - public function buildWelcomeScreen(AphrontRequest $request) { - $viewer = $request->getUser(); - $this->requireResource('config-welcome-css'); - - $content = pht( - "=== Install Phabricator ===\n\n". - "You have successfully installed Phabricator. This screen will guide ". - "you through configuration and orientation. ". - "These steps are optional, and you can go through them in any order. ". - "If you want to get back to this screen later on, you can find it in ". - "the **Config** application under **Welcome Screen**."); - - $setup = array(); - - $setup[] = $this->newItem( - $request, - 'fa-check-square-o green', - $content); - - $issues_resolved = !PhabricatorSetupCheck::getOpenSetupIssueKeys(); - - $setup_href = PhabricatorEnv::getURI('/config/issue/'); - if ($issues_resolved) { - $content = pht( - "=== Resolve Setup Issues ===\n\n". - "You've resolved (or ignored) all outstanding setup issues. ". - "You can review issues in the **Config** application, under ". - "**[[ %s | Setup Issues ]]**.", - $setup_href); - $icon = 'fa-check-square-o green'; - } else { - $content = pht( - "=== Resolve Setup Issues ===\n\n". - "You have some unresolved setup issues to take care of. Click ". - "the link in the yellow banner at the top of the screen to see ". - "them, or find them in the **Config** application under ". - "**[[ %s | Setup Issues ]]**. ". - "Although most setup issues should be resolved, sometimes an issue ". - "is not applicable to an install. ". - "If you don't intend to fix a setup issue (or don't want to fix ". - "it for now), you can use the \"Ignore\" action to mark it as ". - "something you don't plan to deal with.", - $setup_href); - $icon = 'fa-warning red'; - } - - $setup[] = $this->newItem( - $request, - $icon, - $content); - - $configs = id(new PhabricatorAuthProviderConfigQuery()) - ->setViewer(PhabricatorUser::getOmnipotentUser()) - ->execute(); - - $auth_href = PhabricatorEnv::getURI('/auth/'); - $have_auth = (bool)$configs; - if ($have_auth) { - $content = pht( - "=== Login and Registration ===\n\n". - "You've configured at least one authentication provider, so users ". - "can register or log in. ". - "To configure more providers or adjust settings, use the ". - "**[[ %s | Auth Application ]]**.", - $auth_href); - $icon = 'fa-check-square-o green'; - } else { - $content = pht( - "=== Login and Registration ===\n\n". - "You haven't configured any authentication providers yet. ". - "Authentication providers allow users to register accounts and ". - "log in to Phabricator. You can configure Phabricator to accept ". - "credentials like username and password, LDAP, or Google OAuth. ". - "You can configure authentication using the ". - "**[[ %s | Auth Application ]]**.", - $auth_href); - $icon = 'fa-warning red'; - } - - $setup[] = $this->newItem( - $request, - $icon, - $content); - - $config_href = PhabricatorEnv::getURI('/config/'); - - // Just load any config value at all; if one exists the install has figured - // out how to configure things. - $have_config = (bool)id(new PhabricatorConfigEntry())->loadAllWhere( - '1 = 1 LIMIT 1'); - - if ($have_config) { - $content = pht( - "=== Configure Phabricator Settings ===\n\n". - "You've configured at least one setting from the web interface. ". - "To configure more settings later, use the ". - "**[[ %s | Config Application ]]**.", - $config_href); - $icon = 'fa-check-square-o green'; - } else { - $content = pht( - "=== Configure Phabricator Settings ===\n\n". - 'Many aspects of Phabricator are configurable. To explore and '. - 'adjust settings, use the **[[ %s | Config Application ]]**.', - $config_href); - $icon = 'fa-info-circle'; - } - - $setup[] = $this->newItem( - $request, - $icon, - $content); - - $settings_href = PhabricatorEnv::getURI('/settings/'); - - $preferences = id(new PhabricatorUserPreferencesQuery()) - ->setViewer($viewer) - ->withUsers(array($viewer)) - ->executeOne(); - - $have_settings = ($preferences && $preferences->getPreferences()); - - if ($have_settings) { - $content = pht( - "=== Adjust Account Settings ===\n\n". - "You've adjusted at least one setting on your account. ". - "To make more adjustments, visit the ". - "**[[ %s | Settings Application ]]**.", - $settings_href); - $icon = 'fa-check-square-o green'; - } else { - $content = pht( - "=== Adjust Account Settings ===\n\n". - 'You can configure settings for your account by clicking the '. - 'wrench icon in the main menu bar, or visiting the '. - '**[[ %s | Settings Application ]]** directly.', - $settings_href); - $icon = 'fa-info-circle'; - } - - $setup[] = $this->newItem( - $request, - $icon, - $content); - - $dashboard_href = PhabricatorEnv::getURI('/dashboard/'); - $have_dashboard = (bool)PhabricatorDashboardInstall::getDashboard( - $viewer, - PhabricatorHomeApplication::DASHBOARD_DEFAULT, - 'PhabricatorHomeApplication'); - if ($have_dashboard) { - $content = pht( - "=== Customize Home Page ===\n\n". - "You've installed a default dashboard to replace this welcome screen ". - "on the home page. ". - "You can still visit the welcome screen here at any time if you ". - "have steps you want to complete later, or if you feel lonely. ". - "If you've changed your mind about the dashboard you installed, ". - "you can install a different default dashboard with the ". - "**[[ %s | Dashboards Application ]]**.", - $dashboard_href); - $icon = 'fa-check-square-o green'; - } else { - $content = pht( - "=== Customize Home Page ===\n\n". - "When you're done setting things up, you can create a custom ". - "dashboard and install it. Your dashboard will replace this ". - "welcome screen on the Phabricator home page. ". - "Dashboards can show users the information that's most important to ". - "your organization. You can configure them to display things like: ". - "a custom welcome message, a feed of recent activity, or a list of ". - "open tasks, waiting reviews, recent commits, and so on. ". - "After you install a default dashboard, it will replace this page. ". - "You can find this page later by visiting the **Config** ". - "application, under **Welcome Page**. ". - "To get started building a dashboard, use the ". - "**[[ %s | Dashboards Application ]]**. ", - $dashboard_href); - $icon = 'fa-info-circle'; - } - - $setup[] = $this->newItem( - $request, - $icon, - $content); - - $apps_href = PhabricatorEnv::getURI('/applications/'); - $content = pht( - "=== Explore Applications ===\n\n". - "Phabricator is a large suite of applications that work together to ". - "help you develop software, manage tasks, and communicate. A few of ". - "the most commonly used applications are pinned to the left navigation ". - "bar by default.\n\n". - "To explore all of the Phabricator applications, adjust settings, or ". - "uninstall applications you don't plan to use, visit the ". - "**[[ %s | Applications Application ]]**. You can also click the ". - "**Applications** button in the left navigation menu, or search for an ". - "application by name in the main menu bar. ", - $apps_href); - - $explore = array(); - $explore[] = $this->newItem( - $request, - 'fa-globe', - $content); - - // TODO: Restore some sort of "Support" link here, but just nuke it for - // now as we figure stuff out. - - $differential_uri = PhabricatorEnv::getURI('/differential/'); - $differential_create_uri = PhabricatorEnv::getURI( - '/differential/diff/create/'); - $differential_all_uri = PhabricatorEnv::getURI('/differential/query/all/'); - - $differential_user_guide = PhabricatorEnv::getDoclink( - 'Differential User Guide'); - $differential_vs_uri = PhabricatorEnv::getDoclink( - 'User Guide: Review vs Audit'); - - $quick = array(); - $quick[] = $this->newItem( - $request, - 'fa-gear', - pht( - "=== Quick Start: Code Review ===\n\n". - "Review code with **[[ %s | Differential ]]**. ". - "Engineers can use Differential to share, review, and approve ". - "changes to source code. ". - "To get started with code review:\n\n". - " - **[[ %s | Create a Revision ]]** //(Copy and paste a diff from ". - " the command line into the web UI to quickly get a feel for ". - " review.)//\n". - " - **[[ %s | View All Revisions ]]**\n\n". - "For more information, see these articles in the documentation:\n\n". - " - **[[ %s | Differential User Guide ]]**, for a general overview ". - " of Differential.\n". - " - **[[ %s | User Guide: Review vs Audit ]]**, for a discussion ". - " of different code review workflows.", - $differential_uri, - $differential_create_uri, - $differential_all_uri, - $differential_user_guide, - $differential_vs_uri)); - - - $maniphest_uri = PhabricatorEnv::getURI('/maniphest/'); - $maniphest_create_uri = PhabricatorEnv::getURI('/maniphest/task/edit/'); - $maniphest_all_uri = PhabricatorEnv::getURI('/maniphest/query/all/'); - $quick[] = $this->newItem( - $request, - 'fa-anchor', - pht( - "=== Quick Start: Bugs and Tasks ===\n\n". - "Track bugs and tasks in Phabricator with ". - "**[[ %s | Maniphest ]]**. ". - "Users in all roles can use Maniphest to manage current and ". - "planned work and to track bugs and issues. ". - "To get started with bugs and tasks:\n\n". - " - **[[ %s | Create a Task ]]**\n". - " - **[[ %s | View All Tasks ]]**\n", - $maniphest_uri, - $maniphest_create_uri, - $maniphest_all_uri)); - - - $pholio_uri = PhabricatorEnv::getURI('/pholio/'); - $pholio_create_uri = PhabricatorEnv::getURI('/pholio/new/'); - $pholio_all_uri = PhabricatorEnv::getURI('/pholio/query/all/'); - - $quick[] = $this->newItem( - $request, - 'fa-camera-retro', - pht( - "=== Quick Start: Design Review ===\n\n". - "Review proposed designs with **[[ %s | Pholio ]]**. ". - "Designers can use Pholio to share images of what they're working on ". - "and show off things they've made. ". - "To get started with design review:\n\n". - " - **[[ %s | Create a Mock ]]**\n". - " - **[[ %s | View All Mocks ]]**", - $pholio_uri, - $pholio_create_uri, - $pholio_all_uri)); - - - $diffusion_uri = PhabricatorEnv::getURI('/diffusion/edit/'); - $diffusion_create_uri = PhabricatorEnv::getURI('/diffusion/create/'); - $diffusion_all_uri = PhabricatorEnv::getURI('/diffusion/query/all/'); - - $diffusion_user_guide = PhabricatorEnv::getDoclink('Diffusion User Guide'); - $diffusion_setup_guide = PhabricatorEnv::getDoclink( - 'Diffusion User Guide: Repository Hosting'); - - $quick[] = $this->newItem( - $request, - 'fa-code', - pht( - "=== Quick Start: Repositories ===\n\n". - "Manage and browse source code repositories with ". - "**[[ %s | Diffusion ]]**. ". - "Engineers can use Diffusion to browse and audit source code. ". - "You can configure Phabricator to host repositories, or have it ". - "track existing repositories hosted elsewhere (like GitHub, ". - "Bitbucket, or an internal server). ". - "To get started with repositories:\n\n". - " - **[[ %s | Create a New Repository ]]**\n". - " - **[[ %s | View All Repositories ]]**\n\n". - "For more information, see these articles in the documentation:\n\n". - " - **[[ %s | Diffusion User Guide ]]**, for a general overview of ". - " Diffusion.\n". - " - **[[ %s | Diffusion User Guide: Repository Hosting ]]**, ". - " for instructions on configuring repository hosting.\n\n". - "Phabricator supports Git, Mercurial and Subversion.", - $diffusion_uri, - $diffusion_create_uri, - $diffusion_all_uri, - $diffusion_user_guide, - $diffusion_setup_guide)); - - $setup_header = new PHUIRemarkupView( - $viewer, pht('=Setup and Configuration')); - - $explore_header = new PHUIRemarkupView( - $viewer, pht('=Explore Phabricator')); - - $quick_header = new PHUIRemarkupView( - $viewer, pht('=Quick Start Guide')); - - $document = id(new PHUIDocumentViewPro()) - ->setFluid(true) - ->appendChild($setup_header) - ->appendChild($setup) - ->appendChild($explore_header) - ->appendChild($explore) - ->appendChild($quick_header) - ->appendChild($quick); - - return id(new PHUIBoxView()) - ->appendChild($document); - } - - private function newItem(AphrontRequest $request, $icon, $content) { - $viewer = $request->getUser(); - - $icon = id(new PHUIIconView()) - ->setIcon($icon.' fa-2x'); - - $content = new PHUIRemarkupView($viewer, $content); - - $icon = phutil_tag( - 'div', - array( - 'class' => 'config-welcome-icon', - ), - $icon); - - $content = phutil_tag( - 'div', - array( - 'class' => 'config-welcome-content', - ), - $content); - - $view = phutil_tag( - 'div', - array( - 'class' => 'config-welcome-box grouped', - ), - array( - $icon, - $content, - )); - - return $view; - } - -} diff --git a/src/applications/guides/application/PhabricatorGuideApplication.php b/src/applications/guides/application/PhabricatorGuideApplication.php --- a/src/applications/guides/application/PhabricatorGuideApplication.php +++ b/src/applications/guides/application/PhabricatorGuideApplication.php @@ -18,10 +18,6 @@ return 'fa-map-o'; } - public function isPrototype() { - return true; - } - public function getApplicationGroup() { return self::GROUP_UTILITIES; } diff --git a/src/applications/guides/controller/PhabricatorGuideController.php b/src/applications/guides/controller/PhabricatorGuideController.php --- a/src/applications/guides/controller/PhabricatorGuideController.php +++ b/src/applications/guides/controller/PhabricatorGuideController.php @@ -8,7 +8,7 @@ $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); $nav->addLabel(pht('Guides')); - $modules = PhabricatorGuideModule::getAllModules(); + $modules = PhabricatorGuideModule::getEnabledModules(); foreach ($modules as $key => $module) { $nav->addFilter($key.'/', $module->getModuleName()); } diff --git a/src/applications/guides/controller/PhabricatorGuideModuleController.php b/src/applications/guides/controller/PhabricatorGuideModuleController.php --- a/src/applications/guides/controller/PhabricatorGuideModuleController.php +++ b/src/applications/guides/controller/PhabricatorGuideModuleController.php @@ -7,10 +7,11 @@ $viewer = $this->getViewer(); $key = $request->getURIData('module'); + $all_modules = PhabricatorGuideModule::getEnabledModules(); + if (!$key) { - $key = 'welcome'; + $key = key($all_modules); } - $all_modules = PhabricatorGuideModule::getAllModules(); $nav = $this->buildSideNavView(); $nav->selectFilter($key.'/'); diff --git a/src/applications/guides/module/PhabricatorGuideInstallModule.php b/src/applications/guides/module/PhabricatorGuideInstallModule.php --- a/src/applications/guides/module/PhabricatorGuideInstallModule.php +++ b/src/applications/guides/module/PhabricatorGuideInstallModule.php @@ -14,6 +14,13 @@ return 20; } + public function getIsModuleEnabled() { + if (PhabricatorEnv::getEnvConfig('cluster.instance')) { + return false; + } + return true; + } + public function renderModuleStatus(AphrontRequest $request) { $viewer = $request->getViewer(); @@ -25,13 +32,11 @@ if ($issues_resolved) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( "You've resolved (or ignored) all outstanding setup issues."); } else { $icon = 'fa-warning'; $icon_bg = 'bg-red'; - $skip = '#'; $description = pht('You have some unresolved setup issues to take care of.'); } @@ -41,7 +46,6 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); @@ -55,13 +59,11 @@ if ($have_auth) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( "You've configured at least one authentication provider."); } else { $icon = 'fa-key'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = pht( 'Authentication providers allow users to register accounts and '. 'log in to Phabricator.'); @@ -72,7 +74,6 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); @@ -88,13 +89,11 @@ if ($have_config) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( "You've configured at least one setting from the web interface."); } else { $icon = 'fa-sliders'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = pht( 'Learn how to configure mail and other options in Phabricator.'); } @@ -104,7 +103,6 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); @@ -120,13 +118,11 @@ if ($have_settings) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( "You've adjusted at least one setting on your account."); } else { $icon = 'fa-wrench'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = pht( 'Configure account settings for all users, or just yourself'); } @@ -136,25 +132,21 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); $title = pht('Notification Server'); - $href = PhabricatorEnv::getURI('/config/notifications/'); - // TODO: Wire up a notifications check - $have_notifications = false; + $href = PhabricatorEnv::getURI('/config/edit/notification.servers/'); + $have_notifications = PhabricatorEnv::getEnvConfig('notification.servers'); if ($have_notifications) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( "You've set up a real-time notification server."); } else { $icon = 'fa-bell'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = pht( 'Phabricator can deliver notifications in real-time with WebSockets.'); } @@ -164,12 +156,23 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); - return $guide_items; + $intro = pht( + 'Phabricator has been successfully installed. These next guides will '. + 'take you through configuration and new user orientation. '. + 'These steps are optional, and you can go through them in any order. '. + 'If you want to get back to this guide later on, you can find it in '. + '{icon globe} **Applications** under {icon map-o} **Guides**.'); + + $intro = new PHUIRemarkupView($viewer, $intro); + + $intro = id(new PHUIDocumentViewPro()) + ->appendChild($intro); + + return array($intro, $guide_items); } diff --git a/src/applications/guides/module/PhabricatorGuideModule.php b/src/applications/guides/module/PhabricatorGuideModule.php --- a/src/applications/guides/module/PhabricatorGuideModule.php +++ b/src/applications/guides/module/PhabricatorGuideModule.php @@ -5,6 +5,7 @@ abstract public function getModuleKey(); abstract public function getModuleName(); abstract public function getModulePosition(); + abstract public function getIsModuleEnabled(); abstract public function renderModuleStatus(AphrontRequest $request); final public static function getAllModules() { @@ -15,4 +16,13 @@ ->execute(); } + final public static function getEnabledModules() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getModuleKey') + ->setSortMethod('getModulePosition') + ->setFilterMethod('getIsModuleEnabled') + ->execute(); + } + } diff --git a/src/applications/guides/module/PhabricatorGuideQuickStartModule.php b/src/applications/guides/module/PhabricatorGuideQuickStartModule.php --- a/src/applications/guides/module/PhabricatorGuideQuickStartModule.php +++ b/src/applications/guides/module/PhabricatorGuideQuickStartModule.php @@ -14,26 +14,32 @@ return 30; } + public function getIsModuleEnabled() { + return true; + } + public function renderModuleStatus(AphrontRequest $request) { $viewer = $request->getViewer(); + $instance = PhabricatorEnv::getEnvConfig('cluster.instance'); $guide_items = new PhabricatorGuideListView(); - $title = pht('Configure Applications'); - $apps_check = true; - $href = PhabricatorEnv::getURI('/applications/'); - if ($apps_check) { + $title = pht('Create a Repository'); + $repository_check = id(new PhabricatorRepositoryQuery()) + ->setViewer($viewer) + ->execute(); + $href = PhabricatorEnv::getURI('/diffusion/'); + if ($repository_check) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( - "You've uninstalled any unneeded applications for now."); + "You've created at least one repository."); } else { - $icon = 'fa-globe'; + $icon = 'fa-code'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = - pht('Use all our applications, or uninstall the ones you don\'t want.'); + pht('If you are here for code review, let\'s set up your first '. + 'repository.'); } $item = id(new PhabricatorGuideItemView()) @@ -41,26 +47,26 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); - $title = pht('Invite Collaborators'); - $people_check = true; - $href = PhabricatorEnv::getURI('/people/invite/'); - if ($people_check) { + $title = pht('Create a Project'); + $project_check = id(new PhabricatorProjectQuery()) + ->setViewer($viewer) + ->execute(); + $href = PhabricatorEnv::getURI('/project/'); + if ($project_check) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( - 'You will not be alone on this journey.'); + "You've created at least one project."); } else { - $icon = 'fa-group'; + $icon = 'fa-briefcase'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = - pht('Invite the rest of your team to get started on Phabricator.'); + pht('Project tags define everything. Create them for teams, tags, '. + 'or actual projects.'); } $item = id(new PhabricatorGuideItemView()) @@ -68,27 +74,25 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); - $title = pht('Create a Repository'); - $repository_check = true; - $href = PhabricatorEnv::getURI('/diffusion/'); - if ($repository_check) { + $title = pht('Create a Task'); + $task_check = id(new ManiphestTaskQuery()) + ->setViewer($viewer) + ->execute(); + $href = PhabricatorEnv::getURI('/maniphest/'); + if ($task_check) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( - "You've created at least one repository."); + "You've created at least one task."); } else { - $icon = 'fa-code'; + $icon = 'fa-anchor'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = - pht('If you are here for code review, let\'s set up your first '. - 'repository.'); + pht('Create some work for the interns in Maniphest.'); } $item = id(new PhabricatorGuideItemView()) @@ -96,27 +100,25 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); - - $title = pht('Create a Project'); - $project_check = true; - $href = PhabricatorEnv::getURI('/project/'); - if ($project_check) { + $title = pht('Build a Dashboard'); + $have_dashboard = (bool)PhabricatorDashboardInstall::getDashboard( + $viewer, + PhabricatorHomeApplication::DASHBOARD_DEFAULT, + 'PhabricatorHomeApplication'); + $href = PhabricatorEnv::getURI('/dashboard/'); + if ($have_dashboard) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( - "You've created at least one project."); + "You've created at least one dashboard."); } else { - $icon = 'fa-briefcase'; + $icon = 'fa-dashboard'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = - pht('Project tags define everything. Create them for teams, tags, '. - 'or actual projects.'); + pht('Customize the default homepage layout and items.'); } $item = id(new PhabricatorGuideItemView()) @@ -124,26 +126,24 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); - $title = pht('Build a Dashboard'); - $dashboard_check = true; - $href = PhabricatorEnv::getURI('/dashboard/'); - if ($dashboard_check) { + $title = pht('Personalize your Install'); + $wordmark = PhabricatorEnv::getEnvConfig('ui.logo'); + $href = PhabricatorEnv::getURI('/config/edit/ui.logo/'); + if ($wordmark) { $icon = 'fa-check'; $icon_bg = 'bg-green'; - $skip = null; $description = pht( - "You've created at least one dashboard."); + 'It looks amazing, good work. Home Sweet Home.'); } else { - $icon = 'fa-dashboard'; + $icon = 'fa-home'; $icon_bg = 'bg-sky'; - $skip = '#'; $description = - pht('Customize the default homepage layout and items.'); + pht('Change the name and add your company logo, just to give it a '. + 'little extra polish.'); } $item = id(new PhabricatorGuideItemView()) @@ -151,27 +151,43 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); + $title = pht('Explore Applications'); + $href = PhabricatorEnv::getURI('/applications/'); + $icon = 'fa-globe'; + $icon_bg = 'bg-sky'; + $description = + pht('See all the applications included in Phabricator.'); - $title = pht('Personalize your Install'); - $ui_check = true; - $href = PhabricatorEnv::getURI('/config/group/ui/'); - if ($dashboard_check) { - $icon = 'fa-check'; - $icon_bg = 'bg-green'; - $skip = null; - $description = pht( - 'It looks amazing, good work. Home Sweet Home.'); - } else { - $icon = 'fa-home'; - $icon_bg = 'bg-sky'; - $skip = '#'; - $description = - pht('Change the name and add your company logo, just to give it a '. - 'little extra polish.'); + $item = id(new PhabricatorGuideItemView()) + ->setTitle($title) + ->setHref($href) + ->setIcon($icon) + ->setIconBackground($icon_bg) + ->setDescription($description); + $guide_items->addItem($item); + + if (!$instance) { + $title = pht('Invite Collaborators'); + $people_check = id(new PhabricatorPeopleQuery()) + ->setViewer($viewer) + ->execute(); + $people = count($people_check); + $href = PhabricatorEnv::getURI('/people/invite/send/'); + if ($people > 1) { + $icon = 'fa-check'; + $icon_bg = 'bg-green'; + $description = pht( + 'Your invitations have been accepted. You will not be alone on '. + 'this journey.'); + } else { + $icon = 'fa-group'; + $icon_bg = 'bg-sky'; + $description = + pht('Invite the rest of your team to get started on Phabricator.'); + } } $item = id(new PhabricatorGuideItemView()) @@ -179,11 +195,21 @@ ->setHref($href) ->setIcon($icon) ->setIconBackground($icon_bg) - ->setSkipHref($skip) ->setDescription($description); $guide_items->addItem($item); - return $guide_items; + $intro = pht( + 'If your new to Phabricator, these optional steps can help you learn '. + 'the basics. Conceptually, Phabricator is structured as a graph, and '. + 'repositories, tasks, and projects are all independent from each other. '. + 'Feel free to set up Phabricator for how you work best, and explore '. + 'these features at your own pace.'); + + $intro = new PHUIRemarkupView($viewer, $intro); + $intro = id(new PHUIDocumentViewPro()) + ->appendChild($intro); + + return array($intro, $guide_items); } diff --git a/src/applications/guides/module/PhabricatorGuideWelcomeModule.php b/src/applications/guides/module/PhabricatorGuideWelcomeModule.php deleted file mode 100644 --- a/src/applications/guides/module/PhabricatorGuideWelcomeModule.php +++ /dev/null @@ -1,34 +0,0 @@ -getViewer(); - - $content = pht( - 'You have successfully installed Phabricator. These next guides will '. - 'take you through configuration and new user orientation. '. - 'These steps are optional, and you can go through them in any order. '. - 'If you want to get back to this guide later on, you can find it in '. - 'the **Config** application under **Welcome Guide**.'); - - $content = new PHUIRemarkupView($viewer, $content); - - return id(new PHUIDocumentViewPro()) - ->appendChild($content); - - } - -} diff --git a/src/applications/home/controller/PhabricatorHomeMainController.php b/src/applications/home/controller/PhabricatorHomeMainController.php --- a/src/applications/home/controller/PhabricatorHomeMainController.php +++ b/src/applications/home/controller/PhabricatorHomeMainController.php @@ -209,7 +209,7 @@ $content = pht(<<menu; } - public function addFilter($key, $name, $uri = null) { + public function addFilter($key, $name, $uri = null, $icon = null) { return $this->addThing( - $key, $name, $uri, PHUIListItemView::TYPE_LINK); + $key, $name, $uri, PHUIListItemView::TYPE_LINK, $icon); } public function addButton($key, $name, $uri = null) { @@ -105,11 +105,15 @@ $key, $name, $uri, PHUIListItemView::TYPE_BUTTON); } - private function addThing($key, $name, $uri, $type) { + private function addThing($key, $name, $uri, $type, $icon) { $item = id(new PHUIListItemView()) ->setName($name) ->setType($type); + if (strlen($icon)) { + $item->setIcon($icon); + } + if (strlen($key)) { $item->setKey($key); diff --git a/webroot/rsrc/css/application/config/config-welcome.css b/webroot/rsrc/css/application/config/config-welcome.css deleted file mode 100644 --- a/webroot/rsrc/css/application/config/config-welcome.css +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @provides config-welcome-css - */ - -.phui-document-content .config-welcome-box .phabricator-remarkup { - padding: 0 16px 16px; - position: relative; -} - -.config-welcome-box { - padding: 8px 0; -} - -.config-welcome-content { - margin-left: 44px; -} - -.config-welcome-box .config-welcome-icon { - width: 32px; - float: left; - text-align: center; -} - -.phui-document-view-pro .phui-document-content .config-welcome-box - .phabricator-remarkup { - margin: 0; - padding: 0; - }