123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- <template>
- <div class="loading" v-if="!content || loading">
- <span>Loading ...</span>
- </div>
- <article class="article" v-else>
- <nav class="prevnext top">
- <ul>
- <li>
- <a
- @click.prevent="onPrev"
- href="#"
- v-if="prevnext.prev"
- v-html="prevnext.prev.title"
- />
- </li>
- <li>
- <a
- @click.prevent="onNext"
- href="#"
- v-if="prevnext.next"
- v-html="prevnext.next.title"
- />
- </li>
- </ul>
- </nav>
- <section class="taxonomy">
- <div class="thesaurus">
- <ul>
- <li
- v-for="term in content.field_thesaurus" v-bind:key="term.id"
- >{{ term.name }}</li>
- </ul>
- </div>
- <div class="tags">
- <ul>
- <li
- v-for="term in content.field_tags" v-bind:key="term.id"
- >{{ term.name }}</li>
- </ul>
- </div>
- </section>
- <section class="body" v-html="content.body"></section>
- <section class="visuels">
- <figure
- v-for="visuel in content.field_visuel" v-bind:key="visuel.id"
- >
- <img
- :src="visuel.src"
- :alt="visuel.alt"
- :title="visuel.title"
- />
- <caption></caption>
- </figure>
- </section>
- <aside class="linked-materials">
- <h3 class="field__label">Linked Materials</h3>
- <div class="card-list">
- <ul class="">
- <li v-for="node in content.field_linked_materials" v-bind:key="node.id">
- <Card :item="node" />
- </li>
- </ul>
- </div>
- </aside>
- <nav class="prevnext bottom">
- <ul>
- <li>
- <a
- @click.prevent="onPrev"
- href="#"
- v-if="prevnext.prev"
- v-html="prevnext.prev.title"
- />
- </li>
- <li>
- <a
- @click.prevent="onNext"
- href="#"
- v-if="prevnext.next"
- v-html="prevnext.next.title"
- />
- </li>
- </ul>
- </nav>
- </article>
- </template>
- <script>
- import router from 'vuejs/route'
- import store from 'vuejs/store'
- import { JSONAPI } from 'vuejs/api/json-axios'
- import qs from 'querystring'
- import Card from 'vuejs/components/Content/Card'
- import { mapState, mapActions } from 'vuex'
- export default {
- name: "Article",
- router,
- store,
- props: ['item'],
- data(){
- return {
- index:-1,
- prevnext:{},
- uuid:null,
- content:null,
- loading:true,
- }
- },
- computed: {
- ...mapState({
- items: state => state.Blabla.items
- })
- },
- created(){
- this.getArticle()
- },
- methods: {
- ...mapActions({
- getItems: 'Blabla/getItems',
- getItemIndex: 'Blabla/getItemIndex',
- getPrevNextItems: 'Blabla/getPrevNextItems'
- }),
- getArticle(){
- console.log(this.$route);
- // get the article uuid
- if(this.$route.query.uuid){
- // we come from internal link with vuejs
- // directly record uuid
- this.uuid = this.$route.query.uuid
- }else if(drupalDecoupled.entity_type == 'node' && drupalDecoupled.entity_bundle == 'article'){
- // we landed in an internal page
- // get the uuid from drupalDeclouped, provided by materio_decoupled.module
- this.uuid = drupalDecoupled.entity_uuid
- }
- if(this.uuid){
- this.loadArticle()
- // get the prev next items
- if(!this.items.length){
- // if items list not yet loaded preload them
- this.getItems().then(() => {
- // then get the index
- this.getIndex()
- })
- }else{
- // or directly get the index
- this.getIndex()
- }
- }else{
- // if for any reason we dont have the uuid
- // redirect to home
- this.$route.replace('home')
- }
- },
- getIndex(){
- console.log("Article getIndex");
- this.getItemIndex(this.uuid).then((index) => {
- this.index = index
- // console.log('article index', index, this);
- this.getPrevNextItems(index).then((pn) => {
- this.prevnext = pn
- })
- })
- },
- loadArticle(){
- console.log('loadArticle', this.uuid)
- this.loading = true;
- let params = {
- include:'field_linked_materials.images,field_showroom,field_tags,field_thesaurus,field_visuel,uid'
- }
- let q = qs.stringify(params)
- JSONAPI.get(`node/article/${this.uuid}?${q}`)
- .then(({ data }) => {
- console.log('loadArticle data', data)
- this.parseData(data)
- })
- .catch(( error ) => {
- console.warn('Issue with loadArticle', error)
- Promise.reject(error)
- })
- },
- parseData(data){
- let attrs = data.data.attributes
- let relations = data.data.relationships
- console.log('relations', relations);
- let inc = data.included
- console.log('included', inc);
- this.content = {
- title:attrs.title,
- body: attrs.body.value
- }
- // parse all relationships
- for (let key in relations) {
- // skip loop if the property is from prototype
- if (!relations.hasOwnProperty(key)) continue;
- let relation_obj = relations[key]
- console.log('typeof relation_obj.data', typeof relation_obj.data);
- // skip relation_obj if data is not array
- if(!Array.isArray(relation_obj.data)) continue
- // create empty field array
- this.content[key] = []
- // parse relationship values using included
- let field = {}
- // loop through all relation items
- relation_obj.data.forEach((e) => {
- // get the included values for each item using id
- let included = inc.find((i) => { return i.id == e.id })
- // if we not found an included item skip the item
- if(typeof included != 'undefined'){
- // fill the item values
- switch (key) {
- case 'field_visuel':
- field = e.meta
- field.id = e.id
- field.src = included.links.card_medium.href
- break;
- case 'field_linked_materials':
- field = included.attributes
- field.id = included.id
- // get the linked material included images
- field.images = [];
- included.relationships.images.data.forEach((img) => {
- // console.log('href', img.meta.imageDerivatives.links.card_medium.href);
- field.images.push({
- title:img.meta.title,
- url:img.meta.imageDerivatives.links.card_medium.href
- })
- })
- break;
- case 'field_thesaurus':
- case 'field_tags':
- field = included.attributes
- field.id = included.id
- break;
- // case 'field_showroom':
- // field = included.attributes
- // break
- default:
- }
- this.content[key].push(field)
- }
- })
- }
- // update main page title
- this.$store.commit('Common/setPagetitle', this.content.title)
- this.loading = false;
- console.log('article.content',this.content);
- },
- onNext(){
- // console.log('clicked on next', this.prevnext.next);
- let alias = this.prevnext.next.view_node.replace(/^.?\/blabla\//g, '')
- this.$router.push({
- name:`article`,
- params: { alias:alias },
- query: { uuid: this.prevnext.next.uuid }
- })
- },
- onPrev(){
- // console.log('clicked on prev', this.prevnext.next);
- let alias = this.prevnext.prev.view_node.replace(/^.?\/blabla\//g, '')
- this.$router.push({
- name:`article`,
- params: { alias:alias },
- query: { uuid: this.prevnext.prev.uuid }
- })
- }
- },
- components: {
- Card
- },
- watch: {
- '$route' (to, from) {
- console.log('route change')
- this.getArticle()
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- </style>
|