@appscode/design-system 1.0.43-alpha.22 → 1.0.43-alpha.221

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 (134) 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 +286 -126
  4. package/base/utilities/_derived-variables.scss +6 -1
  5. package/base/utilities/_grid.scss +29 -0
  6. package/base/utilities/_initial-variables.scss +27 -17
  7. package/base/utilities/_mixin.scss +1 -17
  8. package/base/utilities/_typography.scss +18 -14
  9. package/base/utilities/dark-theme.scss +9 -145
  10. package/components/_ac-accordion.scss +14 -5
  11. package/components/_ac-alert-box.scss +41 -7
  12. package/components/_ac-card.scss +48 -10
  13. package/components/_ac-code-highlight.scss +5 -1
  14. package/components/_ac-content-layout.scss +2 -2
  15. package/components/_ac-drag.scss +2 -0
  16. package/components/_ac-input.scss +64 -23
  17. package/components/_ac-modal.scss +1 -1
  18. package/components/_ac-multi-select.scss +247 -9
  19. package/components/_ac-options.scss +24 -9
  20. package/components/_ac-select-box.scss +13 -3
  21. package/components/_ac-table.scss +15 -5
  22. package/components/_ac-tabs.scss +46 -5
  23. package/components/_ac-tags.scss +85 -0
  24. package/components/_ac-terminal.scss +270 -0
  25. package/components/_all.scss +28 -0
  26. package/components/_app-drawer.scss +2 -2
  27. package/components/_breadcumb.scss +2 -0
  28. package/components/_buttons.scss +50 -37
  29. package/components/_card-body-wrapper.scss +2 -2
  30. package/components/_dashboard-header.scss +32 -0
  31. package/components/_direct-deploy.scss +69 -0
  32. package/components/_go-to-top.scss +1 -1
  33. package/components/_graph.scss +45 -0
  34. package/components/_image-upload.scss +5 -3
  35. package/components/_left-sidebar-menu.scss +121 -69
  36. package/components/_monaco-editor.scss +1 -1
  37. package/components/_navbar.scss +170 -10
  38. package/components/_overview-info.scss +3 -3
  39. package/components/_pagination.scss +8 -0
  40. package/components/_payment-card.scss +10 -1
  41. package/components/_preview-modal.scss +18 -5
  42. package/components/_pricing-table.scss +1 -1
  43. package/components/_progress-bar.scss +4 -4
  44. package/components/_subscription-card.scss +11 -4
  45. package/components/_table-of-content.scss +1 -1
  46. package/components/_tfa.scss +69 -0
  47. package/components/_transitions.scss +261 -0
  48. package/components/_wizard.scss +16 -3
  49. package/components/bbum/_all.scss +9 -0
  50. package/components/bbum/_card-team.scss +1 -1
  51. package/components/bbum/_information-center.scss +15 -1
  52. package/components/bbum/_sign-up-notification.scss +1 -1
  53. package/components/bbum/_single-post-preview.scss +2 -2
  54. package/components/bbum/_user-profile.scss +2 -3
  55. package/components/ui-builder/_ui-builder.scss +76 -1
  56. package/components/ui-builder/_vue-open-api.scss +104 -0
  57. package/layouts/_all.scss +2 -0
  58. package/layouts/_code-preview.scss +5 -2
  59. package/main.scss +6 -54
  60. package/package.json +4 -7
  61. package/plugins/caching.ts +243 -0
  62. package/plugins/theme.js +4 -0
  63. package/plugins/time-convert.js +49 -0
  64. package/plugins/vue-toaster.js +3 -0
  65. package/vue-components/v2/banner/Banner.vue +2 -2
  66. package/vue-components/v2/breadcrumbs/Breadcrumb.vue +97 -0
  67. package/vue-components/v2/button/Button.vue +5 -0
  68. package/vue-components/v2/button/DownloadBtn.vue +45 -0
  69. package/vue-components/v2/card/Card.vue +1 -0
  70. package/vue-components/v2/card/PaymentCards.vue +11 -2
  71. package/vue-components/v2/content/ContentTable.vue +12 -7
  72. package/vue-components/v2/editor/Editor.vue +43 -24
  73. package/vue-components/v2/editor/FilteredFileEditor.vue +189 -0
  74. package/vue-components/v2/editor/MonacoEditor.vue +125 -0
  75. package/vue-components/v2/editor/ResourceKeyValueEditor.vue +209 -0
  76. package/vue-components/v2/form-fields/Input.vue +1 -1
  77. package/vue-components/v2/loaders/ResourceLoader.vue +101 -0
  78. package/vue-components/v2/loaders/SidebarLoader.vue +43 -0
  79. package/vue-components/v2/modal/Modal.vue +38 -4
  80. package/vue-components/v2/modals/DeleteConfirmationModal.vue +79 -0
  81. package/vue-components/v2/modals/JsonShowModal.vue +12 -2
  82. package/vue-components/v2/navbar/Appdrawer.vue +10 -9
  83. package/vue-components/v2/navbar/ThemeMode.vue +50 -44
  84. package/vue-components/v2/navbar/User.vue +229 -17
  85. package/vue-components/v2/notification/Notification.vue +101 -0
  86. package/vue-components/v2/notification/NotificationItem.vue +44 -0
  87. package/vue-components/v2/pagination/Pagination.vue +16 -3
  88. package/vue-components/v2/preloader/Preloader.vue +5 -5
  89. package/vue-components/v2/sidebar/ClusterSwitcher.vue +126 -0
  90. package/vue-components/v2/sidebar/SidebarItem.vue +23 -1
  91. package/vue-components/v2/sidebar/SidebarItemWithDropDown.vue +19 -20
  92. package/vue-components/v2/tab/TabItem.vue +1 -1
  93. package/vue-components/v2/table/Table.vue +44 -8
  94. package/vue-components/v2/table/TableRow.vue +12 -2
  95. package/vue-components/v2/table/table-cell/CellValue.vue +33 -4
  96. package/vue-components/v2/table/table-cell/GenericCell.vue +56 -0
  97. package/vue-components/v2/table/table-cell/ObjectCell.vue +4 -1
  98. package/vue-components/v2/tabs/EditorTabs.vue +1 -1
  99. package/vue-components/v3/button/Button.vue +6 -1
  100. package/vue-components/v3/content/ContentHeader.vue +2 -1
  101. package/vue-components/v3/content/ContentTable.vue +20 -2
  102. package/vue-components/v3/editor/Editor.vue +42 -33
  103. package/vue-components/v3/editor/FilteredFileEditor.vue +186 -0
  104. package/vue-components/v3/editor/MonacoEditor.vue +131 -0
  105. package/vue-components/v3/editor/ResourceKeyValueEditor.vue +125 -0
  106. package/vue-components/v3/form/Form.vue +63 -0
  107. package/vue-components/v3/form-fields/Input.vue +11 -10
  108. package/vue-components/v3/header/HeaderItem.vue +5 -0
  109. package/vue-components/v3/header/HeaderItems.vue +5 -0
  110. package/vue-components/v3/loaders/ResourceLoader.vue +83 -0
  111. package/vue-components/v3/loaders/SidebarLoader.vue +34 -0
  112. package/vue-components/v3/long-running-tasks/LongRunningTaskItem.vue +92 -0
  113. package/vue-components/v3/modal/Modal.vue +38 -6
  114. package/vue-components/v3/modals/DeleteConfirmationModal.vue +85 -0
  115. package/vue-components/v3/modals/JsonShowModal.vue +25 -16
  116. package/vue-components/v3/modals/LongRunningTasksModal.vue +337 -0
  117. package/vue-components/v3/navbar/Appdrawer.vue +12 -7
  118. package/vue-components/v3/navbar/ThemeMode.vue +49 -47
  119. package/vue-components/v3/navbar/User.vue +242 -18
  120. package/vue-components/v3/notification/Notification.vue +98 -0
  121. package/vue-components/v3/notification/NotificationItem.vue +52 -0
  122. package/vue-components/v3/pagination/Pagination.vue +16 -3
  123. package/vue-components/v3/sidebar/ClusterSwitcher.vue +133 -0
  124. package/vue-components/v3/sidebar/SidebarItemWithDropDown.vue +120 -0
  125. package/vue-components/v3/tab/TabItem.vue +1 -1
  126. package/vue-components/v3/table/MultiInfoTable.vue +143 -0
  127. package/vue-components/v3/table/Table.vue +47 -13
  128. package/vue-components/v3/table/TableContainer.vue +34 -0
  129. package/vue-components/v3/table/TableRow.vue +64 -3
  130. package/vue-components/v3/table/table-cell/CellValue.vue +28 -3
  131. package/vue-components/v3/table/table-cell/GenericCell.vue +75 -0
  132. package/vue-components/v3/table/table-cell/ObjectCell.vue +7 -2
  133. package/vue-components/v3/tabs/EditorTabs.vue +1 -1
  134. package/vue-components/v3/terminal/LongRunningTaskTerminal.vue +148 -0
