@appscode/design-system 1.0.43-alpha.14 → 1.0.43-alpha.142

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/base/utilities/_default.scss +283 -21
  2. package/base/utilities/_derived-variables.scss +0 -13
  3. package/base/utilities/_initial-variables.scss +78 -56
  4. package/base/utilities/_mixin.scss +10 -17
  5. package/base/utilities/_typography.scss +23 -7
  6. package/base/utilities/dark-theme.scss +25 -0
  7. package/components/_ac-accordion.scss +1 -0
  8. package/components/_ac-alert-box.scss +18 -10
  9. package/components/_ac-card.scss +55 -20
  10. package/components/_ac-code-highlight.scss +7 -1
  11. package/components/_ac-content-layout.scss +4 -4
  12. package/components/_ac-drag.scss +6 -6
  13. package/components/_ac-input.scss +74 -40
  14. package/components/_ac-modal.scss +5 -4
  15. package/components/_ac-multi-select.scss +195 -13
  16. package/components/_ac-options.scss +31 -16
  17. package/components/_ac-select-box.scss +15 -5
  18. package/components/_ac-table.scss +42 -36
  19. package/components/_ac-tabs.scss +72 -23
  20. package/components/_ac-tags.scss +2 -2
  21. package/components/_ac-terminal.scss +272 -0
  22. package/components/_app-drawer.scss +6 -6
  23. package/components/_breadcumb.scss +7 -2
  24. package/components/_buttons.scss +60 -27
  25. package/components/_card-body-wrapper.scss +3 -3
  26. package/components/_dashboard-header.scss +33 -1
  27. package/components/_direct-deploy.scss +69 -0
  28. package/components/_go-to-top.scss +1 -1
  29. package/components/_graph.scss +45 -0
  30. package/components/_image-upload.scss +6 -4
  31. package/components/_left-sidebar-menu.scss +200 -46
  32. package/components/_monaco-editor.scss +1 -1
  33. package/components/_navbar.scss +129 -26
  34. package/components/_overview-info.scss +4 -4
  35. package/components/_overview-page.scss +1 -2
  36. package/components/_pagination.scss +10 -2
  37. package/components/_payment-card.scss +28 -12
  38. package/components/_preview-modal.scss +19 -8
  39. package/components/_pricing-table.scss +1 -1
  40. package/components/_progress-bar.scss +5 -5
  41. package/components/_subscription-card.scss +15 -8
  42. package/components/_table-of-content.scss +1 -1
  43. package/components/_tfa.scss +69 -0
  44. package/components/_transitions.scss +261 -0
  45. package/components/_widget-menu.scss +9 -9
  46. package/components/_wizard.scss +31 -19
  47. package/components/ac-toaster/_ac-toasted.scss +5 -5
  48. package/components/bbum/_card-team.scss +18 -10
  49. package/components/bbum/_information-center.scss +17 -3
  50. package/components/bbum/_mobile-desktop.scss +6 -6
  51. package/components/bbum/_post.scss +5 -4
  52. package/components/bbum/_sign-up-notification.scss +6 -6
  53. package/components/bbum/_single-post-preview.scss +9 -9
  54. package/components/bbum/_user-profile.scss +97 -90
  55. package/components/ui-builder/_ui-builder.scss +29 -10
  56. package/components/ui-builder/_vue-open-api.scss +98 -0
  57. package/layouts/_404.scss +2 -1
  58. package/layouts/_code-preview.scss +14 -7
  59. package/main.scss +4 -0
  60. package/package.json +2 -7
  61. package/plugins/theme.js +4 -0
  62. package/vue-components/v2/banner/Banner.vue +2 -2
  63. package/vue-components/v2/breadcrumbs/Breadcrumb.vue +97 -0
  64. package/vue-components/v2/button/Button.vue +5 -0
  65. package/vue-components/v2/button/DownloadBtn.vue +45 -0
  66. package/vue-components/v2/card/PaymentCards.vue +11 -2
  67. package/vue-components/v2/content/ContentTable.vue +12 -7
  68. package/vue-components/v2/editor/Editor.vue +29 -1
  69. package/vue-components/v2/editor/FilteredFileEditor.vue +188 -0
  70. package/vue-components/v2/editor/ResourceKeyValueEditor.vue +209 -0
  71. package/vue-components/v2/loaders/ResourceLoader.vue +101 -0
  72. package/vue-components/v2/loaders/SidebarLoader.vue +43 -0
  73. package/vue-components/v2/modal/Modal.vue +33 -12
  74. package/vue-components/v2/modals/DeleteConfirmationModal.vue +77 -0
  75. package/vue-components/v2/modals/JsonShowModal.vue +12 -2
  76. package/vue-components/v2/navbar/Appdrawer.vue +10 -9
  77. package/vue-components/v2/navbar/ThemeMode.vue +120 -0
  78. package/vue-components/v2/navbar/User.vue +166 -15
  79. package/vue-components/v2/preloader/Preloader.vue +5 -5
  80. package/vue-components/v2/sidebar/ClusterSwitcher.vue +126 -0
  81. package/vue-components/v2/sidebar/SidebarItem.vue +23 -1
  82. package/vue-components/v2/sidebar/SidebarItemWithDropDown.vue +19 -20
  83. package/vue-components/v2/table/Table.vue +44 -8
  84. package/vue-components/v2/table/TableRow.vue +17 -8
  85. package/vue-components/v2/table/table-cell/CellValue.vue +31 -4
  86. package/vue-components/v2/table/table-cell/GenericCell.vue +56 -0
  87. package/vue-components/v2/table/table-cell/ObjectCell.vue +4 -1
  88. package/vue-components/v2/tabs/EditorTabs.vue +1 -1
  89. package/vue-components/v3/button/Button.vue +5 -0
  90. package/vue-components/v3/content/ContentTable.vue +5 -0
  91. package/vue-components/v3/dropdown/DropdownMenu.vue +1 -1
  92. package/vue-components/v3/editor/Editor.vue +50 -30
  93. package/vue-components/v3/editor/FilteredFileEditor.vue +166 -0
  94. package/vue-components/v3/editor/MonacoEditor.vue +124 -0
  95. package/vue-components/v3/editor/ResourceKeyValueEditor.vue +124 -0
  96. package/vue-components/v3/header/HeaderItem.vue +5 -0
  97. package/vue-components/v3/header/HeaderItems.vue +5 -0
  98. package/vue-components/v3/loaders/ResourceLoader.vue +83 -0
  99. package/vue-components/v3/loaders/SidebarLoader.vue +34 -0
  100. package/vue-components/v3/modal/Modal.vue +10 -1
  101. package/vue-components/v3/modals/JsonShowModal.vue +25 -16
  102. package/vue-components/v3/navbar/Appdrawer.vue +12 -7
  103. package/vue-components/v3/navbar/ThemeMode.vue +128 -0
  104. package/vue-components/v3/navbar/User.vue +166 -15
  105. package/vue-components/v3/sidebar/ClusterSwitcher.vue +133 -0
  106. package/vue-components/v3/sidebar/SidebarItemWithDropDown.vue +120 -0
  107. package/vue-components/v3/table/Table.vue +28 -5
  108. package/vue-components/v3/table/TableRow.vue +1 -1
  109. package/vue-components/v3/table/table-cell/CellValue.vue +26 -3
  110. package/vue-components/v3/table/table-cell/GenericCell.vue +62 -0
  111. package/vue-components/v3/table/table-cell/ObjectCell.vue +5 -1
  112. package/vue-components/v3/tabs/EditorTabs.vue +1 -1
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <div>
3
+ <content-loader
4
+ :width="100"
5
+ :height="175"
6
+ :speed="2"
7
+ :primaryColor="primaryLoaderColor"
8
+ :secondaryColor="secondaryLoaderColor"
9
+ >
10
+ <rect x="2" y="1" rx="3" ry="3" width="96" height="20" />
11
+ <rect x="15" y="23" rx="3" ry="3" width="83" height="15" />
12
+ <rect x="15" y="40" rx="3" ry="3" width="83" height="15" />
13
+ <rect x="15" y="57" rx="3" ry="3" width="83" height="15" />
14
+
15
+ <rect x="2" y="78" rx="3" ry="3" width="96" height="20" />
16
+ <rect x="15" y="100" rx="3" ry="3" width="83" height="15" />
17
+ <rect x="15" y="117" rx="3" ry="3" width="83" height="15" />
18
+ <rect x="15" y="134" rx="3" ry="3" width="83" height="15" />
19
+
20
+ <rect x="2" y="155" rx="3" ry="3" width="96" height="20" />
21
+ </content-loader>
22
+ </div>
23
+ </template>
24
+
25
+ <script>
26
+ import { ContentLoader } from "vue-content-loader";
27
+
28
+ export default {
29
+ components: {
30
+ ContentLoader
31
+ },
32
+ props: {
33
+ primaryLoaderColor: {
34
+ type: String,
35
+ default: "#f5f7f9"
36
+ },
37
+ secondaryLoaderColor: {
38
+ type: String,
39
+ default: "#ecebeb"
40
+ }
41
+ }
42
+ };
43
+ </script>
@@ -6,7 +6,7 @@
6
6
  v-if="showModal"
