side-navigation-bar.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <div class="side-navigation"
  3. :class="{
  4. wide: window.wide,
  5. narrow: !window.wide,
  6. active: window.menu ,
  7. collapsed: collapsed
  8. }">
  9. <div class="items">
  10. <div class="item"
  11. :class="{active: window.content === 'projects'}"
  12. @click="show('projects')">
  13. <img src="@/assets/icons/rocket.svg">
  14. <span>Projects</span>
  15. </div>
  16. <div class="item"
  17. :class="{active: window.content === 'settings', inactive: !currentProject}"
  18. @click="ifProjectIsOpened(show, 'settings')">
  19. <img src="@/assets/icons/gear.svg">
  20. <span>Settings</span>
  21. </div>
  22. <div class="item"
  23. :class="{active: window.content === 'add_data', inactive: !currentProject}"
  24. @click="ifProjectIsOpened(show, 'add_data')">
  25. <img src="@/assets/icons/package-dependencies.svg">
  26. <span>Add Data</span>
  27. </div>
  28. <div class="item"
  29. :class="{active: window.content === 'view_data', inactive: !currentProject}"
  30. @click="ifProjectIsOpened(show, 'view_data')">
  31. <img src="@/assets/icons/file-media.svg">
  32. <span>View Data</span>
  33. </div>
  34. <div class="item"
  35. :class="{active: window.content === 'about'}"
  36. @click="show('about')">
  37. <img src="@/assets/icons/info.svg">
  38. <span>About PyCS</span>
  39. </div>
  40. <div v-if="window.wide"
  41. class="item"
  42. :class="{rotate: !collapsed}"
  43. @click="collapse">
  44. <img src="@/assets/icons/paper-airplane.svg">
  45. <span>Collapse</span>
  46. </div>
  47. </div>
  48. <!-- clickable overlay -->
  49. <div class="overlay"
  50. v-if="!window.wide"
  51. @click="closeSelf"/>
  52. </div>
  53. </template>
  54. <script>
  55. export default {
  56. name: "side-navigation-bar",
  57. props: ['window', 'socket', 'status', 'currentProject'],
  58. computed: {
  59. collapsed: function() {
  60. if (!this.status)
  61. return false;
  62. return this.status.settings.frontend.collapse;
  63. }
  64. },
  65. methods: {
  66. closeSelf: function() {
  67. this.$emit('close', null);
  68. },
  69. ifProjectIsOpened: function(fun, ...args) {
  70. if (this.currentProject)
  71. fun.bind(fun)(...args);
  72. },
  73. show: function(value) {
  74. this.window.content = value;
  75. this.closeSelf();
  76. },
  77. collapse: function() {
  78. this.socket.post('/settings', {
  79. frontend: {
  80. collapse: !this.collapsed
  81. }
  82. });
  83. // TODO then / error
  84. }
  85. }
  86. }
  87. </script>
  88. <style scoped>
  89. .side-navigation {
  90. color: whitesmoke;
  91. }
  92. .side-navigation.wide {
  93. flex-grow: 0;
  94. height: 100%;
  95. }
  96. .side-navigation.narrow {
  97. width: 100vw;
  98. left: -100vw;
  99. position: absolute;
  100. top: 0;
  101. bottom: 0;
  102. transition: 0.2s ease-out;
  103. display: flex;
  104. z-index: 1000;
  105. }
  106. .side-navigation.narrow.active {
  107. left: 0;
  108. }
  109. .items {
  110. flex-grow: 0;
  111. height: 100%;
  112. background-color: #2f2f2f;
  113. min-width: 66%;
  114. }
  115. .item {
  116. cursor: pointer;
  117. white-space: nowrap;
  118. display: flex;
  119. align-items: center;
  120. }
  121. .item:hover:not(.inactive) {
  122. background-color: #292929;
  123. }
  124. .item.active:not(.inactive) {
  125. background-color: #1f1f1f;
  126. }
  127. .item.inactive {
  128. color: #7f7f7f;
  129. }
  130. .item:not(:last-child) {
  131. border-bottom: 1px solid rgba(255, 255, 255, 0.25);
  132. }
  133. .item img {
  134. width: 1.2rem;
  135. margin-left: 1rem;
  136. filter: invert(1);
  137. }
  138. .item.rotate img {
  139. transform: rotate(180deg);
  140. }
  141. .item.inactive img {
  142. opacity: 0.5;
  143. }
  144. .item span {
  145. margin: 1rem 4rem 1rem 0.75rem
  146. }
  147. .side-navigation.wide.collapsed .item {
  148. padding: 1rem 1rem 1rem 0;
  149. }
  150. .side-navigation.wide.collapsed .item span {
  151. display: none;
  152. }
  153. .overlay {
  154. flex-grow: 1;
  155. }
  156. </style>