call to backend and setup angular

This commit is contained in:
Kayn Ty 2018-04-05 14:21:32 +02:00
parent b560b768ae
commit d1ea133d76
21 changed files with 624 additions and 40 deletions

View File

@ -1,25 +1,41 @@
<div class="caisse-main row"> <div class="caisse-main row"
<div class="listing-products col-9"> ng-app="caisse"
ng-controller="CaisseCtrl"
>
{% verbatim %}
<div class="alert">
test stuff: {{ stuff[0] }}.
<br>compte: {{ stuff.length }}.
</div>
<div class="well">
{{productsFromDB.length}}
</div>
{% endverbatim %}
<div class="listing-products col-xs-9">
{% for c in categories %} {% for c in categories %}
<h2> <h2>
{{ c.name }} {{ c.name }}
</h2> </h2>
{% for p in c.products %} {% for p in c.products %}
<button class="btn btn-default"> <button class="btn btn-default"
ng-click="addProduct({{ p.id }})">
{{ p.name }} {{ p.name }}
</button> </button>
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
</div> </div>
<div class="sellings col-3"> <div class="sellings col-xs-3">
<div class="current-selling"> <div class="current-selling">
<form action=""> <form action="">
<ul> <ul>
<li>title x1 xxx€</li> {% verbatim %}
</ul>
<h3>Total: xxx€</h3>
<li ng-repeat="p in activeSelling">
{{p.name}} x1 {{p.price}}
</li>
</ul>
<h3>Total: {{CurrentSellingTotal}}€</h3>
{% endverbatim %}
<input type="number" id="paid_amount"> <input type="number" id="paid_amount">
<h3>Rendu: xxxx€</h3> <h3>Rendu: xxxx€</h3>
<div class="row"> <div class="row">
@ -55,9 +71,17 @@
<h4> <h4>
Ventes récentes Ventes récentes
</h4> </h4>
{% if recentSells %}
<ul> <ul>
<li>h:m:s xxxx€</li> {% for s in recentSells %}
<li>{{ s.date|date('Y/m/d H:i:s') }} {{ s.amount }}€</li>
{% endfor %}
</ul> </ul>
{% else %}
aucune
{% endif %}
</div> </div>
</div> </div>

View File

@ -0,0 +1,21 @@
{% extends 'base.html.twig' %}
{% block body %}
<h1>Sellrecord edit</h1>
{{ form_start(edit_form) }}
{{ form_widget(edit_form) }}
<input type="submit" value="Edit" />
{{ form_end(edit_form) }}
<ul>
<li>
<a href="{{ path('sellrecord_index') }}">Back to the list</a>
</li>
<li>
{{ form_start(delete_form) }}
<input type="submit" value="Delete">
{{ form_end(delete_form) }}
</li>
</ul>
{% endblock %}

View File

@ -0,0 +1,37 @@
{% extends 'base.html.twig' %}
{% block body %}
<h1>Sellrecords list</h1>
<table>
<thead>
<tr>
<th>Date</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for sellRecord in sellRecords %}
<tr>
<td><a href="{{ path('sellrecord_show', { 'date': sellRecord.date }) }}">{{ sellRecord.date }}</a></td>
<td>
<ul>
<li>
<a href="{{ path('sellrecord_show', { 'date': sellRecord.date }) }}">show</a>
</li>
<li>
<a href="{{ path('sellrecord_edit', { 'date': sellRecord.date }) }}">edit</a>
</li>
</ul>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<ul>
<li>
<a href="{{ path('sellrecord_new') }}">Create a new sellRecord</a>
</li>
</ul>
{% endblock %}

View File

@ -0,0 +1,16 @@
{% extends 'base.html.twig' %}
{% block body %}
<h1>Sellrecord creation</h1>
{{ form_start(form) }}
{{ form_widget(form) }}
<input type="submit" value="Create" />
{{ form_end(form) }}
<ul>
<li>
<a href="{{ path('sellrecord_index') }}">Back to the list</a>
</li>
</ul>
{% endblock %}