7
7
  class="ac-modal is-middle-alignment"
8
8
  :class="modifierClasses"
9
- @click.self="destroyModal"
9
+ @click.self="onModalOutsideClick"
10
10
  >
11
11
  <div class="ac-modal-inner">
12
12
  <!-- modal header start -->
@@ -17,7 +17,10 @@
17
17
  <header-item>
18
18
  <ac-button
19
19
  modifier-classes="is-square is-transparent"
20
- :icon-image="require('@/assets/images/icons/close-icon.svg')"
20
+ :disabled="isCloseOptionDisabled"
21
+ :icon-image="
22
+ require('@appscode/design-system-images/icons/close-icon.svg')
23
+ "
21
24
  @click.stop="destroyModal"
22
25
  />
23
26
  </header-item>
@@ -36,7 +39,12 @@
36
39
  <!-- modal body end -->
37
40
 
38
41
  <!-- modal footer start -->
39
- <div class="ac-modal-footer action-footer">
42
+ <div
43
+ class="ac-modal-footer action-footer is-flex is-align-items-center is-justify-content-space-between"
44
+ >
45
+ <div>
46
+ <slot name="modal-footer-left" />
47
+ </div>
40
48
  <buttons class="has-text-right is-block">
41
49
  <slot name="modal-footer-controls" />
