Merge branch 'master' of github.com:chamilo/chamilo-lms

pull/4017/head
Yannick Warnier 4 years ago
commit 25bccdd341
  1. 15
      assets/vue/components/Breadcrumb.vue
  2. 2
      assets/vue/components/ccalendarevent/Form.vue
  3. 36
      assets/vue/components/session/SessionCard.vue
  4. 37
      assets/vue/graphql/queries/SessionRelUser.js
  5. 1
      assets/vue/mixins/CreateMixin.js
  6. 12
      assets/vue/views/course/List.vue
  7. 28
      assets/vue/views/user/sessions/List.vue
  8. 19
      src/CoreBundle/Entity/Course.php
  9. 2
      src/CoreBundle/Entity/Session.php
  10. 4
      src/CoreBundle/Entity/SessionRelCourse.php
  11. 6
      src/CoreBundle/Entity/SessionRelCourseRelUser.php
  12. 11
      src/CoreBundle/Entity/SessionRelUser.php
  13. 0
      var/cache/.gitkeep

@ -24,16 +24,10 @@
<script>
import {mapGetters} from "vuex";
import isEmpty from "lodash/isEmpty";
export default {
name: 'Breadcrumb',
props: ['layoutClass', 'legacy'],
data() {
return {
//legacy:[],
};
},
computed: {
...mapGetters('resourcenode', {
resourceNode: 'getResourceNode',
@ -63,15 +57,6 @@ export default {
return items;
}
// Course
/*if (this.$route.query.cid) {
items.push({
text: this.$route.query.cid,
//disabled: route.path === path || lastItem.path === route.path,
href: '/course/' + this.$route.query.cid + '/home'
});
}*/
if (this.legacy) {
console.log('legacy');
// Checking data from legacy main (1.11.x)

@ -137,9 +137,7 @@ export default {
},
setup() {
const store = useStore();
const linksType = ref('users');
const isCurrentTeacher = computed(() => store.getters['security/isCurrentTeacher']);
const isAdmin = computed(() => store.getters['security/isAdmin']);

@ -2,18 +2,18 @@
<div class="text-h6 mt-4">{{ session.name }}</div>
<div class="grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-4">
<div
v-for="edge in session.sessionRelCourseRelUsers.edges"
:key="edge.node.course.id"
v-for="course in courses"
no-body
style="max-width: 540px;"
>
<CourseCard
:course="edge.node.course"
:course="course.node.course"
:session-id="session._id"
/>
</div>
</div>
</template>
//:key="node.course.id"
<style scoped>
.my-card {
width: 100%;
@ -23,6 +23,8 @@
<script>
import CourseCard from '../course/CourseCard.vue';
import {computed, ref} from "vue";
import isEmpty from 'lodash/isEmpty';
export default {
name: 'SessionCard',
@ -31,6 +33,32 @@ export default {
},
props: {
session: Object,
}
},
setup(props) {
const session = props.session;
const courses = ref([]);
let showAllCourses = false;
if (!isEmpty(session.users.edges)) {
session.users.edges.forEach(({node}) => {
// User is Session::SESSION_ADMIN
if (4 === node.relationType) {
showAllCourses = true;
return;
}
});
}
if (showAllCourses) {
courses.value = session.courses.edges;
} else {
courses.value = session.sessionRelCourseRelUsers.edges;
}
return {
courses
};
},
};
</script>

@ -10,7 +10,42 @@ export const GET_SESSION_REL_USER = gql`
edges {
node {
session {
...sessionFields
_id
name
displayStartDate
displayEndDate
users(user: $user) {
edges {
node {
user {
id
}
relationType
}
}
}
courses {
edges {
node {
course {
_id
title
illustrationUrl
}
}
}
}
sessionRelCourseRelUsers(user: $user) {
edges {
node {
course {
_id
title
illustrationUrl
}
}
}
}
}
}
}

@ -2,6 +2,7 @@ import NotificationMixin from './NotificationMixin';
import { formatDateTime } from '../utils/dates';
import isEmpty from 'lodash/isEmpty';
import {MESSAGE_TYPE_INBOX} from "../components/message/msgType";
export default {
mixins: [NotificationMixin],
methods: {

@ -32,17 +32,6 @@
show-select
@update:options="onUpdateOptions"
>
<template slot="item.category" slot-scope="{ item }">
<div v-if="item['category']">
<router-link :to="{ name: 'CourseCategoryUpdate', params: {id: item['category']['@id']}}">
{{ item['category'].name }}
</router-link>
</div>
<div v-else>
-
</div>
</template>
<template slot="item.visibility" slot-scope="{ item }">
{{ $n(item['visibility']) }}
</template>
@ -90,7 +79,6 @@ export default {
{ text: 'title', value: 'title' },
{ text: 'code', value: 'code' },
{ text: 'courseLanguage', value: 'Language' },
{ text: 'category', value: 'category' },
{ text: 'visibility', value: 'visibility' },
{
text: 'Actions',

@ -28,7 +28,7 @@
<script>
import SessionCardList from '../../../components/session/SessionCardList.vue';
import {computed} from "vue";
import {computed, ref} from "vue";
import {useStore} from 'vuex';
import {useQuery, useResult} from '@vue/apollo-composable'
import {GET_SESSION_REL_USER} from "../../../graphql/queries/SessionRelUser.js";
@ -47,24 +47,20 @@ export default {
const {result, loading} = useQuery(GET_SESSION_REL_USER, {
user: "/api/users/" + userId
}, );
const sessions = useResult(result, [], ({sessionRelCourseRelUsers, sessionRelUsers}) => {
const su = sessionRelUsers.edges.map(({
node
}) => node.session);
});
const scu = sessionRelCourseRelUsers.edges
.map(({
node
}) => {
const existsSession = su.findIndex(suSession => suSession._id === node.session._id) >= 0;
const sessions = useResult(result, [], ({sessionRelCourseRelUsers, sessionRelUsers})=> {
let sessionList = [];
const sessionInSessionRelUser = sessionRelUsers.edges.map(({node}) => {
const sessionExists = sessionList.findIndex(suSession => suSession._id === node.session._id) >= 0;
if (!sessionExists) {
sessionList.push(node.session);
}
return existsSession ? null : node.session;
})
.filter(scuSession => scuSession !== null);
return sessionExists ? null : node.session;
});
return [].concat(su).concat(scu);
return sessionList;
});
return {

@ -74,7 +74,14 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[Groups(['course:read', 'course_rel_user:read', 'session_rel_course_rel_user:read', 'session_rel_user:read'])]
#[Groups([
'course:read',
'course_rel_user:read',
'session:read',
'session_rel_course_rel_user:read',
'session_rel_user:read',
'session_rel_course:read',
])]
protected ?int $id = null;
/**
@ -82,7 +89,15 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
*
* @ORM\Column(name="title", type="string", length=250, nullable=true, unique=false)
*/
#[Groups(['course:read', 'course:write', 'course_rel_user:read', 'session_rel_course_rel_user:read', 'session_rel_user:read'])]
#[Groups([
'course:read',
'course:write',
'course_rel_user:read',
'session:read',
'session_rel_course_rel_user:read',
'session_rel_user:read',
'session_rel_course:read',
])]
#[Assert\NotBlank(message: 'A Course requires a title')]
protected ?string $title = null;

@ -89,6 +89,7 @@ class Session implements ResourceWithAccessUrlInterface
* @ORM\OrderBy({"position"="ASC"})
* @ORM\OneToMany(targetEntity="SessionRelCourse", mappedBy="session", cascade={"persist"}, orphanRemoval=true)
*/
#[Groups(['session:read', 'session_rel_user:read'])]
protected Collection $courses;
/**
@ -96,6 +97,7 @@ class Session implements ResourceWithAccessUrlInterface
*
* @ORM\OneToMany(targetEntity="SessionRelUser", mappedBy="session", cascade={"persist"}, orphanRemoval=true)
*/
#[Groups(['session:read', 'session_rel_user:read'])]
protected Collection $users;
/**

@ -66,17 +66,17 @@ class SessionRelCourse
protected ?int $id = null;
/**
* @Groups({"session_rel_course:read", "session_rel_course:write"})
* @ORM\ManyToOne(targetEntity="Session", inversedBy="courses", cascade={"persist"})
* @ORM\JoinColumn(name="session_id", referencedColumnName="id", nullable=false)
*/
#[Groups(['session_rel_course:read', 'session_rel_course:write'])]
protected ?Session $session = null;
/**
* @Groups({"session_rel_course:read", "session_rel_course:write"})
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="sessions", cascade={"persist"})
* @ORM\JoinColumn(name="c_id", referencedColumnName="id", nullable=false)
*/
#[Groups(['session_rel_course:read', 'session_rel_course:write'])]
protected ?Course $course = null;
/**

@ -68,24 +68,24 @@ class SessionRelCourseRelUser
protected ?int $id = null;
/**
* @Groups({"session:read", "session_rel_course_rel_user:read"})
* @ORM\ManyToOne(targetEntity="User", inversedBy="sessionRelCourseRelUsers", cascade={"persist"})
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
*/
#[Groups(['session:read', 'session_rel_course_rel_user:read'])]
protected User $user;
/**
* @Groups({"session_rel_course_rel_user:read"})
* @ORM\ManyToOne(targetEntity="Session", inversedBy="sessionRelCourseRelUsers", cascade={"persist"})
* @ORM\JoinColumn(name="session_id", referencedColumnName="id", nullable=false)
*/
#[Groups(['session_rel_course_rel_user:read'])]
protected Session $session;
/**
* @Groups({"session:read", "session_rel_course_rel_user:read", "session_rel_user:read"})
* @ORM\ManyToOne(targetEntity="Course", inversedBy="sessionRelCourseRelUsers", cascade={"persist"})
* @ORM\JoinColumn(name="c_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
#[Groups(['session:read', 'session_rel_course_rel_user:read', 'session_rel_user:read'])]
#[MaxDepth(1)]
protected Course $course;

@ -84,24 +84,23 @@ class SessionRelUser
protected ?int $id = null;
/**
* @Groups({"session_rel_user:read"})
*
* @ORM\ManyToOne(targetEntity="Session", inversedBy="users", cascade={"persist"})
* @ORM\JoinColumn(name="session_id", referencedColumnName="id")
*/
#[Groups(['session_rel_user:read'])]
protected Session $session;
/**
* @Groups({"session_rel_user:read"})
*
* @ORM\ManyToOne(targetEntity="User", inversedBy="sessionsRelUser", cascade={"persist"})
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
#[Groups(['session_rel_user:read'])]
protected User $user;
/**
* @ORM\Column(name="relation_type", type="integer")
*/
#[Groups(['session_rel_user:read'])]
protected int $relationType;
/**
@ -129,9 +128,7 @@ class SessionRelUser
*/
protected DateTime $registeredAt;
/**
* @Groups({"session_rel_user:read"})
*/
#[Groups(['session_rel_user:read'])]
protected Collection $courses;
public function __construct()

Loading…
Cancel
Save