@@ -0,0 +1,120 @@
1
+ <template>
2
+ <li :class="`is-${dropDownStatus}`">
3
+ <a class="ac-dropdown-button" :title="title" @click="toggleDropDownStatus">
4
+ <span>
5
+ <img :src="icon" alt="icon" />
6
+ </span>
7
+ <strong>{{ title || "-" }}</strong>
8
+ <span class="ac-arrow-down">
9
+ <i class="fa fa-angle-down" aria-hidden="true"> </i>
10
+ </span>
11
+ </a>
12
+
13
+ <ul ref="sectionItems" :style="{ maxHeight: dropDownSectionHeight }">
14
+ <slot />
15
+ </ul>
16
+ </li>
17
+ </template>
18
+
19
+ <script>
20
+ import { defineComponent } from "vue";
21
+
22
+ export default defineComponent({
23
+ props: {
24
+ isDropDownOpen: {
25
+ type: Boolean,
26
+ default: false,
27
+ },
28
+ title: {
29
+ type: String,
30
+ default: "Sidebar Item",
31
+ },
32
+ icon: {
33
+ type: String,
34
+ default: "@/assets/images/icons/basic.svg",
35
+ },
36
+ },
37
+
38
+ emits: ["dropDownItemChange"],
39
+
40
+ data() {
41
+ return {
42
+ dropDownStatus: "close",
43
+ dropDownSectionHeight: null,
44
+ isCompMounted: false,
45
+ };
46
+ },
47
+
48
+ mounted() {
49
+ this.isCompMounted = true;
50
+ setTimeout(() => {
51
+ // for expanding dropdown
52
+ if (this.isDropDownOpen) {
53
+ this.setDropdownMaxHeight("open");
54
+ } else {
55
+ this.setDropdownMaxHeight("close");
56
+ }
57
+ }, 700);
58
+ },
59
+
60
+ watch: {
61
+ title(n, o) {
62
+ if (n && this.isCompMounted) {
63
+ this.$nextTick(() => {
64
+ // for expanding dropdown
65
+ this.setDropdownMaxHeight("open");
66
+ });
67
+ }
68
+
69
+ if (o && this.isCompMounted) {
70
+ this.$nextTick(() => {
71
+ // for expanding dropdown
72
+ this.setDropdownMaxHeight("close");
73
+ });
74
+ }
75
+ },
76
+ isDropDownOpen: {
77
+ immediate: true,
78
+ handler(n) {
79
+ if (n) {
80
+ this.dropDownStatus = "open";
81
+ } else this.dropDownStatus = "close";
82
+ },
83
+ },
84
+ dropDownStatus: {
85
+ immediate: true,
86
+ handler(n) {
87
+ if (n === "open") {
88
+ // emit event to close other drop down items
89
+ this.$emit("dropDownItemChange");
90
+
91
+ this.$nextTick(() => {
92
+ const dropDownUl = this.$refs["sectionItems"];
93
+ // debugger;
94
+ if (dropDownUl)
95
+ this.dropDownSectionHeight = `${dropDownUl.scrollHeight}px`;
96
+ });
97
+ } else {
98
+ // emit event to close other drop down items
99
+ this.dropDownSectionHeight = null;
100
+ }
101
+ },
102
+ },
103
+ },
104
+
105
+ methods: {
106
+ setDropdownMaxHeight(mode) {
107
+ if (mode === "open") {
108
+ this.dropDownSectionHeight = `${this.$refs["sectionItems"].scrollHeight}px`;
109
+ } else {
110
+ this.dropDownSectionHeight = null;
111
+ }
112
+ },
113
+ toggleDropDownStatus() {
114
+ if (this.dropDownStatus === "open") {
115
+ this.dropDownStatus = "close";
116
+ } else this.dropDownStatus = "open";
117
+ },
118
+ },
119
+ });
120
+ </script>
@@ -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>
@@ -0,0 +1,143 @@
1
+ <template>
2
+ <table-container>
3
+ <table
4
+ class="table ac-info-table is-fullwidth"
5
+ :class="{ 'pl-0 pr-0': removeContentPadding }"
6
+ >
7
+ <tbody v-if="isFullTableLoaderActive">
8
+ <table-row v-for="i in loaderCols" :key="i">
9
+ <table-cell>
10
+ <cell-value :is-loader-active="true" />
11
+ </table-cell>
12
+ <table-cell>
13
+ <cell-value :is-loader-active="true" />
14
+ </table-cell>
15
+ </table-row>
16
+ </tbody>
17
+ <tbody
18
+ v-else
19
+ :class="{
20
+ 'no-data-available has-text-centered p-10': isTableEmpty,
21
+ 'pl-0 pr-0': removeContentPadding,
22
+ }"
23
+ >
24
+ <template v-if="!isTableEmpty">
25
+ <table-row
26
+ v-for="(tableHeader, idx) in tableHeaders"
27
+ :key="headerLabels[idx]"
28
+ >
29
+ <table-cell>
30
+ <slot :name="`table-cell-icon-${idx}`" />
31
+ {{ headerLabels[idx] }}
32
+ </table-cell>
33
+ <table-cell v-if="isLoaderActive">
34
+ <cell-value :is-loader-active="true" />
35
+ </table-cell>
36
+ <slot v-else :name="`slot-${idx}`" />
37
+ </table-row>
38
+ </template>
39
+
40
+ <empty-table-info v-else />
41
+ </tbody>
42
+ </table>
43
+
44
+ <!-- pagination start -->
45
+ <slot name="table-pagination" />
46
+ <!-- pagination end -->
47
+ </table-container>
48
+ </template>
49
+
50
+ <script>
51
+ import { defineComponent, defineAsyncComponent } from "vue";
52
+
53
+ export default defineComponent({
54
+ props: {
55
+ isLoaderActive: {
56
+ type: Boolean,
57
+ default: false,
58
+ },
59
+ isTableEmpty: {
60
+ type: Boolean,
61
+ default: true,
62
+ },
63
+ tableHeaders: {
64
+ type: Array,
65
+ default: () => [],
66
+ },
67
+ removeContentPadding: {
68
+ type: Boolean,
69
+ default: false,
70
+ },
71
+ },
72
+
73
+ components: {
74
+ TableContainer: defineAsyncComponent(() =>
75
+ import("../../v2/table/TableContainer.vue").then(
76
+ (module) => module.default
77
+ )
78
+ ),
79
+ EmptyTableInfo: defineAsyncComponent(() =>
80
+ import("../../v2/table/EmptyTableInfo.vue").then(
81
+ (module) => module.default
82
+ )
83
+ ),
84
+ TableRow: defineAsyncComponent(() =>
85
+ import("./TableRow.vue").then((module) => module.default)
86
+ ),
87
+ TableCell: defineAsyncComponent(() =>
88
+ import("./TableCell.vue").then((module) => module.default)
89
+ ),
90
+ CellValue: defineAsyncComponent(() =>
91
+ import("./table-cell/CellValue.vue").then((module) => module.default)
92
+ ),
93
+ },
94
+
95
+ data() {
96
+ return {
97
+ loaderCols: 5,
98
+ headerSortables: [],
99
+ };
100
+ },
101
+
102
+ computed: {
103
+ isFullTableLoaderActive() {
104
+ return !this.tableHeaders.length;
105
+ },
106
+ headerLabels() {
107
+ return this.tableHeaders.map((th) =>
108
+ typeof th === "string" ? th : th?.name || "Label"
109
+ );
110
+ },
111
+ },
112
+
113
+ watch: {
114
+ tableHeaders: {
115
+ immediate: true,
116
+ handler(n) {
117
+ if (this.headerSortables.length === n.length) {
118
+ n.forEach((th, idx) => {
119
+ if (this.headerSortables[idx].enabled !== !!th?.sort?.enable) {
120
+ this.headerSortables[idx].enabled = !!th?.sort?.enable;
121
+ this.headerSortables[idx].mode = "";
122
+ }
123
+ });
124
+ } else {
125
+ this.headerSortables = n.map((th) => {
126
+ if (typeof th === "string") {
127
+ return {
128
+ enabled: false,
129
+ mode: "",
130
+ };
131
+ } else {
132
+ return {
133
+ enabled: !!th?.sort?.enable,
134
+ mode: "",
135
+ };
136
+ }
137
+ });
138
+ }
139
+ },
140
+ },
141
+ },
142
+ });
143
+ </script>
@@ -1,14 +1,16 @@
1
1
  <template>