42
50
  </buttons>
@@ -52,28 +60,36 @@ export default {
52
60
  props: {
53
61
  open: {
54
62
  type: Boolean,
55
- default: false,
63
+ default: false
56
64
  },
57
65
  title: {
58
66
  type: String,
59
- default: "Modal",
67
+ default: "Modal"
60
68
  },
61
69
  modifierClasses: {
62
70
  type: String,
63
- default: "",
71
+ default: ""
72
+ },
73
+ isCloseOptionDisabled: {
74
+ type: Boolean,
75
+ default: false
64
76
  },
77
+ ignoreOutsideClick: {
78
+ type: Boolean,
79
+ default: false
80
+ }
65
81
  },
66
82
 
67
83
  components: {
68
84
  HeaderItems: () => import("../header/HeaderItems.vue"),
69
85
  HeaderItem: () => import("../header/HeaderItem.vue"),
70
86
  Buttons: () => import("../button/Buttons.vue"),
71
- AcButton: () => import("../button/Button.vue"),
87
+ AcButton: () => import("../button/Button.vue")
72
88
  },
73
89
 
74
90
  data() {
75
91
  return {
76
- showModal: false,
92
+ showModal: false
77
93
  };
78
94
  },
79
95
 
@@ -86,8 +102,8 @@ export default {
86
102
  } else {
87
103
  this.destroyModal();
88
104
  }
89
- },
90
- },
105
+ }
106
+ }
91
107
  },
92
108
 
93
109
  methods: {
@@ -97,16 +113,21 @@ export default {
97
113
  this.destroyModal();
98
114
  }
99
115
  },
116
+ onModalOutsideClick() {
117
+ if (this.ignoreOutsideClick) return;
118
+ this.destroyModal();
119
+ },
100
120
  initializeModal() {
101
121
  this.showModal = true;
102
122
  document.addEventListener("keydown", this.onKeyDown);
103
123
  },
104
124
  destroyModal() {
125
+ if (this.isCloseOptionDisabled) return;
105
126
  this.showModal = false;
106
127
  document.removeEventListener("keydown", this.onKeyDown);
107
128
 
108
129
  this.$emit("closemodal", true);
109
- },
110
- },
130
+ }
131
+ }
111
132
  };
112
133
  </script>
