@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,49 @@
1
+ import moment from "moment";
2
+ import { useNow, useThrottleFn } from "@vueuse/core";
3
+
4
+ const getTime = option => {
5
+ if (parseInt(option.time, 10) < 0 || !option.time) {
6
+ return undefined;
7
+ }
8
+ let time = option.time;
9
+
10
+ // moment(option.time).valueOf('x') needs to convert pharmer's api date to epoch time
11
+ time = moment(option.time).valueOf("x")
12
+ ? moment(option.time).valueOf("x")
13
+ : time * 1000;
14
+
15
+ return moment(time).format("MMM DD YYYY, h:mm A");
16
+ };
17
+ const getDayDifferences = options => {
18
+ const past = moment(options.past).isValid()
19
+ ? moment(options.past).valueOf("x") / 1000
20
+ : options.past;
21
+ const now = Date.now() / 1000;
22
+ const diff = now - past;
23
+ if (parseInt(options.past, 10) > 10) {
24
+ let ret = Math.floor(diff / 86400);
25
+ let unit = "";
26
+ if (diff < 60) {
27
+ ret = parseInt(diff, 10);
28
+ unit = " Second";
29
+ } else if (diff < 3600) {
30
+ ret = parseInt(diff / 60, 10);
31
+ unit = " Minute";
32
+ } else if (diff < 86400) {
33
+ ret = parseInt(diff / 3600, 10);
34
+ unit = " Hour";
35
+ } else {
36
+ ret = parseInt(diff / 86400, 10);
37
+ unit = " Day";
38
+ }
39
+ unit += ret > 1 ? "s" : "";
40
+ return ret + unit;
41
+ }
42
+ return undefined;
43
+ };
44
+
45
+ export default {
46
+ getTime,
47
+ // formatMoment,
48
+ getDayDifferences
49
+ };
@@ -41,6 +41,7 @@ module.exports = {
41
41
  },
42
42
  options: {
43
43
  icon: "fa-warning",
44
+ duration: 20000,
44
45
  type: "error",
45
46
  className: "ac-toast is-error",
46
47
  },
@@ -56,6 +57,7 @@ module.exports = {
56
57
  },
57
58
  options: {
58
59
  icon: "fa-info",
60
+ duration: 20000,
59
61
  type: "info",
60
62
  className: "ac-toast is-info",
61
63
  },
@@ -73,6 +75,7 @@ module.exports = {
73
75
  },
74
76
  options: {
75
77
  icon: "fa-warning",
78
+ duration: 2500,
76
79
  type: "error",
77
80
  className: "ac-toast is-warning",
78
81
  },
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <div class="sign-up-notification mb-20">
3
3
  <div class="notification-inner has-text-centered">
4
- <h3><slot name="banner-title" /></h3>
5
- <slot />
4
+ <h3><slot name="banner-title">Error!</slot></h3>
5
+ <slot><p>Oops!! There was an error while loading!</p></slot>
6
6
  </div>
7
7
  </div>
