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

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 (103) hide show
  1. package/base/utilities/_all.scss +8 -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/_extended.scss +38 -0
  6. package/base/utilities/_grid.scss +29 -0
  7. package/base/utilities/_initial-variables.scss +14 -10
  8. package/base/utilities/_typography.scss +6 -12
  9. package/base/utilities/dark-theme.scss +1 -0
  10. package/components/_ac-accordion.scss +14 -5
  11. package/components/_ac-alert-box.scss +32 -6
  12. package/components/_ac-card.scss +17 -5
  13. package/components/_ac-drag.scss +2 -0
  14. package/components/_ac-input.scss +19 -11
  15. package/components/_ac-modal.scss +1 -1
  16. package/components/_ac-multi-select.scss +60 -4
  17. package/components/_ac-report.scss +53 -0
  18. package/components/_ac-table.scss +60 -2
  19. package/components/_ac-tabs.scss +16 -2
  20. package/components/_ac-tags.scss +85 -0
  21. package/components/_ac-terminal.scss +1 -3
  22. package/components/_all.scss +29 -0
  23. package/components/_basic-card.scss +128 -0
  24. package/components/_buttons.scss +14 -33
  25. package/components/_dashboard-header.scss +32 -0
  26. package/components/_left-sidebar-menu.scss +9 -9
  27. package/components/_navbar.scss +89 -4
  28. package/components/_preview-modal.scss +14 -1
  29. package/components/_transitions.scss +296 -0
  30. package/components/_wizard.scss +1 -0
  31. package/components/bbum/_all.scss +9 -0
  32. package/components/bbum/_single-post-preview.scss +1 -1
  33. package/components/ui-builder/_ui-builder.scss +65 -1
  34. package/components/ui-builder/_vue-open-api.scss +6 -0
  35. package/layouts/_all.scss +2 -0
  36. package/layouts/_code-preview.scss +5 -2
  37. package/main.scss +5 -56
  38. package/package.json +4 -2
  39. package/plugins/caching.ts +243 -0
  40. package/plugins/time-convert.js +49 -0
  41. package/plugins/vue-toaster.js +3 -0
  42. package/vue-components/v2/banner/Banner.vue +2 -2
  43. package/vue-components/v2/breadcrumbs/Breadcrumb.vue +97 -0
  44. package/vue-components/v2/button/Button.vue +5 -0
  45. package/vue-components/v2/button/DownloadBtn.vue +45 -0
  46. package/vue-components/v2/card/Card.vue +1 -0
  47. package/vue-components/v2/content/ContentTable.vue +10 -0
  48. package/vue-components/v2/editor/Editor.vue +37 -24
  49. package/vue-components/v2/editor/FilteredFileEditor.vue +189 -0
  50. package/vue-components/v2/editor/MonacoEditor.vue +125 -0
  51. package/vue-components/v2/editor/ResourceKeyValueEditor.vue +209 -0
  52. package/vue-components/v2/form-fields/Input.vue +1 -1
  53. package/vue-components/v2/loaders/ResourceLoader.vue +101 -0
  54. package/vue-components/v2/loaders/SidebarLoader.vue +43 -0
  55. package/vue-components/v2/modal/Modal.vue +31 -5
  56. package/vue-components/v2/modals/DeleteConfirmationModal.vue +79 -0
  57. package/vue-components/v2/modals/JsonShowModal.vue +12 -2
  58. package/vue-components/v2/navbar/User.vue +229 -17
  59. package/vue-components/v2/notification/Notification.vue +101 -0
  60. package/vue-components/v2/notification/NotificationItem.vue +44 -0
  61. package/vue-components/v2/pagination/Pagination.vue +16 -3
  62. package/vue-components/v2/preloader/Preloader.vue +1 -1
  63. package/vue-components/v2/sidebar/SidebarItemWithDropDown.vue +19 -20
  64. package/vue-components/v2/tab/TabItem.vue +1 -1
  65. package/vue-components/v2/table/Table.vue +49 -8
  66. package/vue-components/v2/table/TableRow.vue +12 -2
  67. package/vue-components/v2/table/table-cell/CellValue.vue +29 -9
  68. package/vue-components/v2/table/table-cell/GenericCell.vue +56 -0
  69. package/vue-components/v2/table/table-cell/ObjectCell.vue +4 -1
  70. package/vue-components/v3/button/Button.vue +6 -1
  71. package/vue-components/v3/content/ContentHeader.vue +2 -1
  72. package/vue-components/v3/content/ContentTable.vue +25 -2
  73. package/vue-components/v3/editor/Editor.vue +36 -33
  74. package/vue-components/v3/editor/FilteredFileEditor.vue +186 -0
  75. package/vue-components/v3/editor/MonacoEditor.vue +131 -0
  76. package/vue-components/v3/editor/ResourceKeyValueEditor.vue +125 -0
  77. package/vue-components/v3/form/Form.vue +63 -0
  78. package/vue-components/v3/form-fields/Input.vue +11 -10
  79. package/vue-components/v3/header/HeaderItem.vue +5 -0
  80. package/vue-components/v3/header/HeaderItems.vue +5 -0
  81. package/vue-components/v3/loaders/ResourceLoader.vue +83 -0
  82. package/vue-components/v3/loaders/SidebarLoader.vue +34 -0
  83. package/vue-components/v3/long-running-tasks/LongRunningTaskItem.vue +92 -0
  84. package/vue-components/v3/modal/Modal.vue +35 -7
  85. package/vue-components/v3/modals/DeleteConfirmationModal.vue +85 -0
  86. package/vue-components/v3/modals/JsonShowModal.vue +25 -16
  87. package/vue-components/v3/modals/LongRunningTasksModal.vue +400 -0
  88. package/vue-components/v3/navbar/ThemeMode.vue +41 -49
  89. package/vue-components/v3/navbar/User.vue +242 -18
  90. package/vue-components/v3/notification/AlertBox.vue +61 -0
  91. package/vue-components/v3/notification/Notification.vue +98 -0
  92. package/vue-components/v3/notification/NotificationItem.vue +52 -0
  93. package/vue-components/v3/pagination/Pagination.vue +16 -3
  94. package/vue-components/v3/sidebar/SidebarItemWithDropDown.vue +120 -0
  95. package/vue-components/v3/tab/TabItem.vue +1 -1
  96. package/vue-components/v3/table/MultiInfoTable.vue +143 -0
  97. package/vue-components/v3/table/Table.vue +55 -14
  98. package/vue-components/v3/table/TableContainer.vue +34 -0
  99. package/vue-components/v3/table/TableRow.vue +93 -6
  100. package/vue-components/v3/table/table-cell/CellValue.vue +23 -7
  101. package/vue-components/v3/table/table-cell/GenericCell.vue +75 -0
  102. package/vue-components/v3/table/table-cell/ObjectCell.vue +7 -2
  103. package/vue-components/v3/terminal/LongRunningTaskTerminal.vue +148 -0
