@appscode/design-system 1.0.43-alpha.99 → 1.1.0

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 (101) hide show
  1. package/base/utilities/_all.scss +7 -0
  2. package/base/utilities/_customize-bulma.scss +191 -0
  3. package/base/utilities/_default.scss +58 -124
  4. package/base/utilities/_derived-variables.scss +6 -0
  5. package/base/utilities/_grid.scss +29 -0
  6. package/base/utilities/_initial-variables.scss +13 -9
  7. package/base/utilities/_typography.scss +6 -12
  8. package/base/utilities/dark-theme.scss +1 -0
  9. package/components/_ac-accordion.scss +14 -5
  10. package/components/_ac-alert-box.scss +32 -6
  11. package/components/_ac-card.scss +17 -5
  12. package/components/_ac-drag.scss +2 -0
  13. package/components/_ac-input.scss +19 -11
  14. package/components/_ac-modal.scss +1 -1
  15. package/components/_ac-multi-select.scss +60 -4
  16. package/components/_ac-report.scss +53 -0
  17. package/components/_ac-table.scss +60 -2
  18. package/components/_ac-tabs.scss +16 -2
  19. package/components/_ac-tags.scss +85 -0
  20. package/components/_ac-terminal.scss +1 -3
  21. package/components/_all.scss +28 -0
  22. package/components/_buttons.scss +14 -33
  23. package/components/_dashboard-header.scss +32 -0
  24. package/components/_left-sidebar-menu.scss +9 -9
  25. package/components/_navbar.scss +89 -4
  26. package/components/_preview-modal.scss +14 -1
  27. package/components/_transitions.scss +261 -0
  28. package/components/_wizard.scss +1 -0
  29. package/components/bbum/_all.scss +9 -0
  30. package/components/bbum/_single-post-preview.scss +1 -1
  31. package/components/ui-builder/_ui-builder.scss +58 -0
  32. package/components/ui-builder/_vue-open-api.scss +6 -0
  33. package/layouts/_all.scss +2 -0
  34. package/layouts/_code-preview.scss +5 -2
  35. package/main.scss +5 -56
  36. package/package.json +4 -2
  37. package/plugins/caching.ts +243 -0
  38. package/plugins/time-convert.js +49 -0
  39. package/plugins/vue-toaster.js +3 -0
  40. package/vue-components/v2/banner/Banner.vue +2 -2
  41. package/vue-components/v2/breadcrumbs/Breadcrumb.vue +97 -0
  42. package/vue-components/v2/button/Button.vue +5 -0
  43. package/vue-components/v2/button/DownloadBtn.vue +45 -0
  44. package/vue-components/v2/card/Card.vue +1 -0
  45. package/vue-components/v2/content/ContentTable.vue +12 -7
  46. package/vue-components/v2/editor/Editor.vue +37 -24
  47. package/vue-components/v2/editor/FilteredFileEditor.vue +189 -0
  48. package/vue-components/v2/editor/MonacoEditor.vue +125 -0
  49. package/vue-components/v2/editor/ResourceKeyValueEditor.vue +209 -0
  50. package/vue-components/v2/form-fields/Input.vue +1 -1
  51. package/vue-components/v2/loaders/ResourceLoader.vue +101 -0
  52. package/vue-components/v2/loaders/SidebarLoader.vue +43 -0
  53. package/vue-components/v2/modal/Modal.vue +30 -5
  54. package/vue-components/v2/modals/DeleteConfirmationModal.vue +79 -0
  55. package/vue-components/v2/modals/JsonShowModal.vue +12 -2
  56. package/vue-components/v2/navbar/User.vue +229 -17
  57. package/vue-components/v2/notification/Notification.vue +101 -0
  58. package/vue-components/v2/notification/NotificationItem.vue +44 -0
  59. package/vue-components/v2/pagination/Pagination.vue +16 -3
  60. package/vue-components/v2/preloader/Preloader.vue +1 -1
  61. package/vue-components/v2/sidebar/SidebarItemWithDropDown.vue +19 -20
  62. package/vue-components/v2/tab/TabItem.vue +1 -1
  63. package/vue-components/v2/table/Table.vue +49 -8
  64. package/vue-components/v2/table/TableRow.vue +12 -2
  65. package/vue-components/v2/table/table-cell/CellValue.vue +29 -9
  66. package/vue-components/v2/table/table-cell/GenericCell.vue +56 -0
  67. package/vue-components/v2/table/table-cell/ObjectCell.vue +4 -1
  68. package/vue-components/v3/button/Button.vue +6 -1
  69. package/vue-components/v3/content/ContentHeader.vue +2 -1
  70. package/vue-components/v3/content/ContentTable.vue +20 -2
  71. package/vue-components/v3/editor/Editor.vue +36 -33
  72. package/vue-components/v3/editor/FilteredFileEditor.vue +186 -0
  73. package/vue-components/v3/editor/MonacoEditor.vue +131 -0
  74. package/vue-components/v3/editor/ResourceKeyValueEditor.vue +125 -0
  75. package/vue-components/v3/form/Form.vue +63 -0
  76. package/vue-components/v3/form-fields/Input.vue +11 -10
  77. package/vue-components/v3/header/HeaderItem.vue +5 -0
  78. package/vue-components/v3/header/HeaderItems.vue +5 -0
  79. package/vue-components/v3/loaders/ResourceLoader.vue +83 -0
  80. package/vue-components/v3/loaders/SidebarLoader.vue +34 -0
  81. package/vue-components/v3/long-running-tasks/LongRunningTaskItem.vue +92 -0
  82. package/vue-components/v3/modal/Modal.vue +30 -7
  83. package/vue-components/v3/modals/DeleteConfirmationModal.vue +85 -0
  84. package/vue-components/v3/modals/JsonShowModal.vue +25 -16
  85. package/vue-components/v3/modals/LongRunningTasksModal.vue +400 -0
  86. package/vue-components/v3/navbar/ThemeMode.vue +41 -49
  87. package/vue-components/v3/navbar/User.vue +242 -18
  88. package/vue-components/v3/notification/AlertBox.vue +61 -0
  89. package/vue-components/v3/notification/Notification.vue +98 -0
  90. package/vue-components/v3/notification/NotificationItem.vue +52 -0
  91. package/vue-components/v3/pagination/Pagination.vue +16 -3
  92. package/vue-components/v3/sidebar/SidebarItemWithDropDown.vue +120 -0
  93. package/vue-components/v3/tab/TabItem.vue +1 -1
  94. package/vue-components/v3/table/MultiInfoTable.vue +143 -0
  95. package/vue-components/v3/table/Table.vue +52 -13
  96. package/vue-components/v3/table/TableContainer.vue +34 -0
  97. package/vue-components/v3/table/TableRow.vue +93 -6
  98. package/vue-components/v3/table/table-cell/CellValue.vue +23 -7
  99. package/vue-components/v3/table/table-cell/GenericCell.vue +75 -0
  100. package/vue-components/v3/table/table-cell/ObjectCell.vue +7 -2
  101. package/vue-components/v3/terminal/LongRunningTaskTerminal.vue +148 -0
