App.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <div id="app">
  3. <!-- top navigation bar -->
  4. <top-navigation-bar :window="window"
  5. :current-project="currentProject"
  6. v-on:side="window.menu = !window.menu"></top-navigation-bar>
  7. <!-- bottom content -->
  8. <div class="bottom">
  9. <!-- side navigation bar -->
  10. <side-navigation-bar :window="window"
  11. :socket="socket"
  12. :status="status"
  13. :current-project="currentProject"
  14. v-on:close="window.menu = false"/>
  15. <!-- actual content -->
  16. <div class="content">
  17. <project-open-window v-if="window.content === 'projects'"
  18. :projects="projects"
  19. :status="status"
  20. :socket="socket"
  21. :window="window"
  22. v-on:open="openProject"/>
  23. <project-settings-window v-if="window.content === 'settings'"
  24. :current-project="currentProject"
  25. :status="status"
  26. :socket="socket"
  27. v-on:close="closeProject"/>
  28. <project-data-add-window v-if="window.content === 'add_data'"
  29. :current-project="currentProject"
  30. :status="status"
  31. :socket="socket"/>
  32. <project-data-view-window v-if="window.content === 'view_data'"
  33. :current-project="currentProject"
  34. :status="status"
  35. :socket="socket"/>
  36. <about-window v-if="window.content === 'about'"/>
  37. </div>
  38. </div>
  39. </div>
  40. </template>
  41. <script>
  42. import io from "socket.io-client";
  43. import ProjectOpenWindow from "@/components/projects/project-open-window";
  44. import TopNavigationBar from "@/components/window/top-navigation-bar";
  45. import SideNavigationBar from "@/components/window/side-navigation-bar";
  46. import ProjectSettingsWindow from "@/components/projects/project-settings-window";
  47. import AboutWindow from "@/components/other/about-window";
  48. import ProjectDataAddWindow from "@/components/projects/project-data-add-window";
  49. import ProjectDataViewWindow from "@/components/projects/project-data-view-window";
  50. export default {
  51. name: 'App',
  52. components: {
  53. ProjectDataAddWindow,
  54. ProjectDataViewWindow,
  55. AboutWindow,
  56. ProjectSettingsWindow,
  57. SideNavigationBar,
  58. TopNavigationBar,
  59. ProjectOpenWindow
  60. },
  61. data: function() {
  62. return {
  63. socket: {
  64. baseurl: window.location.protocol + '//' + window.location.hostname + ':5000',
  65. // initialize socket.io connection
  66. io: io(window.location.protocol + '//' + window.location.hostname + ':5000'),
  67. // http methods
  68. post: function(name, value) {
  69. return fetch(this.baseurl + name, {
  70. method: 'POST',
  71. body: JSON.stringify(value)
  72. });
  73. },
  74. upload: function(name, file) {
  75. const form = new FormData();
  76. form.append('file', file);
  77. return fetch(this.baseurl + name, {
  78. method: 'POST',
  79. body: form
  80. });
  81. },
  82. media: function(projectId, fileId) {
  83. return this.baseurl + '/projects/' + projectId + '/data/' + fileId;
  84. }
  85. },
  86. status: null,
  87. window: {
  88. wide: true,
  89. menu: false,
  90. content: 'projects',
  91. project: null
  92. }
  93. }
  94. },
  95. computed: {
  96. projects: function() {
  97. if (this.status == null)
  98. return [];
  99. return Object.keys(this.status.projects).map(key => this.status.projects[key]);
  100. },
  101. currentProject: function() {
  102. for (let i = 0; i < this.projects.length; i++)
  103. if (this.projects[i].id === this.window.project)
  104. return this.projects[i];
  105. return false;
  106. }
  107. },
  108. methods: {
  109. resize: function() {
  110. this.window.wide = (document.body.offsetWidth > 1024);
  111. },
  112. show: function(value) {
  113. this.window.content = value;
  114. },
  115. openProject: function(project) {
  116. this.window.project = project.id;
  117. this.show('settings');
  118. },
  119. closeProject: function() {
  120. this.window.project = null;
  121. this.show('projects');
  122. }
  123. },
  124. created: function() {
  125. this.socket.io.on('app_status', status => {
  126. this.status = status;
  127. });
  128. window.addEventListener('resize', this.resize);
  129. this.resize();
  130. },
  131. destroyed: function() {
  132. window.removeEventListener('resize', this.resize);
  133. }
  134. }
  135. </script>
  136. <style scoped>
  137. #app {
  138. width: 100%;
  139. height: 100%;
  140. display: flex;
  141. flex-direction: column;
  142. }
  143. .bottom {
  144. display: flex;
  145. flex-grow: 1;
  146. flex-direction: row;
  147. width: 100%;
  148. position: relative;
  149. }
  150. .content {
  151. flex-grow: 1;
  152. overflow: hidden;
  153. }
  154. .content > * {
  155. width: 100%;
  156. height: 100%;
  157. }
  158. </style>