@@ -0,0 +1,77 @@
1
+ <template>
2
+ <!-- modal start -->
3
+ <modal
4
+ :title="title"
5
+ modifier-classes="is-normal"
6
+ :open="open"
7
+ @closemodal="closeModal"
8
+ >
9
+ <!-- freedom content start -->
10
+ <div class="action-message pt-35 pb-35 has-text-centered">
11
+ <h5 class="is-message">{{ message }} {{ itemName ? "" : "?" }}</h5>
12
+ <p class="is-description">{{ itemName }} {{ itemName ? "?" : "" }}</p>
13
+ </div>
14
+
15
+ <!-- freedom content end -->
16
+
17
+ <!-- modal footer start -->
18
+ <template #modal-footer-controls>
19
+ <ac-button
20
+ @click.stop="closeModal"
21
+ title="Cancel"
22
+ modifier-classes="is-outlined"
23
+ />
24
+ <ac-button
25
+ modifier-classes="is-danger"
26
+ :is-loader-active="isDeleteActive"
27
+ title="Yes"
28
+ @click.stop="confirm(true)"
29
+ />
30
+ </template>
31
+ </modal>
32
+ <!-- modal end -->
33
+ </template>
34
+
35
+ <script>
36
+ export default {
37
+ components: {
38
+ Modal: () => import("./../modal/Modal.vue"),
39
+ AcButton: () => import("./../button/Button.vue")
40
+ },
41
+ props: {
42
+ open: {
43
+ type: Boolean,
44
+ default: false
45
+ },
46
+ title: {
47
+ type: String,
48
+ default: ""
49
+ },
50
+ message: {
51
+ type: String,
52
+ default: ""
53
+ },
54
+ itemName: {
55
+ type: String,
56
+ default: ""
57
+ },
58
+ isLoading: {
59
+ type: Boolean,
60
+ default: false
61
+ },
62
+ isDeleteActive: {
63
+ type: Boolean,
64
+ default: false
65
+ }
66
+ },
67
+ methods: {
68
+ confirm(response) {
69
+ this.$emit("delete-confirmation-modal$confirm", response);
70
+ },
71
+ closeModal() {
72
+ this.confirm(false);
73
+ this.$emit("closemodal", true);
74
+ }
75
+ }
76
+ };
77
+ </script>
@@ -10,7 +10,9 @@
10
10
  <ac-button
11
11
  modifier-classes="is-square is-primary"
12
12
  icon-class="copy"
13
- v-clipboard:copy="`${editorTitle}: &quot;${editorContent}&quot;`"
13
+ v-clipboard:copy="
14
+ `${editorTitle}: ${JSON.stringify(parsedContent, null, 4)}`
15
+ "
14
16
  v-clipboard:success="onCopy"
15
17
  v-clipboard:error="onError"
16
18
  />
@@ -26,6 +28,8 @@
26
28
  </template>
27
29
 
28
30
  <script>
31
+ import Preloader from "../preloader/Preloader.vue";
32
+ import Banner from "../banner/Banner.vue";
29
33
  export default {
30
34
  props: {
31
35
  open: {
@@ -43,7 +47,13 @@ export default {
43
47
  },
44
48
  components: {
45
49
  Modal: () => import("../modal/Modal.vue"),
46
- Editor: () => import("../editor/Editor.vue"),
50
+ Editor: () => ({
51
+ component: import("../editor/Editor.vue"),
52
+ loading: Preloader,
53
+ delay: 200,
54
+ error: Banner,
55
+ timeout: 20000,
56
+ }),
47
57
  AcButton: () => import("../button/Button.vue"),
48
58
  HeaderItem: () => import("../header/HeaderItem.vue"),
49
59
  },
@@ -1,10 +1,13 @@
1
1
  <template>
2
- <div class="app-drawer-wrapper d-table-cell">
3
- <div class="drawer-icon">
2
+ <div class="app-drawer-wrapper is-flex">
3
+ <div
4
+ class="drawer-icon is-flex is-justify-content-center is-align-items-center"
5
+ >
4
6
  <svg
5
7
  class="gb_We"
6
8
  focusable="false"
7
9
  viewBox="0 0 24 24"
10
+ style="width: 22px;margin-top: 2px;"
8
11
  :style="{ fill: 'white' }"
9
12
  >
10
13
  <path
@@ -20,16 +23,14 @@
20
23
  <article class="media">
21
24
  <figure class="media-left">
22
25
  <p class="image">
23
- <img
24
- :src="app.icon_url"
25
- />
26
+ <img :src="app.icon_url" />
26
27
  </p>
27
28
  </figure>
28
29
  <div class="media-content">
29
30
  <div class="content">
30
31
  <p>
31
- <strong>{{app.title}}</strong>
32
- <span>{{app.sub_title}}</span>
32
+ <strong>{{ app.title }}</strong>
33
+ <span>{{ app.sub_title }}</span>
33
34
  </p>
34
35
  </div>
35
36
  </div>
@@ -50,7 +51,7 @@ export default {
50
51
  }
51
52
  },
52
53
  components: {
53
- NavbarItemContent: () => import("./NavbarItemContent.vue"),
54
- },
54
+ NavbarItemContent: () => import("./NavbarItemContent.vue")
55
+ }
55
56
  };