8
8
  </template>
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div class="ac-breadcrumb">
3
+ <nav aria-label="breadcrumbs" class="breadcrumb">
4
+ <ul>
5
+ <li
6
+ v-for="(item, idx) in list"
7
+ :key="idx"
8
+ :class="{ 'is-active': idx === list.length - 1 }"
9
+ >
10
+ <router-link
11
+ class="router-link-active"
12
+ :class="{ 'is-active': idx === list.length - 1 }"
13
+ :to="item.path"
14
+ >{{ item.name }}
15
+ </router-link>
16
+ </li>
17
+ </ul>
18
+ </nav>
19
+ </div>
20
+ </template>
21
+ <script>
22
+ export default {
23
+ data() {
24
+ return {
25
+ list: []
26
+ };
27
+ },
28
+ methods: {
29
+ createBreadcrumbs(n) {
30
+ //Adding dynamic path to the route
31
+ const listPaths = this.$route.matched.map(element =>
32
+ this.pathReplaceWithParam(element.path)
33
+ );
34
+
35
+ //Removing the last duplicate value from the listpaths array
36
+ listPaths.pop();
37
+
38
+ //Createing the breadcrumb name
39
+ const listName = this.createList(listPaths);
40
+
41
+ //Set the new breadcrumb name and path value to list
42
+ this.list = listName.map((element, index) => {
43
+ return {
44
+ name: element,
45
+ path: listPaths[index]
46
+ };
47
+ });
48
+ },
49
+ pathReplaceWithParam(path) {
50
+ //Split the path and remove the first and last empty block
51
+ let splitPath = path.split("/").filter(element => element !== "");
52
+
53
+ //Replace all element with query params where the element start with ":"
54
+ // Then again add them wthi "/" and return the path value
55
+ return splitPath.reduce((pval, cval) => {
56
+ if (cval[0] === ":") {
57
+ const cutIndex =
58
+ cval.indexOf("?") !== -1 ? cval.indexOf("?") : cval.length;
59
+ return (pval += this.$route.params[cval.slice(1, cutIndex)] + "/");
60
+ } else return (pval += cval + "/");
61
+ }, "/");
62
+ },
63
+ createList(paths) {
64
+ //Split all the path and remove all empty block
65
+ let spath = paths.map(element => {
66
+ return element.split("/").filter(word => word !== "");
67
+ });
68
+
69
+ // Convert all the path arry in one arry where each element is the different fo previous element
70
+ return spath.reduce((prev, curr, currentIdx) => {
71
+ if (currentIdx === 0) return prev.concat([this.createVal(0, curr)]);
72
+ else
73
+ return prev.concat([
74
+ this.createVal(spath[currentIdx - 1].length, curr)
75
+ ]);
76
+ }, []);
77
+ },
78
+ createVal(startIdx, paths) {
79
+ return paths.reduce((prev, curr, idx) => {
80
+ if (idx >= startIdx) {
81
+ if (idx + 1 === paths.length) return (prev += curr);
82
+ else return (prev += curr + " / ");
83
+ } else return prev + "";
84
+ }, "");
85
+ }
86
+ },
87
+ watch: {
88
+ "$route.path": {
89
+ deep: true,
90
+ immediate: true,
91
+ handler(n) {
92
+ this.createBreadcrumbs(n);
93
+ }
94
+ }
95
+ }
96
+ };
97
+ </script>
@@ -4,6 +4,7 @@
4
4
  :class="`${modifierClasses}${isLoaderActive ? ' is-loading' : ''}`"
5
5
  :disabled="disabled"
6
6
  @click="handleClick"
7
+ :title="tooltip"
7
8
  >
8
9
  <span v-if="iconClass || iconImage" class="icon is-small">
9
10
  <img
@@ -27,6 +28,10 @@ export default {
27
28
  type: String,
28
29
  default: "",
29
30
  },
31
+ tooltip: {
32
+ type: String,
33
+ defualt: undefined
34
+ },
30
35
  // for loader
