@appscode/design-system 1.0.43-alpha.17 → 1.0.43-alpha.170

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 (109) hide show
  1. package/base/utilities/_default.scss +269 -4
  2. package/base/utilities/_derived-variables.scss +0 -1
  3. package/base/utilities/_initial-variables.scss +17 -176
  4. package/base/utilities/_mixin.scss +1 -17
  5. package/base/utilities/_typography.scss +14 -4
  6. package/base/utilities/dark-theme.scss +25 -0
  7. package/components/_ac-alert-box.scss +13 -5
  8. package/components/_ac-card.scss +44 -8
  9. package/components/_ac-code-highlight.scss +5 -1
  10. package/components/_ac-content-layout.scss +2 -2
  11. package/components/_ac-input.scss +63 -23
  12. package/components/_ac-multi-select.scss +187 -5
  13. package/components/_ac-options.scss +24 -9
  14. package/components/_ac-select-box.scss +14 -4
  15. package/components/_ac-table.scss +5 -3
  16. package/components/_ac-tabs.scss +39 -3
  17. package/components/_ac-terminal.scss +270 -0
  18. package/components/_app-drawer.scss +2 -2
  19. package/components/_breadcumb.scss +2 -0
  20. package/components/_buttons.scss +39 -7
  21. package/components/_card-body-wrapper.scss +2 -2
  22. package/components/_dashboard-header.scss +32 -0
  23. package/components/_direct-deploy.scss +69 -0
  24. package/components/_go-to-top.scss +1 -1
  25. package/components/_graph.scss +45 -0
  26. package/components/_image-upload.scss +5 -3
  27. package/components/_left-sidebar-menu.scss +193 -39
  28. package/components/_monaco-editor.scss +1 -1
  29. package/components/_navbar.scss +124 -7
  30. package/components/_overview-info.scss +4 -4
  31. package/components/_pagination.scss +8 -0
  32. package/components/_payment-card.scss +10 -1
  33. package/components/_preview-modal.scss +15 -4
  34. package/components/_pricing-table.scss +1 -1
  35. package/components/_progress-bar.scss +4 -4
  36. package/components/_subscription-card.scss +12 -5
  37. package/components/_table-of-content.scss +1 -1
  38. package/components/_tfa.scss +69 -0
  39. package/components/_transitions.scss +261 -0
  40. package/components/_wizard.scss +15 -3
  41. package/components/ac-toaster/_ac-toasted.scss +1 -1
  42. package/components/bbum/_card-team.scss +15 -7
  43. package/components/bbum/_information-center.scss +15 -1
  44. package/components/bbum/_mobile-desktop.scss +1 -1
  45. package/components/bbum/_sign-up-notification.scss +3 -3
  46. package/components/bbum/_single-post-preview.scss +1 -1
  47. package/components/bbum/_user-profile.scss +97 -90
  48. package/components/ui-builder/_ui-builder.scss +43 -3
  49. package/components/ui-builder/_vue-open-api.scss +104 -0
  50. package/main.scss +4 -0
  51. package/package.json +2 -7
  52. package/plugins/theme.js +4 -0
  53. package/plugins/vue-toaster.js +3 -0
  54. package/vue-components/v2/banner/Banner.vue +2 -2
  55. package/vue-components/v2/breadcrumbs/Breadcrumb.vue +97 -0
  56. package/vue-components/v2/button/Button.vue +5 -0
  57. package/vue-components/v2/button/DownloadBtn.vue +45 -0
  58. package/vue-components/v2/card/PaymentCards.vue +11 -2
  59. package/vue-components/v2/content/ContentTable.vue +12 -7
  60. package/vue-components/v2/editor/Editor.vue +36 -5
  61. package/vue-components/v2/editor/FilteredFileEditor.vue +188 -0
  62. package/vue-components/v2/editor/MonacoEditor.vue +125 -0
  63. package/vue-components/v2/editor/ResourceKeyValueEditor.vue +209 -0
  64. package/vue-components/v2/loaders/ResourceLoader.vue +101 -0
  65. package/vue-components/v2/loaders/SidebarLoader.vue +43 -0
  66. package/vue-components/v2/modal/Modal.vue +38 -13
  67. package/vue-components/v2/modals/DeleteConfirmationModal.vue +77 -0
  68. package/vue-components/v2/modals/JsonShowModal.vue +12 -2
  69. package/vue-components/v2/navbar/Appdrawer.vue +10 -9
  70. package/vue-components/v2/navbar/ThemeMode.vue +52 -45
  71. package/vue-components/v2/navbar/User.vue +202 -19
  72. package/vue-components/v2/preloader/Preloader.vue +5 -5
  73. package/vue-components/v2/sidebar/ClusterSwitcher.vue +126 -0
  74. package/vue-components/v2/sidebar/SidebarItem.vue +23 -1
  75. package/vue-components/v2/sidebar/SidebarItemWithDropDown.vue +19 -20
  76. package/vue-components/v2/table/Table.vue +44 -8
  77. package/vue-components/v2/table/TableRow.vue +17 -8
  78. package/vue-components/v2/table/table-cell/CellValue.vue +31 -4
  79. package/vue-components/v2/table/table-cell/GenericCell.vue +56 -0
  80. package/vue-components/v2/table/table-cell/ObjectCell.vue +4 -1
  81. package/vue-components/v2/tabs/EditorTabs.vue +1 -1
  82. package/vue-components/v3/button/Button.vue +5 -0
  83. package/vue-components/v3/content/ContentTable.vue +5 -0
  84. package/vue-components/v3/editor/Editor.vue +50 -30
  85. package/vue-components/v3/editor/FilteredFileEditor.vue +184 -0
  86. package/vue-components/v3/editor/MonacoEditor.vue +131 -0
  87. package/vue-components/v3/editor/ResourceKeyValueEditor.vue +125 -0
  88. package/vue-components/v3/form/Form.vue +63 -0
  89. package/vue-components/v3/form-fields/Input.vue +10 -10
  90. package/vue-components/v3/header/HeaderItem.vue +5 -0
  91. package/vue-components/v3/header/HeaderItems.vue +5 -0
  92. package/vue-components/v3/loaders/ResourceLoader.vue +83 -0
  93. package/vue-components/v3/loaders/SidebarLoader.vue +34 -0
  94. package/vue-components/v3/modal/Modal.vue +40 -16
  95. package/vue-components/v3/modals/DeleteConfirmationModal.vue +83 -0
  96. package/vue-components/v3/modals/JsonShowModal.vue +25 -16
  97. package/vue-components/v3/navbar/Appdrawer.vue +12 -7
  98. package/vue-components/v3/navbar/ThemeMode.vue +51 -46
  99. package/vue-components/v3/navbar/User.vue +190 -16
  100. package/vue-components/v3/sidebar/ClusterSwitcher.vue +133 -0
  101. package/vue-components/v3/sidebar/SidebarItemWithDropDown.vue +120 -0
  102. package/vue-components/v3/table/MultiInfoTable.vue +143 -0
  103. package/vue-components/v3/table/Table.vue +34 -11
  104. package/vue-components/v3/table/TableContainer.vue +34 -0
  105. package/vue-components/v3/table/TableRow.vue +10 -2
  106. package/vue-components/v3/table/table-cell/CellValue.vue +26 -3
  107. package/vue-components/v3/table/table-cell/GenericCell.vue +62 -0
  108. package/vue-components/v3/table/table-cell/ObjectCell.vue +5 -1
  109. package/vue-components/v3/tabs/EditorTabs.vue +1 -1