56
57
  </script>
@@ -0,0 +1,120 @@
1
+ <template>
2
+ <div>
3
+ <button
4
+ v-if="themeMode"
5
+ class="button ac-nav-button"
6
+ style="color: #ffffff; font-size: 15px;"
7
+ @click="toggleTheme"
8
+ :title="themeModes[themeMode].displayName"
9
+ >
10
+ <i :class="`fa ${themeModes[themeMode].iconClass}`" />
11
+ </button>
12
+ <div class="ac-menu-content theme-choice">
13
+ <ul class="is-flex is-flex-direction-row is-justify-content-space-around">
14
+ <li
15
+ v-for="theme of Object.keys(themeModes)"
16
+ :title="themeModes[theme].displayName"
17
+ @click="themeMode = theme"
18
+ :class="{'is-active': themeMode === theme}"
19
+ :key="theme"
20
+ >
21
+ <i :class="['fa', themeModes[theme].iconClass]" />
22
+ </li>
23
+ </ul>
24
+ </div>
25
+ </div>
26
+ </template>
27
+ <script>
28
+ export default {
29
+ data() {
30
+ return {
31
+ themeMode: "",
32
+ themeModes: {
33
+ system: {
34
+ displayName: "System Theme",
35
+ iconClass: "fa-desktop",
36
+ },
37
+ light: {
38
+ displayName: "Light Theme",
39
+ iconClass: "fa-sun-o",
40
+ },
41
+ dark: {
42
+ displayName: "Dark Theme",
43
+ iconClass: "fa-moon-o",
44
+ }
45
+ }
46
+ };
47
+ },
48
+
49
+ mounted() {
50
+ // get theme mode from localStorage or set default one
51
+ this.themeMode = localStorage.getItem("themeMode") || "light";
52
+ },
53
+
54
+ destroyed() {
55
+ this.removeColorSchemeEventListener();
56
+ },
57
+
58
+ watch: {
59
+ themeMode: {
60
+ handler(n) {
61
+ this.onThemeModeChange(n);
62
+ }
63
+ }
64
+ },
65
+
66
+ methods: {
67
+ // handle theme mode button click
68
+ toggleTheme() {
69
+ if (this.themeMode === "light") this.themeMode = "dark";
70
+ else if (this.themeMode === "dark") this.themeMode = "system";
71
+ else if (this.themeMode === "system") this.themeMode = "light";
72
+ },
73
+
74
+ // triggered when theme mode is updated
75
+ onThemeModeChange(n) {
76
+ localStorage.setItem("themeMode", n);
77
+
78
+ let theme = n;
79
+ if (n === "system") {
80
+ const isDarkMode =
81
+ window.matchMedia &&
82
+ window.matchMedia("(prefers-color-scheme: dark)").matches;
83
+ this.addColorSchemeEventListener();
84
+ theme = isDarkMode ? "dark" : "light";
85
+ } else {
86
+ this.removeColorSchemeEventListener();
87
+ }
88
+ this.$emit("set:theme", theme);
89
+ this.handleDarkThemeClass(theme);
90
+ },
91
+
92
+ // add proper css class to update the ui theme
93
+ handleDarkThemeClass(currentTheme) {
94
+ if (currentTheme === "light") {
95
+ document.documentElement.classList.remove("is-dark-theme");
96
+ } else {
97
+ document.documentElement.classList.add("is-dark-theme");
98
+ }
99
+ },
100
+
101
+ // add system theme listener event
102
+ addColorSchemeEventListener() {
103
+ window
104
+ .matchMedia("(prefers-color-scheme: dark)")
105
+ .addEventListener("change", this.handleSystemThemeChange);
106
+ },
107
+
108
+ // remove system theme listener event
109
+ removeColorSchemeEventListener() {
110
+ window
111
+ .matchMedia("(prefers-color-scheme: dark)")
112
+ .removeEventListener("change", this.handleSystemThemeChange);
113
+ },
114
+
115
+ handleSystemThemeChange() {
116
+ this.onThemeModeChange(this.themeMode);
117
+ }
118
+ }
119
+ };
120
+ </script>
@@ -7,31 +7,106 @@
7
7
  <img :src="user.avatar_url" alt="User Photo" />
