Skip to content
Snippets Groups Projects
ProjectDetail.vue 5.61 KiB
Newer Older
fibasile's avatar
fibasile committed
<template>
fibasile's avatar
fibasile committed
  <q-page>
    <div
      v-if="project && projectLoaded"
      class="q-pa-md container"
fibasile's avatar
fibasile committed
      <!--
      {{project}}
      -->
      <div class="row">
fibasile's avatar
fibasile committed
        <!-- content -->
        <div class="col-xs-12 col-md-7 offset-md-1 col-lg-6 offset-lg-2">
          <ProjectPhotosCard
            :project="project"
            :photos="filterPhotos"
          />
fibasile's avatar
fibasile committed
          <q-space />
fibasile's avatar
fibasile committed
          <ProjectTextCard :project="project" />
fibasile's avatar
fibasile committed
        </div>
fibasile's avatar
fibasile committed
        <div class="col-xs-12 col-md-3 col-lg-2">
          <ProjectDescriptionCard
            :project="project"
            @action="handleAction"
          />
        </div>
      </div>

      <q-space />

      <div class="row">
        <div class="col-xs-12 col-md-7 offset-md-1 col-lg-6 offset-lg-2">
          <ProjectCommentsCard
            :comments="project_comments"
            @addComment="handleAddComment"
          />
          <q-space />
          <RelatedProjectsGallery :projects="related_projects" />
fibasile's avatar
fibasile committed
        </div>
      </div>

      <q-dialog v-model="showSelectCollectionDialog">
fibasile's avatar
fibasile committed
        <SelectCollectionDialog @collection="handleSaveBookmark" />
      </q-dialog>

      <q-dialog v-model="showDownloadsDialog">
        <DownloadsDialog
          :downloads="project_files"
          :project="project"
        />
      </q-dialog>
fibasile's avatar
fibasile committed
    </div>

    <div v-if="!project || !projectLoaded">
fibasile's avatar
fibasile committed
      <div class="project-loader flex flex-center">
        <q-spinner-dots
          size="32px"
          class="q-pa-xl"
        />
fibasile's avatar
fibasile committed
      </div>
    </div>
fibasile's avatar
fibasile committed
  </q-page>
</template>

<script>
import { openURL } from 'quasar'
import { mapActions, mapGetters } from 'vuex';
import ProjectDescriptionCard from 'components/project/ProjectDescriptionCard';
import ProjectPhotosCard from 'components/project/ProjectPhotosCard';
import ProjectCommentsCard from 'components/project/ProjectCommentsCard';
import ProjectTextCard from 'components/project/ProjectTextCard';
import RelatedProjectsGallery from 'components/project/RelatedProjectsGallery';
import SelectCollectionDialog from 'src/components/collection/SelectCollectionDialog';
import DownloadsDialog from 'src/components/project/DownloadsDialog';
fibasile's avatar
fibasile committed
export default {
fibasile's avatar
fibasile committed
  components: {
    ProjectPhotosCard,
    ProjectDescriptionCard,
fibasile's avatar
fibasile committed
    ProjectCommentsCard,
fibasile's avatar
fibasile committed
    ProjectTextCard,
    RelatedProjectsGallery,
    SelectCollectionDialog,
    DownloadsDialog
fibasile's avatar
fibasile committed
  },
fibasile's avatar
fibasile committed
  // name: 'PageName',
  mounted () {
fibasile's avatar
fibasile committed
    if (this.projectId) {
fibasile's avatar
fibasile committed
      this.projectLoaded = false;
fibasile's avatar
fibasile committed
      this.$q.loadingBar.start();
      this.loadProject(this.projectId).finally(() => {
        this.$q.loadingBar.stop();
fibasile's avatar
fibasile committed
        this.projectLoaded = true;
fibasile's avatar
fibasile committed
      });
    }
  },
  watch: {
    projectId (newVal) {
fibasile's avatar
fibasile committed
      if (newVal) {
        this.$nextTick(() => {
fibasile's avatar
fibasile committed
          this.projectLoaded = false;
fibasile's avatar
fibasile committed
          this.$q.loadingBar.start();
          this.loadProject(newVal).finally(() => {
fibasile's avatar
fibasile committed
            this.projectLoaded = true;
fibasile's avatar
fibasile committed
            this.$q.loadingBar.stop();
          });
        });
      }
    }
  },
  methods: {
    ...mapActions({
      loadProject: 'project_detail/loadProject',
fibasile's avatar
fibasile committed
      addComment: 'project_detail/addComment',
      addBookmark: 'collections/addBookmark'
    handleAction (action) {
      if (action === 'showDocumentation') {
        this.handleShowDocumentation();
      } else if (action === 'showDownloads') {
        this.handleShowDownloads();
      } else if (action === 'addBookmark') {
        this.handleAddBookmark();
      }
    },
    handleAddComment (comment) {
      console.log('something')
      this.commentLoading = true;
      this.addComment(comment).then(() => {
        this.$q.notify('Comment added successfully');
      }).catch((e) => {
        this.$q.notify('Error adding comment. Please try again later');
      }).finally(() => {
        this.commentLoading = false;
      })
    },
    handleShowDocumentation () {
      // this.showDocumentationDialog = true;
      // this.openURL
      if (this.project.website) { this.openURL(this.project.website) }
    },
    handleShowDownloads () {
      this.showSelectCollectionDialog = false;
      this.showDownloadsDialog = true;
    },

    handleAddBookmark (key) {
      this.showDownloadsDialog = false;
      this.showSelectCollectionDialog = true;
    },
fibasile's avatar
fibasile committed
    handleSaveBookmark (selectedCollection) {
      console.log(selectedCollection)
      const collectionId = selectedCollection.value
      this.addBookmark({ collection: collectionId, project: this.project.id })
        .then(() => {
          this.$q.notify('Bookmark added')
        }).catch((e) => {
          console.log(e)
          this.$q.notify('Some error occurred, please try again later')
        })
fibasile's avatar
fibasile committed
  },
  computed: {
    filterPhotos () {
fibasile's avatar
fibasile committed
      if (!this.project_photos) return [];
      const good = this.project_photos.filter(p => {
fibasile's avatar
fibasile committed
        return p != null;
      });
      return good;
    },
    projectId () {
      return this.$route.params['project_id'];
fibasile's avatar
fibasile committed
    },
fibasile's avatar
fibasile committed
    ...mapGetters({
      project: 'project_detail/selectedProject',
      project_photos: 'project_detail/selectedProjectPhotos',
      project_files: 'project_detail/selectedProjectFiles',
      project_comments: 'project_detail/selectedProjectComments',
fibasile's avatar
fibasile committed
      related_projects: 'project_detail/relatedProjects',
      userCollections: 'collections/userCollections'
  data () {
fibasile's avatar
fibasile committed
    return {
      commentLoading: false,
      projectLoaded: false,
      showSelectCollectionDialog: false,
      showDownloadsDialog: false
fibasile's avatar
fibasile committed
    };
fibasile's avatar
fibasile committed
  }
};
fibasile's avatar
fibasile committed
</script>

fibasile's avatar
fibasile committed
<style lang="scss">
.project-card {
  width: 512px;
  max-width: 100%;
}

div.thumb_small {
  border: none;
  opacity: 0.6;
}
div.thumb_small.on {
  // border: 1px solid #333;
  opacity: 1;
}
fibasile's avatar
fibasile committed
</style>