View File

@ -0,0 +1,28 @@
{% extends 'base.html.twig' %}
{% block body %}
<h1>Sellrecord</h1>
<table>
<tbody>
<tr>
<th>Date</th>
<td>{% if sellRecord.date %}{{ sellRecord.date|date('Y-m-d H:i:s') }}{% endif %}</td>
</tr>
</tbody>
</table>
<ul>
<li>
<a href="{{ path('sellrecord_index') }}">Back to the list</a>
</li>
<li>
<a href="{{ path('sellrecord_edit', { 'date': sellRecord.date }) }}">Edit</a>
</li>
<li>
{{ form_start(delete_form) }}
<input type="submit" value="Delete">
{{ form_end(delete_form) }}
</li>
</ul>
{% endblock %}

View File

@ -1,3 +1,7 @@
app_sell_record:
resource: "@AppBundle/Controller/SellRecordController.php"
type: annotation
hwi_oauth_redirect: hwi_oauth_redirect:
resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml" resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml"
prefix: /connect prefix: /connect
@ -26,3 +30,11 @@ app:
type: annotation type: annotation
fos_user: fos_user:
resource: "@FOSUserBundle/Resources/config/routing/all.xml" resource: "@FOSUserBundle/Resources/config/routing/all.xml"
get_my_products:
path: /get-my-products
defaults: { _controller: AppBundle:Default:getMyProducts }
add_selling:
path: /add-selling
defaults: { _controller: AppBundle:Default:addSelling }

View File

@ -1,2 +1,4 @@
require('../css/app.scss'); require('../css/app.scss');
require('../../node_modules/jquery/dist/jquery.min');
require('../../node_modules/angular/angular.min.js');
require('./parts/main.js'); require('./parts/main.js');

View File

@ -1,2 +1,70 @@
console.log('hello console for main.js'); console.log('hello console for main.js');
var stuff = ['initialstuff'];
angular
.module('caisse', [])
.controller('CaisseCtrl', ['$scope', '$http', function ($scope, $http, stuff) {
$scope.productsFromDB = [
{id: 1, name: "truc 1", price: 8, category: 1},
{id: 2, name: "truc 2", price: 2, category: 1},
{id: 3, name: "truc 3", price: 4, category: 2},
{id: 4, name: "truc 4", price: 1, category: 2},
];
$scope.pausedSelling = [];
$scope.activeSelling = [];
$scope.CurrentSellingTotal = $scope.activeSelling.reduce(function (a, b) {
return a + b.price;
}, 0);
$scope.stuff = stuff;
$scope.setActiveSelling = function (selling) {
$scope.activeSelling = selling;
};
$scope.pauseSelling = function (selling) {
$scope.pausedSelling.push(selling);
};
$scope.addProduct = function (id) {
let found = $scope.productsFromDB.find({id: id});
if (found) {
$scope.productsToRecord.push(found);
}
};
$scope.fetchProductsFromDB = function () {
console.log('fetch products...');
$http.get('get-my-products').then((data) => {
console.log('ok');
$scope.productsFromDB = data;
}, (err) => {
console.log(err);
});
};
$scope.init = (function () {
$scope.fetchProductsFromDB();
})();
$scope.logtest = function () {
console.log('log test ok');
};
$scope.sendForm = function () {
let lesParams = {};
$http({
method: 'POST',
url : '/add-selling',
data : lesParams // pass in data as strings
}).then(function (rep) {
console.log(rep);
if (!rep.success) {
// if not successful, bind errors to error variables
$scope.errors = rep.errors;
} else {
// if successful, bind success message to message
$scope.successMessage = rep.data.message;
// changer le type de bout de phrase demandé
$scope.formData["tykayn_portfoliobundle_cadexqphrasepart[type]"]["$viewValue"] = 'nouveauType';
}
}, function (rep) {
console.log('nope! ', rep.data);
})
;
};
}]);

