@rancher/shell 3.0.7 → 3.0.8-rc.2

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 (123) hide show
  1. package/assets/images/vendor/githubapp.svg +13 -0
  2. package/assets/styles/base/_typography.scss +1 -1
  3. package/assets/styles/global/_layout.scss +21 -35
  4. package/assets/styles/themes/_modern.scss +5 -5
  5. package/assets/translations/en-us.yaml +102 -17
  6. package/assets/translations/zh-hans.yaml +0 -4
  7. package/components/EmberPage.vue +1 -1
  8. package/components/Inactivity.vue +222 -106
  9. package/components/InstallHelmCharts.vue +2 -2
  10. package/components/Resource/Detail/CopyToClipboard.vue +1 -1
  11. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
  12. package/components/Resource/Detail/TitleBar/index.vue +10 -6
  13. package/components/ResourceDetail/index.vue +4 -1
  14. package/components/SortableTable/index.vue +18 -2
  15. package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
  16. package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
  17. package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
  18. package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
  19. package/components/fleet/FleetConfigMapSelector.vue +117 -0
  20. package/components/fleet/FleetSecretSelector.vue +127 -0
  21. package/components/fleet/__tests__/FleetConfigMapSelector.test.ts +125 -0
  22. package/components/fleet/__tests__/FleetSecretSelector.test.ts +82 -0
  23. package/components/form/FileImageSelector.vue +13 -4
  24. package/components/form/FileSelector.vue +11 -2
  25. package/components/form/ResourceLabeledSelect.vue +1 -0
  26. package/components/form/__tests__/ResourceLabeledSelect.test.ts +90 -0
  27. package/components/nav/Header.vue +34 -13
  28. package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
  29. package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
  30. package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
  31. package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
  32. package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
  33. package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
  34. package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
  35. package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
  36. package/components/nav/WindowManager/constants.ts +23 -0
  37. package/components/nav/WindowManager/index.vue +61 -575
  38. package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
  39. package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
  40. package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
  41. package/components/templates/default.vue +4 -40
  42. package/components/templates/home.vue +31 -5
  43. package/config/product/auth.js +1 -0
  44. package/config/query-params.js +1 -0
  45. package/config/settings.ts +8 -1
  46. package/config/store.js +4 -2
  47. package/config/types.js +2 -0
  48. package/detail/pod.vue +1 -0
  49. package/dialog/AddonConfigConfirmationDialog.vue +45 -1
  50. package/directives/ui-context.ts +97 -0
  51. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +52 -11
  52. package/edit/auth/AuthProviderWarningBanners.vue +14 -1
  53. package/edit/auth/github-app-steps.vue +97 -0
  54. package/edit/auth/github-steps.vue +75 -0
  55. package/edit/auth/github.vue +94 -65
  56. package/edit/fleet.cattle.io.helmop.vue +51 -2
  57. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +15 -5
  58. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +11 -9
  59. package/edit/provisioning.cattle.io.cluster/rke2.vue +56 -9
  60. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +28 -2
  61. package/initialize/install-directives.js +2 -0
  62. package/list/projectsecret.vue +1 -1
  63. package/machine-config/azure.vue +1 -1
  64. package/mixins/chart.js +1 -1
  65. package/models/__tests__/chart.test.ts +17 -9
  66. package/models/__tests__/compliance.cattle.io.clusterscanprofile.spec.js +30 -0
  67. package/models/catalog.cattle.io.app.js +1 -1
  68. package/models/chart.js +3 -1
  69. package/models/compliance.cattle.io.clusterscanprofile.js +1 -1
  70. package/models/management.cattle.io.authconfig.js +1 -0
  71. package/package.json +2 -2
  72. package/pages/auth/login.vue +5 -2
  73. package/pages/auth/verify.vue +1 -1
  74. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +3 -2
  75. package/pages/c/_cluster/apps/charts/chart.vue +2 -2
  76. package/pages/c/_cluster/explorer/EventsTable.vue +89 -3
  77. package/pages/c/_cluster/explorer/tools/index.vue +3 -3
  78. package/pages/c/_cluster/settings/performance.vue +12 -25
  79. package/pages/home.vue +313 -12
  80. package/plugins/axios.js +2 -1
  81. package/plugins/dashboard-store/actions.js +1 -1
  82. package/plugins/dashboard-store/resource-class.js +17 -2
  83. package/plugins/steve/steve-pagination-utils.ts +2 -2
  84. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
  85. package/scripts/extension/publish +1 -1
  86. package/store/auth.js +8 -3
  87. package/store/aws.js +8 -6
  88. package/store/features.js +1 -0
  89. package/store/index.js +9 -3
  90. package/store/prefs.js +6 -0
  91. package/store/ui-context.ts +86 -0
  92. package/store/wm.ts +244 -0
  93. package/types/kube/kube-api.ts +2 -1
  94. package/types/rancher/index.d.ts +1 -0
  95. package/types/resources/settings.d.ts +29 -7
  96. package/types/shell/index.d.ts +59 -0
  97. package/types/window-manager.ts +22 -0
  98. package/utils/__tests__/cluster.test.ts +379 -1
  99. package/utils/cluster.js +157 -3
  100. package/utils/dynamic-content/__tests__/config.test.ts +187 -0
  101. package/utils/dynamic-content/__tests__/index.test.ts +390 -0
  102. package/utils/dynamic-content/__tests__/info.test.ts +263 -0
  103. package/utils/dynamic-content/__tests__/new-release.test.ts +216 -0
  104. package/utils/dynamic-content/__tests__/support-notice.test.ts +262 -0
  105. package/utils/dynamic-content/__tests__/util.test.ts +235 -0
  106. package/utils/dynamic-content/config.ts +55 -0
  107. package/utils/dynamic-content/index.ts +273 -0
  108. package/utils/dynamic-content/info.ts +219 -0
  109. package/utils/dynamic-content/new-release.ts +126 -0
  110. package/utils/dynamic-content/support-notice.ts +169 -0
  111. package/utils/dynamic-content/types.d.ts +101 -0
  112. package/utils/dynamic-content/util.ts +122 -0
  113. package/utils/dynamic-importer.js +2 -2
  114. package/utils/inactivity.ts +104 -0
  115. package/utils/pagination-utils.ts +19 -4
  116. package/utils/release-notes.ts +1 -1
  117. package/assets/images/icons/document.svg +0 -3
  118. package/store/wm.js +0 -95
  119. /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
  120. /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
  121. /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
  122. /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
  123. /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