@@ -7,31 +7,155 @@
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
+ data-testid="user-profile-link"
30
+ class="line-break-anywhere is-ellipsis-1"
31
+ >{{ user.username.toUpperCase() }}</a
32
+ >
19
33
  <a :href="`mailto:${user.email}`"> {{ user.email }}</a>
20
34
  </div>
21
35
  </div>
22
- <ul>
23
- <li>
24
- <a :href="`${serverDomain}/user/settings/`">Settings</a>
36
+ <transition-group name="list" tag="ul">
37
+ <li key="settings">
38
+ <a
39
+ data-testid="user-settings-link"
40
+ :href="`${serverDomain}/user/settings/`"
41
+ >Settings</a
42
+ >
25
43
  </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>
44
+ <li v-if="isLoggedinUserAdmin" key="site-admin">
45
+ <a data-testid="site-admin-link" :href="`${accountsDomain}/admin`"
46
+ >Site Administration</a
47
+ >
33
48
  </li>
34
- </ul>
49
+ <li
50
+ v-if="showAccountSwitcher"
51
+ :class="`is-${dropDownStatus}`"
52
+ key="switcher"
53
+ >
54
+ <a
55
+ class="
56
+ ac-dropdown-button
57
+ is-fullwidth
58
+ is-flex
59
+ is-justify-content-space-between
60
+ is-align-items-center
61
+ "
62
+ @click="toggleList()"
63
+ >
64
+ <span>Switch Account</span>
65
+ <span
66
+ ><i
67
+ :class="`fa fa-angle-${
68
+ dropDownStatus === 'open' ? 'up' : 'down'
69
+ }`"
70
+ ></i
71
+ ></span>
72
+ </a>
73
+ <transition-group
74
+ name="list"
75
+ tag="ul"
76
+ class="ac-vscrollbar"
77
+ ref="dropdownItems"
78
+ :style="{ maxHeight: dropDownSectionHeight }"
79
+ >
80
+ <li
81
+ v-for="(org, idx) in formattedOrganizations"
82
+ :key="org.username"
83
+ >
84
+ <a
85
+ class="is-flex is-align-items-center"
86
+ @click="onOrganizationClick(org.username)"
87
+ >
88
+ <div class="width-30 height-30 image">
89
+ <img
90
+ :src="org.avatar_url"
91
+ class="ac-user-profile is-rounded"
92
+ alt="icon"
93
+ />
94
+ </div>
95
+ <div
96
+ class="
97
+ is-flex
98
+ is-align-items-center
99
+ is-justify-content-space-between
100
+ is-fullwidth
101
+ ml-10
102
+ "
103
+ >
104
+ <div class="org-info">
105
+ <strong
106
+ :title="org.username"
107
+ class="line-break-anywhere is-ellipsis-1"
108
+ >{{ org.username }}</strong
109
+ >
110
+ <p>
111
+ {{
112
+ org.isPersonalAccount
113
+ ? "Personal Account"
114
+ : "Organization"
115
+ }}
116
+ </p>
117
+ </div>
118
+ <span
119
+ v-if="idx === 0"
120
+ class="
121
+ material-icons-outlined
122
+ font-size-18
123
+ ml-10
124
+ is-pulled-right
125
+ "
126
+ >
127
+ check
128
+ </span>
129
+ </div>
130
+ </a>
131
+ </li>
132
+ </transition-group>
133
+ </li>
134
+ <li key="dashboard">
135
+ <nuxt-link
136
+ v-if="isPlatformDomain"
137
+ to="/dashboard"
138
+ data-testid="user-dashboard-link"
139
+ >
140
+ Dashboard
141
+ </nuxt-link>
142
+ <a
143
+ v-else
144
+ :href="`${serverDomain}/dashboard`"
145
+ data-testid="user-dashboard-link"
146
+ >
147
+ Dashboard
148
+ </a>
149
+ </li>
150
+ <li key="signout">
151
+ <a
152
+ :href="`${accountsDomain}/user/logout`"
153
+ data-testid="signout-link"
154
+ >
155
+ Sign out
156
+ </a>
157
+ </li>
158
+ </transition-group>
35
159
  </div>
36
160
  </navbar-item-content>
37
161
  </navbar-item>
@@ -40,6 +164,7 @@
40
164
  <script>
41
165
  export default {
42
166
  props: {
167
+ // active user info
43
168
  user: {
44
169
  type: Object,
45
170
  default: () => ({}),
@@ -48,11 +173,98 @@ export default {
48
173
  type: String,
49
174
  default: "",
50
175
  },
176
+ accountsDomain: {
177
+ type: String,
178
+ default: "",
179
+ },
180
+ showAccountSwitcher: {
181
+ type: Boolean,
182
+ default: false,
183
+ },
184
+ // all available organization list including personal account
185
+ organizations: {
186
+ type: Array,
187
+ default: () => [],
188
+ },
189
+ isLoggedinUserAdmin: {
190
+ type: Boolean,
191
+ default: false,
192
+ },
193
+ isPlatformDomain: {
194
+ type: Boolean,
195
+ default: false,
196
+ },
51
197
  },
52
198
 
53
199
  components: {
54
200
  NavbarItem: () => import("./NavbarItem.vue"),
55
201
  NavbarItemContent: () => import("./NavbarItemContent.vue"),
56
202
  },
203
+
204
+ computed: {
205
+ formattedOrganizations() {
206
+ let activeUser;
207
+ const filteredList = this.organizations.filter((item) => {
208
+ if (item.username === this.user.username) {
209
+ activeUser = item;
210
+ } else {
211
+ return true;
212
+ }
213
+ return false;
214
+ });
215
+
216
+ filteredList.unshift(activeUser);
217
+
218
+ return filteredList || [];
219
+ },
220
+ },
221
+
222
+ data() {
223
+ return {
224
+ dropDownStatus: "close",
225
+ dropDownSectionHeight: null,
226
+ };
227
+ },
228
+
229
+ methods: {
230
+ toggleList() {
231
+ this.dropDownStatus = this.dropDownStatus === "open" ? "close" : "open";
232
+ this.$nextTick(() => {
233
+ this.$refs["dropdownItems"].$el.scrollTo(0, 0);
234
+ });
235
+ },
236
+ onOrganizationClick(orgName) {
237
+ this.$refs["dropdownItems"].$el.scrollTo(0, 0);
238
+ this.$emit("activeorg$set", orgName);
239
+ },
240
+ onMouseLeave() {
241
+ this.dropDownStatus = "close";
242
+ },
243
+ },
244
+
245
+ watch: {
246
+ dropDownStatus: {
247
+ immediate: true,
248
+ handler(n) {
249
+ if (n === "open") {
250
+ this.$nextTick(() => {
251
+ const dropDownUl = this.$refs["dropdownItems"];
252
+ if (dropDownUl)
253
+ this.dropDownSectionHeight = `${dropDownUl.scrollHeight}px`;
254
+ });
255
+ } else {
256
+ this.dropDownSectionHeight = null;
257
+ }
258
+ },
259
+ },
260
+ },
57
261
  };
58
- </script>
262
+ </script>
263
+ <style lang="scss" scoped>
264
+ .ac-vscrollbar {
265
+ overflow: auto !important;
266
+ }
267
+ .line-break-anywhere {
268
+ line-break: anywhere;
269
+ }
270
+ </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
+ 'has-text-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>
@@ -9,7 +9,11 @@
9
9
  "
10
10
  >
11
11
  <label>Rows per page</label>
12
- <select v-model="selectedItemCountPerPage" name="page">
12
+ <select
13
+ v-model="selectedItemCountPerPage"
14
+ name="page"
15
+ data-testid="rows-per-page-selector"
16
+ >
13
17
  <option :value="5">5</option>
14
18
  <option :value="10" v-show="totalNoOfItems > 5">10</option>
15
19
  <option :value="15" v-show="totalNoOfItems > 10">15</option>
@@ -31,19 +35,28 @@
31
35
 
32
36
  <ul v-if="totalNoOfItems > selectedItemCountPerPage">
33
37
  <li>
34
- <a class="previous" @click.prevent="prevPage()">
38
+ <a
39
+ class="previous"
40
+ @click.prevent="prevPage()"
41
+ data-testid="pagination-previous-page-button"
42
+ >
35
43
  <i class="fa fa-angle-left" aria-hidden="true"></i>
36
44
  </a>
37
45
  </li>
38
46
  <li v-for="page in pages" :key="`page-${page}`">
39
47
  <a
40
48
  @click.prevent="changePage(page)"
49
+ data-testid="pagination-page-switch-button"
41
50
  :class="{ 'is-current': activePageNo === page }"
42
51
  >{{ page }}</a
43
52
  >
44
53
  </li>
45
54
  <li>
46
- <a class="next" @click.prevent="nextPage()">
55
+ <a
56
+ class="next"
57
+ @click.prevent="nextPage()"
58
+ data-testid="pagination-next-page-button"
59
+ >
47
60
  <i class="fa fa-angle-right" aria-hidden="true"></i>
48
61
  </a>
49
62
  </li>
@@ -19,7 +19,7 @@ export default {
19
19
  },
20
20
  message: {
21
21
  type: String,
22
- default: "Fetching! Please wait for sometime..."
22
+ default: "Loading ..."
23
23
  }
24
24
  }
25
25
  };
@@ -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>
@@ -23,12 +23,41 @@
23
23
  :key="idx"
24
24
  :class="{
25
25
  sorting: headerSortables[idx] && headerSortables[idx].enabled,
26
- 'sorting-desc': headerSortables[idx] && headerSortables[idx].mode === 'desc',
27
- 'sorting-asc': headerSortables[idx] && headerSortables[idx].mode === 'asc',
26
+ 'sorting-desc':
27
+ headerSortables[idx] && headerSortables[idx].mode === 'desc',
28
+ 'sorting-asc':
29
+ headerSortables[idx] && headerSortables[idx].mode === 'asc',
30
+ 'has-text-centered':
31
+ typeof tableHeader === 'string'
32
+ ? false
33
+ : tableHeader.textAlign === 'center',
34
+ 'has-text-left':
35
+ typeof tableHeader === 'string'
36
+ ? false
37
+ : tableHeader.textAlign === 'left',
38
+ 'has-text-right':
39
+ typeof tableHeader === 'string'
40
+ ? false
41
+ : tableHeader.textAlign === 'right',
28
42
  }"
29
- @click.prevent="headerSortables[idx] && headerSortables[idx].enabled && emitSortEvent(idx)"
43
+ @click.prevent="
44
+ headerSortables[idx] &&
45
+ headerSortables[idx].enabled &&
46
+ emitSortEvent(idx)
47
+ "
30
48
  >
31
49
  {{ headerLabels[idx] }}
50
+ <span
51
+ v-if="
52
+ tableHeader.dashboard &&
53
+ tableHeader.dashboard.status &&
54
+ tableHeader.dashboard.status !== 'Success'
55
+ "
56
+ class="icon has-text-danger"
57
+ :title="tableHeader.dashboard && tableHeader.dashboard.message"
58
+ >
59
+ <i class="fa fa-exclamation-triangle" />
60
+ </span>
32
61
  </th>
33
62
  <th
34
63
  ref="action-section"
@@ -81,6 +110,11 @@
81
110
  </tbody>
82
111
  </template>
83
112
  </table>
113
+
114
+ <!-- table footer info start -->
115
+ <slot name="table-footer-info" />
116
+ <!-- table footer info end -->
117
+
84
118
  <!-- pagination start -->
85
119
  <slot name="table-pagination" />
86
120
  <!-- pagination end -->
@@ -146,7 +180,7 @@ export default {
146
180
  },
147
181
  headerLabels() {
148
182
  return this.tableHeaders.map((th) =>
149
- typeof th === "string" ? th : th.label || "Label"
183
+ typeof th === "string" ? th : th.name || "Label"
150
184
  );
151
185
  },
152
186
  },
@@ -157,8 +191,15 @@ export default {
157
191
  handler(n) {
158
192
  if (this.headerSortables.length === n.length) {
159
193
  n.forEach((th, idx) => {
160
- if (this.headerSortables[idx].enabled !== !!th.sortable) {
161
- this.headerSortables[idx].enabled = !!th.sortable;
194
+ if (
195
+ this.headerSortables[idx].enabled !==
196
+ !!(th && th.sort && th.sort.enable)
197
+ ) {
198
+ this.headerSortables[idx].enabled = !!(
199
+ th &&
200
+ th.sort &&
201
+ th.sort.enable
202
+ );
162
203
  this.headerSortables[idx].mode = "";
163
204
  }
164
205
  });
@@ -171,7 +212,7 @@ export default {
171
212
  };
172
213
  } else {
173
214
  return {
174
- enabled: !!th.sortable,
215
+ enabled: !!(th && th.sort && th.sort.enable),
175
216
  mode: "",
176
217
  };
177
218
  }
@@ -198,7 +239,7 @@ export default {
198
239
  emitSortEvent(index) {
199
240
  const emitValue = {
200
241
  index,
201
- label: this.tableHeaders[index].label,
242
+ label: this.tableHeaders[index].name,
202
243
  mode: "",
203
244
  };
204
245