@appscode/design-system 1.0.43-alpha.19 → 1.0.43-alpha.190

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 (124) hide show
  1. package/base/utilities/_all.scss +6 -0
  2. package/base/utilities/_default.scss +269 -4
  3. package/base/utilities/_derived-variables.scss +0 -1
  4. package/base/utilities/_initial-variables.scss +17 -13
  5. package/base/utilities/_mixin.scss +1 -17
  6. package/base/utilities/_typography.scss +14 -4
  7. package/base/utilities/dark-theme.scss +9 -146
  8. package/components/_ac-accordion.scss +8 -4
  9. package/components/_ac-alert-box.scss +15 -7
  10. package/components/_ac-card.scss +33 -6
  11. package/components/_ac-code-highlight.scss +5 -1
  12. package/components/_ac-content-layout.scss +2 -2
  13. package/components/_ac-input.scss +63 -23
  14. package/components/_ac-multi-select.scss +187 -5
  15. package/components/_ac-options.scss +24 -9
  16. package/components/_ac-select-box.scss +13 -3
  17. package/components/_ac-table.scss +7 -5
  18. package/components/_ac-tabs.scss +42 -5
  19. package/components/_ac-terminal.scss +270 -0
  20. package/components/_all.scss +35 -0
  21. package/components/_app-drawer.scss +2 -2
  22. package/components/_breadcumb.scss +2 -0
  23. package/components/_buttons.scss +45 -36
  24. package/components/_card-body-wrapper.scss +2 -2
  25. package/components/_dashboard-header.scss +32 -0
  26. package/components/_direct-deploy.scss +69 -0
  27. package/components/_go-to-top.scss +1 -1
  28. package/components/_graph.scss +45 -0
  29. package/components/_image-upload.scss +5 -3
  30. package/components/_left-sidebar-menu.scss +193 -39
  31. package/components/_monaco-editor.scss +1 -1
  32. package/components/_navbar.scss +125 -8
  33. package/components/_overview-info.scss +4 -4
  34. package/components/_pagination.scss +8 -0
  35. package/components/_payment-card.scss +10 -1
  36. package/components/_preview-modal.scss +15 -4
  37. package/components/_pricing-table.scss +1 -1
  38. package/components/_progress-bar.scss +4 -4
  39. package/components/_subscription-card.scss +12 -5
  40. package/components/_table-of-content.scss +1 -1
  41. package/components/_tfa.scss +69 -0
  42. package/components/_transitions.scss +261 -0
  43. package/components/_wizard.scss +16 -3
  44. package/components/ac-toaster/_ac-toasted.scss +1 -1
  45. package/components/bbum/_card-team.scss +1 -1
  46. package/components/bbum/_information-center.scss +15 -1
  47. package/components/bbum/_sign-up-notification.scss +1 -1
  48. package/components/bbum/_single-post-preview.scss +1 -1
  49. package/components/bbum/_user-profile.scss +91 -90
  50. package/components/ui-builder/_ui-builder.scss +43 -3
  51. package/components/ui-builder/_vue-open-api.scss +104 -0
  52. package/layouts/_all.scss +2 -0
  53. package/layouts/_code-preview.scss +5 -2
  54. package/main.scss +4 -54
  55. package/package.json +2 -7
  56. package/plugins/theme.js +4 -0
  57. package/plugins/time-convert.js +49 -0
  58. package/plugins/vue-toaster.js +3 -0
  59. package/vue-components/v2/banner/Banner.vue +2 -2
  60. package/vue-components/v2/breadcrumbs/Breadcrumb.vue +97 -0
  61. package/vue-components/v2/button/Button.vue +5 -0
  62. package/vue-components/v2/button/DownloadBtn.vue +45 -0
  63. package/vue-components/v2/card/Card.vue +1 -0
  64. package/vue-components/v2/card/PaymentCards.vue +11 -2
  65. package/vue-components/v2/content/ContentTable.vue +12 -7
  66. package/vue-components/v2/editor/Editor.vue +38 -5
  67. package/vue-components/v2/editor/FilteredFileEditor.vue +189 -0
  68. package/vue-components/v2/editor/MonacoEditor.vue +125 -0
  69. package/vue-components/v2/editor/ResourceKeyValueEditor.vue +209 -0
  70. package/vue-components/v2/form-fields/Input.vue +1 -1
  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 +35 -4
  74. package/vue-components/v2/modals/DeleteConfirmationModal.vue +79 -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 +50 -44
  78. package/vue-components/v2/navbar/User.vue +202 -19
  79. package/vue-components/v2/notification/Notification.vue +101 -0
  80. package/vue-components/v2/notification/NotificationItem.vue +44 -0
  81. package/vue-components/v2/preloader/Preloader.vue +5 -5
  82. package/vue-components/v2/sidebar/ClusterSwitcher.vue +126 -0
  83. package/vue-components/v2/sidebar/SidebarItem.vue +23 -1
  84. package/vue-components/v2/sidebar/SidebarItemWithDropDown.vue +19 -20
  85. package/vue-components/v2/tab/TabItem.vue +1 -1
  86. package/vue-components/v2/table/Table.vue +44 -8
  87. package/vue-components/v2/table/TableRow.vue +12 -2
  88. package/vue-components/v2/table/table-cell/CellValue.vue +33 -4
  89. package/vue-components/v2/table/table-cell/GenericCell.vue +56 -0
  90. package/vue-components/v2/table/table-cell/ObjectCell.vue +4 -1
  91. package/vue-components/v2/tabs/EditorTabs.vue +1 -1
  92. package/vue-components/v3/button/Button.vue +5 -0
  93. package/vue-components/v3/content/ContentTable.vue +5 -0
  94. package/vue-components/v3/editor/Editor.vue +50 -30
  95. package/vue-components/v3/editor/FilteredFileEditor.vue +184 -0
  96. package/vue-components/v3/editor/MonacoEditor.vue +131 -0
  97. package/vue-components/v3/editor/ResourceKeyValueEditor.vue +125 -0
  98. package/vue-components/v3/form/Form.vue +63 -0
  99. package/vue-components/v3/form-fields/Input.vue +10 -10
  100. package/vue-components/v3/header/HeaderItem.vue +5 -0
  101. package/vue-components/v3/header/HeaderItems.vue +5 -0
  102. package/vue-components/v3/loaders/ResourceLoader.vue +83 -0
  103. package/vue-components/v3/loaders/SidebarLoader.vue +34 -0
  104. package/vue-components/v3/long-running-tasks/LongRunningTaskItem.vue +92 -0
  105. package/vue-components/v3/modal/Modal.vue +40 -16
  106. package/vue-components/v3/modals/DeleteConfirmationModal.vue +83 -0
  107. package/vue-components/v3/modals/JsonShowModal.vue +25 -16
  108. package/vue-components/v3/modals/LongRunningTasksModal.vue +337 -0
  109. package/vue-components/v3/navbar/Appdrawer.vue +12 -7
  110. package/vue-components/v3/navbar/ThemeMode.vue +49 -47
  111. package/vue-components/v3/navbar/User.vue +190 -16
  112. package/vue-components/v3/notification/Notification.vue +98 -0
  113. package/vue-components/v3/notification/NotificationItem.vue +52 -0
  114. package/vue-components/v3/sidebar/ClusterSwitcher.vue +133 -0
  115. package/vue-components/v3/sidebar/SidebarItemWithDropDown.vue +120 -0
  116. package/vue-components/v3/table/MultiInfoTable.vue +143 -0
  117. package/vue-components/v3/table/Table.vue +35 -12
  118. package/vue-components/v3/table/TableContainer.vue +34 -0
  119. package/vue-components/v3/table/TableRow.vue +10 -2
  120. package/vue-components/v3/table/table-cell/CellValue.vue +26 -3
  121. package/vue-components/v3/table/table-cell/GenericCell.vue +62 -0
  122. package/vue-components/v3/table/table-cell/ObjectCell.vue +5 -1
  123. package/vue-components/v3/tabs/EditorTabs.vue +1 -1
  124. package/vue-components/v3/terminal/LongRunningTaskTerminal.vue +148 -0