31
36
  isLoaderActive: {
32
37
  type: Boolean,
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <ac-button
3
+ modifier-classes="is-primary is-square"
4
+ icon-class="download"
5
+ :is-loader-active="isFetching"
6
+ @click="download()"
7
+ />
8
+ </template>
9
+
10
+ <script>
11
+ import downloadFunc from "downloadjs";
12
+
13
+ export default {
14
+ components: {
15
+ AcButton: () => import("./../button/Button.vue")
16
+ },
17
+ props: {
18
+ fileData: {
19
+ type: String,
20
+ default: ""
21
+ },
22
+ fileName: {
23
+ type: String,
24
+ default: ""
25
+ },
26
+ isFetching: {
27
+ type: Boolean,
28
+ default: false
29
+ }
30
+ },
31
+ data() {
32
+ return {
33
+ downloadIcon: "fa fa-cloud-download"
34
+ };
35
+ },
36
+ component: {
37
+ downloadFunc
38
+ },
39
+ methods: {
40
+ download() {
41
+ downloadFunc(this.fileData, this.fileName);
42
+ }
43
+ }
44
+ };
45
+ </script>
@@ -3,6 +3,7 @@
3
3
  class="ac-single-card has-text-centered style-three"
4
4
  :class="{ 'is-selected': isSelected }"
5
5
  @click="$emit('click', $event)"
6
+ data-testid="card-list-item"
6
7
  >
7
8
  <div class="ac-card-logo" v-if="hasLogo">
8
9
  <slot name="card-logo" />
@@ -5,8 +5,8 @@
5
5
  <content-loader
6
6
  :height="235"
7
7
  :speed="2"
8
- :primary-color="'#f3f3fa'"
9
- :secondary-color="'#ffffff'"
8
+ :primaryColor="primaryColor"
9
+ :secondaryColor="secondaryColor"
10
10
  />
11
11
  </div>
12
12
  <!-- loader end -->
@@ -20,6 +20,7 @@
20
20
  </template>
21
21
  <script>
22
22
  import { ContentLoader } from "vue-content-loader";
23
+ import {loaderLightThemePrimaryColor, loaderDarkThemePrimaryColor, loaderLightThemeSecondaryColor, loaderDarkThemeSecondaryColor} from "@appscode/design-system/plugins/theme";
23
24
 
24
25
  export default {
25
26
  components: {
@@ -31,5 +32,13 @@ export default {
31
32
  default: false,
32
33
  },
33
34
  },
35
+ computed: {
36
+ primaryColor() {
37
+ return document.documentElement.classList.contains("is-dark-theme") ? loaderDarkThemePrimaryColor : loaderLightThemePrimaryColor;
38
+ },
39
+ secondaryColor() {
40
+ return document.documentElement.classList.contains("is-dark-theme") ? loaderDarkThemeSecondaryColor : loaderLightThemeSecondaryColor;
41
+ }
42
+ }
34
43
  };
35
44
  </script>
@@ -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 }"
@@ -21,32 +22,36 @@ export default {
21
22
  props: {
22
23
  removeTableHeaderPadding: {
23
24
  type: Boolean,
24
- default: false,
25
+ default: false
25
26
  },
26
27
  tableTitle: {
27
28
  type: String,
28
- default: "Table",
29
+ default: "Table"
29
30
  },
30
31
  tableSubTitle: {
31
32
  type: String,
32
- default: "",
33
+ default: ""
33
34
  },
34
35
  searchable: {
35
36
  type: Boolean,
36
- default: true,
37
+ default: true
37
38
  },
39
+ hideHeader: {
40
+ type: Boolean,
41
+ default: false
42
+ }
38
43
  },
39
44
  components: {
40
45
  ContentLayout: () => import("./ContentLayout.vue"),
41
46
  ContentHeader: () => import("./ContentHeader.vue"),
42
47
  HeaderItem: () => import("../header/HeaderItem.vue"),
43
- SearchBar: () => import("../searchbars/SearchBar.vue"),
48
+ SearchBar: () => import("../searchbars/SearchBar.vue")
44
49
  },
45
50
 
46
51
  data() {
47
52
  return {
48
- searchText: "",
53
+ searchText: ""
49
54
  };
50
- },
55
+ }
51
56
  };
52
57
  </script>