@@ -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
 
@@ -6,7 +6,7 @@
6
6
  custom
7
7
  v-slot="{ navigate }"
8
8
  >
9
- <tr class="is-link" @click="navigate">
9
+ <tr class="is-link" @click="navigate" data-testid="ac-table-row">
10
10
  <slot />
11
11
  <fake-table-cell
12
12
  v-if="fakeCellWidth > 0"
@@ -14,9 +14,15 @@
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
+ }"
25
+ data-testid="ac-table-row"
20
26
  @click.prevent="$emit('rowselect', true)"
21
27
  >
22
28
  <slot />
@@ -38,6 +44,10 @@ export default {
38
44
  type: Boolean,
39
45
  default: false,
40
46
  },
47
+ isDisabled: {
48
+ type: Boolean,
49
+ default: false,
50
+ },
41
51
  fakeCellWidth: {
42
52
  type: Number,
43
53
  default: 0,
@@ -1,23 +1,29 @@
1
1
  <template>
2
2
  <div v-if="isLoaderActive" ref="cellLoaderDiv" :style="{ maxWidth: '300px' }">
3
- <content-loader :height="10" :width="computedCellWidth || 300" :primaryColor="primaryColor"
4
- :secondaryColor="secondaryColor" />
3
+ <content-loader
4
+ :height="10"
5
+ :width="computedCellWidth || 300"
6
+ :primaryColor="primaryColor"
7
+ :secondaryColor="secondaryColor"
8
+ />
5
9
  </div>
6
- <div v-else class="haha" ref="cellDiv">
10
+ <div v-else ref="cellDiv">
7
11
  <object-cell
8
12
  v-if="valueType === 'object'"
9
13
  :obj="value"
10
14
  :cell-title="cellTitle"
11
15
  :max-character-length="maxCharacterLength"
16
+ data-testid="object-cell-value"
12
17
  />
13
18
  <array-cell
14
19
  v-else-if="valueType === 'array'"
15
20
  :items="value"
16
21
  :cell-title="cellTitle"
17
22
  :max-character-length="maxCharacterLength"
23
+ data-testid="array-cell-value"
18
24
  />
19
25
  <template v-else>
20
- <span class="is-ellipsis-1" :title="value">{{
26
+ <span class="is-ellipsis-1" :title="tooltip" data-testid="cell-value">{{
21
27
  value || (value === 0 ? 0 : "-")
22
28
  }}</span>
23
29
  </template>
@@ -25,7 +31,12 @@
25
31
  </template>
26
32
 
27
33
  <script>
28
- import {loaderLightThemePrimaryColor, loaderDarkThemePrimaryColor, loaderLightThemeSecondaryColor, loaderDarkThemeSecondaryColor} from "@appscode/design-system/plugins/theme";
34
+ import {
35
+ loaderLightThemePrimaryColor,
36
+ loaderDarkThemePrimaryColor,
37
+ loaderLightThemeSecondaryColor,
38
+ loaderDarkThemeSecondaryColor,
39
+ } from "@appscode/design-system/plugins/theme";
29
40
 
30
41
  export default {
31
42
  props: {
@@ -41,6 +52,10 @@ export default {
41
52
  type: null,
42
53
  default: "",
43
54
  },
55
+ tooltip: {
56
+ type: String,
57
+ defualt: "",
58
+ },
44
59
  },
45
60
  components: {
46
61
  ContentLoader: () =>
@@ -52,7 +67,8 @@ export default {
52
67
  computed: {
53
68
  valueType() {
54
69
  if (typeof this.value === "object") {
55
- if (Array.isArray(this.value)) return "array";
70
+ if (this.value === null) return "null";
71
+ else if (Array.isArray(this.value)) return "array";
56
72
  else return "object";
57
73
  } else return typeof this.value;
58
74
  },
@@ -60,11 +76,15 @@ export default {
60
76
  return Math.ceil(this.computedCellWidth / 8);
61
77
  },
62
78
  primaryColor() {
63
- return document.documentElement.classList.contains("is-dark-theme") ? loaderDarkThemePrimaryColor : loaderLightThemePrimaryColor;
79
+ return document.documentElement.classList.contains("is-dark-theme")
80
+ ? loaderDarkThemePrimaryColor
81
+ : loaderLightThemePrimaryColor;
64
82
  },
65
83
  secondaryColor() {
66
- return document.documentElement.classList.contains("is-dark-theme") ? loaderDarkThemeSecondaryColor : loaderLightThemeSecondaryColor;
67
- }
84
+ return document.documentElement.classList.contains("is-dark-theme")
85
+ ? loaderDarkThemeSecondaryColor
86
+ : loaderLightThemeSecondaryColor;
87
+ },
68
88
  },
69
89
 
70
90
  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;
@@ -4,12 +4,13 @@
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
10
11
  v-if="iconImage"
11
12
  :src="iconImage"
12
- alt="close-icon"
13
+ alt="icon"
13
14
  :width="iconImageWidth"
14
15
  />
15
16
  <i v-else :class="`fa fa-${iconClass}`" aria-hidden="true" />
@@ -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,
@@ -4,9 +4,10 @@
4
4
  <div class="ac-cheader-left">
5
5
  <!-- title -->
6
6
  <div class="ac-content-title">
7
- <h6>
7
+ <h6 class="is-flex">
8
8
  <slot name="header-icon" />
9
9
  {{ headerTitle }}
10
+ <slot name="title-right-actions" />
10
11
  </h6>
11
12
  <p v-if="headerSubTitle">{{ headerSubTitle }}</p>
12
13
  </div>
@@ -2,18 +2,27 @@
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"
8
+ :remove-border-bottom="removeBorderBottom"
7
9
  :class="{ 'pl-0 pr-0': removeTableHeaderPadding }"
8
10
  >
11
+ <template #title-right-actions>
12
+ <slot name="title-right-actions" />
13
+ </template>
9
14
  <slot name="content-left-controls" />
10
15
  <header-item>
11
- <search-bar v-if="searchable" @search="searchText = $event" />
16
+ <search-bar v-if="searchable" @search="updateSearchText" />
12
17
  </header-item>
13
18
  <slot name="content-right-controls" />
14
19
  </content-header>
15
20
  </template>
16
- <slot name="content" :search-text="searchText" />
21
+ <slot
22
+ name="content"
23
+ :search-text="searchText"
24
+ :update-search-text="updateSearchText"
25
+ />
17
26
  </content-layout>
18
27
  </template>
19
28
 
@@ -38,6 +47,14 @@ export default defineComponent({
38
47
  type: Boolean,
39
48
  default: true,
40
49
  },
50
+ hideHeader: {
51
+ type: Boolean,
52
+ default: false,
53
+ },
54
+ removeBorderBottom: {
55
+ type: Boolean,
56
+ default: false,
57
+ },
41
58
  },
42
59
  components: {
43
60
  ContentLayout: defineAsyncComponent(() =>
@@ -61,5 +78,11 @@ export default defineComponent({
61
78
  searchText: "",
62
79
  };
63
80
  },
81
+
82
+ methods: {
83
+ updateSearchText(text) {
84
+ this.searchText = text;
85
+ },
86
+ },
64
87
  });
65
88
  </script>
@@ -7,7 +7,6 @@
7
7
  />
8
8
  <monaco-editor
9
9
  v-if="activeTab === 'edit'"
10
- ref="monacoEditor"
11
10
  @editorDidMount="onEditorMount"
12
11
  key="edit"
13
12
  :class="`vh-${editorHeight} is-clipped`"
@@ -16,13 +15,14 @@
16
15
  :language="language"
17
16
  :options="{
18
17
  minimap: {
19
- enabled: calcShowMinimap
18
+ enabled: calcShowMinimap,
20
19
  },
21
20
  theme: theme,
22
21
  readOnly: readOnly,
23
22
  wordWrap: wordWrap,
24
- scrollBeyondLastLine: false
23
+ scrollBeyondLastLine: false,
25
24
  }"
25
+ data-testid="monaco-editor-edit-section"
26
26
  />
27
27
  <monaco-editor
28
28
  v-if="activeTab === 'preview'"
@@ -32,54 +32,57 @@
32
32
  :language="language"
33
33
  :options="{
34
34
  minimap: {
35
- enabled: calcShowMinimap
35
+ enabled: calcShowMinimap,
36
36
  },
37
37
  theme: theme,
38
38
  readOnly: true,
39
39
  wordWrap: wordWrap,
40
- scrollBeyondLastLine: false
40
+ scrollBeyondLastLine: false,
41
41
  }"
42
42
  :original="originalEditorContent"
43
43
  :diff-editor="true"
44
+ data-testid="monaco-editor-preview-section"
44
45
  />
45
46
  </div>
46
47
  </template>
47
48
 
48
49
  <script>
49
50
  import { defineComponent, defineAsyncComponent, h } from "vue";
51
+ import Preloader from "../../v2/preloader/Preloader.vue";
52
+ import Banner from "../../v2/banner/Banner.vue";
50
53
  export default defineComponent({
51
54
  props: {
52
- value: {
55
+ modelValue: {
53
56
  type: String,
54
- default: ""
57
+ default: "",
55
58
  },
56
59
  originalValue: {
57
60
  type: String,
58
- default: ""
61
+ default: "",
59
62
  },
60
63
  readOnly: {
61
64
  type: Boolean,
62
- default: false
65
+ default: false,
63
66
  },
64
67
  language: {
65
68
  type: String,
66
- default: "yaml"
69
+ default: "yaml",
67
70
  },
68
71
  showMinimap: {
69
72
  type: Boolean,
70
- default: true
73
+ default: true,
71
74
  },
72
75
  editorHeight: {
73
76
  type: Number,
74
- default: 40
77
+ default: 40,
75
78
  },
76
79
  editorTheme: {
77
80
  type: String,
78
- default: ""
81
+ default: "",
79
82
  },
80
83
  wordWrap: {
81
84
  type: String,
82
- default: "off"
85
+ default: "off",
83
86
  },
84
87
  },
85
88
 
@@ -87,23 +90,24 @@ export default defineComponent({
87
90
 
88
91
  components: {
89
92
  EditorTabs: defineAsyncComponent(() =>
90
- import("../tabs/EditorTabs.vue").then(module => module.default)
93
+ import("../tabs/EditorTabs.vue").then((module) => module.default)
91
94
  ),
92
- MonacoEditor: defineAsyncComponent(() =>
93
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
94
- // @ts-ignore
95
- import("vue-monaco").then(module => {
96
- module.default.render = () => h("div");
97
- return module.default;
98
- })
99
- )
95
+ MonacoEditor: defineAsyncComponent({
96
+ loader: () =>
97
+ import("./MonacoEditor.vue").then((module) => module.default),
98
+
99
+ loadingComponent: Preloader,
100
+ delay: 200,
101
+ errorComponent: Banner,
102
+ timeout: 100000,
103
+ }),
100
104
  },
101
105
 
102
106
  data() {
103
107
  return {
104
108
  activeTab: "edit",
105
109
  editorContent: "",
106
- originalEditorContent: ""
110
+ originalEditorContent: "",
107
111
  };
108
112
  },
109
113
 
@@ -119,17 +123,17 @@ export default defineComponent({
119
123
  ? "vs-dark"
120
124
  : "vs")
121
125
  );
122
- }
126
+ },
123
127
  },
124
128
 
125
129
  watch: {
126
- value: {
130
+ modelValue: {
127
131
  immediate: true,
128
132
  handler(n) {
129
133
  if (this.editorContent !== n) {
130
134
  this.editorContent = n;
131
135
  }
132
- }
136
+ },
133
137
  },
134
138
  originalValue: {
135
139
  immediate: true,
@@ -137,21 +141,20 @@ export default defineComponent({
137
141
  if (this.originalEditorContent !== n) {
138
142
  this.originalEditorContent = n;
139
143
  }
140
- }
141
- }
144
+ },
145
+ },
142
146
  },
143
147
 
144
148
  methods: {
145
149
  onChange(e) {
146
150
  if (typeof e === "string") this.editorContent = e;
147
151
  },
148
- onEditorMount() {
149
- const editor = this.$refs.monacoEditor.getEditor();
152
+ onEditorMount(editor) {
150
153
  // add event listeners
151
154
  editor.onDidBlurEditorText(() => {
152
155
  this.$emit("update:modelValue", this.editorContent);
153
156
  });
154
- }
155
- }
157
+ },
158
+ },
156
159
  });
157
160
  </script>