View File

@ -8,7 +8,9 @@
"webpack-notifier": "^1.6.0" "webpack-notifier": "^1.6.0"
}, },
"dependencies": { "dependencies": {
"angular": "1.5",
"bootstrap": "^4.0.0", "bootstrap": "^4.0.0",
"font-awesome": "^4.7.0" "font-awesome": "^4.7.0",
"jquery": "1.19"
} }
} }

View File

@ -39,19 +39,29 @@ class DefaultController extends Controller {
$m = $this->getDoctrine()->getManager(); $m = $this->getDoctrine()->getManager();
$currentUser = $this->getUser(); $currentUser = $this->getUser();
$categRepo = $m->getRepository( 'AppBundle:ProductCategory' ); $categRepo = $m->getRepository( 'AppBundle:ProductCategory' );
$sellingRepo = $m->getRepository( 'AppBundle:SellRecord' );
$categories = $categRepo->findAll(); $categories = $categRepo->findAll();
$csrfToken = $this->tokenManager $recentSells = $sellingRepo->findBy( [], [ 'id' => 'desc' ], 0, 5 );
? $this->tokenManager->getToken( 'authenticate' )->getValue()
: null;
// replace this example code with whatever you need // replace this example code with whatever you need
return $this->render( 'logged/dashboard.html.twig', return $this->render( 'logged/dashboard.html.twig',
[ [
'categories' => $categories, 'categories' => $categories,
'currentUser' => $currentUser, 'currentUser' => $currentUser,
'csrf_token' => $csrfToken, 'recentSells' => $recentSells,
'base_dir' => realpath( $this->getParameter( 'kernel.project_dir' ) ) . DIRECTORY_SEPARATOR, 'base_dir' => realpath( $this->getParameter( 'kernel.project_dir' ) ) . DIRECTORY_SEPARATOR,
] ); ] );
} }
public function getMyProductsAction() {
return new JsonResponse( [
[ 'id' => 1, "name" => 'truc', "category" => 1, "price" => 9 ],
// [ 'id' => 2, name => 'truc2', category => 1, price => 4 ],
// [ id => 3, name => 'truc3', category => 2, price => 1 ],
] );
}
public function addSellingAction() {
return new JsonResponse( [ "message" => "ok" ] );
}
} }

View File

@ -0,0 +1,136 @@
<?php
namespace AppBundle\Controller;
use AppBundle\Entity\SellRecord;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Symfony\Component\HttpFoundation\Request;
/**
* Sellrecord controller.
*
* @Route("sellrecord")
*/
class SellRecordController extends Controller
{
/**
* Lists all sellRecord entities.
*
* @Route("/", name="sellrecord_index")
* @Method("GET")
*/
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$sellRecords = $em->getRepository('AppBundle:SellRecord')->findAll();
return $this->render('sellrecord/index.html.twig', array(
'sellRecords' => $sellRecords,
));
}
/**
* Creates a new sellRecord entity.
*
* @Route("/new", name="sellrecord_new")
* @Method({"GET", "POST"})
*/
public function newAction(Request $request)
{
$sellRecord = new Sellrecord();
$form = $this->createForm('AppBundle\Form\SellRecordType', $sellRecord);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($sellRecord);
$em->flush();
return $this->redirectToRoute('sellrecord_show', array('date' => $sellRecord->getDate()));
}
return $this->render('sellrecord/new.html.twig', array(
'sellRecord' => $sellRecord,
'form' => $form->createView(),
));
}
/**
* Finds and displays a sellRecord entity.
*
* @Route("/{date}", name="sellrecord_show")
* @Method("GET")
*/
public function showAction(SellRecord $sellRecord)
{
$deleteForm = $this->createDeleteForm($sellRecord);
return $this->render('sellrecord/show.html.twig', array(
'sellRecord' => $sellRecord,
'delete_form' => $deleteForm->createView(),
));
}
/**
* Displays a form to edit an existing sellRecord entity.
*
* @Route("/{date}/edit", name="sellrecord_edit")
* @Method({"GET", "POST"})
*/
public function editAction(Request $request, SellRecord $sellRecord)
{
$deleteForm = $this->createDeleteForm($sellRecord);
$editForm = $this->createForm('AppBundle\Form\SellRecordType', $sellRecord);
$editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('sellrecord_edit', array('date' => $sellRecord->getDate()));
}
return $this->render('sellrecord/edit.html.twig', array(
'sellRecord' => $sellRecord,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
}
/**
* Deletes a sellRecord entity.
*
* @Route("/{date}", name="sellrecord_delete")
* @Method("DELETE")
*/
public function deleteAction(Request $request, SellRecord $sellRecord)
{
$form = $this->createDeleteForm($sellRecord);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->remove($sellRecord);
$em->flush();
}
return $this->redirectToRoute('sellrecord_index');
}
/**
* Creates a form to delete a sellRecord entity.
*
* @param SellRecord $sellRecord The sellRecord entity
*
* @return \Symfony\Component\Form\Form The form
*/
private function createDeleteForm(SellRecord $sellRecord)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('sellrecord_delete', array('date' => $sellRecord->getDate())))
->setMethod('DELETE')
->getForm()
;
}
}

