@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,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() {
@@ -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"
@@ -146,7 +175,7 @@ export default {
146
175
  },
147
176
  headerLabels() {
148
177
  return this.tableHeaders.map((th) =>
149
- typeof th === "string" ? th : th.label || "Label"
178
+ typeof th === "string" ? th : th.name || "Label"
150
179
  );
151
180
  },
152
181
  },
@@ -157,8 +186,15 @@ export default {
157
186
  handler(n) {
158
187
  if (this.headerSortables.length === n.length) {
159
188
  n.forEach((th, idx) => {
160
- if (this.headerSortables[idx].enabled !== !!th.sortable) {
161
- this.headerSortables[idx].enabled = !!th.sortable;
189
+ if (
190
+ this.headerSortables[idx].enabled !==
191
+ !!(th && th.sort && th.sort.enable)
192
+ ) {
193
+ this.headerSortables[idx].enabled = !!(
194
+ th &&
195
+ th.sort &&
196
+ th.sort.enable
197
+ );
162
198
  this.headerSortables[idx].mode = "";
163
199
  }
164
200
  });
@@ -171,7 +207,7 @@ export default {
171
207
  };
172
208
  } else {
173
209
  return {
174
- enabled: !!th.sortable,
210
+ enabled: !!(th && th.sort && th.sort.enable),
175
211
  mode: "",
176
212
  };
177
213
  }
@@ -198,7 +234,7 @@ export default {
198
234
  emitSortEvent(index) {
199
235
  const emitValue = {
200
236
  index,
201
- label: this.tableHeaders[index].label,
237
+ label: this.tableHeaders[index].name,
202
238
  mode: "",
203
239
  };
204
240
 
@@ -6,7 +6,7 @@
6
6
  custom
7
7
  v-slot="{ navigate }"
8
8
  >
9
- <tr @click="navigate">
9
+ <tr class="is-link" @click="navigate">
10
10
  <slot />
11
11
  <fake-table-cell
12
12
  v-if="fakeCellWidth > 0"
@@ -14,9 +14,14 @@
14
14
  />
15
15
  </tr>
16
16
  </router-link>
17
+
17
18
  <tr
18
19
  v-else
19
- :class="{ 'is-selected': isSelected, 'is-hoverless': !isSelected }"
20
+ :class="{
21
+ 'is-selected': isSelected,
22
+ 'is-hoverless': !isSelected,
23
+ 'is-disabled': isDisabled
24
+ }"
20
25
  @click.prevent="$emit('rowselect', true)"
21
26
  >
22
27
  <slot />
@@ -32,21 +37,25 @@ export default {
32
37
  props: {
33
38
  link: {
34
39
  type: String,
35
- default: "",
40
+ default: ""
36
41
  },
37
42
  isSelected: {
38
43
  type: Boolean,
39
- default: false,
44
+ default: false
45
+ },
46
+ isDisabled: {
47
+ type: Boolean,
48
+ default: false
40
49
  },
41
50
  fakeCellWidth: {
42
51
  type: Number,
43
- default: 0,
44
- },
52
+ default: 0
53
+ }
45
54
  },
46
55
 
47
56
  components: {
48
57
  TableCell: () => import("./TableCell.vue"),
49
- FakeTableCell: () => import("./FakeTableCell.vue"),
50
- },
58
+ FakeTableCell: () => import("./FakeTableCell.vue")
59
+ }
51
60
  };
52
61
  </script>
@@ -1,8 +1,13 @@
1
1
  <template>
2
2
  <div v-if="isLoaderActive" ref="cellLoaderDiv" :style="{ maxWidth: '300px' }">
3
- <content-loader :height="10" :width="computedCellWidth || 300" />
3
+ <content-loader
4
+ :height="10"
5
+ :width="computedCellWidth || 300"
6
+ :primaryColor="primaryColor"
7
+ :secondaryColor="secondaryColor"
8
+ />
4
9
  </div>
5
- <div v-else class="haha" ref="cellDiv">
10
+ <div v-else ref="cellDiv">
6
11
  <object-cell
7
12
  v-if="valueType === 'object'"
8
13
  :obj="value"
@@ -16,7 +21,7 @@
16
21
  :max-character-length="maxCharacterLength"
17
22
  />
18
23
  <template v-else>
19
- <span class="is-ellipsis-1" :title="value">{{
24
+ <span class="is-ellipsis-1" :title="tooltip">{{
20
25
  value || (value === 0 ? 0 : "-")
21
26
  }}</span>
22
27
  </template>
@@ -24,6 +29,13 @@
24
29
  </template>
25
30
 
26
31
  <script>
32
+ import {
33
+ loaderLightThemePrimaryColor,
34
+ loaderDarkThemePrimaryColor,
35
+ loaderLightThemeSecondaryColor,
36
+ loaderDarkThemeSecondaryColor,
37
+ } from "@appscode/design-system/plugins/theme";
38
+
27
39
  export default {
28
40
  props: {
29
41
  isLoaderActive: {
@@ -38,6 +50,10 @@ export default {
38
50
  type: null,
39
51
  default: "",
40
52
  },
53
+ tooltip: {
54
+ type: String,
55
+ defualt: "",
56
+ },
41
57
  },
42
58
  components: {
43
59
  ContentLoader: () =>
@@ -49,13 +65,24 @@ export default {
49
65
  computed: {
50
66
  valueType() {
51
67
  if (typeof this.value === "object") {
52
- if (Array.isArray(this.value)) return "array";
68
+ if (this.value === null) return "null";
69
+ else if (Array.isArray(this.value)) return "array";
53
70
  else return "object";
54
71
  } else return typeof this.value;
55
72
  },
56
73
  maxCharacterLength() {
57
74
  return Math.ceil(this.computedCellWidth / 8);
58
75
  },
76
+ primaryColor() {
77
+ return document.documentElement.classList.contains("is-dark-theme")
78
+ ? loaderDarkThemePrimaryColor
79
+ : loaderLightThemePrimaryColor;
80
+ },
81
+ secondaryColor() {
82
+ return document.documentElement.classList.contains("is-dark-theme")
83
+ ? loaderDarkThemeSecondaryColor
84
+ : loaderLightThemeSecondaryColor;
85
+ },
59
86
  },
60
87
 
61
88
  data() {
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <span
3
+ :class="{
4
+ 'is-flex': cellDescriptor.type !== 'object',
5
+ 'is-align-items-center': cellValue.icon,
6
+ 'is-justify-content-center': cellDescriptor.textAlign === 'center',
7
+ 'is-justify-content-left': cellDescriptor.textAlign === 'left',
8
+ 'is-justify-content-right': cellDescriptor.textAlign === 'right'
9
+ }"
10
+ >
11
+ <span v-if="cellValue.icon" class="icon p-0 mr-10">
12
+ <img width="15" :src="cellValue.icon" />
13
+ </span>
14
+ <router-link v-if="cellValue.link" :to="getCellLink(cellValue)">
15
+ {{ cellValue.data }}
16
+ </router-link>
17
+ <tag v-else-if="cellValue.color" :class="`is-${cellValue.color}`">
18
+ {{ cellValue.data }}
19
+ </tag>
20
+ <cell-value
21
+ v-else
22
+ :cell-title="cellDescriptor.name"
23
+ :value="cellValue.data || '-'"
24
+ :tooltip="cellValue.tooltip || JSON.stringify(cellValue.data)"
25
+ />
26
+ </span>
27
+ </template>
28
+ <script>
29
+ export default {
30
+ components: {
31
+ Tag: () => import("../../tag/Tag.vue"),
32
+ CellValue: () => import("../table-cell/CellValue.vue")
33
+ },
34
+ props: {
35
+ cellDescriptor: {
36
+ type: Object,
37
+ default: () => ({})
38
+ },
39
+ cellValue: {
40
+ type: Object,
41
+ default: () => ({})
42
+ }
43
+ },
44
+ methods: {
45
+ getCellLink(cell) {
46
+ const inject = (str, obj) => str.replace(/\${(.*?)}/g, (x, g) => obj[g]);
47
+ const { user, cluster } = this.$route.params;
48
+ const link = inject(cell.link || "", {
49
+ username: user,
50
+ clustername: cluster
51
+ });
52
+ return link;
53
+ }
54
+ }
55
+ };
56
+ </script>
@@ -68,7 +68,10 @@ export default {
68
68
  },
69
69
  printableStringObjs() {
70
70
  return this.objKeys.map((key) => {
71
- const value = this.obj[key];
71
+ let value = this.obj[key];
72
+ if (typeof value === "object" && value !== null) {
73
+ value = JSON.stringify(value);
74
+ }
72
75
  const keyValue = `${key}: ${value}`;
73
76
  const exceededLength = keyValue.length > 30;
74
77
  const print = exceededLength ? key : keyValue;
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <tabs-body class="mt-20">
2
+ <tabs-body>
3
3
  <tabs class="is-line">
4
4
  <tab-item :is-active="activeTab === 'edit'">
5
5
  <a @click.prevent="$emit('tabchange', 'edit')">Edit</a>
@@ -4,6 +4,7 @@
4
4
  :class="`${modifierClasses}${isLoaderActive ? ' is-loading' : ''}`"
5
5
  :disabled="disabled ? true : null"
6
6
  @click="handleClick"
7
+ :title="tooltip"
7
8
  >
8
9
  <span v-if="iconClass || iconImage" class="icon is-small">
9
10
  <img
@@ -28,6 +29,10 @@ export default defineComponent({
28
29
  type: String,
29
30
  default: "",
30
31
  },
32
+ tooltip: {
33
+ type: String,
34
+ defualt: undefined
35
+ },
31
36
  // for loader
32
37
  isLoaderActive: {
33
38
  type: Boolean,
@@ -2,6 +2,7 @@
2
2
  <content-layout>
3
3
  <template #content-header>
4
4
  <content-header
5
+ v-if="!hideHeader"
5
6
  :header-title="tableTitle"
6
7
  :header-sub-title="tableSubTitle"
7
8
  :class="{ 'pl-0 pr-0': removeTableHeaderPadding }"
@@ -38,6 +39,10 @@ export default defineComponent({
38
39
  type: Boolean,
39
40
  default: true,
40
41
  },
42
+ hideHeader: {
43
+ type: Boolean,
44
+ default: false
45
+ }
41
46
  },
42
47
  components: {
43
48
  ContentLayout: defineAsyncComponent(() =>
@@ -57,9 +57,9 @@ export default defineComponent({
57
57
 
58
58
  // attach click event listener on window, and close the dropdown
59
59
  function deactivateDropdown(e: Event) {
60
- e.preventDefault();
61
60
  const { target } = e;
62
61
  if (
62
+ isDropdownActive.value &&
63
63
  dropdown.value &&
64
64
  dropdown.value !== target &&
65
65
  !dropdown.value.contains(target as Node)