2
- <table-container>
2
+ <table-container ref="ac-table-container" @scroller="handleScroller">
3
3
  <table
4
4
  ref="ac-table"
5
- class="table ac-table ac-striped"
5
+ class="table ac-table"
6
6
  :class="{
7
7
  'is-fullwidth':
8
8
  !isDynamicWidthTable ||
9
9
  isFullTableLoaderActive ||
10
10
  isTableEmpty ||
11
11
  isLoaderActive,
12
+ 'ac-striped': !columnStriped,
13
+ 'ac-label-texted': columnStriped,
12
14
  }"
13
15
  >
14
16
  <thead>
@@ -18,6 +20,7 @@
18
20
  </th>
19
21
  </table-row>
20
22
  <table-row v-else>
23
+ <th v-if="collapsible" style="width: 20px" />
21
24
  <th
22
25
  v-for="(tableHeader, idx) in tableHeaders"
23
26
  :key="idx"
@@ -25,10 +28,33 @@
25
28
  sorting: headerSortables[idx].enabled,
26
29
  'sorting-desc': headerSortables[idx].mode === 'desc',
27
30
  'sorting-asc': headerSortables[idx].mode === 'asc',
31
+ 'has-text-centered':
32
+ typeof tableHeader === 'string'
33
+ ? false
34
+ : tableHeader.textAlign === 'center',
35
+ 'has-text-left':
36
+ typeof tableHeader === 'string'
37
+ ? false
38
+ : tableHeader.textAlign === 'left',
39
+ 'has-text-right':
40
+ typeof tableHeader === 'string'
41
+ ? false
42
+ : tableHeader.textAlign === 'right',
28
43
  }"