@@ -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>
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <div
3
+ @mouseenter="notificationPanelOpen = true"
4
+ @mouseleave="notificationPanelOpen = false"
5
+ >
6
+ <button class="button ac-nav-button">
7
+ <span v-if="unreadCount">{{ unreadCount }}</span>
8
+ <i
9
+ class="fa fa-bell"
10
+ :class="{ 'ac-shake': unreadCount }"
11
+ aria-hidden="true"
12
+ ></i>
13
+ </button>
14
+ <div class="ac-menu-content is-notification">
15
+ <div class="notification-header">
16
+ <div class="left-content">
17
+ <p>
18
+ Notifications <span>({{ notifications.length }})</span>
19
+ </p>
20
+ </div>
21
+ <div class="right-content"></div>
22
+ </div>
23
+ <div :key="notificationPanelOpen ? 1 : 0" class="notification-body">
24
+ <transition-group v-if="notifications.length" name="slide-right">
25
+ <notification-item
26
+ v-for="notification in notifications"
27
+ :key="`${notification.id}${unreadCount}`"
28
+ :notification="notification"
29
+ />
30
+ </transition-group>
31
+ <span v-else class="single-notification-item"
32
+ >No new notifications</span
33
+ >
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </template>
38
+
39
+ <script>
40
+ import { StringCodec } from "nats.ws/cjs/nats";
41
+ export default {
42
+ components: {
43
+ NotificationItem: () => import("./NotificationItem.vue"),
44
+ },
45
+ data() {
46
+ return {
47
+ notifications: [],
48
+ notificationsRead: 0,
49
+
50
+ notificationPanelOpen: false,
51
+ subscription: null,
52
+ };
53
+ },
54
+ computed: {
55
+ unreadCount() {
56
+ return this.notifications.length - this.notificationsRead;
57
+ },
58
+ },
59
+ watch: {
60
+ notificationPanelOpen(n) {
61
+ if (n) {
62
+ this.notificationsRead = this.notifications.length;
63
+ }
64
+ },
65
+ },
66
+ created() {
67
+ this.subscribeToNotifcations();
68
+ },
69
+ methods: {
70
+ addNewNotification(notification) {
71
+ this.notifications.unshift(notification);
72
+ if (this.notificationPanelOpen) {
73
+ this.notificationsRead = this.notifications.length;
74
+ }
75
+ },
76
+ async subscribeToNotifcations() {
77
+ this.subscription = this.$nc?.subscribe("notifications");
78
+ console.log("Started listening to Notifications");
79
+
80
+ if (this.subscription) {
81
+ // listen to channel events
82
+ for await (const msg of this.subscription) {
83
+ console.log("notifications ===>");
84
+ console.log({ data: StringCodec().decode(msg.data) });
85
+ const log = JSON.parse(StringCodec().decode(msg.data));
86
+ console.log({ log });
87
+ const currentTime = new Date().getTime();
88
+ this.addNewNotification({
89
+ ...log,
90
+ id: currentTime,
91
+ time: currentTime,
92
+ });
93
+ msg.respond();
94
+ }
95
+ console.log("Stopped listening to Notifications");
96
+ console.log("Closed Channel Notifications");
97
+ }
98
+ },
99
+ },
100
+ };
101
+ </script>
@@ -0,0 +1,44 @@
1
+ <template>
2
+ <a class="single-notification-item is-complete">
3
+ <p>
4
+ {{ notification.msg }}
5
+ </p>
6
+ <div class="notification-status">
7
+ <p
8
+ :class="{
9
+ 'is-success': notification.status === 'Success',
10
+ 'is-danger': notification.status === 'Failed',
11
+ 'is-info':
12
+ notification.status === 'Started' ||
13
+ notification.status === 'Running',
14
+ 'is-warning': notification.status === 'Pending',
15
+ }"
16
+ >
17
+ <i
18
+ class="fa mr-5"
19
+ :class="{
20
+ 'fa-check': notification.status === 'Success',
21
+ 'fa-exclamation-triangle': notification.status === 'Failed',
22
+ 'fa-info-circle':
23
+ notification.status === 'Started' ||
24
+ notification.status === 'Pending' ||
25
+ notification.status === 'Running',
26
+ }"
27
+ />
28
+ {{ notification.status }}
29
+ </p>
30
+ <p>{{ notification.time | getDayDifferences }} ago</p>
31
+ </div>
32
+ </a>
33
+ </template>
34
+
35
+ <script>
36
+ export default {
37
+ props: {
38
+ notification: {
39
+ type: Object,
40
+ default: () => ({}),
41
+ },
42
+ },
43
+ };
44
+ </script>
@@ -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() {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <li :class="{ 'is-active': isActive }">
2
+ <li :class="{ 'is-active': isActive }" data-testid="tab-item">
3
3
  <slot />
4
4
  </li>
5
5
  </template>