8
8
  </div>
9
9
  </button>
10
- <navbar-item-content>
11
- <div v-if="user.username" class="user-profile-wrapper">
10
+ <navbar-item-content class="navbar-dropdown-wrapper">
11
+ <div v-if="user.username" class="user-profile-wrapper" @mouseleave="onMouseLeave()">
12
12
  <div class="profile-area">
13
13
  <div class="profile-photo">
14
- <img :src="user.avatar_url" alt="User Photo" />
14
+ <img :src="user.avatar_url" alt="User Photo" class="width-50 height-50" />
15
15
  <button class="camera-icon"></button>
16
16
  </div>
17
- <div class="profile-info">
18
- <p>{{ user.username.toUpperCase() }}</p>
17
+ <div class="profile-info" style="width: calc(100% - 60px);">
18
+ <p :title="user.username.toUpperCase()" class="line-break-anywhere is-ellipsis-1">{{ user.username.toUpperCase() }}</p>
19
19
  <a :href="`mailto:${user.email}`"> {{ user.email }}</a>
20
20
  </div>
21
21
  </div>
22
- <ul>
23
- <li>
22
+ <transition-group name="list" tag="ul">
23
+ <li key="settings">
24
24
  <a :href="`${serverDomain}/user/settings/`">Settings</a>
25
25
  </li>