@@ -1,38 +1,49 @@
1
1
  <template>
2
- <button v-if="themeMode" class="button ac-nav-button" @click="toggleTheme" :title="themeModeIconTooltip" >
3
- <i :class="`fa ${themeModeIconClass} width-15`" />
4
- </button>
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>
5
26
  </template>
6
27
  <script>
7
28
  export default {
8
29
  data() {
9
30
  return {
10
31
  themeMode: "",
11
- };
12
- },
13
-
14
- computed: {
15
- // to set icon class for theme mode
16
- themeModeIconClass() {
17
- if(this.themeMode === "system") {
18
- return "fa-desktop";
19
- } else if(this.themeMode === "light") {
20
- return "fa-sun-o";
21
- } else if(this.themeMode === "dark") {
22
- return "fa-moon-o";
23
- }
24
- },
25
-
26
- // to set icon tooltip for theme mode
27
- themeModeIconTooltip() {
28
- if(this.themeMode === "system") {
29
- return "System theme";
30
- } else if(this.themeMode === "light") {
31
- return "Light theme";
32
- } else if(this.themeMode === "dark") {
33
- return "Dark theme";
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
+ }
34
45
  }
35
- }
46
+ };
36
47
  },
37
48
 
38
49
  mounted() {
@@ -55,12 +66,9 @@ export default {
55
66
  methods: {
56
67
  // handle theme mode button click
57
68
  toggleTheme() {
58
- if(this.themeMode === "light")
59
- this.themeMode = "dark";
60
- else if(this.themeMode === "dark")
61
- this.themeMode = "system";
62
- else if(this.themeMode === "system")
63
- this.themeMode = "light";
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";
64
72
  },
65
73
 
66
74
  // triggered when theme mode is updated
@@ -68,19 +76,22 @@ export default {
68
76
  localStorage.setItem("themeMode", n);
69
77
 
70
78
  let theme = n;
71
- if(n === "system") {
72
- const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
79
+ if (n === "system") {
80
+ const isDarkMode =
81
+ window.matchMedia &&
82
+ window.matchMedia("(prefers-color-scheme: dark)").matches;
73
83
  this.addColorSchemeEventListener();
74
84
  theme = isDarkMode ? "dark" : "light";
75
85
  } else {
76
86
  this.removeColorSchemeEventListener();
77
87
  }
88
+ this.$emit("set:theme", theme);
78
89
  this.handleDarkThemeClass(theme);
79
90
  },
80
91
 
81
92
  // add proper css class to update the ui theme
82
93
  handleDarkThemeClass(currentTheme) {
83
- if(currentTheme === "light") {
94
+ if (currentTheme === "light") {
84
95
  document.documentElement.classList.remove("is-dark-theme");
85
96
  } else {
86
97
  document.documentElement.classList.add("is-dark-theme");
@@ -91,23 +102,19 @@ export default {
91
102
  addColorSchemeEventListener() {
92
103
  window
93
104
  .matchMedia("(prefers-color-scheme: dark)")
94
- .addEventListener(
95
- "change", this.handleSystemThemeChange
96
- );
105
+ .addEventListener("change", this.handleSystemThemeChange);
97
106
  },
98
107
 
99
108
  // remove system theme listener event
100
109
  removeColorSchemeEventListener() {
101
110
  window
102
111
  .matchMedia("(prefers-color-scheme: dark)")
103
- .removeEventListener(
104
- "change", this.handleSystemThemeChange
105
- );
112
+ .removeEventListener("change", this.handleSystemThemeChange);
106
113
  },
107
114
 
108
115
  handleSystemThemeChange() {
109
116
  this.onThemeModeChange(this.themeMode);
110
- },
117
+ }
111
118
  }
112
- }
113
- </script>
119
+ };
120
+ </script>
@@ -7,31 +7,130 @@
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
12
+ v-if="user.username"
13
+ class="user-profile-wrapper"
14
+ @mouseleave="onMouseLeave()"
15
+ >
12
16
  <div class="profile-area">
13
17
  <div class="profile-photo">
14
- <img :src="user.avatar_url" alt="User Photo" />
18
+ <img
19
+ :src="user.avatar_url"
20
+ alt="User Photo"
21
+ class="width-50 height-50"
22
+ />
15
23
  <button class="camera-icon"></button>
16
24
  </div>
17
- <div class="profile-info">
18
- <p>{{ user.username.toUpperCase() }}</p>
25
+ <div class="profile-info" style="width: calc(100% - 60px)">
26
+ <a
27
+ :href="`${serverDomain}/${user.username}`"
28
+ :title="user.username.toUpperCase()"
29
+ class="line-break-anywhere is-ellipsis-1"
30
+ >{{ user.username.toUpperCase() }}</a
31
+ >
19
32
  <a :href="`mailto:${user.email}`"> {{ user.email }}</a>
20
33
  </div>
21
34
  </div>
22
- <ul>
23
- <li>
35
+ <transition-group name="list" tag="ul">
36
+ <li key="settings">
24
37
  <a :href="`${serverDomain}/user/settings/`">Settings</a>
25
38
  </li>
26
- <template v-if="user.is_admin">
27
- <li>
28
- <a :href="`${serverDomain}/admin`"> Site Administration </a>
29
- </li>
30
- </template>
31
- <li>
32
- <a :href="`${serverDomain}/user/logout`"> Sign out </a>
39
+ <li v-if="isLoggedinUserAdmin" key="site-admin">
40
+ <a :href="`${accountsDomain}/admin`">Site Administration</a>
33
41
  </li>
34
- </ul>
42
+ <li
43
+ v-if="showAccountSwitcher"
44
+ :class="`is-${dropDownStatus}`"
45
+ key="switcher"
46
+ >
47
+ <a
48
+ class="
49
+ ac-dropdown-button
50
+ is-fullwidth
51
+ is-flex
52
+ is-justify-content-space-between
53
+ is-align-items-center
54
+ "
55
+ @click="toggleList()"
56
+ >
57
+ <span>Switch Account</span>
58
+ <span
59
+ ><i
60
+ :class="
61
+ `fa fa-angle-${dropDownStatus === 'open' ? 'up' : 'down'}`
62
+ "
63
+ ></i
64
+ ></span>
65
+ </a>
66
+ <transition-group
67
+ name="list"
68
+ tag="ul"
69
+ class="ac-vscrollbar"
70
+ ref="dropdownItems"
71
+ :style="{ maxHeight: dropDownSectionHeight }"
72
+ >
73
+ <li
74
+ v-for="(org, idx) in formattedOrganizations"
75
+ :key="org.username"
76
+ >
77
+ <a
78
+ class="is-flex is-align-items-center"
79
+ @click="onOrganizationClick(org.username)"
80
+ >
81
+ <div class="width-30 height-30 image">
82
+ <img
83
+ :src="org.avatar_url"
84
+ class="ac-user-profile is-rounded"
85
+ alt="icon"
86
+ />
87
+ </div>
88
+ <div
89
+ class="
90
+ is-flex
91
+ is-align-items-center
92
+ is-justify-content-space-between
93
+ is-fullwidth
94
+ ml-10
95
+ "
96
+ >
97
+ <div class="org-info">
98
+ <strong
99
+ :title="org.username"
100
+ class="line-break-anywhere is-ellipsis-1"
101
+ >{{ org.username }}</strong
102
+ >
103
+ <p>
104
+ {{
105
+ org.isPersonalAccount
106
+ ? "Personal Account"
107
+ : "Organization"
108
+ }}
109
+ </p>
110
+ </div>
111
+ <span
112
+ v-if="idx === 0"
113
+ class="
114
+ material-icons-outlined
115
+ font-size-18
116
+ ml-10
117
+ is-pulled-right
118
+ "
119
+ >
120
+ check
121
+ </span>
122
+ </div>
123
+ </a>
124
+ </li>
125
+ </transition-group>
126
+ </li>
127
+ <li key="dashboard">
128
+ <a :href="`${serverDomain}/dashboard`"> Dashboard </a>
129
+ </li>
130
+ <li key="signout">
131
+ <a :href="`${accountsDomain}/user/logout`"> Sign out </a>
132
+ </li>
133
+ </transition-group>
35
134
  </div>
36
135
  </navbar-item-content>
37
136
  </navbar-item>
@@ -40,19 +139,103 @@
40
139
  <script>
41
140
  export default {
42
141
  props: {
142
+ // active user info
43
143
  user: {
44
144
  type: Object,
45
- default: () => ({}),
145
+ default: () => ({})
46
146
  },
47
147
  serverDomain: {
48
148
  type: String,
49
- default: "",
149
+ default: ""
150
+ },
151
+ accountsDomain: {
152
+ type: String,
153
+ default: ""
50
154
  },
155
+ showAccountSwitcher: {
156
+ type: Boolean,
157
+ default: false
158
+ },
159
+ // all available organization list including personal account
160
+ organizations: {
161
+ type: Array,
162
+ default: () => []
163
+ },
164
+ isLoggedinUserAdmin: {
165
+ type: Boolean,
166
+ default: false
167
+ }
51
168
  },
52
169
 
53
170
  components: {
54
171
  NavbarItem: () => import("./NavbarItem.vue"),
55
- NavbarItemContent: () => import("./NavbarItemContent.vue"),
172
+ NavbarItemContent: () => import("./NavbarItemContent.vue")
173
+ },
174
+
175
+ computed: {
176
+ formattedOrganizations() {
177
+ let activeUser;
178
+ const filteredList = this.organizations.filter(item => {
179
+ if (item.username === this.user.username) {
180
+ activeUser = item;
181
+ } else {
182
+ return true;
183
+ }
184
+ return false;
185
+ });
186
+
187
+ filteredList.unshift(activeUser);
188
+
189
+ return filteredList || [];
190
+ }
56
191
  },
192
+
193
+ data() {
194
+ return {
195
+ dropDownStatus: "close",
196
+ dropDownSectionHeight: null
197
+ };
198
+ },
199
+
200
+ methods: {
201
+ toggleList() {
202
+ this.dropDownStatus = this.dropDownStatus === "open" ? "close" : "open";
203
+ this.$nextTick(() => {
204
+ this.$refs["dropdownItems"].$el.scrollTo(0, 0);
205
+ });
206
+ },
207
+ onOrganizationClick(orgName) {
208
+ this.$refs["dropdownItems"].$el.scrollTo(0, 0);
209
+ this.$emit("activeorg$set", orgName);
210
+ },
211
+ onMouseLeave() {
212
+ this.dropDownStatus = "close";
213
+ }
214
+ },
215
+
216
+ watch: {
217
+ dropDownStatus: {
218
+ immediate: true,
219
+ handler(n) {
220
+ if (n === "open") {
221
+ this.$nextTick(() => {
222
+ const dropDownUl = this.$refs["dropdownItems"];
223
+ if (dropDownUl)
224
+ this.dropDownSectionHeight = `${dropDownUl.scrollHeight}px`;
225
+ });
226
+ } else {
227
+ this.dropDownSectionHeight = null;
228
+ }
229
+ }
230
+ }
231
+ }
57
232
  };
58
- </script>
233
+ </script>
234
+ <style lang="scss" scoped>
235
+ .ac-vscrollbar {
236
+ overflow: auto !important;
237
+ }
238
+ .line-break-anywhere {
239
+ line-break: anywhere;
240
+ }
241
+ </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>
@@ -0,0 +1,126 @@
1
+ <template>
2
+ <div class="is-cluster-logo" v-if="sidebarCollapsed">
3
+ <img
4
+ width="40"
5
+ :src="getProviderIcon(selectedCluster && selectedCluster.provider)"
6
+ onerror="this.onerror=null;this.src='https://cdn.appscode.com/images/cloud-provider-icons/Generic.png';"
7
+ alt="provider-icon"
8
+ />
9
+ </div>
10
+ <multiselect
11
+ v-else
12
+ v-model="selectedCluster"
13
+ placeholder="Selected Cluster"
14
+ label="name"
15
+ track-by="name"
16
+ :options="clusterOptions"
17
+ :allow-empty="false"
18
+ deselectLabel=""
19
+ selectLabel=""
20
+ selectedLabel=""
21
+ >
22
+ <template slot="singleLabel" slot-scope="props">
23
+ <div class="is-flex is-align-items-center">
24
+ <img
25
+ :src="getProviderIcon(props.option.provider)"
26
+ onerror="this.onerror=null;this.src='https://cdn.appscode.com/images/cloud-provider-icons/Generic.png';"
27
+ alt="No cluster selected"
28
+ /><span
29
+ ><span>{{ props.option.displayName }}</span></span
30
+ >
31
+ </div>
32
+ </template>
33
+ <template slot="option" slot-scope="props">
34
+ <div class="is-flex is-align-items-center">
35
+ <img
36
+ class="mr-15"
37
+ :src="getProviderIcon(props.option.provider)"
38
+ onerror="this.onerror=null;this.src='https://cdn.appscode.com/images/cloud-provider-icons/Generic.png';"
39
+ alt="No cluster selected"
40
+ />
41
+ <div>
42
+ <p>{{ props.option.displayName }}</p>
43
+ <p class="location">{{ props.option.location }}</p>
44
+ </div>
45
+ </div>
46
+ </template>
47
+ </multiselect>
48
+ </template>
49
+
50
+ <script>
51
+ export default {
52
+ props: {
53
+ sidebarCollapsed: {
54
+ type: Boolean,
55
+ default: false,
56
+ },
57
+ mouseHover: {
58
+ type: Boolean,
59
+ default: false,
60
+ },
61
+ clusterOptions: {
62
+ type: Array,
63
+ default: [],
64
+ },
65
+ value: {
66
+ type: String,
67
+ default: "",
68
+ }
69
+ },
70
+
71
+ components: {
72
+ Multiselect: () => import("vue-multiselect"),
73
+ },
74
+
75
+ data() {
76
+ return {
77
+ selectedCluster: null,
78
+ selectedClusterName: "",
79
+ };
80
+ },
81
+
82
+ methods: {
83
+ getProviderIcon(provider) {
84
+ return `https://cdn.appscode.com/images/cloud-provider-icons/${provider}.png`;
85
+ },
86
+ },
87
+
88
+ watch: {
89
+ value: {
90
+ immediate: true,
91
+ handler(n) {
92
+ this.selectedClusterName = n;
93
+ },
94
+ },
95
+ selectedCluster: {
96
+ deep: true,
97
+ handler(n) {
98
+ this.selectedClusterName = n.name;
99
+ },
100
+ },
101
+ selectedClusterName(n) {
102
+ if (this.selectedCluster && n !== this.selectedCluster.name) {
103
+ this.clusterOptions.forEach((item) => {
104
+ if (this.selectedClusterName === item.name) {
105
+ this.selectedCluster = item;
106
+ }
107
+ });
108
+ }
109
+ this.$emit("input", n);
110
+ },
111
+ clusterOptions: {
112
+ deep: true,
113
+ immediate: true,
114
+ async handler(list) {
115
+ if (list) {
116
+ list.forEach(async (item) => {
117
+ if(item.name === this.selectedClusterName) {
118
+ this.selectedCluster = item;
119
+ }
120
+ });
121
+ }
122
+ },
123
+ },
124
+ },
125
+ };
126
+ </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <li>
2
+ <li ref="sidebarItem">
3
3
  <router-link
4
4
  :id="id"
5
5
  :title="title"
@@ -38,5 +38,27 @@ export default {
38
38
  default: "@/assets/images/icons/basic.svg",
39
39
  },
40
40
  },
41
+ watch: {
42
+ isActive: {
43
+ immediate: true,
44
+ handler(n) {
45
+ if (n) {
46
+ this.$nextTick(() => {
47
+ setTimeout(() => {
48
+ const top = (this.$refs.sidebarItem && this.$refs.sidebarItem.getBoundingClientRect().top) || 0;
49
+ // preventing scroll to options that are already visible
50
+ if (top > window.innerHeight - 200) {
51
+ // scroll to selected option item
52
+ this.$refs.sidebarItem.scrollIntoView({
53
+ behavior: 'smooth',
54
+ block: "center"
55
+ });
56
+ }
57
+ }, 500);
58
+ });
59
+ }
60
+ }
61
+ }
62
+ }
41
63
  };
42
64
  </script>
@@ -10,7 +10,7 @@
10
10
  </span>
11
11
  </a>
12
12
 
13
- <ul :ref="title" :style="{ maxHeight: dropDownSectionHeight }">
13
+ <ul ref="sectionItems" :style="{ maxHeight: dropDownSectionHeight }">
14
14
  <slot />
15
15
  </ul>
16
16
  </li>
@@ -23,10 +23,6 @@ export default {
23
23
  type: Boolean,
24
24
  default: false,
25
25
  },
26
- isLoaderActive: {
27
- type: Boolean,
28
- default: false,
29
- },
30
26
  title: {
31
27
  type: String,
32
28
  default: "Sidebar Item",
@@ -41,27 +37,32 @@ export default {
41
37
  return {
42
38
  dropDownStatus: "close",
43
39
  dropDownSectionHeight: null,
40
+ isCompMounted: false,
44
41
  };
45
42
  },
46
43
 
47
- watch: {
48
- isLoaderActive(n) {
49
- if (!n) {
50
- this.$nextTick(() => {
51
- // for expanding dropdown
52
- this.setDropdownMaxHeight("open");
53
- });
44
+ mounted() {
45
+ this.isCompMounted = true;
46
+ setTimeout(() => {
47
+ // for expanding dropdown
48
+ if (this.isDropDownOpen) {
49
+ this.setDropdownMaxHeight("open");
50
+ } else {
51
+ this.setDropdownMaxHeight("close");
54
52
  }
55
- },
53
+ }, 700);
54
+ },
55
+
56
+ watch: {
56
57
  title(n, o) {
57
- if (n && !this.isLoaderActive) {
58
+ if (n && this.isCompMounted) {
58
59
  this.$nextTick(() => {
59
60
  // for expanding dropdown
60
61
  this.setDropdownMaxHeight("open");
61
62
  });
62
63
  }
63
64
 
64
- if (o && !this.isLoaderActive) {
65
+ if (o && this.isCompMounted) {
65
66
  this.$nextTick(() => {
66
67
  // for expanding dropdown
67
68
  this.setDropdownMaxHeight("close");
@@ -84,7 +85,7 @@ export default {
84
85
  this.$emit("dropDownItemChange");
85
86
 
86
87
  this.$nextTick(() => {
87
- const dropDownUl = this.$refs[this.title];
88
+ const dropDownUl = this.$refs["sectionItems"];
88
89
  if (dropDownUl)
89
90
  this.dropDownSectionHeight = `${dropDownUl.scrollHeight}px`;
90
91
  });
@@ -99,11 +100,9 @@ export default {
99
100
  methods: {
100
101
  setDropdownMaxHeight(mode) {
101
102
  if (mode === "open") {
102
- this.$refs[this.title][0].style.maxHeight = `${
103
- this.$refs[this.title][0].scrollHeight
104
- }px`;
103
+ this.dropDownSectionHeight = `${this.$refs["sectionItems"].scrollHeight}px`;
105
104
  } else {
106
- this.$refs[this.title][0].style.maxHeight = null;
105
+ this.dropDownSectionHeight = null;
107
106
  }
108
107
  },
109
108
  toggleDropDownStatus() {