浏览代码

Display confirmation screen for users with JS

Jordi Boggiano 14 年之前
父节点
当前提交
1b3c7d2b6d

+ 17 - 29
src/Packagist/WebBundle/Controller/WebController.php

@@ -21,6 +21,7 @@ use Packagist\WebBundle\Entity\Version;
 use Packagist\WebBundle\Form\PackageType;
 use Packagist\WebBundle\Form\VersionType;
 use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
@@ -83,47 +84,34 @@ class WebController extends Controller
     }
 
     /**
-     * @Template()
      * @Route("/submit/fetch-info", name="submit.fetch_info", defaults={"_format"="json"})
      */
     public function fetchInfoAction()
     {
-        // TODO refactor, this must validate then retrive the name and return that as json, or just return the errors
-        $session = $this->get('session');
-        $em = $this->getDoctrine()->getEntityManager();
         $package = new Package;
+        $package->setRepositoryProvider($this->get('packagist.repository_provider'));
+        $form = $this->createForm(new PackageType, $package);
 
-        if ($repository = $session->get('repository')) {
-            $session->remove('repository');
-            $package->setRepository($repository);
-            $package->fromProvider($this->get('packagist.repository_provider'));
-        }
-
-        $form = $this->createForm(new ConfirmPackageType, $package);
-
+        $response = array('status' => 'error', 'reason' => 'No data posted.');
         $request = $this->getRequest();
         if ($request->getMethod() == 'POST') {
             $form->bindRequest($request);
-            $package->fromProvider($this->get('packagist.repository_provider'));
-
-            $children = $form->getChildren();
-            if ($children['repository']->isValid()) {
-                $user = $this->getUser();
-                $package->addMaintainers($user);
-
-                $em = $this->getDoctrine()->getEntityManager();
-                $em->persist($package);
-                $em->flush();
-
-                $this->get('session')->remove('repository');
-
-                return new RedirectResponse($this->generateUrl('home'));
+            if ($form->isValid()) {
+                $response = array('status' => 'success', 'name' => $package->getName());
+            } else {
+                $errors = array();
+                foreach ($form->getChildren() as $child) {
+                    if ($child->hasErrors()) {
+                        foreach ($child->getErrors() as $error) {
+                            $errors[] = $error->getMessageTemplate();
+                        }
+                    }
+                }
+                $response = array('status' => 'error', 'reason' => $errors);
             }
-        } elseif (!$repository) {
-            return new RedirectResponse($this->generateUrl('submit'));
         }
 
-        return array('form' => $form->createView(), 'package' => $package, 'page' => 'submit');
+        return new Response(json_encode($response));
     }
 
     /**

+ 1 - 1
src/Packagist/WebBundle/Entity/Package.php

@@ -129,7 +129,7 @@ class Package
         // TODO use more specialized exception for repos
 
         if (!isset($information['name']) || !$information['name']) {
-            $context->addViolation('The package name was not be found, your composer.json file must be invalid or missing in your master branch/trunk.', array(), null);
+            $context->addViolation('The package name was not found, your composer.json file must be invalid or missing in your master branch/trunk. Maybe the URL you entered has a typo.', array(), null);
             return;
         }
     }

+ 6 - 0
src/Packagist/WebBundle/Resources/public/css/main.css

@@ -194,6 +194,12 @@ textarea {
 input[type="submit"] {
   width: 406px;
   float: none;
+  background-image: url(../img/arrow.png);
+  background-position: 370px center;
+  background-repeat: no-repeat;
+}
+input[type="submit"].loading {
+  background-image: url(../img/loader.gif);
 }
 
 form ul {

二进制
src/Packagist/WebBundle/Resources/public/img/arrow.png


二进制
src/Packagist/WebBundle/Resources/public/img/loader.gif


+ 35 - 0
src/Packagist/WebBundle/Resources/public/js/submitPackage.js

@@ -0,0 +1,35 @@
+(function($) {
+    var onSubmit = function(e) {
+        var success;
+        $('div > ul, div.confirmation', this).remove();
+        success = function (data) {
+            var html = '';
+            $('#submit').removeClass('loading');
+            if (data.status === 'error') {
+                $.each(data.reason, function (k, v) {
+                    html += '<li>'+v+'</li>';
+                });
+                $('#submit-package-form div').prepend('<ul>'+html+'</ul>');
+            } else {
+                $('#submit-package-form input[type="submit"]').before(
+                    '<div class="confirmation">The package name found for you repository is: '+data.name+', press Submit to confirm.</div>'
+                );
+                $('#submit').val('Submit');
+                $('#submit-package-form').unbind('submit');
+            }
+        };
+        $.post($(this).data('check-url'), $(this).serializeArray(), success);
+        $('#submit').addClass('loading');
+        // TODO display loader icon
+        e.preventDefault();
+    }
+
+    $('#package_repository').change(function() {
+        $('#submit-package-form').unbind('submit');
+        $('#submit-package-form').submit(onSubmit);
+        $('#submit').val('Check');
+    });
+
+    $('#package_repository').triggerHandler('change');
+})($);
+

+ 2 - 3
src/Packagist/WebBundle/Resources/views/Web/submitPackage.html.twig

@@ -6,9 +6,8 @@
 
 {% block content %}
     <h1>Submit package</h1>
-    <form action="" method="POST" {{ form_enctype(form) }}>
-        <div id="form">
-            {{ form_errors(form) }}
+    <form id="submit-package-form" action="" data-check-url="{{ path('submit.fetch_info') }}" method="POST" {{ form_enctype(form) }}>
+        <div>
             <p>
                 {{ form_label(form.repository, "Repository URL (Git only at the moment)") }}
                 {{ form_errors(form.repository) }}