26
- <template v-if="user.is_admin">
27
- <li>
28
- <a :href="`${serverDomain}/admin`"> Site Administration </a>
29
- </li>
30
- </template>
31
- <li>
26
+ <li v-if="user.is_admin" key="site-admin">
27
+ <a :href="`${serverDomain}/admin`">Site Administration</a>
28
+ </li>
29
+ <li v-if="showAccountSwitcher" :class="`is-${dropDownStatus}`" key="switcher">
30
+ <a class="
31
+ ac-dropdown-button
32
+ is-fullwidth
33
+ is-flex
34
+ is-justify-content-space-between
35
+ is-align-items-center
36
+ "
37
+ @click="toggleList()"
38
+ >
39
+ <span>Switch Account</span>
40
+ <span
41
+ ><i
42
+ :class="`fa fa-angle-${
43
+ dropDownStatus === 'open' ? 'up' : 'down'
44
+ }`"
45
+ ></i
46
+ ></span>
47
+ </a>
48
+ <transition-group name="list" tag="ul"
49
+ class="ac-vscrollbar"
50
+ ref="dropdownItems"
51
+ :style="{ maxHeight: dropDownSectionHeight }"
52
+ >
53
+ <li
54
+ v-for="(org, idx) in formattedOrganizations"
55
+ :key="org.username"
56
+ >
57
+ <a
58
+ class="is-flex is-align-items-center"
59
+ @click="onOrganizationClick(org.username)"
60
+ >
61
+ <div class="width-30 height-30 image">
62
+ <img
63
+ :src="org.avatar_url"
64
+ class="ac-user-profile is-rounded"
65
+ alt="icon"
66
+ />
67
+ </div>
68
+ <div
69
+ class="
70
+ is-flex
71
+ is-align-items-center
72
+ is-justify-content-space-between
73
+ is-fullwidth
74
+ ml-10
75
+ "
76
+ >
77
+ <div class="org-info">
78
+ <strong :title="org.username" class="line-break-anywhere is-ellipsis-1">{{ org.username }}</strong>
79
+ <p>
80
+ {{
81
+ org.isPersonalAccount
82
+ ? "Personal Account"
83
+ : "Organization"
84
+ }}
85
+ </p>
86
+ </div>
87
+ <span
88
+ v-if="idx === 0"
89
+ class="
90
+ material-icons-outlined
91
+ font-size-18
92
+ ml-10
93
+ is-pulled-right
94
+ "
95
+ >
96
+ check
97
+ </span>
98
+ </div>
99
+ </a>
100
+ </li>
101
+ </transition-group>
102
+ </li>
103
+ <li key="dashboard">
104
+ <a :href="`${serverDomain}/dashboard`"> Dashboard </a>
105
+ </li>
106
+ <li key="signout">
32
107
  <a :href="`${serverDomain}/user/logout`"> Sign out </a>
33
108
  </li>
34
- </ul>
109
+ </transition-group>
35
110
  </div>
36
111
  </navbar-item-content>
37
112
  </navbar-item>
@@ -40,6 +115,7 @@
40
115
  <script>
41
116
  export default {
42
117
  props: {
118
+ // active user info
43
119
  user: {
44
120
  type: Object,
45
121
  default: () => ({}),
@@ -48,11 +124,86 @@ export default {
48
124
  type: String,
49
125
  default: "",
50
126
  },
127
+ showAccountSwitcher: {
128
+ type: Boolean,
129
+ default: false,
130
+ },
131
+ // all available organization list including personal account
132
+ organizations: {
133
+ type: Array,
134
+ default: () => [],
135
+ },
51
136
  },
52
137
 
53
138
  components: {
54
139
  NavbarItem: () => import("./NavbarItem.vue"),
55
140
  NavbarItemContent: () => import("./NavbarItemContent.vue"),
56
141
  },
142
+
143
+ computed: {
144
+ formattedOrganizations() {
145
+ let activeUser;
146
+ const filteredList = this.organizations.filter((item) => {
147
+ if (item.username === this.user.username) {
148
+ activeUser = item;
149
+ } else {
150
+ return true;
151
+ }
152
+ return false;
153
+ });
154
+
155
+ filteredList.unshift(activeUser);
156
+
157
+ return filteredList || [];
158
+ },
159
+ },
160
+
161
+ data() {
162
+ return {
163
+ dropDownStatus: "close",
164
+ dropDownSectionHeight: null,
165
+ };
166
+ },
167
+
168
+ methods: {
169
+ toggleList() {
170
+ this.dropDownStatus = this.dropDownStatus === "open" ? "close" : "open";
171
+ this.$nextTick(() => {
172
+ this.$refs["dropdownItems"].$el.scrollTo(0, 0);
173
+ });
174
+ },
175
+ onOrganizationClick(orgName) {
176
+ this.$refs["dropdownItems"].$el.scrollTo(0, 0);
177
+ this.$emit("activeorg$set", orgName);
178
+ },
179
+ onMouseLeave() {
180
+ this.dropDownStatus = "close";
181
+ }
182
+ },
183
+
184
+ watch: {
185
+ dropDownStatus: {
186
+ immediate: true,
187
+ handler(n) {
188
+ if (n === "open") {
189
+ this.$nextTick(() => {
190
+ const dropDownUl = this.$refs["dropdownItems"];
191
+ if (dropDownUl)
192
+ this.dropDownSectionHeight = `${dropDownUl.scrollHeight}px`;
193
+ });
194
+ } else {
195
+ this.dropDownSectionHeight = null;
196
+ }
197
+ },
198
+ },
199
+ },
57
200
  };
58
- </script>
201
+ </script>
202
+ <style lang="scss" scoped>
203
+ .ac-vscrollbar {
204
+ overflow: auto !important;
205
+ }
206
+ .line-break-anywhere {
207
+ line-break: anywhere;
208
+ }
209
+ </style>
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div
3
- class="is-flex is-justify-content-center is-align-items-center is-flex-direction-column"
3
+ class="is-flex is-justify-content-center is-align-items-center is-flex-direction-column ac-preloader"
4
4
  style="height: calc(100vh - 200px);"
5
5
  >
6
6
  <span v-if="showSpinner" class="spinner"></span>
@@ -15,12 +15,12 @@ export default {
15
15
  props: {
16
16
  showSpinner: {
17
17
  type: Boolean,
18
- default: true,
18
+ default: true
19
19
  },
20
20
  message: {
21
21
  type: String,
22
- default: "Fetching! Please wait for sometime...",
23
- },
24
- },
22
+ default: "Loading ..."
23
+ }
24
+ }
25
25
  };
26
26
  </script>