diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000000..ec70e47959 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,17 @@ +{ + "root": true, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "parser": "babel-eslint" + }, + "env": { + "browser": true, + "node": true, + "es6": true + }, + "extends": [ + "eslint:recommended", + "plugin:vue/recommended" + ] +} \ No newline at end of file diff --git a/assets/vue/App.vue b/assets/vue/App.vue index de9f64f555..ea695ee4d1 100644 --- a/assets/vue/App.vue +++ b/assets/vue/App.vue @@ -7,7 +7,6 @@ v-model="drawer" :clipped="$vuetify.breakpoint.lgAndUp" disable-resize-watcher - > @@ -21,7 +20,30 @@ + + + mdi-home + + + + My courses + + + + + + + mdi-home + + + + My sessions + + + + @@ -170,9 +192,38 @@ - - mdi-bell - + + + + + +
Notifications
+
+ + + + Notification 1 + + + + + Notification 2 + + + +
+
+ Profile + + Inbox + + Logout @@ -257,44 +312,40 @@ isAuthenticated() { return this.$store.getters['security/isAuthenticated'] }, + isAdmin() { + return this.$store.getters['security/isAdmin'] + }, }, watch: { $route(to, from) { - console.log('remove'); this.$data.legacy_content = ''; if (document.querySelector("#sectionMainContent")) { - console.log('removed sectionMainContent'); document.querySelector("#sectionMainContent").remove(); } let url = window.location.href; console.log(url); var n = url.indexOf("main/"); if (n > 0) { - console.log('ajax'); axios.get(url, { params: { from_vue: 1 } }) - .then((response) => { - // handle success - this.$data.legacy_content = response.data; - }); + .then((response) => { + // handle success + this.$data.legacy_content = response.data; + }); } }, legacy_content: { handler: function () { - console.log('watch'); if (document.querySelector("#sectionMainContent")) { - //console.log('removed sectionMainContent'); - //document.querySelector("#sectionMainContent").remove(); } }, immediate: true }, }, mounted() { - console.log('mounted'); let legacyContent = document.querySelector("#sectionMainContent"); if (legacyContent) { document.querySelector("#sectionMainContent").remove(); diff --git a/assets/vue/router/index.js b/assets/vue/router/index.js index 00db98f0b3..76b10af87f 100644 --- a/assets/vue/router/index.js +++ b/assets/vue/router/index.js @@ -8,11 +8,15 @@ import courseCategoryRoutes from './coursecategory'; import documents from './documents'; import store from "../store"; import Login from "../views/Login"; +import MyCourseList from "../views/user/courses/List"; +import MySessionList from "../views/user/sessions/List"; let router = new VueRouter({ mode: "history", routes: [ { path: "/login", component: Login }, + { path: "/courses", name: "MyCourses", component: MyCourseList }, + { path: "/sessions", name: "MySessions", component: MySessionList }, courseRoutes, courseCategoryRoutes, documents diff --git a/assets/vue/store/security.js b/assets/vue/store/security.js index c5610aa91a..b8d8bc57a8 100644 --- a/assets/vue/store/security.js +++ b/assets/vue/store/security.js @@ -26,9 +26,19 @@ export default { isAuthenticated(state) { return state.isAuthenticated; }, + isAdmin(state, getters) { + return getters.hasRole('ROLE_ADMIN'); + }, + getUser(state) { + return state.user; + }, hasRole(state) { return role => { - return state.user.roles.indexOf(role) !== -1; + if (state.user.roles) { + return state.user.roles.indexOf(role) !== -1; + } + + return false; } } }, diff --git a/assets/vue/views/user/courses/CourseCard.vue b/assets/vue/views/user/courses/CourseCard.vue new file mode 100644 index 0000000000..55a16c642a --- /dev/null +++ b/assets/vue/views/user/courses/CourseCard.vue @@ -0,0 +1,38 @@ + + + diff --git a/assets/vue/views/user/courses/List.vue b/assets/vue/views/user/courses/List.vue new file mode 100644 index 0000000000..a523fd4805 --- /dev/null +++ b/assets/vue/views/user/courses/List.vue @@ -0,0 +1,45 @@ + + + diff --git a/assets/vue/views/user/sessions/List.vue b/assets/vue/views/user/sessions/List.vue new file mode 100644 index 0000000000..65d528af01 --- /dev/null +++ b/assets/vue/views/user/sessions/List.vue @@ -0,0 +1,43 @@ + + + diff --git a/assets/vue/views/user/sessions/SessionCard.vue b/assets/vue/views/user/sessions/SessionCard.vue new file mode 100644 index 0000000000..79bacf594b --- /dev/null +++ b/assets/vue/views/user/sessions/SessionCard.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/CoreBundle/Entity/Course.php b/src/CoreBundle/Entity/Course.php index 4d09b6d848..deb7edfa8a 100644 --- a/src/CoreBundle/Entity/Course.php +++ b/src/CoreBundle/Entity/Course.php @@ -58,7 +58,7 @@ class Course extends AbstractResource implements ResourceInterface /** * @var int - * @Groups({"course:read"}) + * @Groups({"course:read", "course_rel_user:read"}) * @ORM\Column(name="id", type="integer", nullable=false, unique=false) * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") @@ -70,7 +70,7 @@ class Course extends AbstractResource implements ResourceInterface * * @Assert\NotBlank() * - * @Groups({"course:read", "course:write"}) + * @Groups({"course:read", "course:write", "course_rel_user:read", "session_rel_course_rel_user:read"}) * * @ORM\Column(name="title", type="string", length=250, nullable=true, unique=false) */ @@ -80,7 +80,7 @@ class Course extends AbstractResource implements ResourceInterface * @var string * @Assert\NotBlank() * @ApiProperty(iri="http://schema.org/courseCode") - * @Groups({"course:read", "course:write"}) + * @Groups({"course:read", "course:write", "course_rel_user:read"}) * * @Gedmo\Slug( * fields={"title"}, @@ -96,7 +96,7 @@ class Course extends AbstractResource implements ResourceInterface * @var CourseRelUser[]|ArrayCollection * * @ApiSubresource() - * @Groups({"course:read"}) + * Groups({"course:read"}) * "orphanRemoval" is needed to delete the CourseRelUser relation * in the CourseAdmin class. The setUsers, getUsers, removeUsers and * addUsers methods need to be added. @@ -154,32 +154,32 @@ class Course extends AbstractResource implements ResourceInterface protected $currentUrl; /** - * @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\SkillRelCourse", mappedBy="course", cascade={"persist", "remove"}) + * @ORM\OneToMany(targetEntity="SkillRelCourse", mappedBy="course", cascade={"persist", "remove"}) */ protected $skills; /** - * @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\SkillRelUser", mappedBy="course", cascade={"persist", "remove"}) + * @ORM\OneToMany(targetEntity="SkillRelUser", mappedBy="course", cascade={"persist", "remove"}) */ protected $issuedSkills; /** - * @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\GradebookCategory", mappedBy="course", cascade={"persist", "remove"}) + * @ORM\OneToMany(targetEntity="GradebookCategory", mappedBy="course", cascade={"persist", "remove"}) */ protected $gradebookCategories; /** - * @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\GradebookEvaluation", mappedBy="course", cascade={"persist", "remove"}) + * @ORM\OneToMany(targetEntity="GradebookEvaluation", mappedBy="course", cascade={"persist", "remove"}) */ protected $gradebookEvaluations; /** - * @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\GradebookLink", mappedBy="course", cascade={"persist", "remove"}) + * @ORM\OneToMany(targetEntity="GradebookLink", mappedBy="course", cascade={"persist", "remove"}) */ protected $gradebookLinks; /** - * @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\TrackEHotspot", mappedBy="course", cascade={"persist", "remove"}) + * @ORM\OneToMany(targetEntity="TrackEHotspot", mappedBy="course", cascade={"persist", "remove"}) */ protected $trackEHotspots; diff --git a/src/CoreBundle/Entity/CourseRelUser.php b/src/CoreBundle/Entity/CourseRelUser.php index e9c72f5e85..1866fad7c4 100644 --- a/src/CoreBundle/Entity/CourseRelUser.php +++ b/src/CoreBundle/Entity/CourseRelUser.php @@ -13,7 +13,7 @@ use Symfony\Component\Serializer\Annotation\Groups; * * @ApiResource( * shortName="CourseSubscription", - * normalizationContext={"groups"={"course_rel_user:read"}} + * normalizationContext={"groups"={"course_rel_user:read", "user:read"}} * ) * * @ORM\Table( @@ -45,6 +45,7 @@ class CourseRelUser protected $user; /** + * @Groups({"course:read", "user:read"}) * @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="users", cascade={"persist"}) * @ORM\JoinColumn(name="c_id", referencedColumnName="id") */ @@ -52,14 +53,14 @@ class CourseRelUser /** * @var int - * + * @Groups({"user:read", "course:read"}) * @ORM\Column(name="relation_type", type="integer", nullable=false, unique=false) */ protected $relationType; /** * @var bool - * + * @Groups({"user:read"}) * @ORM\Column(name="status", type="integer", nullable=false, unique=false) */ protected $status; diff --git a/src/CoreBundle/Entity/Session.php b/src/CoreBundle/Entity/Session.php index 7e761c6112..529887fcd4 100644 --- a/src/CoreBundle/Entity/Session.php +++ b/src/CoreBundle/Entity/Session.php @@ -113,7 +113,7 @@ class Session protected $urls; /** - * @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\ResourceLink", mappedBy="session", cascade={"remove"}, orphanRemoval=true) + * @ORM\OneToMany(targetEntity="ResourceLink", mappedBy="session", cascade={"remove"}, orphanRemoval=true) */ protected $resourceLinks; @@ -125,7 +125,7 @@ class Session /** * @var string * @Assert\NotBlank() - * @Groups({"session:read", "session:write"}) + * @Groups({"session:read", "session:write", "session_rel_course_rel_user:read"}) * @ORM\Column(name="name", type="string", length=150, nullable=false, unique=false) */ protected $name; diff --git a/src/CoreBundle/Entity/SessionRelCourseRelUser.php b/src/CoreBundle/Entity/SessionRelCourseRelUser.php index fe0a578a0f..2c86503e71 100644 --- a/src/CoreBundle/Entity/SessionRelCourseRelUser.php +++ b/src/CoreBundle/Entity/SessionRelCourseRelUser.php @@ -4,11 +4,17 @@ namespace Chamilo\CoreBundle\Entity; +use ApiPlatform\Core\Annotation\ApiResource; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; /** * Class SessionRelCourseRelUser. * + * @ApiResource( + * shortName="SessionSubscription", + * normalizationContext={"groups"={"session_rel_course_rel_user:read", "user:read"}} + * ) * @ORM\Table( * name="session_rel_course_rel_user", * indexes={ @@ -47,7 +53,7 @@ class SessionRelCourseRelUser /** * @var Session - * + * @Groups({"session_rel_course_rel_user:read"}) * @ORM\ManyToOne(targetEntity="Session", inversedBy="userCourseSubscriptions", cascade={"persist"}) * @ORM\JoinColumn(name="session_id", referencedColumnName="id", nullable=false) */ @@ -55,7 +61,7 @@ class SessionRelCourseRelUser /** * @var Course - * + * @Groups({"session_rel_course_rel_user:read"}) * @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="sessionUserSubscriptions", cascade={"persist"}) * @ORM\JoinColumn(name="c_id", referencedColumnName="id", nullable=false) */ diff --git a/src/CoreBundle/Entity/User.php b/src/CoreBundle/Entity/User.php index ba862c9123..6e2d48e261 100644 --- a/src/CoreBundle/Entity/User.php +++ b/src/CoreBundle/Entity/User.php @@ -277,6 +277,7 @@ class User implements UserInterface, EquatableInterface protected $dropBoxSentFiles; /** + * @Groups({"user:read", "user:write"}) * @ORM\Column(type="array") */ protected $roles; @@ -344,6 +345,7 @@ class User implements UserInterface, EquatableInterface protected $resourceNodes; /** + * @ApiSubresource() * @ORM\OneToMany( * targetEntity="Chamilo\CoreBundle\Entity\SessionRelCourseRelUser", * mappedBy="user", @@ -918,16 +920,6 @@ class User implements UserInterface, EquatableInterface return \UserManager::formatUserFullName($this).$classString; } - /** - * Get userId. - * - * @return int - */ - public function getUserId() - { - return $this->userId; - } - /** * Set lastname. *