29
44
  @click.prevent="headerSortables[idx].enabled && emitSortEvent(idx)"
30
45
  >
31
46
  {{ headerLabels[idx] }}
47
+ <span
48
+ v-if="
49
+ tableHeader.dashboard &&
50
+ tableHeader.dashboard.status &&
51
+ tableHeader.dashboard.status !== 'Success'
52
+ "
53
+ :title="tableHeader.dashboard && tableHeader.dashboard.message"
54
+ class="icon has-text-danger"
55
+ >
56
+ <i class="fa fa-exclamation-triangle" />
57
+ </span>
32
58
  </th>
33
59
  <th
34
60
  ref="action-section"
@@ -104,6 +130,10 @@ export default defineComponent({
104
130
  type: Array,
105
131
  default: () => [],
106
132
  },
133
+ collapsible: {
134
+ type: Boolean,
135
+ default: false,
136
+ },
107
137
  actionable: {
108
138
  type: Boolean,
109
139
  default: false,
@@ -116,13 +146,15 @@ export default defineComponent({
116
146
  type: Number,
117
147
  default: 1920,
118
148
  },
149
+ columnStriped: {
150
+ type: Boolean,
151
+ default: false,
152
+ },
119
153
  },
120
- emits: ["sort"],
154
+ emits: ["sort", "scroller"],
121
155
  components: {
122
156
  TableContainer: defineAsyncComponent(() =>
123
- import("../../v2/table/TableContainer.vue").then(
124
- (module) => module.default
125
- )
157
+ import("./TableContainer.vue").then((module) => module.default)
126
158
  ),
127
159
  TableRow: defineAsyncComponent(() =>
128
160
  import("./TableRow.vue").then((module) => module.default)
@@ -165,7 +197,7 @@ export default defineComponent({
165
197
  },
166
198
  headerLabels() {
167
199
  return this.tableHeaders.map((th) =>
168
- typeof th === "string" ? th : th?.label || "Label"
200
+ typeof th === "string" ? th : th?.name || "Label"
169
201
  );
170
202
  },
171
203
  },
@@ -176,8 +208,8 @@ export default defineComponent({
176
208
  handler(n) {
177
209
  if (this.headerSortables.length === n.length) {
178
210
  n.forEach((th, idx) => {
179
- if (this.headerSortables[idx].enabled !== !!th?.sortable) {
180
- this.headerSortables[idx].enabled = !!th?.sortable;
211
+ if (this.headerSortables[idx].enabled !== !!th?.sort?.enable) {
212
+ this.headerSortables[idx].enabled = !!th?.sort?.enable;
181
213
  this.headerSortables[idx].mode = "";
182
214
  }
183
215
  });
@@ -190,7 +222,7 @@ export default defineComponent({
190
222
  };
191
223
  } else {
192
224
  return {
193
- enabled: !!th?.sortable,
225
+ enabled: !!th?.sort?.enable,
194
226
  mode: "",
195
227
  };
196
228
  }
@@ -199,7 +231,6 @@ export default defineComponent({
199
231
  },
200
232
  },
201
233
  },
202
-
203
234
  updated() {
204
235
  this.$nextTick(() => {
205
236
  this.onWindowResize();
@@ -207,9 +238,12 @@ export default defineComponent({
207
238
  },
208
239
 
209
240
  methods: {
241
+ handleScroller(value) {
242
+ this.$emit("scroller", value);
243
+ },
210
244
  onWindowResize() {
211
245
  if (this.$refs["ac-table"] && this.isDynamicWidthTable) {
212
- const tableWidth = this.$refs["ac-table"].clientWidth;
246
+ const tableWidth = this.$refs["ac-table"]?.clientWidth;
213
247
  const d = this.fullWidth - tableWidth;
214
248
  this.fakeCellWidth = d;
215
249
  }
@@ -217,7 +251,7 @@ export default defineComponent({
217
251
  emitSortEvent(index) {
218
252
  const emitValue = {
219
253
  index,
220
- label: this.tableHeaders[index].label,
254
+ label: this.tableHeaders[index].name,
221
255
  mode: "",
222
256
  };
223
257
 
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <div class="ac-table-container table-container" ref="tableContainer">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script lang="ts">
8
+ import { emit } from 'process'
9
+ import { defineComponent, ref, onMounted, nextTick } from 'vue'
10
+
11
+ export default defineComponent({
12
+ emits: ['scroller'],
13
+
14
+ setup(props, { emit }) {
15
+ const tableContainer = ref(null)
16
+
17
+ function isScrollerShowing() {
18
+ return tableContainer.value?.scrollWidth > tableContainer.value?.clientWidth
19
+ }
20
+
21
+ onMounted(() => {
22
+ setTimeout(() => {
23
+ nextTick(() => {
24
+ emit('scroller', isScrollerShowing())
25
+ })
26
+ }, 50)
27
+ })
28
+
29
+ return {
30
+ tableContainer,
31
+ }
32
+ },
33
+ })
34
+ </script>
@@ -6,7 +6,19 @@
6
6
  custom
7
7
  v-slot="{ navigate }"
8
8
  >
9
- <tr @click="navigate" v-bind="$attrs">
9
+ <tr
10
+ class="is-link"
11
+ @click="navigate"
12
+ v-bind="$attrs"
13
+ data-testid="ac-table-row"
14
+ >
15
+ <table-cell v-if="collapsible">
16
+ <collapsible-button
17
+ @click.stop="toggleCollapse"
18
+ modifier-classes="is-square is-light height-20 width-20 is-rounded is-size-7"
19
+ :icon-class="isCollapsed ? 'chevron-right' : 'chevron-down'"
20
+ />
21
+ </table-cell>
10
22
  <slot />
11
23
  <fake-table-cell
12
24
  v-if="fakeCellWidth > 0"
@@ -16,15 +28,33 @@
16
28
  </router-link>
17
29
  <tr
18
30
  v-else
19
- :class="{ 'is-selected': isSelected, 'is-hoverless': !isSelected }"
31
+ v-bind="$attrs"
32
+ :class="{
33
+ 'is-selected': isSelected,
34
+ 'is-hoverless': !isSelected,
35
+ 'is-disabled': isDisabled,
36
+ }"
37
+ data-testid="ac-table-row"
20
38
  @click.prevent="$emit('rowselect', true)"
21
39
  >
40
+ <table-cell v-if="collapsible">
41
+ <collapsible-button
42
+ @click.stop="toggleCollapse"
43
+ modifier-classes="is-square is-light height-20 width-20 is-rounded is-size-7"
44
+ :icon-class="isCollapsed ? 'chevron-right' : 'chevron-down'"
45
+ />
46
+ </table-cell>
22
47
  <slot />
23
48
  <fake-table-cell
24
49
  v-if="fakeCellWidth > 0"
25
50
  :fake-cell-width="fakeCellWidth"
26
51
  />
27
52
  </tr>
53
+ <tr v-if="collapsible && !isCollapsed" v-bind="$attrs">
54
+ <table-cell colspan="1000" class="table-inner-shadow">
55
+ <slot name="collapsible-content" />
56
+ </table-cell>
57
+ </tr>
28
58
  </template>
29
59
 
30
60
  <script>
@@ -40,13 +70,21 @@ export default defineComponent({
40
70
  type: Boolean,
41
71
  default: false,
42
72
  },
73
+ isDisabled: {
74
+ type: Boolean,
75
+ default: false,
76
+ },
43
77
  fakeCellWidth: {
44
78
  type: Number,
45
79
  default: 0,
46
80
  },
81
+ collapsible: {
82
+ type: Boolean,
83
+ default: false,
84
+ },
47
85
  },
48
86
 
49
- emits: ["rowselect"],
87
+ emits: ["rowselect", "rowexpand", "rowcollapse"],
50
88
 
51
89
  components: {
52
90
  TableCell: defineAsyncComponent(() =>
@@ -55,6 +93,29 @@ export default defineComponent({
55
93
  FakeTableCell: defineAsyncComponent(() =>
56
94
  import("./FakeTableCell.vue").then((module) => module.default)
57
95
  ),
96
+ CollapsibleButton: defineAsyncComponent(() =>
97
+ import("../button/Button.vue")
98
+ ),
99
+ },
100
+
101
+ data() {
102
+ return {
103
+ isCollapsed: true,
104
+ };
105
+ },
106
+
107
+ methods: {
108
+ toggleCollapse() {
109
+ this.isCollapsed = !this.isCollapsed;
110
+ if (!this.isCollapsed) {
111
+ this.$emit("rowexpand", this.collapseRow);
112
+ } else {
113
+ this.$emit("rowcollapse");
114
+ }
115
+ },
116
+ collapseRow() {
117
+ this.isCollapsed = true;
118
+ },
58
119
  },
59
120
  });
60
121
  </script>
@@ -4,23 +4,27 @@
4
4
  :view-box="`0 0 ${computedCellWidth || 300} 10`"
5
5
  :speed="2"
6
6
  :key="computedCellWidth"
7
+ :primaryColor="primaryColor"
8
+ :secondaryColor="secondaryColor"
7
9
  />
8
10
  </div>
9
- <div v-else class="haha" ref="cellDiv">
11
+ <div v-else ref="cellDiv">
10
12
  <object-cell
11
13
  v-if="valueType === 'object'"
12
14
  :obj="value"
13
15
  :cell-title="cellTitle"
14
16
  :max-character-length="maxCharacterLength"
17
+ data-testid="object-cell-value"
15
18
  />
16
19
  <array-cell
17
20
  v-else-if="valueType === 'array'"
18
21
  :items="value"
19
22
  :cell-title="cellTitle"
20
23
  :max-character-length="maxCharacterLength"
24
+ data-testid="array-cell-value"
21
25
  />
22
26
  <template v-else>
23
- <span class="is-ellipsis-1" :title="value">{{
27
+ <span class="is-ellipsis-1" :title="tooltip" data-testid="cell-value">{{
24
28
  value || (value === 0 ? 0 : "-")
25
29
  }}</span>
26
30
  </template>
@@ -29,6 +33,12 @@
29
33
 
30
34
  <script>
31
35
  import { defineComponent, defineAsyncComponent } from "vue";
36
+ import {
37
+ loaderLightThemePrimaryColor,
38
+ loaderDarkThemePrimaryColor,
39
+ loaderLightThemeSecondaryColor,
40
+ loaderDarkThemeSecondaryColor,
41
+ } from "@appscode/design-system/plugins/theme";
32
42
 
33
43
  export default defineComponent({
34
44
  props: {
@@ -44,6 +54,10 @@ export default defineComponent({
44
54
  type: null,
45
55
  default: "",
46
56
  },
57
+ tooltip: {
58
+ type: String,
59
+ defualt: "",
60
+ },
47
61
  },
48
62
  components: {
49
63
  ContentLoader: defineAsyncComponent(() =>
@@ -60,13 +74,24 @@ export default defineComponent({
60
74
  computed: {
61
75
  valueType() {
62
76
  if (typeof this.value === "object") {
63
- if (Array.isArray(this.value)) return "array";
77
+ if (this.value === null) return "null";
78
+ else if (Array.isArray(this.value)) return "array";
64
79
  else return "object";
65
80
  } else return typeof this.value;
66
81
  },
67
82
  maxCharacterLength() {
68
83
  return Math.ceil(this.computedCellWidth / 8);
69
84
  },
85
+ primaryColor() {
86
+ return document.documentElement.classList.contains("is-dark-theme")
87
+ ? loaderDarkThemePrimaryColor
88
+ : loaderLightThemePrimaryColor;
89
+ },
90
+ secondaryColor() {
91
+ return document.documentElement.classList.contains("is-dark-theme")
92
+ ? loaderDarkThemeSecondaryColor
93
+ : loaderLightThemeSecondaryColor;
94
+ },
70
95
  },
71
96
 
72
97
  data() {