@@ -0,0 +1,167 @@
1
+ import { ref } from 'vue';
2
+ import { boundingRect, LEFT, RIGHT, screenRect } from '@shell/utils/position';
3
+ import { Position } from '@shell/types/window-manager';
4
+ import { useStore } from 'vuex';
5
+
6
+ /**
7
+ * This composable is responsible for handling the resize behavior of the window manager panels.
8
+ */
9
+ export default (props: { position: Position, setDimensions: (args: { width?: number, height?: number }) => void }) => {
10
+ const store = useStore();
11
+
12
+ const dragOffset = ref(0);
13
+
14
+ function mouseResizeYStart(event: MouseEvent | TouchEvent) {
15
+ const doc = document.documentElement;
16
+
17
+ doc.addEventListener('mousemove', mouseResizeYMove);
18
+ doc.addEventListener('touchmove', mouseResizeYMove, true);
19
+ doc.addEventListener('mouseup', mouseResizeYEnd);
20
+ doc.addEventListener('mouseleave', mouseResizeYEnd);
21
+ doc.addEventListener('touchend', mouseResizeYEnd, true);
22
+ doc.addEventListener('touchcancel', mouseResizeYEnd, true);
23
+ doc.addEventListener('touchstart', mouseResizeYEnd, true);
24
+
25
+ let eventY: number;
26
+
27
+ if (event instanceof MouseEvent) {
28
+ eventY = event.screenY;
29
+ } else if (event instanceof TouchEvent && event.touches.length > 0) {
30
+ eventY = event.touches[0].screenY;
31
+ } else {
32
+ eventY = 0;
33
+ }
34
+
35
+ const rect = boundingRect(event.target);
36
+ const offset = eventY - rect.top;
37
+
38
+ dragOffset.value = offset;
39
+ }
40
+
41
+ function mouseResizeYMove(event: MouseEvent | TouchEvent) {
42
+ const screen = screenRect();
43
+
44
+ let eventY: number;
45
+
46
+ if (event instanceof MouseEvent) {
47
+ eventY = event.screenY;
48
+ } else if (event instanceof TouchEvent && event.touches.length > 0) {
49
+ eventY = event.touches[0].screenY;
50
+ } else {
51
+ eventY = 0;
52
+ }
53
+
54
+ const min = 50;
55
+ const max = Math.round( 3 * screen.height / 4);
56
+
57
+ let neu = screen.height - eventY + dragOffset.value;
58
+
59
+ neu = Math.max(min, Math.min(neu, max));
60
+
61
+ props.setDimensions({ height: neu });
62
+ }
63
+
64
+ function mouseResizeYEnd(event: MouseEvent | TouchEvent) {
65
+ const doc = document.documentElement;
66
+
67
+ doc.removeEventListener('mousemove', mouseResizeYMove);
68
+ doc.removeEventListener('touchmove', mouseResizeYMove, true);
69
+ doc.removeEventListener('mouseup', mouseResizeYEnd);
70
+ doc.removeEventListener('mouseleave', mouseResizeYEnd);
71
+ doc.removeEventListener('touchend', mouseResizeYEnd, true);
72
+ doc.removeEventListener('touchcancel', mouseResizeYEnd, true);
73
+ doc.removeEventListener('touchstart', mouseResizeYEnd, true);
74
+ }
75
+
76
+ function mouseResizeXStart(event: MouseEvent | TouchEvent) {
77
+ const doc = document.documentElement;
78
+
79
+ doc.addEventListener('mousemove', mouseResizeXMove);
80
+ doc.addEventListener('touchmove', mouseResizeXMove, true);
81
+ doc.addEventListener('mouseup', mouseResizeXEnd);
82
+ doc.addEventListener('mouseleave', mouseResizeXEnd);
83
+ doc.addEventListener('touchend', mouseResizeXEnd, true);
84
+ doc.addEventListener('touchcancel', mouseResizeXEnd, true);
85
+ doc.addEventListener('touchstart', mouseResizeXEnd, true);
86
+
87
+ const eventX = (event instanceof MouseEvent) ? event.screenX : (event as TouchEvent).touches[0].screenX;
88
+ const rect = boundingRect(event.target);
89
+
90
+ switch (props.position) {
91
+ case RIGHT:
92
+ dragOffset.value = eventX - rect.left;
93
+ break;
94
+ case LEFT:
95
+ dragOffset.value = rect.right - eventX;
96
+ break;
97
+ }
98
+ }
99
+
100
+ function mouseResizeXMove(event: MouseEvent | TouchEvent) {
101
+ const screen = screenRect();
102
+ const eventX = (event instanceof MouseEvent) ? event.screenX : (event as TouchEvent).touches[0].screenX;
103
+
104
+ const min = 250;
105
+ const max = Math.round(2 * screen.width / 5);
106
+ let neu;
107
+
108
+ switch (props.position) {
109
+ case RIGHT:
110
+ neu = Math.max(min, Math.min((screen.width - eventX + dragOffset.value) || 0, max));
111
+ break;
112
+ case LEFT:
113
+ neu = Math.max(min, Math.min((eventX + dragOffset.value) || 0, max));
114
+ break;
115
+ }
116
+
117
+ props.setDimensions({ width: neu || 0 });
118
+ }
119
+
120
+ function mouseResizeXEnd(event: MouseEvent | TouchEvent) {
121
+ const doc = document.documentElement;
122
+
123
+ doc.removeEventListener('mousemove', mouseResizeXMove);
124
+ doc.removeEventListener('touchmove', mouseResizeXMove, true);
125
+ doc.removeEventListener('mouseup', mouseResizeXEnd);
126
+ doc.removeEventListener('mouseleave', mouseResizeXEnd);
127
+ doc.removeEventListener('touchend', mouseResizeXEnd, true);
128
+ doc.removeEventListener('touchcancel', mouseResizeXEnd, true);
129
+ doc.removeEventListener('touchstart', mouseResizeXEnd, true);
130
+ }
131
+
132
+ function keyboardResizeY(arrowUp: boolean) {
133
+ const panelHeight = store.state.wm.panelHeight?.[props.position];
134
+ const resizeStep = 20;
135
+ const newHeight = arrowUp ? (panelHeight || 0) + resizeStep : (panelHeight || 0) - resizeStep;
136
+
137
+ props.setDimensions({ height: newHeight });
138
+ }
139
+
140
+ function keyboardResizeX(arrowLeft: boolean) {
141
+ const panelWidth = store.state.wm.panelWidth?.[props.position];
142
+ const resizeStep = 20;
143
+ let width;
144
+
145
+ switch (props.position) {
146
+ case RIGHT:
147
+ width = arrowLeft ? (panelWidth || 0) + resizeStep : (panelWidth || 0) - resizeStep;
148
+ break;
149
+ case LEFT:
150
+ width = arrowLeft ? (panelWidth || 0) - resizeStep : (panelWidth || 0) + resizeStep;
151
+ break;
152
+ }
153
+
154
+ props.setDimensions({ width });
155
+ }
156
+
157
+ return {
158
+ mouseResizeYStart,
159
+ mouseResizeYMove,
160
+ mouseResizeYEnd,
161
+ mouseResizeXStart,
162
+ mouseResizeXMove,
163
+ mouseResizeXEnd,
164
+ keyboardResizeY,
165
+ keyboardResizeX
166
+ };
167
+ };
@@ -0,0 +1,51 @@
1
+ import { computed, ref } from 'vue';
2
+ import { useStore } from 'vuex';
3
+ import { Tab } from '@shell/types/window-manager';
4
+
5
+ const tabs = ref<{ tab: Tab, containerId: string }[]>([]);
6
+
7
+ /**
8
+ * This composable is responsible for handling the tabs within the window manager.
9
+ */
10
+ export default () => {
11
+ const store = useStore();
12
+
13
+ const activeTab = computed(() => store.state.wm.active);
14
+
15
+ function onTabReady(arg: { tab: Tab, containerId: string }) {
16
+ const existing = tabs.value.find((t) => t.tab.id === arg.tab.id);
17
+
18
+ if (existing) {
19
+ existing.containerId = arg.containerId;
20
+
21
+ return;
22
+ }
23
+
24
+ tabs.value = [
25
+ ...tabs.value,
26
+ { tab: arg.tab, containerId: arg.containerId }
27
+ ];
28
+ }
29
+
30
+ function setTabActive(args: { position: string, id: string }) {
31
+ store.commit('wm/setActive', args);
32
+ }
33
+
34
+ function onTabClose(id: string) {
35
+ tabs.value = tabs.value.filter(({ tab }) => tab.id !== id);
36
+ store.commit('wm/closeTab', { id });
37
+ }
38
+
39
+ function onPanelClose(position: string) {
40
+ tabs.value = tabs.value.filter(({ tab }) => tab.position !== position);
41
+ }
42
+
43
+ return {
44
+ tabs,
45
+ activeTab,
46
+ setTabActive,
47
+ onTabReady,
48
+ onTabClose,
49
+ onPanelClose,
50
+ };
51
+ };
@@ -0,0 +1,23 @@
1
+ import { BOTTOM, LEFT, RIGHT } from '@shell/utils/position';
2
+
3
+ export const STORAGE_KEY = {
4
+ [BOTTOM]: 'wm-height',
5
+ [LEFT]: 'wm-vl-width',
6
+ [RIGHT]: 'wm-vr-width',
7
+ pin: 'wm-pin',
8
+ };
9
+
10
+ export const CSS_KEY = {
11
+ [RIGHT]: '--wm-vr-width',
12
+ [LEFT]: '--wm-vl-width',
13
+ [BOTTOM]: '--wm-height',
14
+ };
15
+
16
+ export const Z_INDEX = {
17
+ WM: 1000,
18
+ PIN_EFFECT: 996,
19
+ RIGHT: 999,
20
+ LEFT: 999,
21
+ BOTTOM: 999,
22
+ CENTER: 997,
23
+ };