6
0

side-navigation-bar.vue 3.4 KB

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