You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
1.7 KiB

  1. import Vue from 'vue';
  2. import axios from 'axios';
  3. axios.defaults.xsrfCookieName = 'csrftoken';
  4. axios.defaults.xsrfHeaderName = 'X-CSRFToken';
  5. const baseUrl = window.location.href.split('/').slice(0, 3).join('/');
  6. const vm = new Vue({
  7. el: '#projects_root',
  8. delimiters: ['[[', ']]'],
  9. data: {
  10. items: [],
  11. selectedType: 'All',
  12. isActive: false,
  13. isDelete: false,
  14. },
  15. methods: {
  16. getProjects() {
  17. axios.get(`${baseUrl}/api/projects`).then((response) => {
  18. this.items = response.data;
  19. });
  20. },
  21. deleteProject(project) {
  22. axios.delete(`${baseUrl}/api/projects/${project.id}/`).then((response) => {
  23. this.isDelete = false;
  24. const index = this.items.indexOf(project);
  25. this.items.splice(index, 1);
  26. });
  27. },
  28. updateSelectedType(type) {
  29. this.selectedType = type;
  30. },
  31. },
  32. computed: {
  33. uniqueProjectTypes() {
  34. const types = [];
  35. for (let i = 0; i < this.items.length; i++) {
  36. const item = this.items[i];
  37. types.push(item.project_type);
  38. }
  39. const uniqueTypes = Array.from(new Set(types));
  40. return uniqueTypes;
  41. },
  42. filteredProjects() {
  43. // filter projects
  44. const projects = [];
  45. for (let i = 0; i < this.items.length; i++) {
  46. const item = this.items[i];
  47. if ((this.selectedType === 'All') || (item.project_type === this.selectedType)) {
  48. projects.push(item);
  49. }
  50. }
  51. // create nested projects
  52. const nestedProjects = [];
  53. for (let i = 0; i < Math.ceil(projects.length / 3); i++) {
  54. const p = projects.slice(i * 3, (i + 1) * 3);
  55. nestedProjects.push(p);
  56. }
  57. return nestedProjects;
  58. },
  59. },
  60. created() {
  61. this.getProjects();
  62. },
  63. });