@@ -7,20 +7,22 @@
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`"
14
- v-model="editorContent"
13
+ :value="editorContent"
14
+ @change="onChange"
15
15
  :language="language"
16
16
  :options="{
17
17
  minimap: {
18
- enabled: calcShowMinimap
18
+ enabled: calcShowMinimap,
19
19
  },
20
20
  theme: theme,
21
21
  readOnly: readOnly,
22
- scrollBeyondLastLine: false
22
+ wordWrap: wordWrap,
23
+ scrollBeyondLastLine: false,
23
24
  }"
25
+ data-testid="monaco-editor-edit-section"
24
26
  />
25
27
  <monaco-editor
26
28
  v-if="activeTab === 'preview'"
@@ -30,60 +32,75 @@
30
32
  :language="language"
31
33
  :options="{
32
34
  minimap: {
33
- enabled: calcShowMinimap
35
+ enabled: calcShowMinimap,
34
36
  },
35
37
  theme: theme,
36
38
  readOnly: true,
37
- scrollBeyondLastLine: false
39
+ wordWrap: wordWrap,
40
+ scrollBeyondLastLine: false,
38
41
  }"
39
42
  :original="originalEditorContent"
40
43
  :diff-editor="true"
44
+ data-testid="monaco-editor-preview-section"
41
45
  />
42
46
  </div>
43
47
  </template>
44
48
 
45
49
  <script>
50
+ import Preloader from "../preloader/Preloader.vue";
51
+ import Banner from "../banner/Banner.vue";
46
52
  export default {
47
53
  props: {
48
54
  value: {
49
55
  type: String,
50
- default: ""
56
+ default: "",
51
57
  },
52
58
  originalValue: {
53
59
  type: String,
54
- default: ""
60
+ default: "",
55
61
  },
56
62
  readOnly: {
57
63
  type: Boolean,
58
- default: false
64
+ default: false,
59
65
  },
60
66
  language: {
61
67
  type: String,
62
- default: "yaml"
68
+ default: "yaml",
63
69
  },
64
70
  showMinimap: {
65
71
  type: Boolean,
66
- default: true
72
+ default: true,
67
73
  },
68
74
  editorHeight: {
69
75
  type: Number,
70
- default: 40
76
+ default: 40,
71
77
  },
72
78
  editorTheme: {
73
79
  type: String,
74
- default: ""
75
- }
80
+ default: "",
81
+ },
82
+ wordWrap: {
83
+ type: String,
84
+ default: "off",
85
+ },
76
86
  },
87
+
77
88
  components: {
78
89
  EditorTabs: () => import("../tabs/EditorTabs.vue"),
79
- MonacoEditor: () => import("vue-monaco")
90
+ MonacoEditor: () => ({
91
+ component: import("./MonacoEditor.vue"),
92
+ loading: Preloader,
93
+ delay: 200,
94
+ error: Banner,
95
+ timeout: 100000,
96
+ }),
80
97
  },
81
98
 
82
99
  data() {
83
100
  return {
84
101
  activeTab: "edit",
85
102
  editorContent: "",
86
- originalEditorContent: ""
103
+ originalEditorContent: "",
87
104
  };
88
105
  },
89
106
 
@@ -99,7 +116,7 @@ export default {
99
116
  ? "vs-dark"
100
117
  : "vs")
101
118
  );
102
- }
119
+ },
103
120
  },
104
121
 
105
122
  watch: {
@@ -109,7 +126,7 @@ export default {
109
126
  if (this.editorContent !== n) {
110
127
  this.editorContent = n;
111
128
  }
112
- }
129
+ },
113
130
  },
114
131
  originalValue: {
115
132
  immediate: true,
@@ -117,18 +134,20 @@ export default {
117
134
  if (this.originalEditorContent !== n) {
118
135
  this.originalEditorContent = n;
119
136
  }
120
- }
121
- }
137
+ },
138
+ },
122
139
  },
123
140
 
124
141
  methods: {
125
- onEditorMount() {
126
- const editor = this.$refs.monacoEditor.getEditor();
142
+ onChange(e) {
143
+ if (typeof e === "string") this.editorContent = e;
144
+ },
145
+ onEditorMount(editor) {
127
146
  // add event listeners
128
147
  editor.onDidBlurEditorText(() => {
129
148
  this.$emit("input", this.editorContent);
130
149
  });
131
- }
132
- }
150
+ },
151
+ },
133
152
  };
134
153
  </script>
@@ -0,0 +1,189 @@
1
+ <template>
2
+ <div class="ac-preview is-active is-not-fixed">
3
+ <div class="ac-preview-inner">
4
+ <!-- preview body start -->
5
+ <div class="ac-preview-body mt-0 pt-15 pl-20">
6
+ <div
7
+ v-if="isPreviewLoading || (!isPreviewLoading && previewYamls)"
8
+ class="left-content"
9
+ >
10
+ <div class="ac-files ac-hscrollbar pt-0">
11
+ <ul v-if="!isPreviewLoading">
12
+ <li
13
+ v-for="(previewYaml, idx) in filteredYamls"
14
+ :key="previewYaml.name + idx"
15
+ :class="{ 'is-active': activeKey === previewYaml.uid }"
16
+ data-testid="filtered-file-editor-file-name"
17
+ >
18
+ <a @click.prevent="setActivePreview(previewYaml.uid)">
19
+ <span>
20
+ <img
21
+ src="~@appscode/design-system-images/icons/file-icon.svg"
22
+ alt=""
23
+ />
24
+ </span>
25
+ <span>{{ previewYaml.name }}</span>
26
+ </a>
27
+ </li>
28
+ </ul>
29
+ <sidebar-loader
30
+ v-else
31
+ :primaryLoaderColor="primaryLoaderColor"
32
+ :secondaryLoaderColor="secondaryLoaderColor"
33
+ />
34
+ </div>
35
+ </div>
36
+ <div class="right-content" data-testid="filtered-file-editor-content">
37
+ <div class="right-content">
38
+ <resource-loader
39
+ v-if="isPreviewLoading"
40
+ :primaryLoaderColor="primaryLoaderColor"
41
+ :secondaryLoaderColor="secondaryLoaderColor"
42
+ />
43
+ <editor
44
+ v-else-if="!isPreviewLoading && !hideValue"
45
+ v-model="activeFile.content"
46
+ :original-value="originalValue"
47
+ :language="activeFile.format"
48
+ :read-only="isEditorReadOnly"
49
+ :editor-height="editorHeight"
50
+ :show-minimap="showMinimap"
51
+ :editor-theme="editorTheme"
52
+ :key="editorTheme"
53
+ />
54
+ <span v-else> *************** </span>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </template>
61
+ <script>
62
+ import Preloader from "../preloader/Preloader.vue";
63
+ import Banner from "../banner/Banner.vue";
64
+ export default {
65
+ components: {
66
+ Editor: () => ({
67
+ component: import("./Editor.vue"),
68
+ loading: Preloader,
69
+ delay: 200,
70
+ error: Banner,
71
+ timeout: 100000,
72
+ }),
73
+ ResourceLoader: () => import("./../loaders/ResourceLoader.vue"),
74
+ SidebarLoader: () => import("./../loaders/SidebarLoader.vue"),
75
+ },
76
+ props: {
77
+ searchText: {
78
+ type: String,
79
+ default: "",
80
+ },
81
+ toggleHideValue: {
82
+ type: Boolean,
83
+ default: true,
84
+ },
85
+ isPreviewLoading: {
86
+ type: Boolean,
87
+ default: false,
88
+ },
89
+ isEditorReadOnly: {
90
+ type: Boolean,
91
+ default: false,
92
+ },
93
+ previewYamls: {
94
+ type: Array,
95
+ default: () => {
96
+ [];
97
+ },
98
+ },
99
+ showMinimap: {
100
+ type: Boolean,
101
+ default: false,
102
+ },
103
+ editorHeight: {
104
+ type: Number,
105
+ default: 60,
106
+ },
107
+ loaderColor: {
108
+ type: Object,
109
+ default: () => {
110
+ return {};
111
+ },
112
+ },
113
+ theme: {
114
+ type: String,
115
+ default: "light",
116
+ },
117
+ },
118
+ data() {
119
+ return {
120
+ activeKey: "",
121
+ hideValue: "",
122
+ };
123
+ },
124
+ computed: {
125
+ activeFile() {
126
+ const activeFile = this.filteredYamls.find(
127
+ (element) => element.uid === this.activeKey
128
+ );
129
+ return activeFile || { content: "", format: "yaml" };
130
+ },
131
+ originalValue() {
132
+ const activeFile = this.filteredYamls.find(
133
+ (element) => element.uid === this.activeKey
134
+ );
135
+ return (activeFile && activeFile.initContent) || "";
136
+ },
137
+ editorTheme() {
138
+ return this.theme === "dark" ? "vs-dark" : "vs";
139
+ },
140
+ primaryLoaderColor() {
141
+ return this.loaderColor.primaryLoaderColor;
142
+ },
143
+ secondaryLoaderColor() {
144
+ return this.loaderColor.secondaryLoaderColor;
145
+ },
146
+ filteredYamls() {
147
+ if (this.searchText) {
148
+ return this.previewYamls.filter(
149
+ (element) => JSON.stringify(element).search(this.searchText) > -1
150
+ );
151
+ } else return this.previewYamls;
152
+ },
153
+ isKeyAvailable() {
154
+ const val = this.previewYamls.find((element) => {
155
+ return element.uid === this.activeKey;
156
+ });
157
+ return val === undefined ? false : true;
158
+ },
159
+ },
160
+ methods: {
161
+ initActivePreview() {
162
+ if (!this.isKeyAvailable) {
163
+ this.activeKey = this.previewYamls[0].uid;
164
+ this.hideValue = this.activeFile.isSecret;
165
+ this.$emit("setActiveKey", this.activeKey);
166
+ }
167
+ },
168
+ setActivePreview(uid) {
169
+ this.activeKey = uid;
170
+ this.hideValue = this.activeFile.isSecret;
171
+ this.$emit("setActiveKey", this.activeKey);
172
+ },
173
+ },
174
+ watch: {
175
+ previewYamls: {
176
+ deep: true,
177
+ immediate: true,
178
+ handler(n) {
179
+ if (n.length) {
180
+ this.initActivePreview();
181
+ }
182
+ },
183
+ },
184
+ toggleHideValue(n) {
185
+ this.hideValue = n;
186
+ },
187
+ },
188
+ };
189
+ </script>