View File

@ -5,7 +5,7 @@ namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* @ORM\Entity(repositoryClass="App\Repository\ProductRepository") * @ORM\Entity(repositoryClass="AppBundle\Repository\ProductRepository")
*/ */
class Product { class Product {
/** /**
@ -88,4 +88,45 @@ class Product {
public function setCategory( ProductCategory $category ) { public function setCategory( ProductCategory $category ) {
$this->category = $category; $this->category = $category;
} }
/**
* Constructor
*/
public function __construct()
{
$this->sellRecords = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add sellRecord
*
* @param \AppBundle\Entity\SellRecord $sellRecord
*
* @return Product
*/
public function addSellRecord(\AppBundle\Entity\SellRecord $sellRecord)
{
$this->sellRecords[] = $sellRecord;
return $this;
}
/**
* Remove sellRecord
*
* @param \AppBundle\Entity\SellRecord $sellRecord
*/
public function removeSellRecord(\AppBundle\Entity\SellRecord $sellRecord)
{
$this->sellRecords->removeElement($sellRecord);
}
/**
* Get sellRecords
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getSellRecords()
{
return $this->sellRecords;
}
} }

View File

@ -5,7 +5,7 @@ namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* @ORM\Entity(repositoryClass="App\Repository\ProductCategoryRepository") * @ORM\Entity(repositoryClass="AppBundle\Repository\ProductCategoryRepository")
*/ */
class ProductCategory { class ProductCategory {
/** /**
@ -67,4 +67,32 @@ class ProductCategory {
$this->name = $name; $this->name = $name;
} }
/**
* Constructor
*/
public function __construct() {
$this->products = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add product
*
* @param \AppBundle\Entity\Product $product
*
* @return ProductCategory
*/
public function addProduct( \AppBundle\Entity\Product $product ) {
$this->products[] = $product;
return $this;
}
/**
* Remove product
*
* @param \AppBundle\Entity\Product $product
*/
public function removeProduct( \AppBundle\Entity\Product $product ) {
$this->products->removeElement( $product );
}
} }

View File

@ -13,14 +13,36 @@ class SellRecord {
*/ */
private $products; private $products;
/** /**
* @ORM\Id * @ORM\Id
* @ORM\GeneratedValue * @ORM\GeneratedValue
* @ORM\Column(name="id")
*/
private $id;
/**
* @ORM\Column(type="datetime") * @ORM\Column(type="datetime")
*/ */
private $date; private $date;
/**
* @ORM\Column(type="decimal", scale=2, nullable=true)
*/
private $amount;
/**
* @return mixed
*/
public function getAmount() {
return $this->amount;
}
/**
* @param mixed $amount
*/
public function setAmount( $amount ) {
$this->amount = $amount;
}
/** /**
* @return mixed * @return mixed
*/ */
@ -57,9 +79,9 @@ class SellRecord {
} }
/** /**
* @param mixed $date * @param \DateTime $date
*/ */
public function setDate( $date ) { public function setDate( \DateTime $date ) {
$this->date = $date; $this->date = $date;
} }

View File

@ -5,7 +5,7 @@ namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
/** /**
* @ORM\Entity(repositoryClass="App\Repository\SellRecordRepository") * @ORM\Entity(repositoryClass="AppBundle\Repository\SellRecordRepository")
*/ */
class SellRecord { class SellRecord {
/** /**
@ -21,6 +21,8 @@ class SellRecord {
*/ */
private $date; private $date;
private $amount;
/** /**
* @return mixed * @return mixed
*/ */

View File

@ -63,4 +63,3 @@ class Stuff
return $this->truc; return $this->truc;
} }
} }

View File

@ -36,4 +36,28 @@ class User extends BaseUser {
public function getId() { public function getId() {
return $this->id; return $this->id;
} }
/**
* Set googleId
*
* @param string $googleId
*
* @return User
*/
public function setGoogleId($googleId)
{
$this->googleId = $googleId;
return $this;
}
/**
* Get googleId
*
* @return string
*/
public function getGoogleId()
{
return $this->googleId;
}
} }

View File

@ -0,0 +1,36 @@
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SellRecordType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('products');
}/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\SellRecord'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_sellrecord';
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace AppBundle\Repository;
/**
* StuffRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class StuffRepository extends \Doctrine\ORM\EntityRepository
{
}

View File

@ -0,0 +1,55 @@
<?php
namespace AppBundle\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class SellRecordControllerTest extends WebTestCase
{
/*
public function testCompleteScenario()
{
// Create a new client to browse the application
$client = static::createClient();
// Create a new entry in the database
$crawler = $client->request('GET', '/sellrecord/');
$this->assertEquals(200, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET /sellrecord/");
$crawler = $client->click($crawler->selectLink('Create a new entry')->link());
// Fill in the form and submit it
$form = $crawler->selectButton('Create')->form(array(
'appbundle_sellrecord[field_name]' => 'Test',
// ... other fields to fill
));
$client->submit($form);
$crawler = $client->followRedirect();
// Check data in the show view
$this->assertGreaterThan(0, $crawler->filter('td:contains("Test")')->count(), 'Missing element td:contains("Test")');
// Edit the entity
$crawler = $client->click($crawler->selectLink('Edit')->link());
$form = $crawler->selectButton('Update')->form(array(
'appbundle_sellrecord[field_name]' => 'Foo',
// ... other fields to fill
));
$client->submit($form);
$crawler = $client->followRedirect();
// Check the element contains an attribute with value equals "Foo"
$this->assertGreaterThan(0, $crawler->filter('[value="Foo"]')->count(), 'Missing element [value="Foo"]');
// Delete the entity
$client->submit($crawler->selectButton('Delete')->form());
$crawler = $client->followRedirect();
// Check the entity has been delete on the list
$this->assertNotRegExp('/Foo/', $client->getResponse()->getContent());
}
*/
}

View File

@ -132,6 +132,10 @@ amdefine@>=0.0.4:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
angular@1.5:
version "1.5.11"
resolved "https://registry.yarnpkg.com/angular/-/angular-1.5.11.tgz#8c5ba7386f15965c9acf3429f6881553aada30d6"
ansi-html@0.0.7: ansi-html@0.0.7:
version "0.0.7" version "0.0.7"
resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
@ -2943,6 +2947,10 @@ isstream@~0.1.2:
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
jquery@1.19:
version "3.3.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca"
js-base64@^2.1.8, js-base64@^2.1.9: js-base64@^2.1.8, js-base64@^2.1.9:
version "2.4.3" version "2.4.3"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582"