diff --git a/assets/vue/composables/datatableList.js b/assets/vue/composables/datatableList.js index 4d9013b0aa..c48352f59e 100644 --- a/assets/vue/composables/datatableList.js +++ b/assets/vue/composables/datatableList.js @@ -1,6 +1,6 @@ import { useStore } from 'vuex' import { ref } from 'vue' -import { useRoute } from 'vue-router' +import { useRoute, useRouter } from 'vue-router'; import { isEmpty } from 'lodash' import { useCidReq } from './cidReq' @@ -9,6 +9,7 @@ export function useDatatableList (servicePrefix) { const moduleName = servicePrefix.toLowerCase() const store = useStore() + const router = useRouter() const route = useRoute() const { cid, sid, gid } = useCidReq() @@ -50,10 +51,69 @@ export function useDatatableList (servicePrefix) { .then(() => options.value = { sortBy, sortDesc, itemsPerPage, page }) } + function goToAddItem () { + console.log('addHandler'); + + let folderParams = route.query; + + router.push({ + name: `${servicePrefix}Create`, + query: folderParams, + }); + } + + function goToEditItem (item) { + let folderParams = route.query; + folderParams['id'] = item['@id']; + + if ('folder' === item.filetype || isEmpty(item.filetype)) { + router.push({ + name: `${servicePrefix}Update`, + params: { id: item['@id'] }, + query: folderParams + }); + } + + if ('file' === item.filetype) { + folderParams['getFile'] = true; + if (item.resourceNode.resourceFile && + item.resourceNode.resourceFile.mimeType && + 'text/html' === item.resourceNode.resourceFile.mimeType + ) { + //folderParams['getFile'] = true; + } + + this.$router.push({ + name: `${servicePrefix}UpdateFile`, + params: { id: item['@id'] }, + query: folderParams + }); + } + } + + function onShowItem (item) { + console.log('listmixin showHandler', item); + + let folderParams = route.query; + + if (item) { + folderParams['id'] = item['@id']; + } + + router.push({ + name: `${servicePrefix}Show`, + params: folderParams, + query: folderParams, + }); + } + return { filters, expandedFilter, options, onUpdateOptions, + goToAddItem, + onShowItem, + goToEditItem, } } diff --git a/assets/vue/views/page/List.vue b/assets/vue/views/page/List.vue index 68ab436dfd..b303652180 100644 --- a/assets/vue/views/page/List.vue +++ b/assets/vue/views/page/List.vue @@ -4,58 +4,62 @@ > - - - - - - - - - + + + + + + + + + + + + + + {{ slotProps.data.title }} @@ -63,30 +67,43 @@ + > + + + + + - - - - + + + + + + @@ -137,9 +154,9 @@ @click="hideDialog" /> @@ -147,9 +164,9 @@ @@ -176,214 +193,162 @@ - {{ $t('Are you sure you want to delete the selected items?') }} + - diff --git a/src/CoreBundle/Entity/Page.php b/src/CoreBundle/Entity/Page.php index 864de8a59d..1755ce9b50 100644 --- a/src/CoreBundle/Entity/Page.php +++ b/src/CoreBundle/Entity/Page.php @@ -8,6 +8,7 @@ namespace Chamilo\CoreBundle\Entity; use ApiPlatform\Core\Annotation\ApiFilter; use ApiPlatform\Core\Annotation\ApiResource; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter; use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; use Chamilo\CoreBundle\Traits\TimestampableTypedEntity; use Doctrine\ORM\Mapping as ORM; @@ -50,7 +51,6 @@ use Symfony\Component\Validator\Constraints as Assert; 'groups' => ['page:read', 'timestampable_created:read', 'timestampable_updated:read'], ], )] - #[ApiFilter(SearchFilter::class, properties: [ 'locale' => 'exact', 'url' => 'exact', @@ -58,6 +58,9 @@ use Symfony\Component\Validator\Constraints as Assert; 'category' => 'exact', 'category.title' => 'partial', ])] +#[ApiFilter(OrderFilter::class, properties: [ + 'title', +])] class Page { use TimestampableTypedEntity;