From 87a01e367b61fa4286cc06c046e12aad7df8043b Mon Sep 17 00:00:00 2001 From: pitrackster Date: Wed, 1 Jul 2015 13:43:10 +0200 Subject: [PATCH 01/11] test --- versionsssss.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 versionsssss.txt diff --git a/versionsssss.txt b/versionsssss.txt new file mode 100644 index 000000000..e69de29bb From 4483867c983138dce6ebd5d66f8be48efb223e6b Mon Sep 17 00:00:00 2001 From: pitrackster Date: Wed, 1 Jul 2015 13:43:10 +0200 Subject: [PATCH 02/11] first commit --- .../Player/ExercisePlayerController.php | 54 +++++ DependencyInjection/UJMExoExtension.php | 1 + Entity/Player/ExercisePlayer.php | 218 ++++++++++++++++++ Form/Player/ExercisePlayerType.php | 39 ++++ Listener/Resource/ExercisePlayerListener.php | 119 ++++++++++ .../pdo_mysql/Version20150702121020.php | 45 ++++ Resources/config/config.yml | 8 + Resources/config/form_types.yml | 6 + Resources/config/parameters.yml | 3 + Resources/config/routing.yml | 5 + Resources/config/services.yml | 12 + .../player/Page/Controllers/PageEditCtrl.js | 7 + .../player/Page/Controllers/PageShowCtrl.js | 14 ++ .../Page/Directives/PageShowDirective.js | 27 +++ .../public/js/player/Page/Partials/edit.html | 3 + .../public/js/player/Page/Partials/show.html | 3 + .../js/player/Page/Services/PageService.js | 33 +++ Resources/public/js/player/Page/module.js | 11 + Resources/public/js/player/editor.module.js | 11 + Resources/public/js/player/player.module.js | 15 ++ Resources/public/less/exercise-player.less | 4 + Resources/translations/resource.en.yml | 6 + Resources/translations/resource.fr.yml | 7 + Resources/views/Player/edit.html.twig | 19 ++ Resources/views/Player/layout.html.twig | 64 +++++ Resources/views/Player/view.html.twig | 38 +++ UJMExoBundle.php | 31 ++- composer.json | 8 +- 28 files changed, 802 insertions(+), 9 deletions(-) create mode 100644 Controller/Player/ExercisePlayerController.php create mode 100644 Entity/Player/ExercisePlayer.php create mode 100644 Form/Player/ExercisePlayerType.php create mode 100644 Listener/Resource/ExercisePlayerListener.php create mode 100644 Migrations/pdo_mysql/Version20150702121020.php create mode 100644 Resources/config/form_types.yml create mode 100644 Resources/public/js/player/Page/Controllers/PageEditCtrl.js create mode 100644 Resources/public/js/player/Page/Controllers/PageShowCtrl.js create mode 100644 Resources/public/js/player/Page/Directives/PageShowDirective.js create mode 100644 Resources/public/js/player/Page/Partials/edit.html create mode 100644 Resources/public/js/player/Page/Partials/show.html create mode 100644 Resources/public/js/player/Page/Services/PageService.js create mode 100644 Resources/public/js/player/Page/module.js create mode 100644 Resources/public/js/player/editor.module.js create mode 100644 Resources/public/js/player/player.module.js create mode 100644 Resources/public/less/exercise-player.less create mode 100644 Resources/views/Player/edit.html.twig create mode 100644 Resources/views/Player/layout.html.twig create mode 100644 Resources/views/Player/view.html.twig diff --git a/Controller/Player/ExercisePlayerController.php b/Controller/Player/ExercisePlayerController.php new file mode 100644 index 000000000..3a80a0785 --- /dev/null +++ b/Controller/Player/ExercisePlayerController.php @@ -0,0 +1,54 @@ +container->get('security.context')->isGranted('OPEN', $resource->getResourceNode())) { + throw new AccessDeniedException(); + } + return $this->render('UJMExoBundle:Player:view.html.twig', array( + '_resource' => $resource + ) + ); + } + + /** + * administrate an exercise player + * @Route("/edit/{id}", requirements={"id" = "\d+"}, name="ujm_player_administrate") + * @Method("GET") + * @ParamConverter("ExercisePlayer", class="UJMExoBundle:Player\ExercisePlayer") + */ + public function administrateAction(ExercisePlayer $resource) { + if (false === $this->container->get('security.context')->isGranted('ADMINISTRATE', $resource->getResourceNode())) { + throw new AccessDeniedException(); + } + return $this->render('UJMExoBundle:Player:edit.html.twig', array( + '_resource' => $resource + ) + ); + } +} diff --git a/DependencyInjection/UJMExoExtension.php b/DependencyInjection/UJMExoExtension.php index 77fcc4465..48e64ffbe 100755 --- a/DependencyInjection/UJMExoExtension.php +++ b/DependencyInjection/UJMExoExtension.php @@ -15,5 +15,6 @@ public function load(array $configs, ContainerBuilder $container) $loader = new YamlFileLoader($container, $locator); $loader->load('services.yml'); $loader->load('parameters.yml'); + $loader->load('form_types.yml'); } } diff --git a/Entity/Player/ExercisePlayer.php b/Entity/Player/ExercisePlayer.php new file mode 100644 index 000000000..e15a3efce --- /dev/null +++ b/Entity/Player/ExercisePlayer.php @@ -0,0 +1,218 @@ +published = false; + $this->modified = false; + $this->startDate = new \DateTime(); + } + + /** + * Get player Id + * @return integer + */ + public function getId() { + return $this->id; + } + + /** + * Set player name + * @param string $name + * @return \UJM\ExoBundle\Entity\Player + */ + public function setName($name) { + $this->name = $name; + return $this; + } + + /** + * Get player name + * @return string + */ + public function getName() { + return $this->name; + } + + /** + * Set player startDate + * + * @param datetime $startDate + * @return \UJM\ExoBundle\Entity\Player + */ + public function setStartDate($startDate) { + $this->startDate = $startDate; + return $this; + } + + /** + * Get player startDate + * + * @return datetime + */ + public function getStartDate() { + return $this->startDate; + } + + /** + * Set player endDate + * + * @param datetime $endDate + * @return \UJM\ExoBundle\Entity\Player + */ + public function setEndDate($endDate) { + $this->endDate = $endDate; + return $this; + } + + /** + * Get player endDate + * + * @return datetime + */ + public function getEndDate() { + return $this->endDate; + } + + /** + * Set player description + * + * @param text $description + * @return \UJM\ExoBundle\Entity\Player + */ + public function setDescription($description) { + $this->description = $description; + return $this; + } + + /** + * Get player description + * + * @return text + */ + public function getDescription() { + return $this->description; + } + + /** + * Set player shuffle property + * + * @param boolean $shuffle + * @return \UJM\ExoBundle\Entity\Player + */ + public function setShuffle($shuffle) { + $this->shuffle = $shuffle; + return $this; + } + + /** + * Get player shuffle property + * @return boolean + */ + public function getShuffle() { + return $this->shuffle; + } + + /** + * Set player published property + * @param boolean $published + * @return \UJM\ExoBundle\Entity\Player + */ + public function setPublished($published) { + $this->published = $published; + return $this; + } + + /** + * Get player published property + * @return boolean + */ + public function getPublished() { + return $this->published; + } + + /** + * Set player modified property + * @param boolean $modified + * @return \UJM\ExoBundle\Entity\Player + */ + public function setModified($modified) { + $this->modified = $modified; + return $this; + } + + /** + * Get player modified property + * @return boolean + */ + public function getModified() { + return $this->modified; + } + +} diff --git a/Form/Player/ExercisePlayerType.php b/Form/Player/ExercisePlayerType.php new file mode 100644 index 000000000..b3c943126 --- /dev/null +++ b/Form/Player/ExercisePlayerType.php @@ -0,0 +1,39 @@ +add( + 'name', 'text', array( + 'data' => 'exercise' + ) + ) + ->add('description', 'tinymce', array( + 'attr' => array('data-new-tab' => 'yes'), + 'label' => 'Description', 'required' => false + ) + ); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults( + array( + 'data_class' => 'UJM\ExoBundle\Entity\Player\ExercisePlayer', + ) + ); + } + + public function getName() + { + return 'exercise_player_type'; + } +} diff --git a/Listener/Resource/ExercisePlayerListener.php b/Listener/Resource/ExercisePlayerListener.php new file mode 100644 index 000000000..1ac08ff68 --- /dev/null +++ b/Listener/Resource/ExercisePlayerListener.php @@ -0,0 +1,119 @@ +getResource(); + $route = $this->container + ->get('router') + ->generate('ujm_player_administrate', array('id' => $resource->getId()) + ); + $event->setResponse(new RedirectResponse($route)); + $event->stopPropagation(); + } + + /** + * Fired when a new ResourceNode of type ExercisePlayer is opened + * @param \Claroline\CoreBundle\Event\OpenResourceEvent $event + * @throws \Exception + */ + public function onOpen(OpenResourceEvent $event) { + $resource = $event->getResource(); + //Redirection to the controller. + $route = $this->container + ->get('router') + ->generate('ujm_player_open', array('id' => $resource->getId())); + $event->setResponse(new RedirectResponse($route)); + $event->stopPropagation(); + } + + /** + * + * @param CreateResourceEvent $event + * @throws \Exception + */ + public function onCreate(CreateResourceEvent $event) { + // Create form + $form = $this->container->get('form.factory')->create('exercise_player_type', new ExercisePlayer()); + // Try to process form + $request = $this->container->get('request'); + $form->submit($request); + if ($form->isValid()) { + $resource = $form->getData(); + $event->setResources(array($resource)); + } else { + $content = $this->container->get('templating')->render( + 'ClarolineCoreBundle:Resource:createForm.html.twig', array( + 'form' => $form->createView(), + 'resourceType' => 'ujm_exercise_player' + )); + $event->setErrorFormContent($content); + } + $event->stopPropagation(); + return; + } + + /** + * + * @param CreateFormResourceEvent $event + */ + public function onCreateForm(CreateFormResourceEvent $event) { + // Create form + $form = $this->container->get('form.factory')->create('exercise_player_type', new ExercisePlayer()); + + $content = $this->container->get('templating')->render( + 'ClarolineCoreBundle:Resource:createForm.html.twig', array( + 'form' => $form->createView(), + 'resourceType' => 'ujm_exercise_player' + )); + + + $event->setResponseContent($content); + $event->stopPropagation(); + } + + /** + * Fired when a ResourceNode of type ExercisePlayer is deleted + * @param \Claroline\CoreBundle\Event\DeleteResourceEvent $event + * @throws \Exception + */ + public function onDelete(DeleteResourceEvent $event) { + $em = $this->container->get('doctrine.orm.entity_manager'); + $resource = $event->getResource(); + $em->remove($$resource); + $event->stopPropagation(); + } + + /** + * Fired when a ResourceNode of type ExercisePlayer is duplicated + * @param \Claroline\CoreBundle\Event\CopyResourceEvent $event + * @throws \Exception + */ + public function onCopy(CopyResourceEvent $event) { + $toCopy = $event->getResource(); + $new = new ExercisePlayer(); + $new->setName($toCopy->getName()); + $event->setCopy($new); + $event->stopPropagation(); + } + +} diff --git a/Migrations/pdo_mysql/Version20150702121020.php b/Migrations/pdo_mysql/Version20150702121020.php new file mode 100644 index 000000000..aa850bcc0 --- /dev/null +++ b/Migrations/pdo_mysql/Version20150702121020.php @@ -0,0 +1,45 @@ +addSql(" + CREATE TABLE ujm_exercise_player ( + id INT AUTO_INCREMENT NOT NULL, + name VARCHAR(255) NOT NULL, + description LONGTEXT DEFAULT NULL, + start_date DATETIME NOT NULL, + end_date DATETIME DEFAULT NULL, + published TINYINT(1) NOT NULL, + modified TINYINT(1) NOT NULL, + resourceNode_id INT DEFAULT NULL, + UNIQUE INDEX UNIQ_746F5F97B87FAB32 (resourceNode_id), + PRIMARY KEY(id) + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB + "); + $this->addSql(" + ALTER TABLE ujm_exercise_player + ADD CONSTRAINT FK_746F5F97B87FAB32 FOREIGN KEY (resourceNode_id) + REFERENCES claro_resource_node (id) + ON DELETE CASCADE + "); + } + + public function down(Schema $schema) + { + $this->addSql(" + DROP TABLE ujm_exercise_player + "); + } +} \ No newline at end of file diff --git a/Resources/config/config.yml b/Resources/config/config.yml index a011c438f..d7c7a8825 100755 --- a/Resources/config/config.yml +++ b/Resources/config/config.yml @@ -8,6 +8,14 @@ plugin: icon: res_exo.png activity_rules: - action: resource-ujm_exercise-exercise_evaluated + - class: UJM\ExoBundle\Entity\Player\ExercisePlayer + name: ujm_exercise_player + is_exportable: false + icon: res_exo.png + actions: + - name: administrate + menu_name: ujm_exercise_player_administrate + tools: - name: ujm_questions diff --git a/Resources/config/form_types.yml b/Resources/config/form_types.yml new file mode 100644 index 000000000..9aef6d450 --- /dev/null +++ b/Resources/config/form_types.yml @@ -0,0 +1,6 @@ +services: + # ExercisePlayer type + ujm_exo_bundle.form.type.exercise_player_type: + class: %ujm_exo_bundle.form.type.exercise_player_type.class% + tags: + - { name: form.type, alias: exercise_player_type } diff --git a/Resources/config/parameters.yml b/Resources/config/parameters.yml index dc2eee835..e816059ef 100755 --- a/Resources/config/parameters.yml +++ b/Resources/config/parameters.yml @@ -4,3 +4,6 @@ parameters: ujm.param.exo_directory: "%claroline.param.uploads_directory%/ujmexo" ujm.param.qti_directory: "%ujm.param.exo_directory%/qti" + + # Form Types + ujm_exo_bundle.form.type.exercise_player_type.class: UJM\ExoBundle\Form\Player\ExercisePlayerType diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml index 6520cec8b..21a2650c7 100755 --- a/Resources/config/routing.yml +++ b/Resources/config/routing.yml @@ -49,3 +49,8 @@ all_paper: all_qti: resource: "routing/all/qti.yml" prefix: /all/qti + +exercise_player: + resource: "@UJMExoBundle/Controller/Player/ExercisePlayerController.php" + type: annotation + prefix: /player diff --git a/Resources/config/services.yml b/Resources/config/services.yml index dc6afcb28..317b1cc75 100755 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -177,3 +177,15 @@ services: scope: request tags: - { name: validator.constraint_validator, alias: ujm.exercise_isvalidqcmmark } + + ujm.listener.exercise_player_listener: + class: UJM\ExoBundle\Listener\Resource\ExercisePlayerListener + calls: + - [setContainer, ["@service_container"]] + tags: + - { name: kernel.event_listener, event: create_form_ujm_exercise_player, method: onCreateForm } + - { name: kernel.event_listener, event: create_ujm_exercise_player, method: onCreate } + - { name: kernel.event_listener, event: open_ujm_exercise_player, method: onOpen } + - { name: kernel.event_listener, event: delete_ujm_exercise_player, method: onDelete } + - { name: kernel.event_listener, event: copy_ujm_exercise_player, method: onCopy } + - { name: kernel.event_listener, event: ujm_exercise_player_administrate_ujm_exercise_player, method: onAdministrate } \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js new file mode 100644 index 000000000..9facedfa1 --- /dev/null +++ b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js @@ -0,0 +1,7 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + + diff --git a/Resources/public/js/player/Page/Controllers/PageShowCtrl.js b/Resources/public/js/player/Page/Controllers/PageShowCtrl.js new file mode 100644 index 000000000..0e12272e8 --- /dev/null +++ b/Resources/public/js/player/Page/Controllers/PageShowCtrl.js @@ -0,0 +1,14 @@ +(function () { + 'use strict'; + + angular.module('Page').controller('PageShowController', [ + 'PageService', + function (PageService) { + + + this.sayHello = function () { + console.log(PageService.hello()); + }; + } + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/player/Page/Directives/PageShowDirective.js b/Resources/public/js/player/Page/Directives/PageShowDirective.js new file mode 100644 index 000000000..f41a8f21e --- /dev/null +++ b/Resources/public/js/player/Page/Directives/PageShowDirective.js @@ -0,0 +1,27 @@ +/** + * Activity Form directive + * Directive Documentation : https://docs.angularjs.org/guide/directive + */ +(function () { + 'use strict'; + + angular.module('Page').directive('pageShow', [ + function () { + return { + restrict: 'E', + replace: true, + controller: 'PageShowCtrl', + controllerAs: 'pageShowCtrl', + templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/show.html', + scope: { + activity: '@' + }, + link: function (scope, element, attr, pageShowCtrl) { + pageShowCtrl.sayHello(); + } + }; + } + ]); +})(); + + diff --git a/Resources/public/js/player/Page/Partials/edit.html b/Resources/public/js/player/Page/Partials/edit.html new file mode 100644 index 000000000..f33763a01 --- /dev/null +++ b/Resources/public/js/player/Page/Partials/edit.html @@ -0,0 +1,3 @@ +
+ this is the "edit exercise player" partial +
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Partials/show.html b/Resources/public/js/player/Page/Partials/show.html new file mode 100644 index 000000000..04a5b5404 --- /dev/null +++ b/Resources/public/js/player/Page/Partials/show.html @@ -0,0 +1,3 @@ +
+ this is the "show exercise player" partial +
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Services/PageService.js b/Resources/public/js/player/Page/Services/PageService.js new file mode 100644 index 000000000..c7987daa9 --- /dev/null +++ b/Resources/public/js/player/Page/Services/PageService.js @@ -0,0 +1,33 @@ +/** + * Step Service + */ +(function () { + 'use strict'; + + angular.module('PageModule').factory('PageService', [ + '$http', + function PageService($http) { + /** + * Page object + * @constructor + */ + var Page = function Page(name) { + this.name = name; + }; + + + + return { + /** + * Test method + * + * @param {object} [parentStep] + * @returns {Step} + */ + hello: function () { + return this.name; + }, + }; + } + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/player/Page/module.js b/Resources/public/js/player/Page/module.js new file mode 100644 index 000000000..cfe0c3524 --- /dev/null +++ b/Resources/public/js/player/Page/module.js @@ -0,0 +1,11 @@ +/** + * Page module + */ +(function () { + 'use strict'; + + angular.module('Page', [ + + ]); +})(); + diff --git a/Resources/public/js/player/editor.module.js b/Resources/public/js/player/editor.module.js new file mode 100644 index 000000000..b726dde5b --- /dev/null +++ b/Resources/public/js/player/editor.module.js @@ -0,0 +1,11 @@ +(function () { + 'use strict'; + + // exercise player module + angular.module('ExercisePlayerEditorApp', [ + 'ngSanitize', + 'ui.bootstrap', + 'ui.translation', + 'Page' + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/player/player.module.js b/Resources/public/js/player/player.module.js new file mode 100644 index 000000000..4a52e46dd --- /dev/null +++ b/Resources/public/js/player/player.module.js @@ -0,0 +1,15 @@ +(function () { + 'use strict'; + + // exercise player module + angular.module('ExercisePlayerPlayerApp', [ + 'ngSanitize', + 'ui.bootstrap', + 'ui.translation', + 'ui.tinymce', + 'ui.translation', + 'ui.sortable', + 'ui.resourcePicker', + 'Page' + ]); +})(); \ No newline at end of file diff --git a/Resources/public/less/exercise-player.less b/Resources/public/less/exercise-player.less new file mode 100644 index 000000000..5c1bbbb36 --- /dev/null +++ b/Resources/public/less/exercise-player.less @@ -0,0 +1,4 @@ +body{ + color:red; +} + diff --git a/Resources/translations/resource.en.yml b/Resources/translations/resource.en.yml index f5741f66d..c3025c14a 100755 --- a/Resources/translations/resource.en.yml +++ b/Resources/translations/resource.en.yml @@ -1 +1,7 @@ +# e +exercise_player_type_name: Name + +# u ujm_exercise: Exercise +ujm_exercise_player: Exercise player +ujm_exercise_player_administrate: Administrate exercise player diff --git a/Resources/translations/resource.fr.yml b/Resources/translations/resource.fr.yml index 384d591f0..45f3d521a 100755 --- a/Resources/translations/resource.fr.yml +++ b/Resources/translations/resource.fr.yml @@ -1 +1,8 @@ +# e +exercise_player_type_name: Nom + +# u ujm_exercise: Exercice +ujm_exercise_player: Player d'exercice +ujm_exercise_player_administrate: Administrer le player d'exercise + diff --git a/Resources/views/Player/edit.html.twig b/Resources/views/Player/edit.html.twig new file mode 100644 index 000000000..f8f5e61eb --- /dev/null +++ b/Resources/views/Player/edit.html.twig @@ -0,0 +1,19 @@ +{% extends "UJMExoBundle:Player:layout.html.twig" %} + + + +{% block breadcrumb %} + {{ parent() }} +{% endblock %} + + + +{% block content %} + +
+ +
+ +{% endblock %} + + diff --git a/Resources/views/Player/layout.html.twig b/Resources/views/Player/layout.html.twig new file mode 100644 index 000000000..3285de10d --- /dev/null +++ b/Resources/views/Player/layout.html.twig @@ -0,0 +1,64 @@ +{% extends "ClarolineCoreBundle:Workspace:layout.html.twig" %} + +{% block stylesheets %} + {# Claroline CSS #} + {{ parent() }} + + {# Exercise Player styles #} + {% stylesheets debug=false filter='lessphp, cssmin' output='vendor/ujmexo/exercise-player.css' + '@UJMExoBundle/Resources/public/less/exercise-player.less' + %} + + {% endstylesheets %} +{% endblock %} + +{% block content %} + +{% endblock %} + +{% block javascripts %} + {# Claroline JS #} + {{ parent() }} + + {# Translations #} + + + {# Angular JS #} + {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/angular-js.js' + '@InnovaAngularJSBundle/Resources/public/js/angular.min.js' + '@InnovaAngularJSBundle/Resources/public/js/angular-sanitize.min.js' + '@InnovaAngularJSBundle/Resources/public/js/angular-route.min.js' + '@InnovaAngularJSBundle/Resources/public/js/angular-resource.min.js' + '@InnovaAngularJSBundle/Resources/public/js/angular-touch.min.js' + %} + + {% endjavascripts %} + + {# Angular UI #} + {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/angular-ui.js' + '@InnovaAngularUIBootstrapBundle/Resources/public/js/*' + '@InnovaAngularUIPageslideBundle/Resources/public/js/*' + '@InnovaAngularUITinyMCEBundle/Resources/public/js/*' + '@InnovaAngularUITranslationBundle/Resources/public/js/*' + '@InnovaAngularUIResourcePickerBundle/Resources/public/js/*' + %} + + {% endjavascripts %} + + + + {# Set some vars needed by Angular parts #} + +{% endblock %} diff --git a/Resources/views/Player/view.html.twig b/Resources/views/Player/view.html.twig new file mode 100644 index 000000000..a952177b2 --- /dev/null +++ b/Resources/views/Player/view.html.twig @@ -0,0 +1,38 @@ +{% extends "UJMExoBundle:Player:layout.html.twig" %} + + + +{% block breadcrumb %} + {{ parent() }} +{% endblock %} + +{% block content %} + +
+ +
+{% endblock %} + + +{% block javascripts %} + {# Load Claroline JS #} + {{ parent() }} + + + + {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm_exo_player_player.js' + + '@UJMExoBundle/Resources/public/js/player/player.module.js' + + '@UJMExoBundle/Resources/public/js/player/Page/*' + '@UJMExoBundle/Resources/public/js/player/Page/Controllers/*' + '@UJMExoBundle/Resources/public/js/player/Page/Directives/*' + '@UJMExoBundle/Resources/public/js/player/Page/Services/*' + + '@UJMExoBundle/Resources/public/js/player/player.module.js' + %} + + {% endjavascripts %} + + +{% endblock %} \ No newline at end of file diff --git a/UJMExoBundle.php b/UJMExoBundle.php index 6d13090d2..d1b868ee2 100755 --- a/UJMExoBundle.php +++ b/UJMExoBundle.php @@ -5,23 +5,38 @@ use Claroline\CoreBundle\Library\PluginBundle; use Claroline\KernelBundle\Bundle\ConfigurationBuilder; -class UJMExoBundle extends PluginBundle -{ +class UJMExoBundle extends PluginBundle { - public function getContainerExtension() - { + public function getContainerExtension() { return new DependencyInjection\UJMExoExtension(); } - public function getConfiguration($environment) - { + public function getConfiguration($environment) { $config = new ConfigurationBuilder(); return $config->addRoutingResource(__DIR__ . '/Resources/config/routing.yml', null, 'exercise'); } - public function getRequiredFixturesDirectory($environment) - { + public function getRequiredFixturesDirectory($environment) { return 'DataFixtures'; } + + public function suggestConfigurationFor(Bundle $bundle, $environment) { + $bundleClass = get_class($bundle); + $config = new ConfigurationBuilder(); + $emptyConfigs = array( + 'Innova\AngularJSBundle\InnovaAngularJSBundle', + 'Innova\AngularUIBootstrapBundle\InnovaAngularUIBootstrapBundle', + 'Innova\AngularUITranslationBundle\InnovaAngularUITranslationBundle', + 'Innova\AngularUIResourcePickerBundle\InnovaAngularUIResourcePickerBundle', + 'Innova\AngularUITinyMCEBundle\InnovaAngularUITinyMCEBundle', + 'Innova\AngularUITreeBundle\InnovaAngularUITreeBundle', + 'Innova\AngularUIPageslideBundle\InnovaAngularUIPageslideBundle', + ); + if (in_array($bundleClass, $emptyConfigs)) { + return $config; + } + return false; + } + } diff --git a/composer.json b/composer.json index 1c0f90886..db814ed51 100755 --- a/composer.json +++ b/composer.json @@ -4,7 +4,13 @@ "type": "claroline-plugin", "require": { "claroline/core-bundle": "~5.0", - "icap/badge-bundle": "~5.0" + "icap/badge-bundle": "~5.0", + "innova/angular-js-bundle": "~5.1", + "innova/angular-ui-bootstrap-bundle" : "~5.0", + "innova/angular-ui-tinymce-bundle" : "~5.0", + "innova/angular-ui-pageslide-bundle" : "~5.0", + "innova/angular-ui-translation-bundle" : "~5.0", + "innova/angular-ui-resource-picker-bundle" : "~6.0" }, "autoload": { "psr-0": { "UJM\\ExoBundle": "" } From 66d379099501069d99b3723a4b23004c55f31dcc Mon Sep 17 00:00:00 2001 From: pitrackster Date: Fri, 3 Jul 2015 09:35:00 +0200 Subject: [PATCH 03/11] delete test file --- versionsssss.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 versionsssss.txt diff --git a/versionsssss.txt b/versionsssss.txt deleted file mode 100644 index e69de29bb..000000000 From 7cfbabca642f8dbd53e7804dfe3c1aa78c49db31 Mon Sep 17 00:00:00 2001 From: pitrackster Date: Fri, 3 Jul 2015 11:12:59 +0200 Subject: [PATCH 04/11] angularize player --- Resources/public/css/exercise-player.css | 1 + .../js/player/Page/Controllers/PageShowCtrl.js | 2 +- .../public/js/player/Page/Partials/show.html | 13 +++++++++++-- .../public/js/player/Page/Services/PageService.js | 2 +- Resources/public/js/player/player.module.js | 2 -- Resources/views/Player/layout.html.twig | 15 ++++++--------- Resources/views/Player/view.html.twig | 3 +-- UJMExoBundle.php | 2 +- composer.json | 9 +++------ 9 files changed, 25 insertions(+), 24 deletions(-) create mode 100644 Resources/public/css/exercise-player.css diff --git a/Resources/public/css/exercise-player.css b/Resources/public/css/exercise-player.css new file mode 100644 index 000000000..363a06397 --- /dev/null +++ b/Resources/public/css/exercise-player.css @@ -0,0 +1 @@ +body{color:red} \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageShowCtrl.js b/Resources/public/js/player/Page/Controllers/PageShowCtrl.js index 0e12272e8..16fa34212 100644 --- a/Resources/public/js/player/Page/Controllers/PageShowCtrl.js +++ b/Resources/public/js/player/Page/Controllers/PageShowCtrl.js @@ -1,7 +1,7 @@ (function () { 'use strict'; - angular.module('Page').controller('PageShowController', [ + angular.module('Page').controller('PageShowCtrl', [ 'PageService', function (PageService) { diff --git a/Resources/public/js/player/Page/Partials/show.html b/Resources/public/js/player/Page/Partials/show.html index 04a5b5404..064b69969 100644 --- a/Resources/public/js/player/Page/Partials/show.html +++ b/Resources/public/js/player/Page/Partials/show.html @@ -1,3 +1,12 @@ -
- this is the "show exercise player" partial + + +
+ +
+

this is the "show exercise player" partial panel header

+ +
+
+ this is the "show exercise player" partial panel body +
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Services/PageService.js b/Resources/public/js/player/Page/Services/PageService.js index c7987daa9..177fe2779 100644 --- a/Resources/public/js/player/Page/Services/PageService.js +++ b/Resources/public/js/player/Page/Services/PageService.js @@ -4,7 +4,7 @@ (function () { 'use strict'; - angular.module('PageModule').factory('PageService', [ + angular.module('Page').factory('PageService', [ '$http', function PageService($http) { /** diff --git a/Resources/public/js/player/player.module.js b/Resources/public/js/player/player.module.js index 4a52e46dd..bb8a04b7d 100644 --- a/Resources/public/js/player/player.module.js +++ b/Resources/public/js/player/player.module.js @@ -5,10 +5,8 @@ angular.module('ExercisePlayerPlayerApp', [ 'ngSanitize', 'ui.bootstrap', - 'ui.translation', 'ui.tinymce', 'ui.translation', - 'ui.sortable', 'ui.resourcePicker', 'Page' ]); diff --git a/Resources/views/Player/layout.html.twig b/Resources/views/Player/layout.html.twig index 3285de10d..5ac16f59a 100644 --- a/Resources/views/Player/layout.html.twig +++ b/Resources/views/Player/layout.html.twig @@ -5,7 +5,7 @@ {{ parent() }} {# Exercise Player styles #} - {% stylesheets debug=false filter='lessphp, cssmin' output='vendor/ujmexo/exercise-player.css' + {% stylesheets debug=false filter='lessphp, cssmin' output='bundles/ujmexo/css/exercise-player.css' '@UJMExoBundle/Resources/public/less/exercise-player.less' %} @@ -24,7 +24,7 @@ {# Angular JS #} - {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/angular-js.js' + {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm-exo-angular-js.js' '@InnovaAngularJSBundle/Resources/public/js/angular.min.js' '@InnovaAngularJSBundle/Resources/public/js/angular-sanitize.min.js' '@InnovaAngularJSBundle/Resources/public/js/angular-route.min.js' @@ -35,12 +35,13 @@ {% endjavascripts %} {# Angular UI #} - {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/angular-ui.js' + {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm-exo-angular-ui.js' '@InnovaAngularUIBootstrapBundle/Resources/public/js/*' - '@InnovaAngularUIPageslideBundle/Resources/public/js/*' '@InnovaAngularUITinyMCEBundle/Resources/public/js/*' '@InnovaAngularUITranslationBundle/Resources/public/js/*' '@InnovaAngularUIResourcePickerBundle/Resources/public/js/*' + '@InnovaAngularUIPageSlideBundle/Resources/public/js/*' + '@InnovaAngularUISortableBundle/Resources/public/js/*' %} {% endjavascripts %} @@ -55,10 +56,6 @@ AngularApp.webDir = "{{ asset('') }}"; AngularApp.locale = "{{ app.request.locale ~ '_' ~ app.request.locale|upper }}"; - AngularApp.resourceIcons = { - {% for resourceIcon in resourceIcons %} - "{{ resourceIcon.mimeType }}" : "{{ asset(resourceIcon.relativeUrl) }}"{% if loop.last != true %},{% endif %} - {% endfor %} - }; + {% endblock %} diff --git a/Resources/views/Player/view.html.twig b/Resources/views/Player/view.html.twig index a952177b2..bb8528b0e 100644 --- a/Resources/views/Player/view.html.twig +++ b/Resources/views/Player/view.html.twig @@ -6,8 +6,7 @@ {{ parent() }} {% endblock %} -{% block content %} - +{% block content %}
diff --git a/UJMExoBundle.php b/UJMExoBundle.php index d1b868ee2..a4154c24c 100755 --- a/UJMExoBundle.php +++ b/UJMExoBundle.php @@ -30,8 +30,8 @@ public function suggestConfigurationFor(Bundle $bundle, $environment) { 'Innova\AngularUITranslationBundle\InnovaAngularUITranslationBundle', 'Innova\AngularUIResourcePickerBundle\InnovaAngularUIResourcePickerBundle', 'Innova\AngularUITinyMCEBundle\InnovaAngularUITinyMCEBundle', - 'Innova\AngularUITreeBundle\InnovaAngularUITreeBundle', 'Innova\AngularUIPageslideBundle\InnovaAngularUIPageslideBundle', + 'Innova\AngularUISortableBundle\AngularUISortableBundle', ); if (in_array($bundleClass, $emptyConfigs)) { return $config; diff --git a/composer.json b/composer.json index db814ed51..4e4b740ca 100755 --- a/composer.json +++ b/composer.json @@ -8,15 +8,12 @@ "innova/angular-js-bundle": "~5.1", "innova/angular-ui-bootstrap-bundle" : "~5.0", "innova/angular-ui-tinymce-bundle" : "~5.0", - "innova/angular-ui-pageslide-bundle" : "~5.0", "innova/angular-ui-translation-bundle" : "~5.0", - "innova/angular-ui-resource-picker-bundle" : "~6.0" + "innova/angular-ui-resource-picker-bundle" : "~6.0", + "innova/angular-ui-sortable-bundle" : "~5.0" }, "autoload": { "psr-0": { "UJM\\ExoBundle": "" } }, - "target-dir": "UJM/ExoBundle", - "extra": { - "dbVersion": "20150416104535" - } + "target-dir": "UJM/ExoBundle" } From 9e5665e2979e0580341541e9ff0c5c85fa743957 Mon Sep 17 00:00:00 2001 From: pitrackster Date: Fri, 3 Jul 2015 11:16:40 +0200 Subject: [PATCH 05/11] error in composer --- Resources/views/Player/layout.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/views/Player/layout.html.twig b/Resources/views/Player/layout.html.twig index 5ac16f59a..ea4c22601 100644 --- a/Resources/views/Player/layout.html.twig +++ b/Resources/views/Player/layout.html.twig @@ -40,7 +40,7 @@ '@InnovaAngularUITinyMCEBundle/Resources/public/js/*' '@InnovaAngularUITranslationBundle/Resources/public/js/*' '@InnovaAngularUIResourcePickerBundle/Resources/public/js/*' - '@InnovaAngularUIPageSlideBundle/Resources/public/js/*' + '@InnovaAngularUIPageslideBundle/Resources/public/js/*' '@InnovaAngularUISortableBundle/Resources/public/js/*' %} From 5fde7460f8302f8085504d62e52bbad731fede53 Mon Sep 17 00:00:00 2001 From: pitrackster Date: Fri, 3 Jul 2015 11:22:55 +0200 Subject: [PATCH 06/11] added dependency in composer --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4e4b740ca..ee927ec04 100755 --- a/composer.json +++ b/composer.json @@ -10,7 +10,8 @@ "innova/angular-ui-tinymce-bundle" : "~5.0", "innova/angular-ui-translation-bundle" : "~5.0", "innova/angular-ui-resource-picker-bundle" : "~6.0", - "innova/angular-ui-sortable-bundle" : "~5.0" + "innova/angular-ui-sortable-bundle" : "~5.0", + "innova/angular-ui-pageslide-bundle" : "~5.0" }, "autoload": { "psr-0": { "UJM\\ExoBundle": "" } From 6e0d925a4000a67665e34d82121d659cac9a8d75 Mon Sep 17 00:00:00 2001 From: pitrackster Date: Fri, 3 Jul 2015 17:02:33 +0200 Subject: [PATCH 07/11] resource has page --- .../Player/ExercisePlayerController.php | 2 +- Entity/Player/ExercisePlayer.php | 144 +++++++++++--- Entity/Player/Page.php | 186 ++++++++++++++++++ Listener/Resource/ExercisePlayerListener.php | 9 +- Manager/Player/ExercisePlayerManager.php | 52 +++++ .../pdo_mysql/Version20150703141121.php | 32 +++ .../pdo_mysql/Version20150703162336.php | 50 +++++ Resources/config/parameters.yml | 3 + Resources/config/services.yml | 8 +- Resources/public/css/exercise-player.css | 1 - .../player/Page/Controllers/PageEditCtrl.js | 23 ++- .../player/Page/Controllers/PageShowCtrl.js | 4 +- .../Page/Directives/PageEditDirective.js | 32 +++ .../Page/Directives/PageShowDirective.js | 6 +- .../public/js/player/Page/Partials/edit.html | 20 +- .../public/js/player/Page/Partials/show.html | 10 +- .../js/player/Page/Services/PageService.js | 45 ++++- Resources/public/js/player/editor.module.js | 2 + Resources/public/less/exercise-player.less | 8 +- Resources/views/Player/edit.html.twig | 28 ++- Resources/views/Player/layout.html.twig | 1 - Resources/views/Player/view.html.twig | 6 +- 22 files changed, 599 insertions(+), 73 deletions(-) create mode 100644 Entity/Player/Page.php create mode 100644 Manager/Player/ExercisePlayerManager.php create mode 100644 Migrations/pdo_mysql/Version20150703141121.php create mode 100644 Migrations/pdo_mysql/Version20150703162336.php create mode 100644 Resources/public/js/player/Page/Directives/PageEditDirective.js diff --git a/Controller/Player/ExercisePlayerController.php b/Controller/Player/ExercisePlayerController.php index 3a80a0785..95846d274 100644 --- a/Controller/Player/ExercisePlayerController.php +++ b/Controller/Player/ExercisePlayerController.php @@ -8,7 +8,7 @@ use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; -use Claroline\CoreBundle\Entity\Workspace\Workspace; + use UJM\ExoBundle\Entity\Player\ExercisePlayer; /** diff --git a/Entity/Player/ExercisePlayer.php b/Entity/Player/ExercisePlayer.php index e15a3efce..01e440e15 100644 --- a/Entity/Player/ExercisePlayer.php +++ b/Entity/Player/ExercisePlayer.php @@ -5,6 +5,8 @@ use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; use Claroline\CoreBundle\Entity\Resource\AbstractResource; +use Doctrine\Common\Collections\ArrayCollection; +use UJM\ExoBundle\Entity\Player\Page; /** * ExercisePlayer Entity @@ -12,7 +14,7 @@ * @ORM\Table(name="ujm_exercise_player") * @ORM\Entity */ -class ExercisePlayer extends AbstractResource { +class ExercisePlayer extends AbstractResource implements \JsonSerializable { /** * @var integer @@ -36,23 +38,35 @@ class ExercisePlayer extends AbstractResource { * * @ORM\Column(name="description", type="text", nullable=true) */ - private $description; + protected $description; - + /** + * @var datetime $creationDate + * + * @ORM\Column(name="creation", type="datetime") + */ + protected $creationDate; + + /** + * @var datetime $modificationDate + * + * @ORM\Column(name="modification", type="datetime") + */ + protected $modificationDate; /** * @var datetime $startDate * * @ORM\Column(name="start_date", type="datetime") */ - private $startDate; + protected $startDate; /** * @var datetime $endDate * * @ORM\Column(name="end_date", type="datetime", nullable=true) */ - private $endDate; + protected $endDate; /** * @var boolean @@ -68,10 +82,20 @@ class ExercisePlayer extends AbstractResource { */ protected $modified; + /** + * Pages associated with ExercisePlayer + * @var pages + * @ORM\OneToMany(targetEntity="UJM\ExoBundle\Entity\Player\Page", cascade={"remove", "persist"}, mappedBy="exercisePlayer") + */ + protected $pages; + public function __construct() { $this->published = false; $this->modified = false; $this->startDate = new \DateTime(); + $this->creationDate = new \DateTime(); + $this->modificationDate = new \DateTime(); + $this->pages = new ArrayCollection(); } /** @@ -82,10 +106,38 @@ public function getId() { return $this->id; } + /** + * + * @param Page $p + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer + */ + public function addPage(Page $p) { + $this->pages[] = $p; + return $this; + } + + /** + * + * @param Page $p + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer + */ + public function removePage(Page $p) { + $this->pages->removeElement($p); + return $this; + } + + /** + * + * @return ArrayCollection + */ + public function getPages() { + return $this->pages; + } + /** * Set player name * @param string $name - * @return \UJM\ExoBundle\Entity\Player + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer */ public function setName($name) { $this->name = $name; @@ -104,7 +156,7 @@ public function getName() { * Set player startDate * * @param datetime $startDate - * @return \UJM\ExoBundle\Entity\Player + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer */ public function setStartDate($startDate) { $this->startDate = $startDate; @@ -124,7 +176,7 @@ public function getStartDate() { * Set player endDate * * @param datetime $endDate - * @return \UJM\ExoBundle\Entity\Player + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer */ public function setEndDate($endDate) { $this->endDate = $endDate; @@ -141,48 +193,69 @@ public function getEndDate() { } /** - * Set player description + * Set player creation date * - * @param text $description - * @return \UJM\ExoBundle\Entity\Player + * @param datetime $date + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer */ - public function setDescription($description) { - $this->description = $description; + public function setCreationDate($date) { + $this->creationDate = $date; return $this; } /** - * Get player description + * Get player creation date * - * @return text + * @return datetime */ - public function getDescription() { - return $this->description; + public function getCreationDate() { + return $this->creationDate; } /** - * Set player shuffle property + * Set player modification date * - * @param boolean $shuffle - * @return \UJM\ExoBundle\Entity\Player + * @param datetime $date + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer */ - public function setShuffle($shuffle) { - $this->shuffle = $shuffle; + public function setModificationDate($date) { + $this->modificationDate = $date; return $this; } /** - * Get player shuffle property - * @return boolean + * Get player modification date + * + * @return datetime + */ + public function getModificationDate() { + return $this->modificationDate; + } + + /** + * Set player description + * + * @param text $description + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer */ - public function getShuffle() { - return $this->shuffle; + public function setDescription($description) { + $this->description = $description; + return $this; + } + + /** + * Get player description + * + * @return text + */ + public function getDescription() { + return $this->description; } /** * Set player published property * @param boolean $published - * @return \UJM\ExoBundle\Entity\Player + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer */ public function setPublished($published) { $this->published = $published; @@ -200,7 +273,7 @@ public function getPublished() { /** * Set player modified property * @param boolean $modified - * @return \UJM\ExoBundle\Entity\Player + * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer */ public function setModified($modified) { $this->modified = $modified; @@ -215,4 +288,19 @@ public function getModified() { return $this->modified; } + public function jsonSerialize() { + // TODO serialize Pages arraycollection + return array( + 'id' => $this->id, + 'name' => $this->name, + 'description' => $this->description, + 'start' => $this->startDate, + 'end' => $this->endDate, + 'creation' => $this->creationDate, + 'modification' => $this->modificationDate, + 'published' => $this->published, + 'pages' => $this->pages + ); + } + } diff --git a/Entity/Player/Page.php b/Entity/Player/Page.php new file mode 100644 index 000000000..ab2a1036d --- /dev/null +++ b/Entity/Player/Page.php @@ -0,0 +1,186 @@ +shuffle = false; + $this->isFirstPage = false; + $this->isLastPage = false; + } + + /** + * Get page Id + * @return integer + */ + public function getId() { + return $this->id; + } + + /** + * + * @param ExercisePlayer $exoplayer + * @return \UJM\ExoBundle\Entity\Player\Page + */ + public function setExercisePlayer(ExercisePlayer $exoplayer){ + $this->exercisePlayer = $exoplayer; + return $this; + } + + /** + * + * @return ExercisePlayer + */ + public function getExercisePlayer(){ + return $this->exercisePlayer; + } + + /** + * + * @param integer $position + * @return \UJM\ExoBundle\Entity\Player\Page + */ + public function setPosition($position) { + $this->position = $position; + return $this; + } + + /** + * + * @return integer + */ + public function getPosition(){ + return $this->position; + } + + /** + * + * @param boolean $shuffle + * @return \UJM\ExoBundle\Entity\Player\Page + */ + public function setShuffle($shuffle){ + $this->shuffle = $shuffle; + return $this; + } + + /** + * + * @return boolean + */ + public function getShuffle(){ + return $this->shuffle; + } + + /** + * + * @param boolean $isLast + * @return \UJM\ExoBundle\Entity\Player\Page + */ + public function setIsLastPage($isLast){ + $this->isLastPage = $isLast; + return $this; + } + + /** + * + * @return boolean + */ + public function getIsLastPage(){ + return $this->isLastPage; + } + + /** + * + * @param boolean $isFirst + * @return \UJM\ExoBundle\Entity\Player\Page + */ + public function setIsFirstPage($isFirst){ + $this->isFirstPage = $isFirst; + return $this; + } + + /** + * + * @return boolean + */ + public function getIsFirstPage(){ + return $this->isFirstPage; + } + + public function jsonSerialize() + { + // TODO serialize questions arraycollection + return array ( + 'id' => $this->id, + 'position' => $this->position, + 'shuffle' => $this->shuffle, + 'isFirst' => $this->isFirstPage, + 'isLast' => $this->isLastPage + ); + } + +} diff --git a/Listener/Resource/ExercisePlayerListener.php b/Listener/Resource/ExercisePlayerListener.php index 1ac08ff68..326a16c56 100644 --- a/Listener/Resource/ExercisePlayerListener.php +++ b/Listener/Resource/ExercisePlayerListener.php @@ -59,7 +59,12 @@ public function onCreate(CreateResourceEvent $event) { $form->submit($request); if ($form->isValid()) { $resource = $form->getData(); - $event->setResources(array($resource)); + + $ep = $this->container->get('ujm_exo_bundle.manager.exercise_player')->createFirstAndLastPage($resource); + + $event->setResources(array($ep)); + + } else { $content = $this->container->get('templating')->render( 'ClarolineCoreBundle:Resource:createForm.html.twig', array( @@ -99,7 +104,7 @@ public function onCreateForm(CreateFormResourceEvent $event) { public function onDelete(DeleteResourceEvent $event) { $em = $this->container->get('doctrine.orm.entity_manager'); $resource = $event->getResource(); - $em->remove($$resource); + $em->remove($resource); $event->stopPropagation(); } diff --git a/Manager/Player/ExercisePlayerManager.php b/Manager/Player/ExercisePlayerManager.php new file mode 100644 index 000000000..0400c06db --- /dev/null +++ b/Manager/Player/ExercisePlayerManager.php @@ -0,0 +1,52 @@ +em = $em; + $this->translator = $translator; + } + + public function getRepository() { + return $this->em->getRepository('UJMExoBundle:Player\ExercisePlayer'); + } + + public function createFirstAndLastPage(ExercisePlayer $ep) { + + //var_dump($ep->getPages()); + // add first page + $first = new Page(); + $first->setIsFirstPage(true); + $first->setExercisePlayer($ep); + $ep->addPage($first); + //$this->em->persist($ep); + + // add last page + $last = new Page(); + $last->setIsLastPage(true); + $last->setExercisePlayer($ep); + $ep->addPage($last); + + //var_dump($ep->getPages());die; + + $this->em->persist($ep); + $this->em->flush(); + return $ep; + } + +} diff --git a/Migrations/pdo_mysql/Version20150703141121.php b/Migrations/pdo_mysql/Version20150703141121.php new file mode 100644 index 000000000..ad105e90c --- /dev/null +++ b/Migrations/pdo_mysql/Version20150703141121.php @@ -0,0 +1,32 @@ +addSql(" + ALTER TABLE ujm_exercise_player + ADD creation DATETIME NOT NULL, + ADD modification DATETIME NOT NULL + "); + } + + public function down(Schema $schema) + { + $this->addSql(" + ALTER TABLE ujm_exercise_player + DROP creation, + DROP modification + "); + } +} \ No newline at end of file diff --git a/Migrations/pdo_mysql/Version20150703162336.php b/Migrations/pdo_mysql/Version20150703162336.php new file mode 100644 index 000000000..7dded2c75 --- /dev/null +++ b/Migrations/pdo_mysql/Version20150703162336.php @@ -0,0 +1,50 @@ +addSql(" + CREATE TABLE ujm_exercise_page ( + id INT AUTO_INCREMENT NOT NULL, + exercise_player_id INT NOT NULL, + position SMALLINT DEFAULT NULL, + shuffle TINYINT(1) NOT NULL, + is_first_page TINYINT(1) NOT NULL, + is_last_page TINYINT(1) NOT NULL, + resourceNode_id INT DEFAULT NULL, + INDEX IDX_19F33E7D3731F335 (exercise_player_id), + UNIQUE INDEX UNIQ_19F33E7DB87FAB32 (resourceNode_id), + PRIMARY KEY(id) + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB + "); + $this->addSql(" + ALTER TABLE ujm_exercise_page + ADD CONSTRAINT FK_19F33E7D3731F335 FOREIGN KEY (exercise_player_id) + REFERENCES ujm_exercise_player (id) + "); + $this->addSql(" + ALTER TABLE ujm_exercise_page + ADD CONSTRAINT FK_19F33E7DB87FAB32 FOREIGN KEY (resourceNode_id) + REFERENCES claro_resource_node (id) + ON DELETE CASCADE + "); + } + + public function down(Schema $schema) + { + $this->addSql(" + DROP TABLE ujm_exercise_page + "); + } +} \ No newline at end of file diff --git a/Resources/config/parameters.yml b/Resources/config/parameters.yml index e816059ef..733c55395 100755 --- a/Resources/config/parameters.yml +++ b/Resources/config/parameters.yml @@ -7,3 +7,6 @@ parameters: # Form Types ujm_exo_bundle.form.type.exercise_player_type.class: UJM\ExoBundle\Form\Player\ExercisePlayerType + + # Managers + ujm_exo_bundle.manager.exercise_player.class: UJM\ExoBundle\Manager\Player\ExercisePlayerManager diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 317b1cc75..10e90754c 100755 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -188,4 +188,10 @@ services: - { name: kernel.event_listener, event: open_ujm_exercise_player, method: onOpen } - { name: kernel.event_listener, event: delete_ujm_exercise_player, method: onDelete } - { name: kernel.event_listener, event: copy_ujm_exercise_player, method: onCopy } - - { name: kernel.event_listener, event: ujm_exercise_player_administrate_ujm_exercise_player, method: onAdministrate } \ No newline at end of file + - { name: kernel.event_listener, event: ujm_exercise_player_administrate_ujm_exercise_player, method: onAdministrate } + + ujm_exo_bundle.manager.exercise_player: + class: UJM\ExoBundle\Manager\Player\ExercisePlayerManager + arguments: + entityManager: @doctrine.orm.entity_manager + translator: @translator \ No newline at end of file diff --git a/Resources/public/css/exercise-player.css b/Resources/public/css/exercise-player.css index 363a06397..e69de29bb 100644 --- a/Resources/public/css/exercise-player.css +++ b/Resources/public/css/exercise-player.css @@ -1 +0,0 @@ -body{color:red} \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js index 9facedfa1..10cb4e425 100644 --- a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js +++ b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js @@ -1,7 +1,20 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ +(function () { + 'use strict'; + angular.module('Page').controller('PageEditCtrl', [ + 'PageService', + function (PageService) { + + this.sayHello = function (name) { + // console.log(PageService.hello(name)); + }; + + this.getPage = function (){ + //console.log('called'); + //console.log(PageService.getPage()); + return PageService.getPage(); + }; + } + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageShowCtrl.js b/Resources/public/js/player/Page/Controllers/PageShowCtrl.js index 16fa34212..3bd51bc01 100644 --- a/Resources/public/js/player/Page/Controllers/PageShowCtrl.js +++ b/Resources/public/js/player/Page/Controllers/PageShowCtrl.js @@ -6,8 +6,8 @@ function (PageService) { - this.sayHello = function () { - console.log(PageService.hello()); + this.sayHello = function (name) { + console.log(PageService.hello(name)); }; } ]); diff --git a/Resources/public/js/player/Page/Directives/PageEditDirective.js b/Resources/public/js/player/Page/Directives/PageEditDirective.js new file mode 100644 index 000000000..a88b5dbb5 --- /dev/null +++ b/Resources/public/js/player/Page/Directives/PageEditDirective.js @@ -0,0 +1,32 @@ +/** + * Activity Form directive + * Directive Documentation : https://docs.angularjs.org/guide/directive + */ +(function () { + 'use strict'; + + angular.module('Page').directive('pageEdit', [ + function () { + return { + restrict: 'E', + replace: true, + controller: 'PageEditCtrl', + controllerAs: 'pageEditCtrl', + templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/edit.html', + scope: { + page: '=', + player: '=' + }, + link: function (scope, element, attr, pageEditCtrl) { + /*pageEditCtrl.sayHello(scope.name); + console.log('page ' + scope.page.title); + console.log('player id ' + scope.player.id); + console.log('player name ' + scope.player.name); + console.log('player description ' + scope.player.description);*/ + } + }; + } + ]); +})(); + + diff --git a/Resources/public/js/player/Page/Directives/PageShowDirective.js b/Resources/public/js/player/Page/Directives/PageShowDirective.js index f41a8f21e..1e11b1d5e 100644 --- a/Resources/public/js/player/Page/Directives/PageShowDirective.js +++ b/Resources/public/js/player/Page/Directives/PageShowDirective.js @@ -14,10 +14,12 @@ controllerAs: 'pageShowCtrl', templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/show.html', scope: { - activity: '@' + page: '=', + name: '@', + player: '=' }, link: function (scope, element, attr, pageShowCtrl) { - pageShowCtrl.sayHello(); + } }; } diff --git a/Resources/public/js/player/Page/Partials/edit.html b/Resources/public/js/player/Page/Partials/edit.html index f33763a01..08683ddbe 100644 --- a/Resources/public/js/player/Page/Partials/edit.html +++ b/Resources/public/js/player/Page/Partials/edit.html @@ -1,3 +1,19 @@ -
- this is the "edit exercise player" partial +
+
+

You are editing player : {{player.name}}

+
+
+
+
+ player name : {{player.name}} +
+
+
+
+
+ player name : {{player.name}} +
+
+
+
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Partials/show.html b/Resources/public/js/player/Page/Partials/show.html index 064b69969..d7a344b97 100644 --- a/Resources/public/js/player/Page/Partials/show.html +++ b/Resources/public/js/player/Page/Partials/show.html @@ -1,12 +1,10 @@ - -
-
-

this is the "show exercise player" partial panel header

- +

This is the "show exercise player" partial panel header

- this is the "show exercise player" partial panel body + This is the "show exercise player" partial panel body +
+

{{name}}

\ No newline at end of file diff --git a/Resources/public/js/player/Page/Services/PageService.js b/Resources/public/js/player/Page/Services/PageService.js index 177fe2779..518399822 100644 --- a/Resources/public/js/player/Page/Services/PageService.js +++ b/Resources/public/js/player/Page/Services/PageService.js @@ -7,26 +7,51 @@ angular.module('Page').factory('PageService', [ '$http', function PageService($http) { + + /** + * ExercisePlayer Id + * @type {Number} + */ + var id = null; + /** - * Page object - * @constructor + * current page properties + * @type object */ - var Page = function Page(name) { - this.name = name; + var page = { + title: 'new page' }; - - return { /** * Test method * - * @param {object} [parentStep] - * @returns {Step} + * @param {string} [name] + * @returns {string} + */ + hello: function (name) { + return 'Hello ' + name; + }, + setPlayerId: function (value){ + id = value; + }, + /** + * Get exercise player ID + * @returns {Number} */ - hello: function () { - return this.name; + getPlayerId: function(){ + return id; + }, + setPage: function(value){ + page = value; }, + /** + * + * @returns {Object} page + */ + getPage: function(){ + return page; + } }; } ]); diff --git a/Resources/public/js/player/editor.module.js b/Resources/public/js/player/editor.module.js index b726dde5b..10a49c548 100644 --- a/Resources/public/js/player/editor.module.js +++ b/Resources/public/js/player/editor.module.js @@ -5,7 +5,9 @@ angular.module('ExercisePlayerEditorApp', [ 'ngSanitize', 'ui.bootstrap', + 'ui.tinymce', 'ui.translation', + 'ui.resourcePicker', 'Page' ]); })(); \ No newline at end of file diff --git a/Resources/public/less/exercise-player.less b/Resources/public/less/exercise-player.less index 5c1bbbb36..bc6e3734a 100644 --- a/Resources/public/less/exercise-player.less +++ b/Resources/public/less/exercise-player.less @@ -1,4 +1,8 @@ -body{ - color:red; +.exercise-player-container{ + + .exercise-player-page{ + + } + } diff --git a/Resources/views/Player/edit.html.twig b/Resources/views/Player/edit.html.twig index f8f5e61eb..c70b484e9 100644 --- a/Resources/views/Player/edit.html.twig +++ b/Resources/views/Player/edit.html.twig @@ -1,19 +1,35 @@ {% extends "UJMExoBundle:Player:layout.html.twig" %} - - {% block breadcrumb %} {{ parent() }} {% endblock %} +{% block content %} +
+ +
+{% endblock %} + +{% block javascripts %} + {# Load Claroline JS #} + {{ parent() }} -{% block content %} -
- -
+ {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm_exo_player_editor.js' + + '@UJMExoBundle/Resources/public/js/player/Page/*' + '@UJMExoBundle/Resources/public/js/player/Page/Controllers/*' + '@UJMExoBundle/Resources/public/js/player/Page/Directives/*' + '@UJMExoBundle/Resources/public/js/player/Page/Services/*' + + '@UJMExoBundle/Resources/public/js/player/editor.module.js' + %} + + {% endjavascripts %} + + {% endblock %} diff --git a/Resources/views/Player/layout.html.twig b/Resources/views/Player/layout.html.twig index ea4c22601..86e8b64ef 100644 --- a/Resources/views/Player/layout.html.twig +++ b/Resources/views/Player/layout.html.twig @@ -40,7 +40,6 @@ '@InnovaAngularUITinyMCEBundle/Resources/public/js/*' '@InnovaAngularUITranslationBundle/Resources/public/js/*' '@InnovaAngularUIResourcePickerBundle/Resources/public/js/*' - '@InnovaAngularUIPageslideBundle/Resources/public/js/*' '@InnovaAngularUISortableBundle/Resources/public/js/*' %} diff --git a/Resources/views/Player/view.html.twig b/Resources/views/Player/view.html.twig index bb8528b0e..3f2e86d8f 100644 --- a/Resources/views/Player/view.html.twig +++ b/Resources/views/Player/view.html.twig @@ -7,8 +7,8 @@ {% endblock %} {% block content %} -
- +
+
{% endblock %} @@ -21,8 +21,6 @@ {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm_exo_player_player.js' - '@UJMExoBundle/Resources/public/js/player/player.module.js' - '@UJMExoBundle/Resources/public/js/player/Page/*' '@UJMExoBundle/Resources/public/js/player/Page/Controllers/*' '@UJMExoBundle/Resources/public/js/player/Page/Directives/*' From 202aaed5320ec31d953ea435a94ffe2b91d5ad58 Mon Sep 17 00:00:00 2001 From: pitrackster Date: Tue, 7 Jul 2015 09:46:24 +0200 Subject: [PATCH 08/11] - Exercise player is now a Claroline resource - When created two pages are added (first and last) - You can navigate between the 2 pages --- .../Player/ExercisePlayerController.php | 22 ++++- Entity/Player/ExercisePlayer.php | 9 +- Entity/Player/Page.php | 28 +++++- Manager/Player/ExercisePlayerManager.php | 12 +-- Manager/Player/PageManager.php | 59 +++++++++++++ .../pdo_mysql/Version20150706165036.php | 48 +++++++++++ Resources/config/parameters.yml | 1 + Resources/config/services.yml | 6 ++ Resources/public/css/exercise-player.css | 1 + .../player/Page/Controllers/PageEditCtrl.js | 86 +++++++++++++++++-- .../Page/Directives/PageEditDirective.js | 20 +++-- .../public/js/player/Page/Partials/edit.html | 36 ++++++-- .../js/player/Page/Services/PageService.js | 2 +- .../player/Player/Services/PlayerService.js | 66 ++++++++++++++ Resources/public/js/player/Player/module.js | 11 +++ Resources/public/less/exercise-player.less | 25 +++++- Resources/views/Player/edit.html.twig | 2 +- 17 files changed, 401 insertions(+), 33 deletions(-) create mode 100644 Manager/Player/PageManager.php create mode 100644 Migrations/pdo_mysql/Version20150706165036.php create mode 100644 Resources/public/js/player/Player/Services/PlayerService.js create mode 100644 Resources/public/js/player/Player/module.js diff --git a/Controller/Player/ExercisePlayerController.php b/Controller/Player/ExercisePlayerController.php index 95846d274..ebe3ed1b3 100644 --- a/Controller/Player/ExercisePlayerController.php +++ b/Controller/Player/ExercisePlayerController.php @@ -30,6 +30,7 @@ public function openAction(ExercisePlayer $resource) { if (false === $this->container->get('security.context')->isGranted('OPEN', $resource->getResourceNode())) { throw new AccessDeniedException(); } + return $this->render('UJMExoBundle:Player:view.html.twig', array( '_resource' => $resource ) @@ -46,9 +47,28 @@ public function administrateAction(ExercisePlayer $resource) { if (false === $this->container->get('security.context')->isGranted('ADMINISTRATE', $resource->getResourceNode())) { throw new AccessDeniedException(); } + + $firstPage = $this->get('ujm_exo_bundle.manager.page')->getFirstPage($resource); + $lastPage = $this->get('ujm_exo_bundle.manager.page')->getLastPage($resource); + $pages = $this->get('ujm_exo_bundle.manager.page')->getPages($resource); + return $this->render('UJMExoBundle:Player:edit.html.twig', array( - '_resource' => $resource + '_resource' => $resource, + 'pages' => $pages, + 'last' => $lastPage, + 'first' => $firstPage ) ); } + + /** + * update an exercise player + * @Route("/update/{id}", requirements={"id" = "\d+"}, name="ujm_player_update") + * @Method("PUT") + * @ParamConverter("ExercisePlayer", class="UJMExoBundle:Player\ExercisePlayer") + * + */ + public function updateAction(ExercisePlayer $resource){ + die ('update called'); + } } diff --git a/Entity/Player/ExercisePlayer.php b/Entity/Player/ExercisePlayer.php index 01e440e15..2cd5b0afd 100644 --- a/Entity/Player/ExercisePlayer.php +++ b/Entity/Player/ExercisePlayer.php @@ -289,7 +289,14 @@ public function getModified() { } public function jsonSerialize() { + // TODO serialize Pages arraycollection + /*$pages = array(); + $temp = $this->getPages(); + foreach ($temp as $p){ + $pages[]= $p->jsonSerialize(); + }*/ + return array( 'id' => $this->id, 'name' => $this->name, @@ -299,7 +306,7 @@ public function jsonSerialize() { 'creation' => $this->creationDate, 'modification' => $this->modificationDate, 'published' => $this->published, - 'pages' => $this->pages + // 'pages' => $pages ); } diff --git a/Entity/Player/Page.php b/Entity/Player/Page.php index ab2a1036d..35ea210de 100644 --- a/Entity/Player/Page.php +++ b/Entity/Player/Page.php @@ -14,7 +14,7 @@ * @ORM\Table(name="ujm_exercise_page") * @ORM\Entity */ -class Page extends AbstractResource implements \JsonSerializable{ +class Page implements \JsonSerializable{ /** * @var integer @@ -24,9 +24,16 @@ class Page extends AbstractResource implements \JsonSerializable{ * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; + + /** + * @var description + * + * @ORM\Column(name="description", type="text", nullable=true) + */ + protected $description; /** - * Page position / order in the ExercisePlayer sequence * + * Page position / order in the ExercisePlayer sequence * first and last page are note ordered * * @var Number $position @@ -81,6 +88,20 @@ public function getId() { return $this->id; } + public function getDescription(){ + return $this->description; + } + + /** + * + * @param string $description + * @return \UJM\ExoBundle\Entity\Player\Page + */ + public function setDescription($description){ + $this->description = $description; + return $this; + } + /** * * @param ExercisePlayer $exoplayer @@ -179,7 +200,8 @@ public function jsonSerialize() 'position' => $this->position, 'shuffle' => $this->shuffle, 'isFirst' => $this->isFirstPage, - 'isLast' => $this->isLastPage + 'isLast' => $this->isLastPage, + 'description' => $this->description ); } diff --git a/Manager/Player/ExercisePlayerManager.php b/Manager/Player/ExercisePlayerManager.php index 0400c06db..0dd76fd3c 100644 --- a/Manager/Player/ExercisePlayerManager.php +++ b/Manager/Player/ExercisePlayerManager.php @@ -27,26 +27,28 @@ public function getRepository() { } public function createFirstAndLastPage(ExercisePlayer $ep) { - - //var_dump($ep->getPages()); + // add first page $first = new Page(); $first->setIsFirstPage(true); + $first->setPosition(1); + $first->setDescription('

This is the first Page

'); $first->setExercisePlayer($ep); $ep->addPage($first); - //$this->em->persist($ep); // add last page $last = new Page(); $last->setIsLastPage(true); + $last->setPosition(2); + $last->setDescription('

This is the last Page

'); $last->setExercisePlayer($ep); $ep->addPage($last); - //var_dump($ep->getPages());die; - $this->em->persist($ep); $this->em->flush(); return $ep; } + + } diff --git a/Manager/Player/PageManager.php b/Manager/Player/PageManager.php new file mode 100644 index 000000000..62c33a8fa --- /dev/null +++ b/Manager/Player/PageManager.php @@ -0,0 +1,59 @@ +em = $em; + $this->translator = $translator; + } + + public function getRepository() { + return $this->em->getRepository('UJMExoBundle:Player\Page'); + } + + /** + * Get first page + * @param ExercisePlayer $ep + * @return \UJM\ExoBundle\Entity\Player\Page + */ + public function getFirstPage(ExercisePlayer $ep) { + $page = $this->getRepository()->findOneBy(array('exercisePlayer' => $ep, 'isFirstPage' => true)); + return $page; + } + + /** + * Get first page + * @param ExercisePlayer $ep + * @return \UJM\ExoBundle\Entity\Player\Page + */ + public function getLastPage(ExercisePlayer $ep) { + $page = $this->getRepository()->findOneBy(array('exercisePlayer' => $ep, 'isLastPage' => true)); + return $page; + } + + /** + * Get all pages excluding first and last + * @param ExercisePlayer $ep + * @return ArrayCollection + */ + public function getPages(ExercisePlayer $ep) { + $pages = $this->getRepository()->findBy(array('exercisePlayer' => $ep/*, 'isFirstPage' => false, 'isLastPage' => false*/), array('position' => 'ASC')); + return $pages; + } + +} diff --git a/Migrations/pdo_mysql/Version20150706165036.php b/Migrations/pdo_mysql/Version20150706165036.php new file mode 100644 index 000000000..82ac0253d --- /dev/null +++ b/Migrations/pdo_mysql/Version20150706165036.php @@ -0,0 +1,48 @@ +addSql(" + ALTER TABLE ujm_exercise_page + DROP FOREIGN KEY FK_19F33E7DB87FAB32 + "); + $this->addSql(" + DROP INDEX UNIQ_19F33E7DB87FAB32 ON ujm_exercise_page + "); + $this->addSql(" + ALTER TABLE ujm_exercise_page + ADD description LONGTEXT DEFAULT NULL, + DROP resourceNode_id + "); + } + + public function down(Schema $schema) + { + $this->addSql(" + ALTER TABLE ujm_exercise_page + ADD resourceNode_id INT DEFAULT NULL, + DROP description + "); + $this->addSql(" + ALTER TABLE ujm_exercise_page + ADD CONSTRAINT FK_19F33E7DB87FAB32 FOREIGN KEY (resourceNode_id) + REFERENCES claro_resource_node (id) + ON DELETE CASCADE + "); + $this->addSql(" + CREATE UNIQUE INDEX UNIQ_19F33E7DB87FAB32 ON ujm_exercise_page (resourceNode_id) + "); + } +} \ No newline at end of file diff --git a/Resources/config/parameters.yml b/Resources/config/parameters.yml index 733c55395..6ff0a8588 100755 --- a/Resources/config/parameters.yml +++ b/Resources/config/parameters.yml @@ -10,3 +10,4 @@ parameters: # Managers ujm_exo_bundle.manager.exercise_player.class: UJM\ExoBundle\Manager\Player\ExercisePlayerManager + ujm_exo_bundle.manager.pages.class: UJM\ExoBundle\Manager\Player\PageManager diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 10e90754c..5c644e26e 100755 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -192,6 +192,12 @@ services: ujm_exo_bundle.manager.exercise_player: class: UJM\ExoBundle\Manager\Player\ExercisePlayerManager + arguments: + entityManager: @doctrine.orm.entity_manager + translator: @translator + + ujm_exo_bundle.manager.page: + class: UJM\ExoBundle\Manager\Player\PageManager arguments: entityManager: @doctrine.orm.entity_manager translator: @translator \ No newline at end of file diff --git a/Resources/public/css/exercise-player.css b/Resources/public/css/exercise-player.css index e69de29bb..4bbdb3227 100644 --- a/Resources/public/css/exercise-player.css +++ b/Resources/public/css/exercise-player.css @@ -0,0 +1 @@ +.exercise-player-container .exercise-player-page ul.page-list{list-style-type:none}.exercise-player-container .exercise-player-page ul.page-list li.page-list-item{display:inline-block;width:50px;height:50px;border:1px solid black;margin:5px;border-radius:5px}.exercise-player-container .exercise-player-page ul.page-list li.page-list-item a{display:inline-block;padding-top:12px} \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js index 10cb4e425..31b45c598 100644 --- a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js +++ b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js @@ -5,15 +5,89 @@ 'PageService', function (PageService) { + this.currentPage = {}; + this.pages = {}; + + this.sortableOptions = { + placeholder: "placeholder", + stop: function (e, ui) { + this.updateActivitiesOrder(); + }.bind(this), + cancel: ".unsortable", + items: "li:not(.unsortable)" + }; + + // Tiny MCE options + this.tinymceOptions = { + relative_urls: false, + theme: 'modern', + browser_spellcheck : true, + autoresize_min_height: 100, + autoresize_max_height: 500, + plugins: [ + 'autoresize advlist autolink lists link image charmap print preview hr anchor pagebreak', + 'searchreplace wordcount visualblocks visualchars fullscreen', + 'insertdatetime media nonbreaking save table directionality', + 'template paste textcolor emoticons code' + ], + toolbar1: 'undo redo | styleselect | bold italic underline | forecolor | alignleft aligncenter alignright | preview fullscreen', + paste_preprocess: function (plugin, args) { + var link = $('
' + args.content + '
').text().trim(); //inside div because a bug of jquery + var url = link.match(/^(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})$/); + + if (url) { + args.content = '' + link + ''; + window.Claroline.Home.generatedContent(link, function (data) { + insertContent(data); + }, false); + } + } + }; + + this.addPage = function(){ + + }; + + this.removePage = function(){ + + }; + + this.update = function(){ + + }; - this.sayHello = function (name) { - // console.log(PageService.hello(name)); + this.getNextPage = function () { + var index = this.pages.indexOf(this.currentPage); + if (false !== index && this.pages[index + 1]) { + this.setCurrentPage(this.pages[index + 1]); + } else { + this.setCurrentPage(this.pages[0]); + } + }; + + this.getPreviousPage = function(){ + var index = this.pages.indexOf(this.currentPage); + if (false !== index && this.pages[index - 1]) { + this.setCurrentPage(this.pages[index - 1]); + } else { + this.setCurrentPage(this.pages[this.pages.length - 1]); + } + }; + + this.setPages = function(pages){ + this.pages = pages; + }; + + this.getPages = function(){ + return this.pages; + } + + this.setCurrentPage = function(page){ + this.currentPage = page; }; - this.getPage = function (){ - //console.log('called'); - //console.log(PageService.getPage()); - return PageService.getPage(); + this.getCurrentPage = function (){ + return currentPage; }; } ]); diff --git a/Resources/public/js/player/Page/Directives/PageEditDirective.js b/Resources/public/js/player/Page/Directives/PageEditDirective.js index a88b5dbb5..5defc7e67 100644 --- a/Resources/public/js/player/Page/Directives/PageEditDirective.js +++ b/Resources/public/js/player/Page/Directives/PageEditDirective.js @@ -14,15 +14,23 @@ controllerAs: 'pageEditCtrl', templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/edit.html', scope: { - page: '=', + pages: '=', + first: '=', + last: '=', player: '=' }, link: function (scope, element, attr, pageEditCtrl) { - /*pageEditCtrl.sayHello(scope.name); - console.log('page ' + scope.page.title); - console.log('player id ' + scope.player.id); - console.log('player name ' + scope.player.name); - console.log('player description ' + scope.player.description);*/ + // set current page to first page + console.log('directive link method called'); + pageEditCtrl.setCurrentPage(scope.first); + pageEditCtrl.setPages(scope.pages); + + /* + console.log(scope.player); + console.log(scope.last); + console.log(scope.first); + console.log(scope.pages); + */ } }; } diff --git a/Resources/public/js/player/Page/Partials/edit.html b/Resources/public/js/player/Page/Partials/edit.html index 08683ddbe..a7a64a272 100644 --- a/Resources/public/js/player/Page/Partials/edit.html +++ b/Resources/public/js/player/Page/Partials/edit.html @@ -1,19 +1,45 @@
-
-

You are editing player : {{player.name}}

+
+

You are editing player : {{player.name}}

+
+ + + +
-
+
+
player name : {{player.name}}

+ +
+
+ +
+ +
+ + +
+
+
+
- player name : {{player.name}} +
-
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Services/PageService.js b/Resources/public/js/player/Page/Services/PageService.js index 518399822..f5303c2b0 100644 --- a/Resources/public/js/player/Page/Services/PageService.js +++ b/Resources/public/js/player/Page/Services/PageService.js @@ -1,5 +1,5 @@ /** - * Step Service + * Page Service */ (function () { 'use strict'; diff --git a/Resources/public/js/player/Player/Services/PlayerService.js b/Resources/public/js/player/Player/Services/PlayerService.js new file mode 100644 index 000000000..3a73850c9 --- /dev/null +++ b/Resources/public/js/player/Player/Services/PlayerService.js @@ -0,0 +1,66 @@ +/** + * Exercise player service + */ +(function () { + 'use strict'; + + angular.module('Player').factory('PlayerService', [ + '$http', + '$filter', + '$q', + function PlayerService($http, $filter, $q) { + + + + return { + /** + * Test method + * + * @param {string} [name] + * @returns {string} + */ + hello: function (name) { + return 'Hello ' + name; + }, + /** + * Update the player + * @param {type} player + * @returns {undefined} + */ + update : function (player){ + var deferred = $q.defer(); + + // player constructor + function Player(player){ + var ujm_player = { + name:player.name, + description: player.description, + startDate: player.startDate, + endDate: player.endDate, + modification: new Date() + }; + + return ujm_player; + } + + var updated = new Player(player); + $http + .put( + Routing.generate('ujm_player_update', { playerId : player.id }), + { + player: updated + } + ) + .success(function (response){ + deferred.resolve(response); + }) + .error(function(data, status){ + console.log('player service, update method error'); + console.log(status); + console.log(data); + }); + } + }; + } + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/player/Player/module.js b/Resources/public/js/player/Player/module.js new file mode 100644 index 000000000..cec394ccb --- /dev/null +++ b/Resources/public/js/player/Player/module.js @@ -0,0 +1,11 @@ +/** + * Page module + */ +(function () { + 'use strict'; + + angular.module('Player', [ + + ]); +})(); + diff --git a/Resources/public/less/exercise-player.less b/Resources/public/less/exercise-player.less index bc6e3734a..70927ddda 100644 --- a/Resources/public/less/exercise-player.less +++ b/Resources/public/less/exercise-player.less @@ -1,8 +1,25 @@ .exercise-player-container{ - - .exercise-player-page{ - + + .exercise-player-page{ + + ul.page-list{ + list-style-type: none; + li.page-list-item { + display: inline-block; + width:50px; + height: 50px; + border: 1px solid black; + /*background-color: rgba(22, 22,128, 0.8);*/ + margin: 5px; + border-radius: 5px; + a { + display: inline-block; + padding-top: 12px; + } + } + } + } - + } diff --git a/Resources/views/Player/edit.html.twig b/Resources/views/Player/edit.html.twig index c70b484e9..b71257614 100644 --- a/Resources/views/Player/edit.html.twig +++ b/Resources/views/Player/edit.html.twig @@ -6,7 +6,7 @@ {% block content %}
- +
{% endblock %} From a7354eb7834a7d2760a49abaa39085f0f7f13202 Mon Sep 17 00:00:00 2001 From: pitrackster Date: Thu, 9 Jul 2015 13:21:05 +0200 Subject: [PATCH 09/11] Exercise player edit features first version --- .../Player/ExercisePlayerController.php | 78 ++++++++--- .../Player/ExercisePlayerPageController.php | 54 ++++++++ Entity/Player/ExercisePlayer.php | 128 +----------------- Entity/Player/Page.php | 3 +- Form/Player/ExercisePlayerType.php | 22 ++- Manager/Player/ExercisePlayerManager.php | 10 +- Manager/Player/PageManager.php | 97 ++++++++++++- .../pdo_mysql/Version20150707164200.php | 36 +++++ Resources/config/routing.yml | 6 + Resources/config/services.yml | 2 +- Resources/public/css/exercise-player.css | 2 +- .../player/Page/Controllers/PageEditCtrl.js | 111 ++++++++++----- .../Page/Directives/PageEditDirective.js | 16 +-- .../Page/Directives/PageShowDirective.js | 6 +- .../public/js/player/Page/Partials/edit.html | 45 ------ .../js/player/Page/Partials/page.edit.html | 49 +++++++ .../js/player/Page/Partials/page.show.html | 11 ++ .../public/js/player/Page/Partials/show.html | 10 -- .../js/player/Page/Services/PageService.js | 79 ++++++----- .../Player/Controllers/PlayerEditCtrl.js | 77 +++++++++++ .../Player/Directives/PlayerEditDirective.js | 30 ++++ .../player/Player/Partials/player.edit.html | 38 ++++++ .../player/Player/Services/PlayerService.js | 32 ++--- Resources/public/js/player/Player/module.js | 2 +- Resources/public/js/player/editor.module.js | 3 +- Resources/public/less/exercise-player.less | 9 +- Resources/translations/exercise_player.en.yml | 19 +++ Resources/translations/exercise_player.fr.yml | 19 +++ Resources/translations/resource.en.yml | 3 - Resources/translations/resource.fr.yml | 3 - Resources/views/Player/edit.html.twig | 10 +- Resources/views/Player/layout.html.twig | 2 +- 32 files changed, 676 insertions(+), 336 deletions(-) create mode 100644 Controller/Player/ExercisePlayerPageController.php create mode 100644 Migrations/pdo_mysql/Version20150707164200.php delete mode 100644 Resources/public/js/player/Page/Partials/edit.html create mode 100644 Resources/public/js/player/Page/Partials/page.edit.html create mode 100644 Resources/public/js/player/Page/Partials/page.show.html delete mode 100644 Resources/public/js/player/Page/Partials/show.html create mode 100644 Resources/public/js/player/Player/Controllers/PlayerEditCtrl.js create mode 100644 Resources/public/js/player/Player/Directives/PlayerEditDirective.js create mode 100644 Resources/public/js/player/Player/Partials/player.edit.html create mode 100644 Resources/translations/exercise_player.en.yml create mode 100644 Resources/translations/exercise_player.fr.yml diff --git a/Controller/Player/ExercisePlayerController.php b/Controller/Player/ExercisePlayerController.php index ebe3ed1b3..00b7d25c2 100644 --- a/Controller/Player/ExercisePlayerController.php +++ b/Controller/Player/ExercisePlayerController.php @@ -8,7 +8,8 @@ use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; - +use Symfony\Component\Form\FormInterface; +use Symfony\Component\HttpFoundation\JsonResponse; use UJM\ExoBundle\Entity\Player\ExercisePlayer; /** @@ -16,10 +17,8 @@ * * @author patrick */ -class ExercisePlayerController extends Controller{ - - - +class ExercisePlayerController extends Controller { + /** * display an exercise player * @Route("/view/{id}", requirements={"id" = "\d+"}, name="ujm_player_open") @@ -30,13 +29,13 @@ public function openAction(ExercisePlayer $resource) { if (false === $this->container->get('security.context')->isGranted('OPEN', $resource->getResourceNode())) { throw new AccessDeniedException(); } - + return $this->render('UJMExoBundle:Player:view.html.twig', array( '_resource' => $resource - ) + ) ); } - + /** * administrate an exercise player * @Route("/edit/{id}", requirements={"id" = "\d+"}, name="ujm_player_administrate") @@ -47,28 +46,65 @@ public function administrateAction(ExercisePlayer $resource) { if (false === $this->container->get('security.context')->isGranted('ADMINISTRATE', $resource->getResourceNode())) { throw new AccessDeniedException(); } - - $firstPage = $this->get('ujm_exo_bundle.manager.page')->getFirstPage($resource); - $lastPage = $this->get('ujm_exo_bundle.manager.page')->getLastPage($resource); - $pages = $this->get('ujm_exo_bundle.manager.page')->getPages($resource); - + + $pages = $this->get('ujm_exo_bundle.manager.pages')->getPages($resource); + return $this->render('UJMExoBundle:Player:edit.html.twig', array( '_resource' => $resource, - 'pages' => $pages, - 'last' => $lastPage, - 'first' => $firstPage - ) + 'pages' => $pages + ) ); } - + /** * update an exercise player - * @Route("/update/{id}", requirements={"id" = "\d+"}, name="ujm_player_update") + * @Route("/update/{id}", requirements={"id" = "\d+"}, name="ujm_player_update", options = {"expose" = true}) * @Method("PUT") * @ParamConverter("ExercisePlayer", class="UJMExoBundle:Player\ExercisePlayer") * */ - public function updateAction(ExercisePlayer $resource){ - die ('update called'); + public function updateAction(ExercisePlayer $resource) { + + if (false === $this->container->get('security.context')->isGranted('EDIT', $resource->getResourceNode())) { + throw new AccessDeniedException(); + } + + $params = array( + 'method' => 'PUT', + 'csrf_protection' => false, + ); + // Create form + $form = $this->container->get('form.factory')->create('exercise_player_type', $resource, $params); + $request = $this->container->get('request'); + $form->submit($request); + $response = array(); + if ($form->isValid()) { + $resource = $form->getData(); + $updated = $this->get('ujm_exo_bundle.manager.exercise_player')->update($resource); + $response['status'] = 'success'; + $response['messages'] = array(); + $response['data'] = $updated; + } else { + $errors = $this->getFormErrors($form); + $response['status'] = 'error'; + $response['messages'] = $errors; + $response['data'] = null; + } + return new JsonResponse($response); } + + private function getFormErrors(FormInterface $form) { + $errors = array(); + foreach ($form->getErrors() as $key => $error) { + $errors[$key] = $error->getMessage(); + } + // Get errors from children + foreach ($form->all() as $child) { + if (!$child->isValid()) { + $errors[$child->getName()] = $this->getFormErrors($child); + } + } + return $errors; + } + } diff --git a/Controller/Player/ExercisePlayerPageController.php b/Controller/Player/ExercisePlayerPageController.php new file mode 100644 index 000000000..a5f060c6f --- /dev/null +++ b/Controller/Player/ExercisePlayerPageController.php @@ -0,0 +1,54 @@ +container->get('security.context')->isGranted('EDIT', $resource->getResourceNode())) { + throw new AccessDeniedException(); + } + $request = $this->container->get('request'); + // get request data + $pages = $request->request->get('pages'); + + // response + $response = array(); + + // update the exercise player pages + try { + $updated = $this->get('ujm_exo_bundle.manager.pages')->updatePages($resource, $pages); + $response['status'] = 'success'; + $response['messages'] = array(); + $response['data'] = $updated; + } catch (\Exception $ex) { + $response['status'] = 'error'; + $response['messages'] = $ex->getMessage(); + $response['data'] = null; + } + return new JsonResponse($response); + } + + + +} diff --git a/Entity/Player/ExercisePlayer.php b/Entity/Player/ExercisePlayer.php index 2cd5b0afd..ac07412f3 100644 --- a/Entity/Player/ExercisePlayer.php +++ b/Entity/Player/ExercisePlayer.php @@ -38,21 +38,7 @@ class ExercisePlayer extends AbstractResource implements \JsonSerializable { * * @ORM\Column(name="description", type="text", nullable=true) */ - protected $description; - - /** - * @var datetime $creationDate - * - * @ORM\Column(name="creation", type="datetime") - */ - protected $creationDate; - - /** - * @var datetime $modificationDate - * - * @ORM\Column(name="modification", type="datetime") - */ - protected $modificationDate; + protected $description; /** * @var datetime $startDate @@ -68,19 +54,7 @@ class ExercisePlayer extends AbstractResource implements \JsonSerializable { */ protected $endDate; - /** - * @var boolean - * - * @ORM\Column(name="published", type="boolean") - */ - protected $published; - - /** - * @var boolean - * - * @ORM\Column(name="modified", type="boolean") - */ - protected $modified; + /** * Pages associated with ExercisePlayer @@ -89,12 +63,8 @@ class ExercisePlayer extends AbstractResource implements \JsonSerializable { */ protected $pages; - public function __construct() { - $this->published = false; - $this->modified = false; + public function __construct() { $this->startDate = new \DateTime(); - $this->creationDate = new \DateTime(); - $this->modificationDate = new \DateTime(); $this->pages = new ArrayCollection(); } @@ -192,46 +162,7 @@ public function getEndDate() { return $this->endDate; } - /** - * Set player creation date - * - * @param datetime $date - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer - */ - public function setCreationDate($date) { - $this->creationDate = $date; - return $this; - } - - /** - * Get player creation date - * - * @return datetime - */ - public function getCreationDate() { - return $this->creationDate; - } - - /** - * Set player modification date - * - * @param datetime $date - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer - */ - public function setModificationDate($date) { - $this->modificationDate = $date; - return $this; - } - - /** - * Get player modification date - * - * @return datetime - */ - public function getModificationDate() { - return $this->modificationDate; - } - + /** * Set player description * @@ -252,61 +183,14 @@ public function getDescription() { return $this->description; } - /** - * Set player published property - * @param boolean $published - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer - */ - public function setPublished($published) { - $this->published = $published; - return $this; - } - - /** - * Get player published property - * @return boolean - */ - public function getPublished() { - return $this->published; - } - - /** - * Set player modified property - * @param boolean $modified - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer - */ - public function setModified($modified) { - $this->modified = $modified; - return $this; - } - - /** - * Get player modified property - * @return boolean - */ - public function getModified() { - return $this->modified; - } - public function jsonSerialize() { - // TODO serialize Pages arraycollection - /*$pages = array(); - $temp = $this->getPages(); - foreach ($temp as $p){ - $pages[]= $p->jsonSerialize(); - }*/ - return array( 'id' => $this->id, 'name' => $this->name, 'description' => $this->description, - 'start' => $this->startDate, - 'end' => $this->endDate, - 'creation' => $this->creationDate, - 'modification' => $this->modificationDate, - 'published' => $this->published, - // 'pages' => $pages + 'startDate' => !empty($this->startDate) ? $this->startDate->format('Y-m-d'): null, + 'endDate' => !empty($this->endDate) ? $this->endDate->format('Y-m-d'): null ); } diff --git a/Entity/Player/Page.php b/Entity/Player/Page.php index 35ea210de..cc98a466f 100644 --- a/Entity/Player/Page.php +++ b/Entity/Player/Page.php @@ -201,7 +201,8 @@ public function jsonSerialize() 'shuffle' => $this->shuffle, 'isFirst' => $this->isFirstPage, 'isLast' => $this->isLastPage, - 'description' => $this->description + 'description' => $this->description, + 'playerId' => $this->exercisePlayer->getId() ); } diff --git a/Form/Player/ExercisePlayerType.php b/Form/Player/ExercisePlayerType.php index b3c943126..e4713be8d 100644 --- a/Form/Player/ExercisePlayerType.php +++ b/Form/Player/ExercisePlayerType.php @@ -12,14 +12,29 @@ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( - 'name', 'text', array( - 'data' => 'exercise' - ) + 'name', 'text' ) ->add('description', 'tinymce', array( 'attr' => array('data-new-tab' => 'yes'), 'label' => 'Description', 'required' => false ) + ) + ->add('startDate', 'datetime', array( + 'data' => new \DateTime(), + 'attr'=>array('style'=>'display:none;'), + 'widget' => 'single_text', + 'label' => ' ', + 'input' => 'datetime' + ) + ) + ->add('endDate', 'datetime', array( + 'data' => null, + 'attr'=>array('style'=>'display:none;'), + 'label' => ' ', + 'widget' => 'single_text', + 'required' => false , + 'input' => 'datetime' + ) ); } @@ -28,6 +43,7 @@ public function configureOptions(OptionsResolver $resolver) $resolver->setDefaults( array( 'data_class' => 'UJM\ExoBundle\Entity\Player\ExercisePlayer', + 'translation_domain' => 'exercise_player', ) ); } diff --git a/Manager/Player/ExercisePlayerManager.php b/Manager/Player/ExercisePlayerManager.php index 0dd76fd3c..b4dc2cee8 100644 --- a/Manager/Player/ExercisePlayerManager.php +++ b/Manager/Player/ExercisePlayerManager.php @@ -43,12 +43,16 @@ public function createFirstAndLastPage(ExercisePlayer $ep) { $last->setDescription('

This is the last Page

'); $last->setExercisePlayer($ep); $ep->addPage($last); - + + $this->em->persist($ep); + $this->em->flush(); + return $ep; + } + + public function update(ExercisePlayer $ep) { $this->em->persist($ep); $this->em->flush(); return $ep; } - - } diff --git a/Manager/Player/PageManager.php b/Manager/Player/PageManager.php index 62c33a8fa..24112cbf7 100644 --- a/Manager/Player/PageManager.php +++ b/Manager/Player/PageManager.php @@ -36,7 +36,7 @@ public function getFirstPage(ExercisePlayer $ep) { return $page; } - /** + /** * Get first page * @param ExercisePlayer $ep * @return \UJM\ExoBundle\Entity\Player\Page @@ -46,14 +46,103 @@ public function getLastPage(ExercisePlayer $ep) { return $page; } - /** - * Get all pages excluding first and last + /** + * Get all pages * @param ExercisePlayer $ep * @return ArrayCollection */ public function getPages(ExercisePlayer $ep) { - $pages = $this->getRepository()->findBy(array('exercisePlayer' => $ep/*, 'isFirstPage' => false, 'isLastPage' => false*/), array('position' => 'ASC')); + $pages = $this->getRepository()->findBy(array('exercisePlayer' => $ep), array('position' => 'ASC')); return $pages; } + /** + * + * @param ExercisePlayer $ep + * @param type $pages + */ + public function updatePages(ExercisePlayer $ep, $pages) { + + // validate data or throws exception + $this->validatePlayerPagesData($pages); + + // get original pages before update to delete unused pages + $oldPages = $this->getPages($ep); + + $this->deleteUnusedPages($oldPages, $pages); + + foreach ($pages as $page) { + $pageEntity = null; + $toDelete = false; + if (isset($page['id'])) { + $pageEntity = $this->getRepository()->findOneBy(array('id' => $page['id'])); + + } else { + $pageEntity = new Page(); + $pageEntity->setExercisePlayer($ep); + } + if (!$toDelete) { + $pageEntity->setPosition($page['position']); + $pageEntity->setDescription($page['description']); + $pageEntity->setShuffle(isset($page['shuffle']) ? $page['shuffle'] : false); + $this->em->persist($pageEntity); + } + $this->em->flush(); + } + + return $this->getPages($ep); + } + + /** + * Since we get an array from angular service we have to check the received data for each page + * @param Array $pages + * @return boolean + * @throws Exception + */ + private function validatePlayerPagesData($pages) { + $valid = true; + + if (!$valid) { + throw new Exception('error'); + } + return $valid; + } + + /** + * Compare two Page(s) collection, the old one and the new one + * if an item is in the old collection and in the new one we keep it + * if an item in the new collection has no id we also keep it + * if an item has an id but can not be found in the new collection we remove it + * @param ArrayCollection $oldCollection + * @param Array $newCollection + */ + private function deleteUnusedPages($oldCollection, $newCollection){ + foreach ($oldCollection as $toCheck){ + $toKeep = false; + $currentId = $toCheck->getId(); + foreach($newCollection as $new){ + if(!isset($new['id']) || $new['id'] == $currentId){ + $toKeep = true; + break; + } + } + if(!$toKeep){ + $pageEntity = $this->getRepository()->findOneBy(array('id' => $currentId)); + $this->em->remove($pageEntity); + $this->em->flush(); + } + } + } + + public function addPage(ExercisePlayer $ep, $page) { + + $pageEntity = new Page(); + $pageEntity->setExercisePlayer($ep); + $pageEntity->setPosition($page['position']); + $pageEntity->setDescription($page['description']); + $pageEntity->setShuffle(isset($page['shuffle']) ? $page['shuffle'] : false); + $this->em->persist($pageEntity); + $this->em->flush(); + } + } diff --git a/Migrations/pdo_mysql/Version20150707164200.php b/Migrations/pdo_mysql/Version20150707164200.php new file mode 100644 index 000000000..73beda8a9 --- /dev/null +++ b/Migrations/pdo_mysql/Version20150707164200.php @@ -0,0 +1,36 @@ +addSql(" + ALTER TABLE ujm_exercise_player + DROP published, + DROP modified, + DROP creation, + DROP modification + "); + } + + public function down(Schema $schema) + { + $this->addSql(" + ALTER TABLE ujm_exercise_player + ADD published TINYINT(1) NOT NULL, + ADD modified TINYINT(1) NOT NULL, + ADD creation DATETIME NOT NULL, + ADD modification DATETIME NOT NULL + "); + } +} \ No newline at end of file diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml index 21a2650c7..1b179a5cf 100755 --- a/Resources/config/routing.yml +++ b/Resources/config/routing.yml @@ -54,3 +54,9 @@ exercise_player: resource: "@UJMExoBundle/Controller/Player/ExercisePlayerController.php" type: annotation prefix: /player + + +exercise_pages: + resource: "@UJMExoBundle/Controller/Player/ExercisePlayerPageController.php" + type: annotation + prefix: /page diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 5c644e26e..48e3ea83f 100755 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -196,7 +196,7 @@ services: entityManager: @doctrine.orm.entity_manager translator: @translator - ujm_exo_bundle.manager.page: + ujm_exo_bundle.manager.pages: class: UJM\ExoBundle\Manager\Player\PageManager arguments: entityManager: @doctrine.orm.entity_manager diff --git a/Resources/public/css/exercise-player.css b/Resources/public/css/exercise-player.css index 4bbdb3227..7d636e534 100644 --- a/Resources/public/css/exercise-player.css +++ b/Resources/public/css/exercise-player.css @@ -1 +1 @@ -.exercise-player-container .exercise-player-page ul.page-list{list-style-type:none}.exercise-player-container .exercise-player-page ul.page-list li.page-list-item{display:inline-block;width:50px;height:50px;border:1px solid black;margin:5px;border-radius:5px}.exercise-player-container .exercise-player-page ul.page-list li.page-list-item a{display:inline-block;padding-top:12px} \ No newline at end of file +.exercise-player-container{width:100%;background:white;padding:15px}.exercise-player-container .page-container ul.page-list{list-style-type:none}.exercise-player-container .page-container ul.page-list li.page-list-item{display:inline-block;width:50px;height:50px;border:1px solid black;margin:5px;border-radius:5px}.exercise-player-container .page-container ul.page-list li.page-list-item a{display:inline-block;padding-top:12px} \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js index 31b45c598..81cce2c3f 100644 --- a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js +++ b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js @@ -4,24 +4,24 @@ angular.module('Page').controller('PageEditCtrl', [ 'PageService', function (PageService) { - - this.currentPage = {}; + this.pages = {}; - + this.currentPageIndex = 0; + this.sortableOptions = { placeholder: "placeholder", stop: function (e, ui) { - this.updateActivitiesOrder(); + this.updateActivitiesOrder(); }.bind(this), cancel: ".unsortable", items: "li:not(.unsortable)" }; - + // Tiny MCE options this.tinymceOptions = { relative_urls: false, theme: 'modern', - browser_spellcheck : true, + browser_spellcheck: true, autoresize_min_height: 100, autoresize_max_height: 500, plugins: [ @@ -43,51 +43,88 @@ } } }; - - this.addPage = function(){ - + + // Page constructor + var my = this; + var Page = function () { + var ujm_page = { + description: '

New page default description

', + position: my.pages.length, + shuffle: false, + playerId: my.pages[0].playerId, + isLast: false, + isFirst: false + }; + return ujm_page; + }; + + this.addPage = function () { + // create a new page + var page = new Page(); + // update last page position + var last = this.pages[this.pages.length - 1]; + last.position = page.position + 1; + // add new page at the right index in pages array + this.pages.splice(this.pages.length - 1, 0, page); }; - - this.removePage = function(){ - + + this.removePage = function () { + var current = this.pages[this.currentPageIndex]; + console.log(current); + if (current && !current.isLast && !current.isFirst) { + var index = this.pages.indexOf(current); + // update positions... + for (var i = index; i < this.pages.length; i++) { + var p = this.pages[i]; + p.position = p.position - 1; + } + // remove page + this.pages.splice(index, 1); + } }; - - this.update = function(){ - + + this.update = function () { + var promise = PageService.update(this.pages); + promise.then(function (result) { + console.log('result'); + console.log(result); + }, function (error) { + console.log('error'); + console.log(error); + }); + }; - this.getNextPage = function () { - var index = this.pages.indexOf(this.currentPage); - if (false !== index && this.pages[index + 1]) { - this.setCurrentPage(this.pages[index + 1]); + this.getNextPage = function () { + var newIndex = this.currentPageIndex + 1; + if (this.pages[newIndex]) { + this.currentPageIndex = newIndex; } else { - this.setCurrentPage(this.pages[0]); + this.currentPageIndex = 0; } }; - - this.getPreviousPage = function(){ - var index = this.pages.indexOf(this.currentPage); - if (false !== index && this.pages[index - 1]) { - this.setCurrentPage(this.pages[index - 1]); + + this.getPreviousPage = function () { + var newIndex = this.currentPageIndex - 1; + if (this.pages[newIndex]) { + this.currentPageIndex = newIndex; } else { - this.setCurrentPage(this.pages[this.pages.length - 1]); + this.currentPageIndex = this.pages.length - 1; } }; - - this.setPages = function(pages){ + + + this.setPages = function (pages) { this.pages = pages; }; - - this.getPages = function(){ + + this.getPages = function () { return this.pages; - } - - this.setCurrentPage = function(page){ - this.currentPage = page; }; - - this.getCurrentPage = function (){ - return currentPage; + + this.setCurrentPage = function (page) { + var index = this.pages.indexOf(page); + this.currentPageIndex = index; }; } ]); diff --git a/Resources/public/js/player/Page/Directives/PageEditDirective.js b/Resources/public/js/player/Page/Directives/PageEditDirective.js index 5defc7e67..ee73ae261 100644 --- a/Resources/public/js/player/Page/Directives/PageEditDirective.js +++ b/Resources/public/js/player/Page/Directives/PageEditDirective.js @@ -12,19 +12,19 @@ replace: true, controller: 'PageEditCtrl', controllerAs: 'pageEditCtrl', - templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/edit.html', + templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/page.edit.html', scope: { - pages: '=', - first: '=', - last: '=', - player: '=' + pages: '=' }, link: function (scope, element, attr, pageEditCtrl) { // set current page to first page - console.log('directive link method called'); - pageEditCtrl.setCurrentPage(scope.first); + console.log('page edit directive link method called'); + //pageEditCtrl.setCurrentPage(scope.pages[0]); pageEditCtrl.setPages(scope.pages); + //console.log(scope.pages[0].description); + //pageEditCtrl.setPlayer(scope.player); + /* console.log(scope.player); console.log(scope.last); @@ -36,5 +36,3 @@ } ]); })(); - - diff --git a/Resources/public/js/player/Page/Directives/PageShowDirective.js b/Resources/public/js/player/Page/Directives/PageShowDirective.js index 1e11b1d5e..515eaccd5 100644 --- a/Resources/public/js/player/Page/Directives/PageShowDirective.js +++ b/Resources/public/js/player/Page/Directives/PageShowDirective.js @@ -12,11 +12,9 @@ replace: true, controller: 'PageShowCtrl', controllerAs: 'pageShowCtrl', - templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/show.html', + templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/page.show.html', scope: { - page: '=', - name: '@', - player: '=' + pages: '=' }, link: function (scope, element, attr, pageShowCtrl) { diff --git a/Resources/public/js/player/Page/Partials/edit.html b/Resources/public/js/player/Page/Partials/edit.html deleted file mode 100644 index a7a64a272..000000000 --- a/Resources/public/js/player/Page/Partials/edit.html +++ /dev/null @@ -1,45 +0,0 @@ -
-
-

You are editing player : {{player.name}}

-
- - - -
-
-
- -
-
- player name : {{player.name}} -
-
-
- -
-
- -
- -
- - -
-
-
- -
-
- -
-
-
-
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Partials/page.edit.html b/Resources/public/js/player/Page/Partials/page.edit.html new file mode 100644 index 000000000..b11a976d3 --- /dev/null +++ b/Resources/public/js/player/Page/Partials/page.edit.html @@ -0,0 +1,49 @@ +
+
+
+

{{ 'exercise_player_page_panel_title'|trans:{}:'exercise_player' }} {{ pageEditCtrl.currentPageIndex + 1}} / {{ pageEditCtrl.pages.length}}

+
+ + + +
+
+
+ +
+
+ +
+ +
+ + +
+
+
+ + +
+
+ +
+
+
+ +
+ + +
+
+
+
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Partials/page.show.html b/Resources/public/js/player/Page/Partials/page.show.html new file mode 100644 index 000000000..6682a2cb8 --- /dev/null +++ b/Resources/public/js/player/Page/Partials/page.show.html @@ -0,0 +1,11 @@ +
+
+

This is the "show exercise player" partial panel header

+
+
+

This is the "show exercise player" partial panel body

+
+

Nothing is implemented in the player yet :(

+

Please use the administrate resource menu to see the actual exercsie player interface in edit mode.

+
+
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Partials/show.html b/Resources/public/js/player/Page/Partials/show.html deleted file mode 100644 index d7a344b97..000000000 --- a/Resources/public/js/player/Page/Partials/show.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-

This is the "show exercise player" partial panel header

-
-
- This is the "show exercise player" partial panel body -
-

{{name}}

-
-
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Services/PageService.js b/Resources/public/js/player/Page/Services/PageService.js index f5303c2b0..0d3e721ab 100644 --- a/Resources/public/js/player/Page/Services/PageService.js +++ b/Resources/public/js/player/Page/Services/PageService.js @@ -6,51 +6,50 @@ angular.module('Page').factory('PageService', [ '$http', - function PageService($http) { + '$filter', + '$q', + function PageService($http, $filter, $q) { - /** - * ExercisePlayer Id - * @type {Number} - */ - var id = null; - - /** - * current page properties - * @type object - */ - var page = { - title: 'new page' - }; - return { - /** - * Test method - * - * @param {string} [name] - * @returns {string} - */ - hello: function (name) { - return 'Hello ' + name; - }, - setPlayerId: function (value){ - id = value; - }, - /** - * Get exercise player ID - * @returns {Number} - */ - getPlayerId: function(){ - return id; - }, - setPage: function(value){ - page = value; + + + addPage : function(){ + function Page(){ + var ujm_player = { + name: player.name, + description: player.description, + startDate: new Date(player.startDate), + endDate: new Date(player.endDate) + }; + + return ujm_player; + } + + var updated = new Player(player); }, + /** - * - * @returns {Object} page + * Update exercise player pages + * @param player + * @returns */ - getPage: function(){ - return page; + update : function (pages){ + var deferred = $q.defer(); + var playerId = pages[0].playerId; + $http + .post( + Routing.generate('ujm_pages_update', { id : playerId}), {pages: pages} + ) + .success(function (response){ + deferred.resolve(response); + }) + .error(function(data, status){ + console.log('Page service, update method error'); + console.log(status); + console.log(data); + }); + + return deferred.promise; } }; } diff --git a/Resources/public/js/player/Player/Controllers/PlayerEditCtrl.js b/Resources/public/js/player/Player/Controllers/PlayerEditCtrl.js new file mode 100644 index 000000000..5cb6640b1 --- /dev/null +++ b/Resources/public/js/player/Player/Controllers/PlayerEditCtrl.js @@ -0,0 +1,77 @@ +(function () { + 'use strict'; + + angular.module('Player').controller('PlayerEditCtrl', [ + 'PlayerService', + function (PlayerService) { + + this.player = {}; + this.isCollapsed = false; + + this.endDateIsOpened = false; + this.startDateIsOpened = false; + + this.openEndDate = function ($event) { + $event.preventDefault(); + $event.stopPropagation(); + this.startDateIsOpened = true; + }; + + this.openStartDate = function ($event) { + $event.preventDefault(); + $event.stopPropagation(); + this.endDateIsOpened = true; + }; + + // not working + this.dateOptions = { + showButtonBar: false, + closeText: 'Close Me', + showWeeks: false + }; + + + + // Tiny MCE options + this.tinymceOptions = { + relative_urls: false, + theme: 'modern', + browser_spellcheck: true, + autoresize_min_height: 100, + autoresize_max_height: 500, + plugins: [ + 'autoresize advlist autolink lists link image charmap print preview hr anchor pagebreak', + 'searchreplace wordcount visualblocks visualchars fullscreen', + 'insertdatetime media nonbreaking save table directionality', + 'template paste textcolor emoticons code' + ], + toolbar1: 'undo redo | styleselect | bold italic underline | forecolor | alignleft aligncenter alignright | preview fullscreen', + paste_preprocess: function (plugin, args) { + var link = $('
' + args.content + '
').text().trim(); //inside div because a bug of jquery + var url = link.match(/^(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})$/); + + if (url) { + args.content = '' + link + ''; + window.Claroline.Home.generatedContent(link, function (data) { + insertContent(data); + }, false); + } + } + }; + + + this.update = function () { + console.log(this.player); + PlayerService.update(this.player); + }; + + this.setPlayer = function (player) { + this.player = player; + }; + + this.getPlayer = function () { + return this.player; + }; + } + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/player/Player/Directives/PlayerEditDirective.js b/Resources/public/js/player/Player/Directives/PlayerEditDirective.js new file mode 100644 index 000000000..7406b32b9 --- /dev/null +++ b/Resources/public/js/player/Player/Directives/PlayerEditDirective.js @@ -0,0 +1,30 @@ +/** + * Activity Form directive + * Directive Documentation : https://docs.angularjs.org/guide/directive + */ +(function () { + 'use strict'; + + angular.module('Player').directive('playerEdit', [ + function () { + return { + restrict: 'E', + replace: true, + controller: 'PlayerEditCtrl', + controllerAs: 'playerEditCtrl', + templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Player/Partials/player.edit.html', + scope: { + player: '=' + }, + link: function (scope, element, attr, playerEditCtrl) { + // set current page to first page + console.log('player directive link method called'); + playerEditCtrl.setPlayer(scope.player); + + } + }; + } + ]); +})(); + + diff --git a/Resources/public/js/player/Player/Partials/player.edit.html b/Resources/public/js/player/Player/Partials/player.edit.html new file mode 100644 index 000000000..458342f5c --- /dev/null +++ b/Resources/public/js/player/Player/Partials/player.edit.html @@ -0,0 +1,38 @@ +
+
+
+

{{ 'exercise_player_panel_title'|trans:{}:'exercise_player' }}

+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/Resources/public/js/player/Player/Services/PlayerService.js b/Resources/public/js/player/Player/Services/PlayerService.js index 3a73850c9..ab26d7e59 100644 --- a/Resources/public/js/player/Player/Services/PlayerService.js +++ b/Resources/public/js/player/Player/Services/PlayerService.js @@ -8,47 +8,37 @@ '$http', '$filter', '$q', - function PlayerService($http, $filter, $q) { - + function PlayerService($http, $filter, $q) { return { - /** - * Test method - * - * @param {string} [name] - * @returns {string} - */ - hello: function (name) { - return 'Hello ' + name; - }, + /** * Update the player - * @param {type} player - * @returns {undefined} + * @param player + * @returns */ update : function (player){ - var deferred = $q.defer(); - + var deferred = $q.defer(); // player constructor function Player(player){ var ujm_player = { - name:player.name, + name: player.name, description: player.description, - startDate: player.startDate, - endDate: player.endDate, - modification: new Date() + startDate: new Date(player.startDate), + endDate: new Date(player.endDate) }; return ujm_player; } var updated = new Player(player); + $http .put( - Routing.generate('ujm_player_update', { playerId : player.id }), + Routing.generate('ujm_player_update', { id : player.id }), { - player: updated + exercise_player_type: updated } ) .success(function (response){ diff --git a/Resources/public/js/player/Player/module.js b/Resources/public/js/player/Player/module.js index cec394ccb..4b098c8db 100644 --- a/Resources/public/js/player/Player/module.js +++ b/Resources/public/js/player/Player/module.js @@ -5,7 +5,7 @@ 'use strict'; angular.module('Player', [ - + ]); })(); diff --git a/Resources/public/js/player/editor.module.js b/Resources/public/js/player/editor.module.js index 10a49c548..3a707de51 100644 --- a/Resources/public/js/player/editor.module.js +++ b/Resources/public/js/player/editor.module.js @@ -8,6 +8,7 @@ 'ui.tinymce', 'ui.translation', 'ui.resourcePicker', - 'Page' + 'Page', + 'Player' ]); })(); \ No newline at end of file diff --git a/Resources/public/less/exercise-player.less b/Resources/public/less/exercise-player.less index 70927ddda..c69db4e33 100644 --- a/Resources/public/less/exercise-player.less +++ b/Resources/public/less/exercise-player.less @@ -1,6 +1,11 @@ .exercise-player-container{ - - .exercise-player-page{ + width: 100%; + background: white; + padding: 15px; + .player-container{ + + } + .page-container{ ul.page-list{ list-style-type: none; diff --git a/Resources/translations/exercise_player.en.yml b/Resources/translations/exercise_player.en.yml new file mode 100644 index 000000000..16e2079d2 --- /dev/null +++ b/Resources/translations/exercise_player.en.yml @@ -0,0 +1,19 @@ +# e +exercise_player_type_name : Player name +exercise_player_type_description : Player description +exercise_player_start_date: Start date +exercise_player_end_date: End date +exercise_player_name : Name +exercise_player_description : Description +exercise_player_page_description: Description +exercise_player_page_shuffle: Shuffle +exercise_player_page_previous: Previous page +exercise_player_page_next: Next page +exercise_player_page_view: View page +exercise_player_pages_save: Save pages +exercise_player_page_add: Add page +exercise_player_page_remove: Ramove page +exercise_player_panel_hide: Hide / Show player informations +exercise_player_panel_title: Player +exercise_player_save: Save player +exercise_player_page_panel_title: Pages diff --git a/Resources/translations/exercise_player.fr.yml b/Resources/translations/exercise_player.fr.yml new file mode 100644 index 000000000..9a3eb266f --- /dev/null +++ b/Resources/translations/exercise_player.fr.yml @@ -0,0 +1,19 @@ +# e +exercise_player_type_name : Nom du player +exercise_player_type_description : Description du player +exercise_player_start_date: Date de début +exercise_player_end_date: Date de fin +exercise_player_name : Nom +exercise_player_description : Description +exercise_player_page_description: Description +exercise_player_page_shuffle: Aléatoire +exercise_player_page_previous: Page précédente +exercise_player_page_next: Page suivante +exercise_player_page_view: Voir la page +exercise_player_pages_save: Sauvegarder les pages du player +exercise_player_page_add: Ajouter une page +exercise_player_page_remove: Supprimer une page +exercise_player_panel_hide: Cacher / Montrer les informations du player +exercise_player_panel_title: Player +exercise_player_save: Sauvegarder le player +exercise_player_page_panel_title: Pages \ No newline at end of file diff --git a/Resources/translations/resource.en.yml b/Resources/translations/resource.en.yml index c3025c14a..bf0fcd967 100755 --- a/Resources/translations/resource.en.yml +++ b/Resources/translations/resource.en.yml @@ -1,6 +1,3 @@ -# e -exercise_player_type_name: Name - # u ujm_exercise: Exercise ujm_exercise_player: Exercise player diff --git a/Resources/translations/resource.fr.yml b/Resources/translations/resource.fr.yml index 45f3d521a..ed0b6c914 100755 --- a/Resources/translations/resource.fr.yml +++ b/Resources/translations/resource.fr.yml @@ -1,6 +1,3 @@ -# e -exercise_player_type_name: Nom - # u ujm_exercise: Exercice ujm_exercise_player: Player d'exercice diff --git a/Resources/views/Player/edit.html.twig b/Resources/views/Player/edit.html.twig index b71257614..753a2769b 100644 --- a/Resources/views/Player/edit.html.twig +++ b/Resources/views/Player/edit.html.twig @@ -6,7 +6,8 @@ {% block content %}
- + +
{% endblock %} @@ -15,9 +16,12 @@ {# Load Claroline JS #} {{ parent() }} - - {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm_exo_player_editor.js' + + '@UJMExoBundle/Resources/public/js/player/Player/*' + '@UJMExoBundle/Resources/public/js/player/Player/Controllers/*' + '@UJMExoBundle/Resources/public/js/player/Player/Directives/*' + '@UJMExoBundle/Resources/public/js/player/Player/Services/*' '@UJMExoBundle/Resources/public/js/player/Page/*' '@UJMExoBundle/Resources/public/js/player/Page/Controllers/*' diff --git a/Resources/views/Player/layout.html.twig b/Resources/views/Player/layout.html.twig index 86e8b64ef..145097615 100644 --- a/Resources/views/Player/layout.html.twig +++ b/Resources/views/Player/layout.html.twig @@ -21,7 +21,7 @@ {{ parent() }} {# Translations #} - + {# Angular JS #} {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm-exo-angular-js.js' From 358f040fff7a4406c2d5d3605d8b23d00b658b77 Mon Sep 17 00:00:00 2001 From: pitrackster Date: Fri, 10 Jul 2015 13:29:22 +0200 Subject: [PATCH 10/11] add drag and drop to pages in edit mode --- Resources/public/css/exercise-player.css | 2 +- .../player/Page/Controllers/PageEditCtrl.js | 26 +++++++++++++--- .../js/player/Page/Partials/page.edit.html | 11 +++---- .../js/player/Page/Partials/page.show.html | 2 +- Resources/public/js/player/editor.module.js | 3 +- Resources/public/less/exercise-player.less | 31 ++++++++++++++----- 6 files changed, 53 insertions(+), 22 deletions(-) diff --git a/Resources/public/css/exercise-player.css b/Resources/public/css/exercise-player.css index 7d636e534..7802013e3 100644 --- a/Resources/public/css/exercise-player.css +++ b/Resources/public/css/exercise-player.css @@ -1 +1 @@ -.exercise-player-container{width:100%;background:white;padding:15px}.exercise-player-container .page-container ul.page-list{list-style-type:none}.exercise-player-container .page-container ul.page-list li.page-list-item{display:inline-block;width:50px;height:50px;border:1px solid black;margin:5px;border-radius:5px}.exercise-player-container .page-container ul.page-list li.page-list-item a{display:inline-block;padding-top:12px} \ No newline at end of file +.exercise-player-container{width:100%;background:white;padding:15px}.exercise-player-container .page-container ul.page-list{list-style-type:none}.exercise-player-container .page-container ul.page-list li.page-list-item{display:inline-block;line-height:50px;width:50px;height:50px;vertical-align:middle;border:1px solid black;cursor:pointer;background-color:rgba(255,255,255,0.8);margin:5px;border-radius:5px}.exercise-player-container .page-container ul.page-list li.page-list-item div{display:inline-block}.exercise-player-container .page-container ul.page-list li.page-list-item.active{background-color:#428bca}.exercise-player-container .page-container ul.page-list .placeholder{display:inline-block;border:1px dotted #aaa;width:35px;line-height:50px;height:35px;vertical-align:middle;border-radius:5px;background-color:rgba(66,139,202,0.2)} \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js index 81cce2c3f..89508c954 100644 --- a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js +++ b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js @@ -10,8 +10,18 @@ this.sortableOptions = { placeholder: "placeholder", + axis: 'x', + /* start: function (e, ui){ + console.log('start'); + var item = ui.item.scope().page; + var fromIndex = ui.item.sortable.index; + console.log('start', item, fromIndex); + }.bind(this),*/ stop: function (e, ui) { - this.updateActivitiesOrder(); + /*var item = ui.item.scope().page; + var toIndex = ui.item.sortable.dropindex; + item.position = toIndex + 1;*/ + this.updatePagesOrder(); }.bind(this), cancel: ".unsortable", items: "li:not(.unsortable)" @@ -86,11 +96,9 @@ this.update = function () { var promise = PageService.update(this.pages); promise.then(function (result) { - console.log('result'); - console.log(result); + console.log('ok'); }, function (error) { console.log('error'); - console.log(error); }); }; @@ -112,6 +120,16 @@ this.currentPageIndex = this.pages.length - 1; } }; + + // on dragg end + this.updatePagesOrder = function(){ + console.log('dragg end'); + var index = 0; + for(index; index < this.pages.length; index++){ + var p = this.pages[index]; + p.position = index + 1; + } + } this.setPages = function (pages) { diff --git a/Resources/public/js/player/Page/Partials/page.edit.html b/Resources/public/js/player/Page/Partials/page.edit.html index b11a976d3..d7236320e 100644 --- a/Resources/public/js/player/Page/Partials/page.edit.html +++ b/Resources/public/js/player/Page/Partials/page.edit.html @@ -15,17 +15,14 @@

{{ 'exercise_player_page_panel_title'|trans:{}

-
- - +

diff --git a/Resources/public/js/player/Page/Partials/page.show.html b/Resources/public/js/player/Page/Partials/page.show.html index 6682a2cb8..edfb3a15c 100644 --- a/Resources/public/js/player/Page/Partials/page.show.html +++ b/Resources/public/js/player/Page/Partials/page.show.html @@ -6,6 +6,6 @@

This is the "show exercise player" partial panel header<

This is the "show exercise player" partial panel body


Nothing is implemented in the player yet :(

-

Please use the administrate resource menu to see the actual exercsie player interface in edit mode.

+

Please use the administrate resource menu to see the actual exercise player interface in edit mode.

\ No newline at end of file diff --git a/Resources/public/js/player/editor.module.js b/Resources/public/js/player/editor.module.js index 3a707de51..7229cfe50 100644 --- a/Resources/public/js/player/editor.module.js +++ b/Resources/public/js/player/editor.module.js @@ -4,7 +4,8 @@ // exercise player module angular.module('ExercisePlayerEditorApp', [ 'ngSanitize', - 'ui.bootstrap', + 'ui.bootstrap', + 'ui.sortable', 'ui.tinymce', 'ui.translation', 'ui.resourcePicker', diff --git a/Resources/public/less/exercise-player.less b/Resources/public/less/exercise-player.less index c69db4e33..9f8815b74 100644 --- a/Resources/public/less/exercise-player.less +++ b/Resources/public/less/exercise-player.less @@ -3,7 +3,7 @@ background: white; padding: 15px; .player-container{ - + } .page-container{ @@ -11,20 +11,35 @@ list-style-type: none; li.page-list-item { display: inline-block; + line-height: 50px; width:50px; height: 50px; + vertical-align: middle; border: 1px solid black; - /*background-color: rgba(22, 22,128, 0.8);*/ + cursor: pointer; + background-color: rgba(255, 255, 255, 0.8); margin: 5px; border-radius: 5px; - a { + div { display: inline-block; - padding-top: 12px; + /*padding-top: 12px;*/ } + + } + li.page-list-item.active{ + background-color: rgba(66, 139, 202, 1); + } + .placeholder { + display: inline-block; + border: 1px dotted #aaa; + width:35px; + line-height: 50px; + height: 35px; + /*padding-top:10px;*/ + vertical-align: middle; + border-radius: 5px; + background-color: rgba(66, 139, 202, 0.2); } } - } - -} - +} \ No newline at end of file From 576371d14d873878aed40e7cc552073b07dde7ae Mon Sep 17 00:00:00 2001 From: pitrackster Date: Thu, 16 Jul 2015 09:42:23 +0200 Subject: [PATCH 11/11] rename entities --- .../SequenceController.php} | 41 +++-- .../StepController.php} | 20 +-- .../Sequence.php} | 70 ++++---- Entity/{Player/Page.php => Sequence/Step.php} | 74 ++++----- .../SequenceType.php} | 10 +- ...layerListener.php => SequenceListener.php} | 33 ++-- Manager/Player/ExercisePlayerManager.php | 58 ------- Manager/Player/PageManager.php | 148 ----------------- Manager/Sequence/SequenceManager.php | 57 +++++++ Manager/Sequence/StepManager.php | 125 +++++++++++++++ .../pdo_mysql/Version20150715120410.php | 68 ++++++++ Resources/config/config.yml | 6 +- Resources/config/form_types.yml | 4 +- Resources/config/parameters.yml | 6 +- Resources/config/routing.yml | 10 +- Resources/config/services.yml | 24 +-- Resources/public/css/ujm-sequence.css | 1 + .../player/Page/Controllers/PageEditCtrl.js | 149 ------------------ .../player/Page/Controllers/PageShowCtrl.js | 14 -- .../Page/Directives/PageEditDirective.js | 38 ----- .../Page/Directives/PageShowDirective.js | 27 ---- .../js/player/Page/Partials/page.edit.html | 46 ------ .../js/player/Page/Services/PageService.js | 57 ------- .../player/Player/Partials/player.edit.html | 38 ----- .../Sequence/Controllers/SequenceEditCtrl.js} | 22 ++- .../Directives/SequenceEditDirective.js} | 16 +- .../Sequence/Partials/sequence.edit.html | 38 +++++ .../Sequence/Services/SequenceService.js} | 33 ++-- .../Player => sequence/Sequence}/module.js | 2 +- .../sequence/Step/Controllers/StepEditCtrl.js | 138 ++++++++++++++++ .../sequence/Step/Controllers/StepShowCtrl.js | 14 ++ .../Step/Directives/StepEditDirective.js | 27 ++++ .../Step/Directives/StepShowDirective.js | 24 +++ .../js/sequence/Step/Partials/step.edit.html | 46 ++++++ .../Step/Partials/step.show.html} | 0 .../js/sequence/Step/Services/StepService.js | 41 +++++ .../{player/Page => sequence/Step}/module.js | 2 +- .../js/{player => sequence}/editor.module.js | 6 +- .../js/{player => sequence}/player.module.js | 4 +- ...exercise-player.less => ujm-sequence.less} | 10 +- Resources/translations/exercise_player.en.yml | 19 --- Resources/translations/exercise_player.fr.yml | 19 --- Resources/translations/resource.en.yml | 4 +- Resources/translations/resource.fr.yml | 5 +- Resources/translations/ujm_sequence.en.yml | 19 +++ Resources/translations/ujm_sequence.fr.yml | 19 +++ Resources/views/Player/edit.html.twig | 39 ----- Resources/views/Player/view.html.twig | 35 ---- Resources/views/Sequence/edit.html.twig | 39 +++++ .../{Player => Sequence}/layout.html.twig | 6 +- Resources/views/Sequence/view.html.twig | 35 ++++ 51 files changed, 892 insertions(+), 894 deletions(-) rename Controller/{Player/ExercisePlayerController.php => Sequence/SequenceController.php} (67%) rename Controller/{Player/ExercisePlayerPageController.php => Sequence/StepController.php} (69%) rename Entity/{Player/ExercisePlayer.php => Sequence/Sequence.php} (67%) rename Entity/{Player/Page.php => Sequence/Step.php} (62%) rename Form/{Player/ExercisePlayerType.php => Sequence/SequenceType.php} (84%) rename Listener/Resource/{ExercisePlayerListener.php => SequenceListener.php} (74%) delete mode 100644 Manager/Player/ExercisePlayerManager.php delete mode 100644 Manager/Player/PageManager.php create mode 100644 Manager/Sequence/SequenceManager.php create mode 100644 Manager/Sequence/StepManager.php create mode 100644 Migrations/pdo_mysql/Version20150715120410.php create mode 100644 Resources/public/css/ujm-sequence.css delete mode 100644 Resources/public/js/player/Page/Controllers/PageEditCtrl.js delete mode 100644 Resources/public/js/player/Page/Controllers/PageShowCtrl.js delete mode 100644 Resources/public/js/player/Page/Directives/PageEditDirective.js delete mode 100644 Resources/public/js/player/Page/Directives/PageShowDirective.js delete mode 100644 Resources/public/js/player/Page/Partials/page.edit.html delete mode 100644 Resources/public/js/player/Page/Services/PageService.js delete mode 100644 Resources/public/js/player/Player/Partials/player.edit.html rename Resources/public/js/{player/Player/Controllers/PlayerEditCtrl.js => sequence/Sequence/Controllers/SequenceEditCtrl.js} (83%) rename Resources/public/js/{player/Player/Directives/PlayerEditDirective.js => sequence/Sequence/Directives/SequenceEditDirective.js} (50%) create mode 100644 Resources/public/js/sequence/Sequence/Partials/sequence.edit.html rename Resources/public/js/{player/Player/Services/PlayerService.js => sequence/Sequence/Services/SequenceService.js} (51%) rename Resources/public/js/{player/Player => sequence/Sequence}/module.js (70%) create mode 100644 Resources/public/js/sequence/Step/Controllers/StepEditCtrl.js create mode 100644 Resources/public/js/sequence/Step/Controllers/StepShowCtrl.js create mode 100644 Resources/public/js/sequence/Step/Directives/StepEditDirective.js create mode 100644 Resources/public/js/sequence/Step/Directives/StepShowDirective.js create mode 100644 Resources/public/js/sequence/Step/Partials/step.edit.html rename Resources/public/js/{player/Page/Partials/page.show.html => sequence/Step/Partials/step.show.html} (100%) create mode 100644 Resources/public/js/sequence/Step/Services/StepService.js rename Resources/public/js/{player/Page => sequence/Step}/module.js (73%) rename Resources/public/js/{player => sequence}/editor.module.js (74%) rename Resources/public/js/{player => sequence}/player.module.js (76%) rename Resources/public/less/{exercise-player.less => ujm-sequence.less} (88%) delete mode 100644 Resources/translations/exercise_player.en.yml delete mode 100644 Resources/translations/exercise_player.fr.yml create mode 100644 Resources/translations/ujm_sequence.en.yml create mode 100644 Resources/translations/ujm_sequence.fr.yml delete mode 100644 Resources/views/Player/edit.html.twig delete mode 100644 Resources/views/Player/view.html.twig create mode 100644 Resources/views/Sequence/edit.html.twig rename Resources/views/{Player => Sequence}/layout.html.twig (92%) create mode 100644 Resources/views/Sequence/view.html.twig diff --git a/Controller/Player/ExercisePlayerController.php b/Controller/Sequence/SequenceController.php similarity index 67% rename from Controller/Player/ExercisePlayerController.php rename to Controller/Sequence/SequenceController.php index 00b7d25c2..b5d3e40be 100644 --- a/Controller/Player/ExercisePlayerController.php +++ b/Controller/Sequence/SequenceController.php @@ -1,6 +1,6 @@ container->get('security.context')->isGranted('OPEN', $resource->getResourceNode())) { throw new AccessDeniedException(); } - return $this->render('UJMExoBundle:Player:view.html.twig', array( + return $this->render('UJMExoBundle:Sequence:view.html.twig', array( '_resource' => $resource ) ); @@ -38,32 +37,32 @@ public function openAction(ExercisePlayer $resource) { /** * administrate an exercise player - * @Route("/edit/{id}", requirements={"id" = "\d+"}, name="ujm_player_administrate") + * @Route("/edit/{id}", requirements={"id" = "\d+"}, name="ujm_sequence_administrate") * @Method("GET") - * @ParamConverter("ExercisePlayer", class="UJMExoBundle:Player\ExercisePlayer") + * @ParamConverter("Sequence", class="UJMExoBundle:Sequence\Sequence") */ - public function administrateAction(ExercisePlayer $resource) { + public function administrateAction(Sequence $resource) { if (false === $this->container->get('security.context')->isGranted('ADMINISTRATE', $resource->getResourceNode())) { throw new AccessDeniedException(); } - $pages = $this->get('ujm_exo_bundle.manager.pages')->getPages($resource); + $steps = $this->get('ujm_exo_bundle.manager.steps')->getSteps($resource); - return $this->render('UJMExoBundle:Player:edit.html.twig', array( + return $this->render('UJMExoBundle:Sequence:edit.html.twig', array( '_resource' => $resource, - 'pages' => $pages + 'steps' => $steps ) ); } /** * update an exercise player - * @Route("/update/{id}", requirements={"id" = "\d+"}, name="ujm_player_update", options = {"expose" = true}) + * @Route("/update/{id}", requirements={"id" = "\d+"}, name="ujm_sequence_update", options = {"expose" = true}) * @Method("PUT") - * @ParamConverter("ExercisePlayer", class="UJMExoBundle:Player\ExercisePlayer") + * @ParamConverter("Sequence", class="UJMExoBundle:Sequence\Sequence") * */ - public function updateAction(ExercisePlayer $resource) { + public function updateAction(Sequence $resource) { if (false === $this->container->get('security.context')->isGranted('EDIT', $resource->getResourceNode())) { throw new AccessDeniedException(); @@ -74,13 +73,13 @@ public function updateAction(ExercisePlayer $resource) { 'csrf_protection' => false, ); // Create form - $form = $this->container->get('form.factory')->create('exercise_player_type', $resource, $params); + $form = $this->container->get('form.factory')->create('sequence_type', $resource, $params); $request = $this->container->get('request'); $form->submit($request); $response = array(); if ($form->isValid()) { $resource = $form->getData(); - $updated = $this->get('ujm_exo_bundle.manager.exercise_player')->update($resource); + $updated = $this->get('ujm_exo_bundle.manager.sequence')->update($resource); $response['status'] = 'success'; $response['messages'] = array(); $response['data'] = $updated; diff --git a/Controller/Player/ExercisePlayerPageController.php b/Controller/Sequence/StepController.php similarity index 69% rename from Controller/Player/ExercisePlayerPageController.php rename to Controller/Sequence/StepController.php index a5f060c6f..004a1d79e 100644 --- a/Controller/Player/ExercisePlayerPageController.php +++ b/Controller/Sequence/StepController.php @@ -1,6 +1,6 @@ container->get('security.context')->isGranted('EDIT', $resource->getResourceNode())) { throw new AccessDeniedException(); } $request = $this->container->get('request'); // get request data - $pages = $request->request->get('pages'); + $steps = $request->request->get('steps'); // response $response = array(); // update the exercise player pages try { - $updated = $this->get('ujm_exo_bundle.manager.pages')->updatePages($resource, $pages); + $updated = $this->get('ujm_exo_bundle.manager.steps')->updateSteps($resource, $steps); $response['status'] = 'success'; $response['messages'] = array(); $response['data'] = $updated; diff --git a/Entity/Player/ExercisePlayer.php b/Entity/Sequence/Sequence.php similarity index 67% rename from Entity/Player/ExercisePlayer.php rename to Entity/Sequence/Sequence.php index ac07412f3..ab2e9f68b 100644 --- a/Entity/Player/ExercisePlayer.php +++ b/Entity/Sequence/Sequence.php @@ -1,20 +1,20 @@ startDate = new \DateTime(); - $this->pages = new ArrayCollection(); + $this->steps = new ArrayCollection(); } /** - * Get player Id + * Get sequence Id * @return integer */ public function getId() { @@ -78,21 +76,21 @@ public function getId() { /** * - * @param Page $p - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer + * @param Step $s + * @return \UJM\ExoBundle\Entity\Sequence\Sequence */ - public function addPage(Page $p) { - $this->pages[] = $p; + public function addStep(Step $s) { + $this->steps[] = $s; return $this; } /** * - * @param Page $p - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer + * @param Step $s + * @return \UJM\ExoBundle\Entity\Sequence\Sequence */ - public function removePage(Page $p) { - $this->pages->removeElement($p); + public function removePage(Step $s) { + $this->steps->removeElement($s); return $this; } @@ -100,14 +98,14 @@ public function removePage(Page $p) { * * @return ArrayCollection */ - public function getPages() { - return $this->pages; + public function getSteps() { + return $this->steps; } /** - * Set player name + * Set sequence name * @param string $name - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer + * @return \UJM\ExoBundle\Entity\Sequence\Sequence */ public function setName($name) { $this->name = $name; @@ -115,7 +113,7 @@ public function setName($name) { } /** - * Get player name + * Get sequence name * @return string */ public function getName() { @@ -123,10 +121,10 @@ public function getName() { } /** - * Set player startDate + * Set sequence startDate * * @param datetime $startDate - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer + * @return \UJM\ExoBundle\Entity\Sequence\Sequence */ public function setStartDate($startDate) { $this->startDate = $startDate; @@ -134,7 +132,7 @@ public function setStartDate($startDate) { } /** - * Get player startDate + * Get sequence startDate * * @return datetime */ @@ -143,10 +141,10 @@ public function getStartDate() { } /** - * Set player endDate + * Set sequence endDate * * @param datetime $endDate - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer + * @return \UJM\ExoBundle\Entity\Sequence\Sequence */ public function setEndDate($endDate) { $this->endDate = $endDate; @@ -154,7 +152,7 @@ public function setEndDate($endDate) { } /** - * Get player endDate + * Get sequence endDate * * @return datetime */ @@ -164,10 +162,10 @@ public function getEndDate() { /** - * Set player description + * Set sequence description * * @param text $description - * @return \UJM\ExoBundle\Entity\Player\ExercisePlayer + * @return \UJM\ExoBundle\Entity\Sequence\Sequence */ public function setDescription($description) { $this->description = $description; @@ -175,7 +173,7 @@ public function setDescription($description) { } /** - * Get player description + * Get sequence description * * @return text */ diff --git a/Entity/Player/Page.php b/Entity/Sequence/Step.php similarity index 62% rename from Entity/Player/Page.php rename to Entity/Sequence/Step.php index cc98a466f..95eaad128 100644 --- a/Entity/Player/Page.php +++ b/Entity/Sequence/Step.php @@ -1,20 +1,20 @@ shuffle = false; - $this->isFirstPage = false; - $this->isLastPage = false; + $this->isFirst = false; + $this->isLast = false; } /** @@ -95,7 +95,7 @@ public function getDescription(){ /** * * @param string $description - * @return \UJM\ExoBundle\Entity\Player\Page + * @return \UJM\ExoBundle\Entity\Sequence\Step */ public function setDescription($description){ $this->description = $description; @@ -104,26 +104,26 @@ public function setDescription($description){ /** * - * @param ExercisePlayer $exoplayer - * @return \UJM\ExoBundle\Entity\Player\Page + * @param Sequence $sequence + * @return \UJM\ExoBundle\Entity\Sequence\Step */ - public function setExercisePlayer(ExercisePlayer $exoplayer){ - $this->exercisePlayer = $exoplayer; + public function setSequence(Sequence $sequence){ + $this->sequence = $sequence; return $this; } /** * - * @return ExercisePlayer + * @return sequence */ - public function getExercisePlayer(){ - return $this->exercisePlayer; + public function getSequence(){ + return $this->sequence; } /** * * @param integer $position - * @return \UJM\ExoBundle\Entity\Player\Page + * @return \UJM\ExoBundle\Entity\Sequence\Step */ public function setPosition($position) { $this->position = $position; @@ -141,7 +141,7 @@ public function getPosition(){ /** * * @param boolean $shuffle - * @return \UJM\ExoBundle\Entity\Player\Page + * @return \UJM\ExoBundle\Entity\Sequence\Step */ public function setShuffle($shuffle){ $this->shuffle = $shuffle; @@ -159,10 +159,10 @@ public function getShuffle(){ /** * * @param boolean $isLast - * @return \UJM\ExoBundle\Entity\Player\Page + * @return \UJM\ExoBundle\Entity\Sequence\Step */ - public function setIsLastPage($isLast){ - $this->isLastPage = $isLast; + public function setIsLast($isLast){ + $this->isLast = $isLast; return $this; } @@ -170,17 +170,17 @@ public function setIsLastPage($isLast){ * * @return boolean */ - public function getIsLastPage(){ - return $this->isLastPage; + public function getIsLast(){ + return $this->isLast; } /** * * @param boolean $isFirst - * @return \UJM\ExoBundle\Entity\Player\Page + * @return \UJM\ExoBundle\Entity\Sequence\Step */ - public function setIsFirstPage($isFirst){ - $this->isFirstPage = $isFirst; + public function setIsFirst($isFirst){ + $this->isFirst = $isFirst; return $this; } @@ -188,8 +188,8 @@ public function setIsFirstPage($isFirst){ * * @return boolean */ - public function getIsFirstPage(){ - return $this->isFirstPage; + public function getIsFirst(){ + return $this->isFirst; } public function jsonSerialize() @@ -199,10 +199,10 @@ public function jsonSerialize() 'id' => $this->id, 'position' => $this->position, 'shuffle' => $this->shuffle, - 'isFirst' => $this->isFirstPage, - 'isLast' => $this->isLastPage, + 'isFirst' => $this->isFirst, + 'isLast' => $this->isLast, 'description' => $this->description, - 'playerId' => $this->exercisePlayer->getId() + 'sequenceId' => $this->sequence->getId() ); } diff --git a/Form/Player/ExercisePlayerType.php b/Form/Sequence/SequenceType.php similarity index 84% rename from Form/Player/ExercisePlayerType.php rename to Form/Sequence/SequenceType.php index e4713be8d..8d79b51da 100644 --- a/Form/Player/ExercisePlayerType.php +++ b/Form/Sequence/SequenceType.php @@ -1,12 +1,12 @@ setDefaults( array( - 'data_class' => 'UJM\ExoBundle\Entity\Player\ExercisePlayer', - 'translation_domain' => 'exercise_player', + 'data_class' => 'UJM\ExoBundle\Entity\Sequence\Sequence', + 'translation_domain' => 'ujm_sequence', ) ); } public function getName() { - return 'exercise_player_type'; + return 'sequence_type'; } } diff --git a/Listener/Resource/ExercisePlayerListener.php b/Listener/Resource/SequenceListener.php similarity index 74% rename from Listener/Resource/ExercisePlayerListener.php rename to Listener/Resource/SequenceListener.php index 326a16c56..d7f37f61b 100644 --- a/Listener/Resource/ExercisePlayerListener.php +++ b/Listener/Resource/SequenceListener.php @@ -12,12 +12,12 @@ use Claroline\CoreBundle\Event\OpenResourceEvent; use Claroline\CoreBundle\Event\CustomActionResourceEvent; -use UJM\ExoBundle\Entity\Player\ExercisePlayer; +use UJM\ExoBundle\Entity\Sequence\Sequence; -class ExercisePlayerListener extends ContainerAware { +class SequenceListener extends ContainerAware { /** - * Fired when a new ResourceNode of type ExercisePlayer is edited + * Fired when a new ResourceNode of type Sequence is edited * @param \Claroline\CoreBundle\Event\CustomActionResourceEvent $event * @throws \Exception */ @@ -25,14 +25,14 @@ public function onAdministrate(CustomActionResourceEvent $event) { $resource = $event->getResource(); $route = $this->container ->get('router') - ->generate('ujm_player_administrate', array('id' => $resource->getId()) + ->generate('ujm_sequence_administrate', array('id' => $resource->getId()) ); $event->setResponse(new RedirectResponse($route)); $event->stopPropagation(); } /** - * Fired when a new ResourceNode of type ExercisePlayer is opened + * Fired when a new ResourceNode of type Sequence is opened * @param \Claroline\CoreBundle\Event\OpenResourceEvent $event * @throws \Exception */ @@ -41,7 +41,7 @@ public function onOpen(OpenResourceEvent $event) { //Redirection to the controller. $route = $this->container ->get('router') - ->generate('ujm_player_open', array('id' => $resource->getId())); + ->generate('ujm_sequence_open', array('id' => $resource->getId())); $event->setResponse(new RedirectResponse($route)); $event->stopPropagation(); } @@ -53,23 +53,23 @@ public function onOpen(OpenResourceEvent $event) { */ public function onCreate(CreateResourceEvent $event) { // Create form - $form = $this->container->get('form.factory')->create('exercise_player_type', new ExercisePlayer()); + $form = $this->container->get('form.factory')->create('sequence_type', new Sequence()); // Try to process form $request = $this->container->get('request'); $form->submit($request); if ($form->isValid()) { $resource = $form->getData(); - $ep = $this->container->get('ujm_exo_bundle.manager.exercise_player')->createFirstAndLastPage($resource); + $sequence = $this->container->get('ujm_exo_bundle.manager.sequence')->createFirstAndLastStep($resource); - $event->setResources(array($ep)); + $event->setResources(array($sequence)); } else { $content = $this->container->get('templating')->render( 'ClarolineCoreBundle:Resource:createForm.html.twig', array( 'form' => $form->createView(), - 'resourceType' => 'ujm_exercise_player' + 'resourceType' => 'ujm_sequence' )); $event->setErrorFormContent($content); } @@ -83,21 +83,20 @@ public function onCreate(CreateResourceEvent $event) { */ public function onCreateForm(CreateFormResourceEvent $event) { // Create form - $form = $this->container->get('form.factory')->create('exercise_player_type', new ExercisePlayer()); + $form = $this->container->get('form.factory')->create('sequence_type', new Sequence()); $content = $this->container->get('templating')->render( 'ClarolineCoreBundle:Resource:createForm.html.twig', array( 'form' => $form->createView(), - 'resourceType' => 'ujm_exercise_player' - )); - + 'resourceType' => 'ujm_sequence' + )); $event->setResponseContent($content); $event->stopPropagation(); } /** - * Fired when a ResourceNode of type ExercisePlayer is deleted + * Fired when a ResourceNode of type Sequence is deleted * @param \Claroline\CoreBundle\Event\DeleteResourceEvent $event * @throws \Exception */ @@ -109,13 +108,13 @@ public function onDelete(DeleteResourceEvent $event) { } /** - * Fired when a ResourceNode of type ExercisePlayer is duplicated + * Fired when a ResourceNode of type Sequence is duplicated * @param \Claroline\CoreBundle\Event\CopyResourceEvent $event * @throws \Exception */ public function onCopy(CopyResourceEvent $event) { $toCopy = $event->getResource(); - $new = new ExercisePlayer(); + $new = new Sequence(); $new->setName($toCopy->getName()); $event->setCopy($new); $event->stopPropagation(); diff --git a/Manager/Player/ExercisePlayerManager.php b/Manager/Player/ExercisePlayerManager.php deleted file mode 100644 index b4dc2cee8..000000000 --- a/Manager/Player/ExercisePlayerManager.php +++ /dev/null @@ -1,58 +0,0 @@ -em = $em; - $this->translator = $translator; - } - - public function getRepository() { - return $this->em->getRepository('UJMExoBundle:Player\ExercisePlayer'); - } - - public function createFirstAndLastPage(ExercisePlayer $ep) { - - // add first page - $first = new Page(); - $first->setIsFirstPage(true); - $first->setPosition(1); - $first->setDescription('

This is the first Page

'); - $first->setExercisePlayer($ep); - $ep->addPage($first); - - // add last page - $last = new Page(); - $last->setIsLastPage(true); - $last->setPosition(2); - $last->setDescription('

This is the last Page

'); - $last->setExercisePlayer($ep); - $ep->addPage($last); - - $this->em->persist($ep); - $this->em->flush(); - return $ep; - } - - public function update(ExercisePlayer $ep) { - $this->em->persist($ep); - $this->em->flush(); - return $ep; - } - -} diff --git a/Manager/Player/PageManager.php b/Manager/Player/PageManager.php deleted file mode 100644 index 24112cbf7..000000000 --- a/Manager/Player/PageManager.php +++ /dev/null @@ -1,148 +0,0 @@ -em = $em; - $this->translator = $translator; - } - - public function getRepository() { - return $this->em->getRepository('UJMExoBundle:Player\Page'); - } - - /** - * Get first page - * @param ExercisePlayer $ep - * @return \UJM\ExoBundle\Entity\Player\Page - */ - public function getFirstPage(ExercisePlayer $ep) { - $page = $this->getRepository()->findOneBy(array('exercisePlayer' => $ep, 'isFirstPage' => true)); - return $page; - } - - /** - * Get first page - * @param ExercisePlayer $ep - * @return \UJM\ExoBundle\Entity\Player\Page - */ - public function getLastPage(ExercisePlayer $ep) { - $page = $this->getRepository()->findOneBy(array('exercisePlayer' => $ep, 'isLastPage' => true)); - return $page; - } - - /** - * Get all pages - * @param ExercisePlayer $ep - * @return ArrayCollection - */ - public function getPages(ExercisePlayer $ep) { - $pages = $this->getRepository()->findBy(array('exercisePlayer' => $ep), array('position' => 'ASC')); - return $pages; - } - - /** - * - * @param ExercisePlayer $ep - * @param type $pages - */ - public function updatePages(ExercisePlayer $ep, $pages) { - - // validate data or throws exception - $this->validatePlayerPagesData($pages); - - // get original pages before update to delete unused pages - $oldPages = $this->getPages($ep); - - $this->deleteUnusedPages($oldPages, $pages); - - foreach ($pages as $page) { - $pageEntity = null; - $toDelete = false; - if (isset($page['id'])) { - $pageEntity = $this->getRepository()->findOneBy(array('id' => $page['id'])); - - } else { - $pageEntity = new Page(); - $pageEntity->setExercisePlayer($ep); - } - if (!$toDelete) { - $pageEntity->setPosition($page['position']); - $pageEntity->setDescription($page['description']); - $pageEntity->setShuffle(isset($page['shuffle']) ? $page['shuffle'] : false); - $this->em->persist($pageEntity); - } - $this->em->flush(); - } - - return $this->getPages($ep); - } - - /** - * Since we get an array from angular service we have to check the received data for each page - * @param Array $pages - * @return boolean - * @throws Exception - */ - private function validatePlayerPagesData($pages) { - $valid = true; - - if (!$valid) { - throw new Exception('error'); - } - return $valid; - } - - /** - * Compare two Page(s) collection, the old one and the new one - * if an item is in the old collection and in the new one we keep it - * if an item in the new collection has no id we also keep it - * if an item has an id but can not be found in the new collection we remove it - * @param ArrayCollection $oldCollection - * @param Array $newCollection - */ - private function deleteUnusedPages($oldCollection, $newCollection){ - foreach ($oldCollection as $toCheck){ - $toKeep = false; - $currentId = $toCheck->getId(); - foreach($newCollection as $new){ - if(!isset($new['id']) || $new['id'] == $currentId){ - $toKeep = true; - break; - } - } - if(!$toKeep){ - $pageEntity = $this->getRepository()->findOneBy(array('id' => $currentId)); - $this->em->remove($pageEntity); - $this->em->flush(); - } - } - } - - public function addPage(ExercisePlayer $ep, $page) { - - $pageEntity = new Page(); - $pageEntity->setExercisePlayer($ep); - $pageEntity->setPosition($page['position']); - $pageEntity->setDescription($page['description']); - $pageEntity->setShuffle(isset($page['shuffle']) ? $page['shuffle'] : false); - $this->em->persist($pageEntity); - $this->em->flush(); - } - -} diff --git a/Manager/Sequence/SequenceManager.php b/Manager/Sequence/SequenceManager.php new file mode 100644 index 000000000..498a7ea4c --- /dev/null +++ b/Manager/Sequence/SequenceManager.php @@ -0,0 +1,57 @@ +em = $em; + $this->translator = $translator; + } + + public function getRepository() { + return $this->em->getRepository('UJMExoBundle:Sequence\Sequence'); + } + + public function createFirstAndLastStep(Sequence $s) { + + // add first page + $first = new Step(); + $first->setIsFirst(true); + $first->setPosition(1); + $first->setDescription('

This is the first Step

'); + $first->setSequence($s); + $s->addStep($first); + + // add last page + $last = new Step(); + $last->setIsLast(true); + $last->setPosition(2); + $last->setDescription('

This is the last Step

'); + $last->setSequence($s); + $s->addStep($last); + + $this->em->persist($s); + $this->em->flush(); + return $s; + } + + public function update(Sequence $s) { + $this->em->persist($s); + $this->em->flush(); + return $s; + } + +} diff --git a/Manager/Sequence/StepManager.php b/Manager/Sequence/StepManager.php new file mode 100644 index 000000000..09cf8e37c --- /dev/null +++ b/Manager/Sequence/StepManager.php @@ -0,0 +1,125 @@ +em = $em; + $this->translator = $translator; + } + + public function getRepository() { + return $this->em->getRepository('UJMExoBundle:Sequence\Step'); + } + + /** + * Get all steps + * @param Sequence $s + * @return ArrayCollection + */ + public function getSteps(Sequence $s) { + $steps = $this->getRepository()->findBy(array('sequence' => $s), array('position' => 'ASC')); + return $steps; + } + + /** + * + * @param Sequence $s + * @param type $steps + */ + public function updateSteps(Sequence $s, $steps) { + + // validate data or throws exception + $this->validateStepsData($steps); + + // get original pages before update to delete unused steps + $oldSteps = $this->getSteps($s); + $this->deleteUnusedSteps($oldSteps, $steps); + + foreach ($steps as $step) { + $stepEntity = null; + $toDelete = false; + if (isset($step['id'])) { + $stepEntity = $this->getRepository()->findOneBy(array('id' => $step['id'])); + } else { + $stepEntity = new Step(); + $stepEntity->setSequence($s); + } + if (!$toDelete) { + $stepEntity->setPosition($step['position']); + $stepEntity->setDescription($step['description']); + $stepEntity->setShuffle(isset($step['shuffle']) ? $step['shuffle'] : false); + $this->em->persist($stepEntity); + } + $this->em->flush(); + } + + return $this->getSteps($s); + } + + /** + * Since we get an array from angular service we have to check the received data for each step + * @param Array $steps + * @return boolean + * @throws Exception + */ + private function validateStepsData($steps) { + $valid = true; + + if (!$valid) { + throw new Exception('error'); + } + return $valid; + } + + /** + * Compare two Step(s) collection, the old one and the new one + * if an item is in the old collection and in the new one we keep it + * if an item in the new collection has no id we also keep it + * if an item has an id but can not be found in the new collection we remove it + * @param ArrayCollection $oldCollection + * @param Array $newCollection + */ + private function deleteUnusedSteps($oldCollection, $newCollection){ + foreach ($oldCollection as $toCheck){ + $toKeep = false; + $currentId = $toCheck->getId(); + foreach($newCollection as $new){ + if(!isset($new['id']) || $new['id'] == $currentId){ + $toKeep = true; + break; + } + } + if(!$toKeep){ + $step = $this->getRepository()->findOneBy(array('id' => $currentId)); + $this->em->remove($step); + $this->em->flush(); + } + } + } + + public function addStep(Sequence $s, $step) { + + $stepEntity = new Step(); + $stepEntity->setExercisePlayer($s); + $stepEntity->setPosition($step['position']); + $stepEntity->setDescription($step['description']); + $stepEntity->setShuffle(isset($step['shuffle']) ? $step['shuffle'] : false); + $this->em->persist($stepEntity); + $this->em->flush(); + } + +} diff --git a/Migrations/pdo_mysql/Version20150715120410.php b/Migrations/pdo_mysql/Version20150715120410.php new file mode 100644 index 000000000..452e1d886 --- /dev/null +++ b/Migrations/pdo_mysql/Version20150715120410.php @@ -0,0 +1,68 @@ +addSql(" + CREATE TABLE ujm_sequence_step ( + id INT AUTO_INCREMENT NOT NULL, + sequence_id INT NOT NULL, + description LONGTEXT DEFAULT NULL, + position SMALLINT DEFAULT NULL, + shuffle TINYINT(1) NOT NULL, + is_first TINYINT(1) NOT NULL, + is_last TINYINT(1) NOT NULL, + INDEX IDX_2AE7A31998FB19AE (sequence_id), + PRIMARY KEY(id) + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB + "); + $this->addSql(" + CREATE TABLE ujm_sequence ( + id INT AUTO_INCREMENT NOT NULL, + name VARCHAR(255) NOT NULL, + description LONGTEXT DEFAULT NULL, + start_date DATETIME NOT NULL, + end_date DATETIME DEFAULT NULL, + resourceNode_id INT DEFAULT NULL, + UNIQUE INDEX UNIQ_CB11F712B87FAB32 (resourceNode_id), + PRIMARY KEY(id) + ) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB + "); + $this->addSql(" + ALTER TABLE ujm_sequence_step + ADD CONSTRAINT FK_2AE7A31998FB19AE FOREIGN KEY (sequence_id) + REFERENCES ujm_sequence (id) + "); + $this->addSql(" + ALTER TABLE ujm_sequence + ADD CONSTRAINT FK_CB11F712B87FAB32 FOREIGN KEY (resourceNode_id) + REFERENCES claro_resource_node (id) + ON DELETE CASCADE + "); + } + + public function down(Schema $schema) + { + $this->addSql(" + ALTER TABLE ujm_sequence_step + DROP FOREIGN KEY FK_2AE7A31998FB19AE + "); + $this->addSql(" + DROP TABLE ujm_sequence_step + "); + $this->addSql(" + DROP TABLE ujm_sequence + "); + } +} \ No newline at end of file diff --git a/Resources/config/config.yml b/Resources/config/config.yml index d7c7a8825..9d382afa9 100755 --- a/Resources/config/config.yml +++ b/Resources/config/config.yml @@ -8,13 +8,13 @@ plugin: icon: res_exo.png activity_rules: - action: resource-ujm_exercise-exercise_evaluated - - class: UJM\ExoBundle\Entity\Player\ExercisePlayer - name: ujm_exercise_player + - class: UJM\ExoBundle\Entity\Sequence\Sequence + name: ujm_sequence is_exportable: false icon: res_exo.png actions: - name: administrate - menu_name: ujm_exercise_player_administrate + menu_name: ujm_sequence_administrate tools: diff --git a/Resources/config/form_types.yml b/Resources/config/form_types.yml index 9aef6d450..ee8cdabb9 100644 --- a/Resources/config/form_types.yml +++ b/Resources/config/form_types.yml @@ -1,6 +1,6 @@ services: # ExercisePlayer type ujm_exo_bundle.form.type.exercise_player_type: - class: %ujm_exo_bundle.form.type.exercise_player_type.class% + class: %ujm_exo_bundle.form.type.sequence_type.class% tags: - - { name: form.type, alias: exercise_player_type } + - { name: form.type, alias: sequence_type } diff --git a/Resources/config/parameters.yml b/Resources/config/parameters.yml index 6ff0a8588..209410e76 100755 --- a/Resources/config/parameters.yml +++ b/Resources/config/parameters.yml @@ -6,8 +6,8 @@ parameters: ujm.param.qti_directory: "%ujm.param.exo_directory%/qti" # Form Types - ujm_exo_bundle.form.type.exercise_player_type.class: UJM\ExoBundle\Form\Player\ExercisePlayerType + ujm_exo_bundle.form.type.sequence_type.class: UJM\ExoBundle\Form\Sequence\SequenceType # Managers - ujm_exo_bundle.manager.exercise_player.class: UJM\ExoBundle\Manager\Player\ExercisePlayerManager - ujm_exo_bundle.manager.pages.class: UJM\ExoBundle\Manager\Player\PageManager + ujm_exo_bundle.manager.sequence.class: UJM\ExoBundle\Manager\Sequence\SequenceManager + ujm_exo_bundle.manager.steps.class: UJM\ExoBundle\Manager\Sequence\StepManager diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml index 1b179a5cf..4e98b11fd 100755 --- a/Resources/config/routing.yml +++ b/Resources/config/routing.yml @@ -50,13 +50,13 @@ all_qti: resource: "routing/all/qti.yml" prefix: /all/qti -exercise_player: - resource: "@UJMExoBundle/Controller/Player/ExercisePlayerController.php" +sequence: + resource: "@UJMExoBundle/Controller/Sequence/SequenceController.php" type: annotation - prefix: /player + prefix: /sequence -exercise_pages: - resource: "@UJMExoBundle/Controller/Player/ExercisePlayerPageController.php" +sequence_steps: + resource: "@UJMExoBundle/Controller/Sequence/StepController.php" type: annotation prefix: /page diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 48e3ea83f..f6fd7ef43 100755 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -178,26 +178,26 @@ services: tags: - { name: validator.constraint_validator, alias: ujm.exercise_isvalidqcmmark } - ujm.listener.exercise_player_listener: - class: UJM\ExoBundle\Listener\Resource\ExercisePlayerListener + ujm.listener.sequence_listener: + class: UJM\ExoBundle\Listener\Resource\SequenceListener calls: - [setContainer, ["@service_container"]] tags: - - { name: kernel.event_listener, event: create_form_ujm_exercise_player, method: onCreateForm } - - { name: kernel.event_listener, event: create_ujm_exercise_player, method: onCreate } - - { name: kernel.event_listener, event: open_ujm_exercise_player, method: onOpen } - - { name: kernel.event_listener, event: delete_ujm_exercise_player, method: onDelete } - - { name: kernel.event_listener, event: copy_ujm_exercise_player, method: onCopy } - - { name: kernel.event_listener, event: ujm_exercise_player_administrate_ujm_exercise_player, method: onAdministrate } + - { name: kernel.event_listener, event: create_form_ujm_sequence, method: onCreateForm } + - { name: kernel.event_listener, event: create_ujm_sequence, method: onCreate } + - { name: kernel.event_listener, event: open_ujm_sequence, method: onOpen } + - { name: kernel.event_listener, event: delete_ujm_sequence, method: onDelete } + - { name: kernel.event_listener, event: copy_ujm_sequence, method: onCopy } + - { name: kernel.event_listener, event: ujm_sequence_administrate_ujm_sequence, method: onAdministrate } - ujm_exo_bundle.manager.exercise_player: - class: UJM\ExoBundle\Manager\Player\ExercisePlayerManager + ujm_exo_bundle.manager.sequence: + class: UJM\ExoBundle\Manager\Sequence\SequenceManager arguments: entityManager: @doctrine.orm.entity_manager translator: @translator - ujm_exo_bundle.manager.pages: - class: UJM\ExoBundle\Manager\Player\PageManager + ujm_exo_bundle.manager.steps: + class: UJM\ExoBundle\Manager\Sequence\StepManager arguments: entityManager: @doctrine.orm.entity_manager translator: @translator \ No newline at end of file diff --git a/Resources/public/css/ujm-sequence.css b/Resources/public/css/ujm-sequence.css new file mode 100644 index 000000000..01ce00b9d --- /dev/null +++ b/Resources/public/css/ujm-sequence.css @@ -0,0 +1 @@ +.ujm-sequence-container{width:100%;background:white;padding:15px}.ujm-sequence-container .step-container ul.step-list{list-style-type:none}.ujm-sequence-container .step-container ul.step-list li.step-list-item{display:inline-block;line-height:50px;width:50px;height:50px;vertical-align:middle;border:1px solid black;cursor:pointer;background-color:rgba(255,255,255,0.8);margin:5px;border-radius:5px}.ujm-sequence-container .step-container ul.step-list li.step-list-item div{display:inline-block}.ujm-sequence-container .step-container ul.step-list li.step-list-item.active{background-color:#428bca}.ujm-sequence-container .step-container ul.step-list .placeholder{display:inline-block;border:1px dotted #aaa;width:35px;line-height:50px;height:35px;vertical-align:middle;border-radius:5px;background-color:rgba(66,139,202,0.2)} \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js b/Resources/public/js/player/Page/Controllers/PageEditCtrl.js deleted file mode 100644 index 89508c954..000000000 --- a/Resources/public/js/player/Page/Controllers/PageEditCtrl.js +++ /dev/null @@ -1,149 +0,0 @@ -(function () { - 'use strict'; - - angular.module('Page').controller('PageEditCtrl', [ - 'PageService', - function (PageService) { - - this.pages = {}; - this.currentPageIndex = 0; - - this.sortableOptions = { - placeholder: "placeholder", - axis: 'x', - /* start: function (e, ui){ - console.log('start'); - var item = ui.item.scope().page; - var fromIndex = ui.item.sortable.index; - console.log('start', item, fromIndex); - }.bind(this),*/ - stop: function (e, ui) { - /*var item = ui.item.scope().page; - var toIndex = ui.item.sortable.dropindex; - item.position = toIndex + 1;*/ - this.updatePagesOrder(); - }.bind(this), - cancel: ".unsortable", - items: "li:not(.unsortable)" - }; - - // Tiny MCE options - this.tinymceOptions = { - relative_urls: false, - theme: 'modern', - browser_spellcheck: true, - autoresize_min_height: 100, - autoresize_max_height: 500, - plugins: [ - 'autoresize advlist autolink lists link image charmap print preview hr anchor pagebreak', - 'searchreplace wordcount visualblocks visualchars fullscreen', - 'insertdatetime media nonbreaking save table directionality', - 'template paste textcolor emoticons code' - ], - toolbar1: 'undo redo | styleselect | bold italic underline | forecolor | alignleft aligncenter alignright | preview fullscreen', - paste_preprocess: function (plugin, args) { - var link = $('
' + args.content + '
').text().trim(); //inside div because a bug of jquery - var url = link.match(/^(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})$/); - - if (url) { - args.content = '' + link + ''; - window.Claroline.Home.generatedContent(link, function (data) { - insertContent(data); - }, false); - } - } - }; - - // Page constructor - var my = this; - var Page = function () { - var ujm_page = { - description: '

New page default description

', - position: my.pages.length, - shuffle: false, - playerId: my.pages[0].playerId, - isLast: false, - isFirst: false - }; - return ujm_page; - }; - - this.addPage = function () { - // create a new page - var page = new Page(); - // update last page position - var last = this.pages[this.pages.length - 1]; - last.position = page.position + 1; - // add new page at the right index in pages array - this.pages.splice(this.pages.length - 1, 0, page); - }; - - this.removePage = function () { - var current = this.pages[this.currentPageIndex]; - console.log(current); - if (current && !current.isLast && !current.isFirst) { - var index = this.pages.indexOf(current); - // update positions... - for (var i = index; i < this.pages.length; i++) { - var p = this.pages[i]; - p.position = p.position - 1; - } - // remove page - this.pages.splice(index, 1); - } - }; - - this.update = function () { - var promise = PageService.update(this.pages); - promise.then(function (result) { - console.log('ok'); - }, function (error) { - console.log('error'); - }); - - }; - - this.getNextPage = function () { - var newIndex = this.currentPageIndex + 1; - if (this.pages[newIndex]) { - this.currentPageIndex = newIndex; - } else { - this.currentPageIndex = 0; - } - }; - - this.getPreviousPage = function () { - var newIndex = this.currentPageIndex - 1; - if (this.pages[newIndex]) { - this.currentPageIndex = newIndex; - } else { - this.currentPageIndex = this.pages.length - 1; - } - }; - - // on dragg end - this.updatePagesOrder = function(){ - console.log('dragg end'); - var index = 0; - for(index; index < this.pages.length; index++){ - var p = this.pages[index]; - p.position = index + 1; - } - } - - - this.setPages = function (pages) { - this.pages = pages; - }; - - this.getPages = function () { - return this.pages; - }; - - this.setCurrentPage = function (page) { - var index = this.pages.indexOf(page); - this.currentPageIndex = index; - }; - } - ]); -})(); \ No newline at end of file diff --git a/Resources/public/js/player/Page/Controllers/PageShowCtrl.js b/Resources/public/js/player/Page/Controllers/PageShowCtrl.js deleted file mode 100644 index 3bd51bc01..000000000 --- a/Resources/public/js/player/Page/Controllers/PageShowCtrl.js +++ /dev/null @@ -1,14 +0,0 @@ -(function () { - 'use strict'; - - angular.module('Page').controller('PageShowCtrl', [ - 'PageService', - function (PageService) { - - - this.sayHello = function (name) { - console.log(PageService.hello(name)); - }; - } - ]); -})(); \ No newline at end of file diff --git a/Resources/public/js/player/Page/Directives/PageEditDirective.js b/Resources/public/js/player/Page/Directives/PageEditDirective.js deleted file mode 100644 index ee73ae261..000000000 --- a/Resources/public/js/player/Page/Directives/PageEditDirective.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Activity Form directive - * Directive Documentation : https://docs.angularjs.org/guide/directive - */ -(function () { - 'use strict'; - - angular.module('Page').directive('pageEdit', [ - function () { - return { - restrict: 'E', - replace: true, - controller: 'PageEditCtrl', - controllerAs: 'pageEditCtrl', - templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/page.edit.html', - scope: { - pages: '=' - }, - link: function (scope, element, attr, pageEditCtrl) { - // set current page to first page - console.log('page edit directive link method called'); - //pageEditCtrl.setCurrentPage(scope.pages[0]); - pageEditCtrl.setPages(scope.pages); - //console.log(scope.pages[0].description); - - //pageEditCtrl.setPlayer(scope.player); - - /* - console.log(scope.player); - console.log(scope.last); - console.log(scope.first); - console.log(scope.pages); - */ - } - }; - } - ]); -})(); diff --git a/Resources/public/js/player/Page/Directives/PageShowDirective.js b/Resources/public/js/player/Page/Directives/PageShowDirective.js deleted file mode 100644 index 515eaccd5..000000000 --- a/Resources/public/js/player/Page/Directives/PageShowDirective.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Activity Form directive - * Directive Documentation : https://docs.angularjs.org/guide/directive - */ -(function () { - 'use strict'; - - angular.module('Page').directive('pageShow', [ - function () { - return { - restrict: 'E', - replace: true, - controller: 'PageShowCtrl', - controllerAs: 'pageShowCtrl', - templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Page/Partials/page.show.html', - scope: { - pages: '=' - }, - link: function (scope, element, attr, pageShowCtrl) { - - } - }; - } - ]); -})(); - - diff --git a/Resources/public/js/player/Page/Partials/page.edit.html b/Resources/public/js/player/Page/Partials/page.edit.html deleted file mode 100644 index d7236320e..000000000 --- a/Resources/public/js/player/Page/Partials/page.edit.html +++ /dev/null @@ -1,46 +0,0 @@ -
-
-
-

{{ 'exercise_player_page_panel_title'|trans:{}:'exercise_player' }} {{ pageEditCtrl.currentPageIndex + 1}} / {{ pageEditCtrl.pages.length}}

-
- - - -
-
-
- -
-
- -
-
-
    -
  • -
    {{ page.position }}
    -
  • -
-
-
- -
-
-
- - -
-
- -
-
-
- -
- - -
-
-
-
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Services/PageService.js b/Resources/public/js/player/Page/Services/PageService.js deleted file mode 100644 index 0d3e721ab..000000000 --- a/Resources/public/js/player/Page/Services/PageService.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Page Service - */ -(function () { - 'use strict'; - - angular.module('Page').factory('PageService', [ - '$http', - '$filter', - '$q', - function PageService($http, $filter, $q) { - - return { - - - addPage : function(){ - function Page(){ - var ujm_player = { - name: player.name, - description: player.description, - startDate: new Date(player.startDate), - endDate: new Date(player.endDate) - }; - - return ujm_player; - } - - var updated = new Player(player); - }, - - /** - * Update exercise player pages - * @param player - * @returns - */ - update : function (pages){ - var deferred = $q.defer(); - var playerId = pages[0].playerId; - $http - .post( - Routing.generate('ujm_pages_update', { id : playerId}), {pages: pages} - ) - .success(function (response){ - deferred.resolve(response); - }) - .error(function(data, status){ - console.log('Page service, update method error'); - console.log(status); - console.log(data); - }); - - return deferred.promise; - } - }; - } - ]); -})(); \ No newline at end of file diff --git a/Resources/public/js/player/Player/Partials/player.edit.html b/Resources/public/js/player/Player/Partials/player.edit.html deleted file mode 100644 index 458342f5c..000000000 --- a/Resources/public/js/player/Player/Partials/player.edit.html +++ /dev/null @@ -1,38 +0,0 @@ -
-
-
-

{{ 'exercise_player_panel_title'|trans:{}:'exercise_player' }}

-
- - -
-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
-
\ No newline at end of file diff --git a/Resources/public/js/player/Player/Controllers/PlayerEditCtrl.js b/Resources/public/js/sequence/Sequence/Controllers/SequenceEditCtrl.js similarity index 83% rename from Resources/public/js/player/Player/Controllers/PlayerEditCtrl.js rename to Resources/public/js/sequence/Sequence/Controllers/SequenceEditCtrl.js index 5cb6640b1..421869098 100644 --- a/Resources/public/js/player/Player/Controllers/PlayerEditCtrl.js +++ b/Resources/public/js/sequence/Sequence/Controllers/SequenceEditCtrl.js @@ -1,11 +1,11 @@ (function () { 'use strict'; - angular.module('Player').controller('PlayerEditCtrl', [ - 'PlayerService', - function (PlayerService) { + angular.module('Sequence').controller('SequenceEditCtrl', [ + 'SequenceService', + function (SequenceService) { - this.player = {}; + this.sequence = {}; this.isCollapsed = false; this.endDateIsOpened = false; @@ -59,18 +59,16 @@ } }; - - this.update = function () { - console.log(this.player); - PlayerService.update(this.player); + this.update = function () { + SequenceService.update(this.sequence); }; - this.setPlayer = function (player) { - this.player = player; + this.setSequence = function (sequence) { + this.sequence = sequence; }; - this.getPlayer = function () { - return this.player; + this.getSequence = function () { + return this.sequence; }; } ]); diff --git a/Resources/public/js/player/Player/Directives/PlayerEditDirective.js b/Resources/public/js/sequence/Sequence/Directives/SequenceEditDirective.js similarity index 50% rename from Resources/public/js/player/Player/Directives/PlayerEditDirective.js rename to Resources/public/js/sequence/Sequence/Directives/SequenceEditDirective.js index 7406b32b9..4eadf7e75 100644 --- a/Resources/public/js/player/Player/Directives/PlayerEditDirective.js +++ b/Resources/public/js/sequence/Sequence/Directives/SequenceEditDirective.js @@ -5,21 +5,21 @@ (function () { 'use strict'; - angular.module('Player').directive('playerEdit', [ + angular.module('Sequence').directive('sequenceEdit', [ function () { return { restrict: 'E', replace: true, - controller: 'PlayerEditCtrl', - controllerAs: 'playerEditCtrl', - templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/player/Player/Partials/player.edit.html', + controller: 'SequenceEditCtrl', + controllerAs: 'sequenceEditCtrl', + templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/sequence/Sequence/Partials/sequence.edit.html', scope: { - player: '=' + sequence: '=' }, - link: function (scope, element, attr, playerEditCtrl) { + link: function (scope, element, attr, sequenceEditCtrl) { // set current page to first page - console.log('player directive link method called'); - playerEditCtrl.setPlayer(scope.player); + console.log('sequence directive link method called'); + sequenceEditCtrl.setSequence(scope.sequence); } }; diff --git a/Resources/public/js/sequence/Sequence/Partials/sequence.edit.html b/Resources/public/js/sequence/Sequence/Partials/sequence.edit.html new file mode 100644 index 000000000..fc4960f0d --- /dev/null +++ b/Resources/public/js/sequence/Sequence/Partials/sequence.edit.html @@ -0,0 +1,38 @@ +
+
+
+

{{ 'sequence_panel_title'|trans:{}:'ujm_sequence' }}

+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/Resources/public/js/player/Player/Services/PlayerService.js b/Resources/public/js/sequence/Sequence/Services/SequenceService.js similarity index 51% rename from Resources/public/js/player/Player/Services/PlayerService.js rename to Resources/public/js/sequence/Sequence/Services/SequenceService.js index ab26d7e59..cf60e7493 100644 --- a/Resources/public/js/player/Player/Services/PlayerService.js +++ b/Resources/public/js/sequence/Sequence/Services/SequenceService.js @@ -4,7 +4,7 @@ (function () { 'use strict'; - angular.module('Player').factory('PlayerService', [ + angular.module('Sequence').factory('SequenceService', [ '$http', '$filter', '$q', @@ -14,41 +14,42 @@ return { /** - * Update the player - * @param player + * Update the sequence + * @param sequence * @returns */ - update : function (player){ + update : function (sequence){ var deferred = $q.defer(); - // player constructor - function Player(player){ - var ujm_player = { - name: player.name, - description: player.description, - startDate: new Date(player.startDate), - endDate: new Date(player.endDate) + // sequence constructor + function Sequence(sequence){ + var ujm_sequence = { + name: sequence.name, + description: sequence.description, + startDate: new Date(sequence.startDate), + endDate: new Date(sequence.endDate) }; - return ujm_player; + return ujm_sequence; } - var updated = new Player(player); + var updated = new Sequence(sequence); $http .put( - Routing.generate('ujm_player_update', { id : player.id }), + Routing.generate('ujm_sequence_update', { id : sequence.id }), { - exercise_player_type: updated + sequence_type: updated } ) .success(function (response){ deferred.resolve(response); }) .error(function(data, status){ - console.log('player service, update method error'); + console.log('sequence service, update method error'); console.log(status); console.log(data); }); + return deferred; } }; } diff --git a/Resources/public/js/player/Player/module.js b/Resources/public/js/sequence/Sequence/module.js similarity index 70% rename from Resources/public/js/player/Player/module.js rename to Resources/public/js/sequence/Sequence/module.js index 4b098c8db..7ed3e012e 100644 --- a/Resources/public/js/player/Player/module.js +++ b/Resources/public/js/sequence/Sequence/module.js @@ -4,7 +4,7 @@ (function () { 'use strict'; - angular.module('Player', [ + angular.module('Sequence', [ ]); })(); diff --git a/Resources/public/js/sequence/Step/Controllers/StepEditCtrl.js b/Resources/public/js/sequence/Step/Controllers/StepEditCtrl.js new file mode 100644 index 000000000..6074a9c6b --- /dev/null +++ b/Resources/public/js/sequence/Step/Controllers/StepEditCtrl.js @@ -0,0 +1,138 @@ +(function () { + 'use strict'; + + angular.module('Step').controller('StepEditCtrl', [ + 'StepService', + function (StepService) { + + this.steps = {}; + this.currentStepIndex = 0; + + // options for sortable steps + this.sortableOptions = { + placeholder: "placeholder", + axis: 'x', + stop: function (e, ui) { + this.updateStepsOrder(); + }.bind(this), + cancel: ".unsortable", + items: "li:not(.unsortable)" + }; + + // Tiny MCE options + this.tinymceOptions = { + relative_urls: false, + theme: 'modern', + browser_spellcheck: true, + autoresize_min_height: 100, + autoresize_max_height: 500, + plugins: [ + 'autoresize advlist autolink lists link image charmap print preview hr anchor pagebreak', + 'searchreplace wordcount visualblocks visualchars fullscreen', + 'insertdatetime media nonbreaking save table directionality', + 'template paste textcolor emoticons code' + ], + toolbar1: 'undo redo | styleselect | bold italic underline | forecolor | alignleft aligncenter alignright | preview fullscreen', + paste_preprocess: function (plugin, args) { + var link = $('
' + args.content + '
').text().trim(); //inside div because a bug of jquery + var url = link.match(/^(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)|((mailto:)?[_.\w-]+@([\w][\w\-]+\.)+[a-zA-Z]{2,3})$/); + + if (url) { + args.content = '' + link + ''; + window.Claroline.Home.generatedContent(link, function (data) { + insertContent(data); + }, false); + } + } + }; + + // Step constructor + var my = this; + var Step = function () { + var ujm_step = { + description: '

New step default description

', + position: my.steps.length, + shuffle: false, + sequenceId: my.steps[0].sequenceId, + isLast: false, + isFirst: false + }; + return ujm_step; + }; + + this.addStep = function () { + // create a new step + var step = new Step(); + // update last step position + var last = this.steps[this.steps.length - 1]; + last.position = step.position + 1; + // add new step at the right index in steps array + this.steps.splice(this.steps.length - 1, 0, step); + }; + + this.removeStep = function () { + var current = this.steps[this.currentStepIndex]; + if (current && !current.isLast && !current.isFirst) { + var index = this.steps.indexOf(current); + // update positions... + for (var i = index; i < this.steps.length; i++) { + var step = this.steps[i]; + step.position = step.position - 1; + } + // remove step + this.steps.splice(index, 1); + } + }; + + this.update = function () { + var promise = StepService.update(this.steps); + promise.then(function (result) { + console.log('steps update success'); + }, function (error) { + console.log('steps update error'); + }); + + }; + + this.getNextStep = function () { + var newIndex = this.currentStepIndex + 1; + if (this.steps[newIndex]) { + this.currentStepIndex = newIndex; + } else { + this.currentStepIndex = 0; + } + }; + + this.getPreviousStep = function () { + var newIndex = this.currentStepIndex - 1; + if (this.steps[newIndex]) { + this.currentStepIndex = newIndex; + } else { + this.currentStepIndex = this.steps.length - 1; + } + }; + + // on dragg end + this.updateStepsOrder = function(){ + var index = 0; + for(index; index < this.steps.length; index++){ + var step = this.steps[index]; + step.position = index + 1; + } + }; + + this.setSteps = function (steps) { + this.steps = steps; + }; + + this.getSteps = function () { + return this.steps; + }; + + this.setCurrentStep = function (step) { + var index = this.steps.indexOf(step); + this.currentStepIndex = index; + }; + } + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/sequence/Step/Controllers/StepShowCtrl.js b/Resources/public/js/sequence/Step/Controllers/StepShowCtrl.js new file mode 100644 index 000000000..d61a45572 --- /dev/null +++ b/Resources/public/js/sequence/Step/Controllers/StepShowCtrl.js @@ -0,0 +1,14 @@ +(function () { + 'use strict'; + + angular.module('Step').controller('StepShowCtrl', [ + 'StepService', + function (StepService) { + + + this.sayHello = function (name) { + console.log(StepService.hello(name)); + }; + } + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/sequence/Step/Directives/StepEditDirective.js b/Resources/public/js/sequence/Step/Directives/StepEditDirective.js new file mode 100644 index 000000000..fd2799fc8 --- /dev/null +++ b/Resources/public/js/sequence/Step/Directives/StepEditDirective.js @@ -0,0 +1,27 @@ +/** + * Activity Form directive + * Directive Documentation : https://docs.angularjs.org/guide/directive + */ +(function () { + 'use strict'; + + angular.module('Step').directive('stepEdit', [ + function () { + return { + restrict: 'E', + replace: true, + controller: 'StepEditCtrl', + controllerAs: 'stepEditCtrl', + templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/sequence/Step/Partials/step.edit.html', + scope: { + steps: '=' + }, + link: function (scope, element, attr, stepEditCtrl) { + // set current page to first page + console.log('step edit directive link method called'); + stepEditCtrl.setSteps(scope.steps); + } + }; + } + ]); +})(); diff --git a/Resources/public/js/sequence/Step/Directives/StepShowDirective.js b/Resources/public/js/sequence/Step/Directives/StepShowDirective.js new file mode 100644 index 000000000..f41271f68 --- /dev/null +++ b/Resources/public/js/sequence/Step/Directives/StepShowDirective.js @@ -0,0 +1,24 @@ + +(function () { + 'use strict'; + + angular.module('Step').directive('stepShow', [ + function () { + return { + restrict: 'E', + replace: true, + controller: 'StepShowCtrl', + controllerAs: 'stepShowCtrl', + templateUrl: AngularApp.webDir + 'bundles/ujmexo/js/sequence/Step/Partials/step.show.html', + scope: { + steps: '=' + }, + link: function (scope, element, attr, stepShowCtrl) { + + } + }; + } + ]); +})(); + + diff --git a/Resources/public/js/sequence/Step/Partials/step.edit.html b/Resources/public/js/sequence/Step/Partials/step.edit.html new file mode 100644 index 000000000..e690cce99 --- /dev/null +++ b/Resources/public/js/sequence/Step/Partials/step.edit.html @@ -0,0 +1,46 @@ +
+
+
+

{{ 'sequence_step_panel_title'|trans:{}:'ujm_sequence' }} {{ stepEditCtrl.currentStepIndex + 1}} / {{ stepEditCtrl.steps.length}}

+
+ + + +
+
+
+ +
+
+ +
+
+
    +
  • +
    {{ step.position }}
    +
  • +
+
+
+ +
+
+
+ + +
+
+ +
+
+
+ +
+ + +
+
+
+
\ No newline at end of file diff --git a/Resources/public/js/player/Page/Partials/page.show.html b/Resources/public/js/sequence/Step/Partials/step.show.html similarity index 100% rename from Resources/public/js/player/Page/Partials/page.show.html rename to Resources/public/js/sequence/Step/Partials/step.show.html diff --git a/Resources/public/js/sequence/Step/Services/StepService.js b/Resources/public/js/sequence/Step/Services/StepService.js new file mode 100644 index 000000000..fc913c672 --- /dev/null +++ b/Resources/public/js/sequence/Step/Services/StepService.js @@ -0,0 +1,41 @@ +/** + * Page Service + */ +(function () { + 'use strict'; + + angular.module('Step').factory('StepService', [ + '$http', + '$filter', + '$q', + function StepService($http, $filter, $q) { + + return { + + /** + * Update exercise player steps + * @param player + * @returns + */ + update : function (steps){ + var deferred = $q.defer(); + var sequenceId = steps[0].sequenceId; + $http + .post( + Routing.generate('ujm_steps_update', { id : sequenceId}), {steps: steps} + ) + .success(function (response){ + deferred.resolve(response); + }) + .error(function(data, status){ + console.log('Step service, update method error'); + console.log(status); + console.log(data); + }); + + return deferred.promise; + } + }; + } + ]); +})(); \ No newline at end of file diff --git a/Resources/public/js/player/Page/module.js b/Resources/public/js/sequence/Step/module.js similarity index 73% rename from Resources/public/js/player/Page/module.js rename to Resources/public/js/sequence/Step/module.js index cfe0c3524..d5a8a5fc9 100644 --- a/Resources/public/js/player/Page/module.js +++ b/Resources/public/js/sequence/Step/module.js @@ -4,7 +4,7 @@ (function () { 'use strict'; - angular.module('Page', [ + angular.module('Step', [ ]); })(); diff --git a/Resources/public/js/player/editor.module.js b/Resources/public/js/sequence/editor.module.js similarity index 74% rename from Resources/public/js/player/editor.module.js rename to Resources/public/js/sequence/editor.module.js index 7229cfe50..cc2fb3218 100644 --- a/Resources/public/js/player/editor.module.js +++ b/Resources/public/js/sequence/editor.module.js @@ -2,14 +2,14 @@ 'use strict'; // exercise player module - angular.module('ExercisePlayerEditorApp', [ + angular.module('SequenceEditApp', [ 'ngSanitize', 'ui.bootstrap', 'ui.sortable', 'ui.tinymce', 'ui.translation', 'ui.resourcePicker', - 'Page', - 'Player' + 'Step', + 'Sequence' ]); })(); \ No newline at end of file diff --git a/Resources/public/js/player/player.module.js b/Resources/public/js/sequence/player.module.js similarity index 76% rename from Resources/public/js/player/player.module.js rename to Resources/public/js/sequence/player.module.js index bb8a04b7d..8a6f19222 100644 --- a/Resources/public/js/player/player.module.js +++ b/Resources/public/js/sequence/player.module.js @@ -2,12 +2,12 @@ 'use strict'; // exercise player module - angular.module('ExercisePlayerPlayerApp', [ + angular.module('SequenceViewApp', [ 'ngSanitize', 'ui.bootstrap', 'ui.tinymce', 'ui.translation', 'ui.resourcePicker', - 'Page' + 'Step' ]); })(); \ No newline at end of file diff --git a/Resources/public/less/exercise-player.less b/Resources/public/less/ujm-sequence.less similarity index 88% rename from Resources/public/less/exercise-player.less rename to Resources/public/less/ujm-sequence.less index 9f8815b74..bd8b85c4c 100644 --- a/Resources/public/less/exercise-player.less +++ b/Resources/public/less/ujm-sequence.less @@ -1,15 +1,15 @@ -.exercise-player-container{ +.ujm-sequence-container{ width: 100%; background: white; padding: 15px; .player-container{ } - .page-container{ + .step-container{ - ul.page-list{ + ul.step-list{ list-style-type: none; - li.page-list-item { + li.step-list-item { display: inline-block; line-height: 50px; width:50px; @@ -26,7 +26,7 @@ } } - li.page-list-item.active{ + li.step-list-item.active{ background-color: rgba(66, 139, 202, 1); } .placeholder { diff --git a/Resources/translations/exercise_player.en.yml b/Resources/translations/exercise_player.en.yml deleted file mode 100644 index 16e2079d2..000000000 --- a/Resources/translations/exercise_player.en.yml +++ /dev/null @@ -1,19 +0,0 @@ -# e -exercise_player_type_name : Player name -exercise_player_type_description : Player description -exercise_player_start_date: Start date -exercise_player_end_date: End date -exercise_player_name : Name -exercise_player_description : Description -exercise_player_page_description: Description -exercise_player_page_shuffle: Shuffle -exercise_player_page_previous: Previous page -exercise_player_page_next: Next page -exercise_player_page_view: View page -exercise_player_pages_save: Save pages -exercise_player_page_add: Add page -exercise_player_page_remove: Ramove page -exercise_player_panel_hide: Hide / Show player informations -exercise_player_panel_title: Player -exercise_player_save: Save player -exercise_player_page_panel_title: Pages diff --git a/Resources/translations/exercise_player.fr.yml b/Resources/translations/exercise_player.fr.yml deleted file mode 100644 index 9a3eb266f..000000000 --- a/Resources/translations/exercise_player.fr.yml +++ /dev/null @@ -1,19 +0,0 @@ -# e -exercise_player_type_name : Nom du player -exercise_player_type_description : Description du player -exercise_player_start_date: Date de début -exercise_player_end_date: Date de fin -exercise_player_name : Nom -exercise_player_description : Description -exercise_player_page_description: Description -exercise_player_page_shuffle: Aléatoire -exercise_player_page_previous: Page précédente -exercise_player_page_next: Page suivante -exercise_player_page_view: Voir la page -exercise_player_pages_save: Sauvegarder les pages du player -exercise_player_page_add: Ajouter une page -exercise_player_page_remove: Supprimer une page -exercise_player_panel_hide: Cacher / Montrer les informations du player -exercise_player_panel_title: Player -exercise_player_save: Sauvegarder le player -exercise_player_page_panel_title: Pages \ No newline at end of file diff --git a/Resources/translations/resource.en.yml b/Resources/translations/resource.en.yml index bf0fcd967..b6876fa64 100755 --- a/Resources/translations/resource.en.yml +++ b/Resources/translations/resource.en.yml @@ -1,4 +1,4 @@ # u ujm_exercise: Exercise -ujm_exercise_player: Exercise player -ujm_exercise_player_administrate: Administrate exercise player +ujm_sequence: UJM Sequence +ujm_sequence_administrate: Administrate sequence diff --git a/Resources/translations/resource.fr.yml b/Resources/translations/resource.fr.yml index ed0b6c914..8211f11c3 100755 --- a/Resources/translations/resource.fr.yml +++ b/Resources/translations/resource.fr.yml @@ -1,5 +1,4 @@ # u ujm_exercise: Exercice -ujm_exercise_player: Player d'exercice -ujm_exercise_player_administrate: Administrer le player d'exercise - +ujm_sequence: Séquence UJM +ujm_sequence_administrate: Administrer la séquence diff --git a/Resources/translations/ujm_sequence.en.yml b/Resources/translations/ujm_sequence.en.yml new file mode 100644 index 000000000..9f95ccde8 --- /dev/null +++ b/Resources/translations/ujm_sequence.en.yml @@ -0,0 +1,19 @@ +# e +sequence_panel_title: Sequence +sequence_panel_hide: Hide / Show sequence informations +sequence_type_name : Sequence name +sequence_type_description : Sequence description +sequence_start_date: Start date +sequence_end_date: End date +sequence_name : Name +sequence_description : Description +sequence_step_description: Description +sequence_step_shuffle: Shuffle +sequence_step_previous: Previous step +sequence_step_next: Next step +sequence_step_view: View step +sequence_steps_save: Save steps +sequence_step_add: Add step +sequence_step_remove: Remove step +sequence_save: Save sequence +sequence_step_panel_title: Steps diff --git a/Resources/translations/ujm_sequence.fr.yml b/Resources/translations/ujm_sequence.fr.yml new file mode 100644 index 000000000..76c070eed --- /dev/null +++ b/Resources/translations/ujm_sequence.fr.yml @@ -0,0 +1,19 @@ +# e +sequence_panel_title: Séquence +sequence_panel_hide: Cacher / Montrer les informations de la séquence +sequence_type_name : Nom de la séquence +sequence_type_description : Description de la séquence +sequence_start_date: Date de début +sequence_end_date: Date de fin +sequence_name : Nom +sequence_description : Description +sequence_step_description: Description +sequence_step_shuffle: Aléatoire +sequence_step_previous: Etape précédente +sequence_step_next: Etape suivante +sequence_step_view: Voir l'étape +sequence_steps_save: Sauvegarder les étapes +sequence_step_add: Ajouter une étape +sequence_step_remove: Supprimer une étape +sequence_save: Sauvegarder la séquence +sequence_step_panel_title: Etapes \ No newline at end of file diff --git a/Resources/views/Player/edit.html.twig b/Resources/views/Player/edit.html.twig deleted file mode 100644 index 753a2769b..000000000 --- a/Resources/views/Player/edit.html.twig +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "UJMExoBundle:Player:layout.html.twig" %} - -{% block breadcrumb %} - {{ parent() }} -{% endblock %} - -{% block content %} -
- - -
-{% endblock %} - - -{% block javascripts %} - {# Load Claroline JS #} - {{ parent() }} - - {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm_exo_player_editor.js' - - '@UJMExoBundle/Resources/public/js/player/Player/*' - '@UJMExoBundle/Resources/public/js/player/Player/Controllers/*' - '@UJMExoBundle/Resources/public/js/player/Player/Directives/*' - '@UJMExoBundle/Resources/public/js/player/Player/Services/*' - - '@UJMExoBundle/Resources/public/js/player/Page/*' - '@UJMExoBundle/Resources/public/js/player/Page/Controllers/*' - '@UJMExoBundle/Resources/public/js/player/Page/Directives/*' - '@UJMExoBundle/Resources/public/js/player/Page/Services/*' - - '@UJMExoBundle/Resources/public/js/player/editor.module.js' - %} - - {% endjavascripts %} - - -{% endblock %} - - diff --git a/Resources/views/Player/view.html.twig b/Resources/views/Player/view.html.twig deleted file mode 100644 index 3f2e86d8f..000000000 --- a/Resources/views/Player/view.html.twig +++ /dev/null @@ -1,35 +0,0 @@ -{% extends "UJMExoBundle:Player:layout.html.twig" %} - - - -{% block breadcrumb %} - {{ parent() }} -{% endblock %} - -{% block content %} -
- -
-{% endblock %} - - -{% block javascripts %} - {# Load Claroline JS #} - {{ parent() }} - - - - {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm_exo_player_player.js' - - '@UJMExoBundle/Resources/public/js/player/Page/*' - '@UJMExoBundle/Resources/public/js/player/Page/Controllers/*' - '@UJMExoBundle/Resources/public/js/player/Page/Directives/*' - '@UJMExoBundle/Resources/public/js/player/Page/Services/*' - - '@UJMExoBundle/Resources/public/js/player/player.module.js' - %} - - {% endjavascripts %} - - -{% endblock %} \ No newline at end of file diff --git a/Resources/views/Sequence/edit.html.twig b/Resources/views/Sequence/edit.html.twig new file mode 100644 index 000000000..8c3db68d9 --- /dev/null +++ b/Resources/views/Sequence/edit.html.twig @@ -0,0 +1,39 @@ +{% extends "UJMExoBundle:Sequence:layout.html.twig" %} + +{% block breadcrumb %} + {{ parent() }} +{% endblock %} + +{% block content %} +
+ + +
+{% endblock %} + + +{% block javascripts %} + {# Load Claroline JS #} + {{ parent() }} + + {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm_sequence_edit.js' + + '@UJMExoBundle/Resources/public/js/sequence/Sequence/*' + '@UJMExoBundle/Resources/public/js/sequence/Sequence/Controllers/*' + '@UJMExoBundle/Resources/public/js/sequence/Sequence/Directives/*' + '@UJMExoBundle/Resources/public/js/sequence/Sequence/Services/*' + + '@UJMExoBundle/Resources/public/js/sequence/Step/*' + '@UJMExoBundle/Resources/public/js/sequence/Step/Controllers/*' + '@UJMExoBundle/Resources/public/js/sequence/Step/Directives/*' + '@UJMExoBundle/Resources/public/js/sequence/Step/Services/*' + + '@UJMExoBundle/Resources/public/js/sequence/editor.module.js' + %} + + {% endjavascripts %} + + +{% endblock %} + + diff --git a/Resources/views/Player/layout.html.twig b/Resources/views/Sequence/layout.html.twig similarity index 92% rename from Resources/views/Player/layout.html.twig rename to Resources/views/Sequence/layout.html.twig index 145097615..a26ebf482 100644 --- a/Resources/views/Player/layout.html.twig +++ b/Resources/views/Sequence/layout.html.twig @@ -5,8 +5,8 @@ {{ parent() }} {# Exercise Player styles #} - {% stylesheets debug=false filter='lessphp, cssmin' output='bundles/ujmexo/css/exercise-player.css' - '@UJMExoBundle/Resources/public/less/exercise-player.less' + {% stylesheets debug=false filter='lessphp, cssmin' output='bundles/ujmexo/css/ujm-sequence.css' + '@UJMExoBundle/Resources/public/less/ujm-sequence.less' %} {% endstylesheets %} @@ -21,7 +21,7 @@ {{ parent() }} {# Translations #} - + {# Angular JS #} {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm-exo-angular-js.js' diff --git a/Resources/views/Sequence/view.html.twig b/Resources/views/Sequence/view.html.twig new file mode 100644 index 000000000..843586b0d --- /dev/null +++ b/Resources/views/Sequence/view.html.twig @@ -0,0 +1,35 @@ +{% extends "UJMExoBundle:Sequence:layout.html.twig" %} + + + +{% block breadcrumb %} + {{ parent() }} +{% endblock %} + +{% block content %} +
+ +
+{% endblock %} + + +{% block javascripts %} + {# Load Claroline JS #} + {{ parent() }} + + + + {% javascripts debug=false filter='jsmin' output='vendor/ujmexo/ujm_sequence_show.js' + + '@UJMExoBundle/Resources/public/js/sequence/Sequence/*' + '@UJMExoBundle/Resources/public/js/sequence/Sequence/Controllers/*' + '@UJMExoBundle/Resources/public/js/sequence/Sequence/Directives/*' + '@UJMExoBundle/Resources/public/js/sequence/Sequence/Services/*' + + '@UJMExoBundle/Resources/public/js/player/player.module.js' + %} + + {% endjavascripts %} + + +{% endblock %} \ No newline at end of file