@dovetail-v2/refine 0.0.66-pod-exec.0 → 0.1.0

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 (238) hide show
  1. package/dist/{MonacoYamlDiffEditor-6b799b64.js → MonacoYamlDiffEditor-e737ae8d.js} +1 -1
  2. package/dist/{index-c07bed15.js → index-0c7bfb69.js} +5800 -19551
  3. package/dist/refine.js +162 -161
  4. package/dist/refine.umd.cjs +4780 -18531
  5. package/dist/style.css +11 -229
  6. package/lib/src/App.js +91 -0
  7. package/lib/src/Dovetail.js +45 -0
  8. package/lib/src/components/Breadcrumb/index.js +20 -0
  9. package/lib/src/components/ConditionsTable/ConditionsTable.js +56 -0
  10. package/lib/src/components/ConditionsTable/index.js +1 -0
  11. package/lib/src/components/CreateButton/index.js +10 -0
  12. package/lib/src/components/CronJobDropdown/index.js +26 -0
  13. package/lib/src/components/CronjobJobsTable/index.js +49 -0
  14. package/lib/src/components/DeleteButton/index.js +13 -0
  15. package/lib/src/components/DeleteManyButton/index.js +16 -0
  16. package/lib/src/components/DrawerShow/DrawerShow.js +13 -0
  17. package/lib/src/components/DrawerShow/index.js +1 -0
  18. package/lib/src/components/EditButton/index.js +13 -0
  19. package/lib/src/components/EditField/index.js +47 -0
  20. package/lib/src/components/ErrorContent/index.js +36 -0
  21. package/lib/src/components/EventsTable/EventsTable.js +59 -0
  22. package/lib/src/components/EventsTable/index.js +1 -0
  23. package/lib/src/components/Form/FormModal.d.ts +0 -1
  24. package/lib/src/components/Form/KeyValueListWidget.js +56 -0
  25. package/lib/src/components/Form/MetadataForm.js +9 -0
  26. package/lib/src/components/Form/NameInputWidget.js +50 -0
  27. package/lib/src/components/Form/NamespaceSelectWidget.js +21 -0
  28. package/lib/src/components/Form/index.js +4 -0
  29. package/lib/src/components/Form/widget.js +1 -0
  30. package/lib/src/components/FormErrorAlert/index.js +8 -0
  31. package/lib/src/components/FormLayout/index.js +21 -0
  32. package/lib/src/components/FormModal/index.js +51 -0
  33. package/lib/src/components/ImageNames/index.js +14 -0
  34. package/lib/src/components/IngressRulesComponent/index.js +11 -0
  35. package/lib/src/components/IngressRulesTable/IngressRulesTable.js +51 -0
  36. package/lib/src/components/IngressRulesTable/index.js +1 -0
  37. package/lib/src/components/K8sDropdown/index.js +31 -0
  38. package/lib/src/components/KeyValue/KeyValue.js +27 -0
  39. package/lib/src/components/KeyValue/index.js +1 -0
  40. package/lib/src/components/KeyValueData/index.js +50 -0
  41. package/lib/src/components/Layout/index.js +39 -0
  42. package/lib/src/components/ListPage/index.d.ts +1 -0
  43. package/lib/src/components/ListPage/index.js +25 -0
  44. package/lib/src/components/Menu/index.js +36 -0
  45. package/lib/src/components/NamespacesFilter/index.js +34 -0
  46. package/lib/src/components/NetworkPolicyRulesTable/NetworkPolicyRulesTable.d.ts +1 -2
  47. package/lib/src/components/NetworkPolicyRulesTable/NetworkPolicyRulesTable.js +77 -0
  48. package/lib/src/components/NetworkPolicyRulesTable/index.js +1 -0
  49. package/lib/src/components/PageShow/PageShow.js +11 -0
  50. package/lib/src/components/PageShow/index.js +1 -0
  51. package/lib/src/components/PodContainersTable/PodContainersTable.js +78 -0
  52. package/lib/src/components/PodContainersTable/index.js +1 -0
  53. package/lib/src/components/PodLog/index.js +136 -0
  54. package/lib/src/components/ReferenceLink/index.js +17 -0
  55. package/lib/src/components/RefineForm/RefineFormContent.d.ts +10 -0
  56. package/lib/src/components/RefineForm/RefineFormModal.d.ts +8 -0
  57. package/lib/src/components/RefineForm/RefineFormPage.d.ts +7 -0
  58. package/lib/src/components/RefineForm/index.d.ts +3 -0
  59. package/lib/src/components/RefineForm/type.d.ts +20 -0
  60. package/lib/src/components/RefineForm/useRefineForm.d.ts +10 -0
  61. package/lib/src/components/ResourceCRUD/ResourceCRUD.js +15 -0
  62. package/lib/src/components/ResourceCRUD/create/index.js +13 -0
  63. package/lib/src/components/ResourceCRUD/index.js +4 -0
  64. package/lib/src/components/ResourceCRUD/list/index.js +19 -0
  65. package/lib/src/components/ResourceCRUD/show/index.js +6 -0
  66. package/lib/src/components/ResourceFiledDisplays.d.ts +7 -0
  67. package/lib/src/components/ResourceLink/index.js +21 -0
  68. package/lib/src/components/ResourceUsageBar/index.js +81 -0
  69. package/lib/src/components/Separator/index.js +11 -0
  70. package/lib/src/components/ShowContent/ShowContent.js +157 -0
  71. package/lib/src/components/ShowContent/fields.d.ts +7 -2
  72. package/lib/src/components/ShowContent/fields.js +157 -0
  73. package/lib/src/components/ShowContent/index.js +2 -0
  74. package/lib/src/components/StateTag/StateTag.js +22 -0
  75. package/lib/src/components/StateTag/index.js +1 -0
  76. package/lib/src/components/Table/ErrorContent.js +36 -0
  77. package/lib/src/components/Table/TableToolBar.js +14 -0
  78. package/lib/src/components/Table/TableWidgets.js +28 -0
  79. package/lib/src/components/Table/index.js +69 -0
  80. package/lib/src/components/Tags/index.js +22 -0
  81. package/lib/src/components/Time/index.js +14 -0
  82. package/lib/src/components/WorkloadDropdown/index.js +24 -0
  83. package/lib/src/components/WorkloadPodsTable/WorkloadPodsTable.js +39 -0
  84. package/lib/src/components/WorkloadPodsTable/index.js +1 -0
  85. package/lib/src/components/WorkloadReplicas/index.js +50 -0
  86. package/lib/src/components/YamlEditor/MonacoYamlDiffEditor.js +34 -0
  87. package/lib/src/components/YamlEditor/MonacoYamlEditor.js +149 -0
  88. package/lib/src/components/YamlEditor/YamlEditorComponent.js +90 -0
  89. package/lib/src/components/YamlEditor/index.js +1 -0
  90. package/lib/src/components/YamlEditor/style.js +102 -0
  91. package/lib/src/components/YamlEditor/yaml.worker.js +1 -0
  92. package/lib/src/components/YamlForm/index.d.ts +0 -4
  93. package/lib/src/components/YamlForm/index.js +61 -0
  94. package/lib/src/components/index.d.ts +1 -3
  95. package/lib/src/components/index.js +38 -0
  96. package/lib/src/constants/index.js +2 -0
  97. package/lib/src/constants/k8s.js +203 -0
  98. package/lib/src/constants/state.js +15 -0
  99. package/lib/src/contexts/component.js +3 -0
  100. package/lib/src/contexts/configs.js +3 -0
  101. package/lib/src/contexts/global-store.js +3 -0
  102. package/lib/src/contexts/index.js +3 -0
  103. package/lib/src/hooks/index.js +7 -0
  104. package/lib/src/hooks/useDeleteModal/index.js +1 -0
  105. package/lib/src/hooks/useDeleteModal/useDeleteManyModal.js +31 -0
  106. package/lib/src/hooks/useDeleteModal/useDeleteModal.js +38 -0
  107. package/lib/src/hooks/useDownloadYAML.js +10 -0
  108. package/lib/src/hooks/useEagleForm.d.ts +1 -2
  109. package/lib/src/hooks/useEagleForm.js +177 -0
  110. package/lib/src/hooks/useEagleTable/columns.d.ts +6 -6
  111. package/lib/src/hooks/useEagleTable/columns.js +246 -0
  112. package/lib/src/hooks/useEagleTable/index.js +2 -0
  113. package/lib/src/hooks/useEagleTable/useEagleTable.js +63 -0
  114. package/lib/src/hooks/useEdit.js +19 -0
  115. package/lib/src/hooks/useGlobalStore.js +5 -0
  116. package/lib/src/hooks/useK8sYamlEditor.js +37 -0
  117. package/lib/src/hooks/useOpenForm.js +43 -0
  118. package/lib/src/hooks/useSchema.js +37 -0
  119. package/lib/src/hooks/useSubmitForm.js +42 -0
  120. package/lib/src/i18n.d.ts +26 -2
  121. package/lib/src/i18n.js +19 -0
  122. package/lib/src/index.js +13 -0
  123. package/lib/src/locales/en-US/dovetail.json +18 -0
  124. package/lib/src/locales/en-US/index.d.ts +14 -1
  125. package/lib/src/locales/en-US/index.js +4 -0
  126. package/lib/src/locales/index.js +6 -0
  127. package/lib/src/locales/zh-CN/dovetail.json +91 -0
  128. package/lib/src/locales/zh-CN/index.d.ts +12 -1
  129. package/lib/src/locales/zh-CN/index.js +4 -0
  130. package/lib/src/main.js +12 -0
  131. package/lib/src/models/cronjob-model.d.ts +0 -1
  132. package/lib/src/models/cronjob-model.js +32 -0
  133. package/lib/src/models/daemonset-model.d.ts +0 -1
  134. package/lib/src/models/daemonset-model.js +17 -0
  135. package/lib/src/models/deployment-model.d.ts +0 -1
  136. package/lib/src/models/deployment-model.js +17 -0
  137. package/lib/src/models/event-model.d.ts +0 -1
  138. package/lib/src/models/event-model.js +11 -0
  139. package/lib/src/models/index.js +14 -0
  140. package/lib/src/models/ingress-model.d.ts +0 -1
  141. package/lib/src/models/ingress-model.js +24 -0
  142. package/lib/src/models/job-model.d.ts +0 -1
  143. package/lib/src/models/job-model.js +56 -0
  144. package/lib/src/models/network-policy-model.d.ts +0 -1
  145. package/lib/src/models/network-policy-model.js +10 -0
  146. package/lib/src/models/node-model.d.ts +0 -1
  147. package/lib/src/models/persistent-volume-claim.d.ts +0 -1
  148. package/lib/src/models/persistent-volume.d.ts +0 -1
  149. package/lib/src/models/pod-metrics-model.d.ts +0 -1
  150. package/lib/src/models/pod-metrics-model.js +34 -0
  151. package/lib/src/models/pod-model.d.ts +0 -1
  152. package/lib/src/models/pod-model.js +78 -0
  153. package/lib/src/models/resource-model.d.ts +1 -1
  154. package/lib/src/models/resource-model.js +34 -0
  155. package/lib/src/models/server-instance-model.d.ts +10 -0
  156. package/lib/src/models/service-model.d.ts +0 -1
  157. package/lib/src/models/service-model.js +17 -0
  158. package/lib/src/models/statefulset-model.d.ts +0 -1
  159. package/lib/src/models/statefulset-model.js +17 -0
  160. package/lib/src/models/storage-class.d.ts +0 -1
  161. package/lib/src/models/types/index.js +1 -0
  162. package/lib/src/models/types/metric.js +1 -0
  163. package/lib/src/models/workload-base-model.d.ts +0 -1
  164. package/lib/src/models/workload-base-model.js +22 -0
  165. package/lib/src/models/workload-model.d.ts +0 -1
  166. package/lib/src/models/workload-model.js +51 -0
  167. package/lib/src/pages/configmaps/index.js +15 -0
  168. package/lib/src/pages/cronjobs/create/index.js +6 -0
  169. package/lib/src/pages/cronjobs/index.js +3 -0
  170. package/lib/src/pages/cronjobs/list/index.js +42 -0
  171. package/lib/src/pages/cronjobs/show/index.js +16 -0
  172. package/lib/src/pages/daemonsets/create/index.js +6 -0
  173. package/lib/src/pages/daemonsets/index.js +3 -0
  174. package/lib/src/pages/daemonsets/list/index.js +32 -0
  175. package/lib/src/pages/daemonsets/show/index.js +16 -0
  176. package/lib/src/pages/deployments/create/index.js +7 -0
  177. package/lib/src/pages/deployments/index.js +3 -0
  178. package/lib/src/pages/deployments/list/index.js +26 -0
  179. package/lib/src/pages/deployments/show/index.js +16 -0
  180. package/lib/src/pages/ingresses/index.js +26 -0
  181. package/lib/src/pages/jobs/index.js +34 -0
  182. package/lib/src/pages/networkPolicies/index.js +67 -0
  183. package/lib/src/pages/persistentvolumeclaims/index.d.ts +4 -0
  184. package/lib/src/pages/persistentvolumes/index.d.ts +3 -18
  185. package/lib/src/pages/pods/create/index.js +6 -0
  186. package/lib/src/pages/pods/index.js +3 -0
  187. package/lib/src/pages/pods/list/index.js +81 -0
  188. package/lib/src/pages/pods/show/index.js +54 -0
  189. package/lib/src/pages/secrets/index.js +15 -0
  190. package/lib/src/pages/services/index.js +26 -0
  191. package/lib/src/pages/statefulsets/create/index.js +6 -0
  192. package/lib/src/pages/statefulsets/index.js +3 -0
  193. package/lib/src/pages/statefulsets/list/index.js +26 -0
  194. package/lib/src/pages/statefulsets/show/index.js +16 -0
  195. package/lib/src/plugins/index.js +3 -0
  196. package/lib/src/plugins/model-plugin.js +46 -0
  197. package/lib/src/plugins/relation-plugin.js +81 -0
  198. package/lib/src/plugins/type.js +1 -0
  199. package/lib/src/providers/index.js +1 -0
  200. package/lib/src/providers/router-provider/index.js +100 -0
  201. package/lib/src/types/index.js +1 -0
  202. package/lib/src/types/resource.js +12 -0
  203. package/lib/src/utils/addId.js +8 -0
  204. package/lib/src/utils/download.js +9 -0
  205. package/lib/src/utils/error.js +53 -0
  206. package/lib/src/utils/form.js +9 -0
  207. package/lib/src/utils/k8s.js +6 -0
  208. package/lib/src/utils/labels.js +15 -0
  209. package/lib/src/utils/match-selector.js +12 -0
  210. package/lib/src/utils/openapi.js +33 -0
  211. package/lib/src/utils/schema.js +117 -0
  212. package/lib/src/utils/selector.js +12 -0
  213. package/lib/src/utils/string.js +6 -0
  214. package/lib/src/utils/time.js +46 -0
  215. package/lib/src/utils/unit.js +69 -0
  216. package/lib/src/utils/yaml.js +44 -0
  217. package/lib/vite.config.js +60 -0
  218. package/package.json +1 -10
  219. package/lib/src/components/ModalContextProvider/index.d.ts +0 -12
  220. package/lib/src/components/PodDropdown/index.d.ts +0 -9
  221. package/lib/src/components/PodShellModal/PodShell.d.ts +0 -18
  222. package/lib/src/components/PodShellModal/index.d.ts +0 -10
  223. package/lib/src/components/Shell/index.d.ts +0 -50
  224. package/lib/src/components/Shell/zmodem/index.d.ts +0 -51
  225. package/lib/src/hooks/useModal.d.ts +0 -0
  226. package/lib/src/hooks/useNamespaceFilter.d.ts +0 -5
  227. package/lib/src/model/cronjob-model.d.ts +0 -9
  228. package/lib/src/model/index.d.ts +0 -6
  229. package/lib/src/model/job-model.d.ts +0 -10
  230. package/lib/src/model/pod-metrics-model.d.ts +0 -7
  231. package/lib/src/model/pod-model.d.ts +0 -15
  232. package/lib/src/model/resource-model.d.ts +0 -17
  233. package/lib/src/model/workload-model.d.ts +0 -17
  234. package/lib/src/pages/nodes/hooks/useNodeMetrics.d.ts +0 -17
  235. package/lib/src/pages/storageclasses/list/index.d.ts +0 -3
  236. package/lib/src/pages/storageclasses/show/index.d.ts +0 -3
  237. package/lib/src/types/metric.d.ts +0 -25
  238. package/lib/src/utils/shell.d.ts +0 -16
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { css, cx } from '@linaria/core';
3
+ import { parseSi } from 'src/utils/unit';
4
+ const WrapperStyle = css `
5
+ display: flex;
6
+ align-items: center;
7
+
8
+ .usage-text {
9
+ width: 50px;
10
+ text-align: right;
11
+ }
12
+
13
+ .usage-bar {
14
+ height: 12px;
15
+ width: 100px;
16
+ position: relative;
17
+ border-radius: 2px;
18
+ }
19
+
20
+ .request-anchor {
21
+ position: absolute;
22
+ left: 10%;
23
+ top: -3px;
24
+ height: 18px;
25
+ width: 2px;
26
+ background: #777;
27
+ z-index: 9;
28
+ }
29
+
30
+ .usage-fill-bar {
31
+ position: absolute;
32
+ left: 0;
33
+ top: 0;
34
+ height: 100%;
35
+ background: rgba(0, 128, 255, 0.6);
36
+ z-index: 7;
37
+ }
38
+
39
+ .request-bar {
40
+ position: absolute;
41
+ left: 0;
42
+ top: 0;
43
+ height: 100%;
44
+ background: #d8deeb;
45
+ z-index: 5;
46
+ }
47
+
48
+ .request-to-limit-bar {
49
+ position: absolute;
50
+ right: 0;
51
+ top: 0;
52
+ height: 100%;
53
+ background: #d8deeb;
54
+ z-index: 5;
55
+
56
+ &.no-limit {
57
+ background: linear-gradient(to right, #d8deeb 50%, #d8deeb 50%);
58
+ background-size: 4px 100%;
59
+
60
+ &.exceed-request {
61
+ background: linear-gradient(to right, #d8deeb 50%, rgba(0, 128, 255, 0.6) 50%);
62
+ background-size: 4px 100%;
63
+ }
64
+ }
65
+ }
66
+ `;
67
+ const InnerBar = ({ usage, requestNum, limitNum }) => {
68
+ const usageNum = parseSi(usage);
69
+ const totalNum = limitNum || requestNum / 0.8;
70
+ const requestPercent = (100 * requestNum) / totalNum;
71
+ const usageInRequestPercent = 100 * Math.min(usageNum / requestNum, 1);
72
+ const usageInRequestToLimitPercent = 100 * Math.min(Math.max(usageNum - requestNum, 0) / (totalNum - requestNum), 1);
73
+ const noLimit = limitNum === 0;
74
+ return (_jsxs("div", { className: "usage-bar", style: { marginLeft: 4 }, children: [_jsx("div", { className: "request-anchor", style: {
75
+ left: `${requestPercent}%`,
76
+ } }), _jsx("div", { className: "request-bar", style: { width: `${requestPercent}%` }, children: _jsx("div", { className: "usage-fill-bar", style: { width: `${usageInRequestPercent}%` } }) }), _jsx("div", { className: cx('request-to-limit-bar', noLimit && 'no-limit', usageInRequestToLimitPercent > 0 && 'exceed-request'), style: { width: `${100 - requestPercent}%` }, children: !noLimit && (_jsx("div", { className: "usage-fill-bar", style: { width: `${usageInRequestToLimitPercent}%` } })) })] }));
77
+ };
78
+ export const ResourceUsageBar = props => {
79
+ const { usage, requestNum } = props;
80
+ return (_jsxs("div", { className: cx('usage-wrapper', WrapperStyle), children: [_jsx("div", { className: "usage-text", children: usage }), requestNum > 0 && _jsx(InnerBar, { ...props })] }));
81
+ };
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { css } from '@linaria/core';
3
+ const Style = css `
4
+ width: 1px;
5
+ height: 16px;
6
+ border-radius: 1px;
7
+ background: rgba(172, 186, 211, 0.6);
8
+ `;
9
+ export const Separator = () => {
10
+ return _jsx("div", { className: Style });
11
+ };
@@ -0,0 +1,157 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Typo, useUIKit } from '@cloudtower/eagle';
3
+ import { css } from '@linaria/core';
4
+ import { useParsed, useResource, useShow } from '@refinedev/core';
5
+ import yaml from 'js-yaml';
6
+ import { get, omit } from 'lodash-es';
7
+ import { useState, useMemo, useCallback } from 'react';
8
+ import K8sDropdown from 'src/components/K8sDropdown';
9
+ import { KeyValueData } from 'src/components/KeyValueData';
10
+ import MonacoYamlEditor from 'src/components/YamlEditor/MonacoYamlEditor';
11
+ import useK8sYamlEditor from 'src/hooks/useK8sYamlEditor';
12
+ import { useGlobalStore } from '../../hooks';
13
+ import { useD2Translation } from '../../i18n';
14
+ import { StateTag } from '../StateTag';
15
+ import { Tags } from '../Tags';
16
+ import Time from '../Time';
17
+ const ShowContentWrapperStyle = css `
18
+ .ant-row {
19
+ margin-right: 0 !important;
20
+ }
21
+ `;
22
+ const TopBarStyle = css `
23
+ justify-content: space-between;
24
+ width: 100%;
25
+ `;
26
+ const ShowContentHeaderStyle = css `
27
+ width: 100%;
28
+ height: 100%;
29
+ `;
30
+ const EditorStyle = css `
31
+ margin-top: 16px;
32
+ `;
33
+ const FieldWrapperStyle = css `
34
+ display: flex;
35
+ flex-wrap: nowrap;
36
+ `;
37
+ const TabsStyle = css `
38
+ &.ant-tabs {
39
+ .ant-tabs-nav {
40
+ margin-bottom: 0;
41
+ }
42
+ }
43
+ `;
44
+ const StateTagStyle = css `
45
+ margin-left: 8px;
46
+ `;
47
+ var Mode;
48
+ (function (Mode) {
49
+ Mode["Detail"] = "detail";
50
+ Mode["Yaml"] = "yaml";
51
+ })(Mode || (Mode = {}));
52
+ export const ShowContent = (props) => {
53
+ const { showConfig, formatter, Dropdown = K8sDropdown } = props;
54
+ const kit = useUIKit();
55
+ const { globalStore } = useGlobalStore();
56
+ const parsed = useParsed();
57
+ const { resource } = useResource();
58
+ const [mode, setMode] = useState(Mode.Detail);
59
+ const { queryResult } = useShow({
60
+ id: parsed?.params?.id,
61
+ liveMode: mode === Mode.Yaml ? 'off' : 'auto',
62
+ });
63
+ const { t } = useD2Translation();
64
+ const { fold } = useK8sYamlEditor();
65
+ const { data } = queryResult;
66
+ const schema = useMemo(() => ({}), []);
67
+ const defaultEditorValue = useMemo(() => (data?.data ? yaml.dump(omit(globalStore?.restoreItem(data.data), 'id')) : ''), [globalStore, data]);
68
+ const onEditorCreate = useCallback(editor => {
69
+ fold(editor);
70
+ }, [fold]);
71
+ if (!data?.data) {
72
+ return null;
73
+ }
74
+ const model = data.data;
75
+ const record = formatter ? formatter(model) : data?.data;
76
+ function renderFields(fields) {
77
+ if (!record)
78
+ return null;
79
+ return fields.map(field => {
80
+ let content;
81
+ const value = get(record, field.path);
82
+ if (field.renderContent) {
83
+ content = field.renderContent(value, record, field);
84
+ }
85
+ else {
86
+ content = _jsx("span", { children: get(record, field.path) });
87
+ }
88
+ return (_jsx(kit.col, { span: field.col, children: field.render ? (field.render(value, record, field)) : (_jsxs("div", { className: FieldWrapperStyle, children: [_jsxs("span", { className: Typo.Label.l3_regular, style: { width: field.labelWidth || '64px' }, children: [field.title, ":", ' '] }), content] })) }, field.path.join()));
89
+ });
90
+ }
91
+ const DESCRIPTION_DEFAULT_FIELDS = [
92
+ {
93
+ key: 'NameSpace',
94
+ title: t('dovetail.namespace'),
95
+ path: ['metadata', 'namespace'],
96
+ },
97
+ {
98
+ key: 'Age',
99
+ title: t('dovetail.created_time'),
100
+ path: ['metadata', 'creationTimestamp'],
101
+ renderContent(value) {
102
+ return _jsx(Time, { date: new Date(value) });
103
+ },
104
+ },
105
+ ];
106
+ const LABELS_ANNOTATIONS_GROUP_FIELDS = [
107
+ {
108
+ key: 'Labels',
109
+ title: t('dovetail.label'),
110
+ path: ['metadata', 'labels'],
111
+ col: 24,
112
+ renderContent: value => {
113
+ if (!value) {
114
+ return undefined;
115
+ }
116
+ return _jsx(Tags, { value: value });
117
+ },
118
+ },
119
+ {
120
+ key: 'Annotations',
121
+ title: t('dovetail.annotation'),
122
+ path: ['metadata', 'annotations'],
123
+ col: 24,
124
+ renderContent: value => {
125
+ if (!value) {
126
+ return undefined;
127
+ }
128
+ return _jsx(KeyValueData, { datas: value, expandable: true });
129
+ },
130
+ },
131
+ ];
132
+ const stateDisplay = get(record, 'stateDisplay');
133
+ const topBar = (_jsxs(kit.space, { className: TopBarStyle, children: [_jsxs("div", { children: [_jsxs("span", { className: Typo.Display.d2_bold_title, children: [resource?.meta?.kind, ": "] }), _jsx("span", { className: Typo.Label.l1_regular, children: record?.metadata?.name }), stateDisplay ? (_jsx(StateTag, { className: StateTagStyle, state: stateDisplay })) : undefined] }), _jsxs(kit.space, { children: [_jsxs(kit.radioGroup, { value: mode, onChange: e => setMode(e.target.value), children: [_jsx(kit.radioButton, { value: "detail", children: t('dovetail.detail') }), _jsx(kit.radioButton, { value: "yaml", children: "YAML" })] }), _jsx(Dropdown, { record: record })] })] }));
134
+ const descriptions = (_jsx(kit.row, { gutter: 24, children: renderFields([...DESCRIPTION_DEFAULT_FIELDS, ...(showConfig.descriptions || [])]) }));
135
+ const groups = (showConfig.groups || [])
136
+ .concat([
137
+ {
138
+ fields: LABELS_ANNOTATIONS_GROUP_FIELDS,
139
+ },
140
+ ])
141
+ .map((group, index) => (_jsx(kit.row, { gutter: [24, 16], children: renderFields(group.fields) }, index)));
142
+ const tabs = (_jsx(kit.tabs, { className: TabsStyle, children: (showConfig.tabs || []).map(field => {
143
+ let content;
144
+ if (field.renderContent) {
145
+ content = field.renderContent(get(record, field.path), record, field);
146
+ }
147
+ else {
148
+ content = _jsx("span", { children: get(record, field.path) });
149
+ }
150
+ return (_jsx(kit.tabsTabPane, { tab: field.title, children: content }, field.key));
151
+ }) }));
152
+ const modeMap = {
153
+ [Mode.Detail]: (_jsxs(_Fragment, { children: [groups, _jsx(kit.divider, {}), tabs] })),
154
+ [Mode.Yaml]: (_jsx(MonacoYamlEditor, { className: EditorStyle, defaultValue: defaultEditorValue, schema: schema, onEditorCreate: onEditorCreate, readOnly: true })),
155
+ };
156
+ return (_jsxs("div", { className: ShowContentWrapperStyle, children: [_jsxs(kit.space, { direction: "vertical", className: ShowContentHeaderStyle, children: [topBar, descriptions] }), _jsx(kit.divider, {}), modeMap[mode]] }));
157
+ };
@@ -2,7 +2,7 @@ import { i18n as I18nType } from 'i18next';
2
2
  import { Unstructured } from 'k8s-api-provider';
3
3
  import { NetworkPolicy } from 'kubernetes-types/networking/v1';
4
4
  import React from 'react';
5
- import { JobModel, ResourceModel, WorkloadModel, WorkloadBaseModel, CronJobModel, IngressModel, ServiceModel, StorageClassModel } from '../../models';
5
+ import { JobModel, ResourceModel, WorkloadModel, WorkloadBaseModel, CronJobModel, IngressModel, ServiceModel, StorageClassModel, PersistentVolumeModel, PersistentVolumeClaimModel } from '../../models';
6
6
  export type ShowField<Model extends ResourceModel> = {
7
7
  key: string;
8
8
  title?: React.ReactNode;
@@ -59,5 +59,10 @@ export declare const PodSelectorField: <Model extends ResourceModel<Required<Uns
59
59
  export declare const PortsTableField: <Model extends ServiceModel>() => ShowField<Model>;
60
60
  export declare const DurationField: <Model extends JobModel | CronJobModel>(i18n: I18nType) => ShowField<Model>;
61
61
  export declare const StorageClassProvisionerField: <Model extends StorageClassModel>(i18n: I18nType) => ShowField<Model>;
62
- export declare const StorageClassFsTypeField: <Model extends StorageClassModel>(i18n: I18nType) => ShowField<Model>;
63
62
  export declare const StorageClassPvField: <Model extends StorageClassModel>() => ShowField<Model>;
63
+ export declare const PVCapacityField: <Model extends PersistentVolumeModel>(i18n: I18nType) => ShowField<Model>;
64
+ export declare const PVCStorageField: <Model extends PersistentVolumeClaimModel>(i18n: I18nType) => ShowField<Model>;
65
+ export declare const PVStorageClassField: <Model extends PersistentVolumeModel | PersistentVolumeClaimModel>(i18n: I18nType) => ShowField<Model>;
66
+ export declare const PVPhaseField: <Model extends PersistentVolumeModel | PersistentVolumeClaimModel>(i18n: I18nType) => ShowField<Model>;
67
+ export declare const PVVolumeModeField: <Model extends PersistentVolumeModel | PersistentVolumeClaimModel>(i18n: I18nType) => ShowField<Model>;
68
+ export declare const PVAccessModeField: <Model extends PersistentVolumeModel | PersistentVolumeClaimModel>(i18n: I18nType) => ShowField<Model>;
@@ -0,0 +1,157 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ConditionsTable } from '../ConditionsTable';
3
+ import { CronjobJobsTable } from '../CronjobJobsTable';
4
+ import { EventsTable } from '../EventsTable';
5
+ import { ImageNames } from '../ImageNames';
6
+ import { IngressRulesTable } from '../IngressRulesTable';
7
+ import { KeyValue } from '../KeyValue';
8
+ import Time from '../Time';
9
+ import { WorkloadPodsTable } from '../WorkloadPodsTable';
10
+ import { WorkloadReplicas } from '../WorkloadReplicas';
11
+ export const ImageField = (i18n) => {
12
+ return {
13
+ key: 'Image',
14
+ title: i18n.t('dovetail.image'),
15
+ path: ['imageNames'],
16
+ col: 12,
17
+ renderContent(value) {
18
+ return _jsx(ImageNames, { value: value });
19
+ },
20
+ };
21
+ };
22
+ export const ReplicaField = (i18n) => {
23
+ return {
24
+ key: 'Replicas',
25
+ title: i18n.t('dovetail.replicas'),
26
+ path: ['status', 'replicas'],
27
+ renderContent: (_, record, field) => {
28
+ return _jsx(WorkloadReplicas, { record: record, label: field.title, editable: true });
29
+ },
30
+ };
31
+ };
32
+ export const ConditionsField = (i18n) => {
33
+ return {
34
+ key: 'Conditions',
35
+ title: i18n.t('dovetail.condition'),
36
+ path: ['status', 'conditions'],
37
+ renderContent: value => {
38
+ return _jsx(ConditionsTable, { conditions: value });
39
+ },
40
+ };
41
+ };
42
+ export const PodsField = () => {
43
+ return {
44
+ key: 'pods',
45
+ title: 'Pods',
46
+ path: [],
47
+ renderContent: (_, record) => {
48
+ return (_jsx(WorkloadPodsTable, { selector: record.metadata.relations?.find(r => {
49
+ return r.kind === 'Pod' && r.type === 'creates';
50
+ })?.selector, hideToolbar: true }));
51
+ },
52
+ };
53
+ };
54
+ export const JobsField = () => {
55
+ return {
56
+ key: 'jobs',
57
+ title: 'Jobs',
58
+ path: [],
59
+ renderContent: (_, record) => {
60
+ return (_jsx(CronjobJobsTable, { owner: {
61
+ apiVersion: record.apiVersion || '',
62
+ kind: record.kind || '',
63
+ name: record.metadata?.name || '',
64
+ namespace: record.metadata?.namespace || '',
65
+ uid: record.metadata?.uid || '',
66
+ } }));
67
+ },
68
+ };
69
+ };
70
+ export const DataField = (i18n) => {
71
+ return {
72
+ key: 'data',
73
+ title: i18n.t('dovetail.data'),
74
+ path: ['data'],
75
+ renderContent: val => {
76
+ return _jsx(KeyValue, { value: val });
77
+ },
78
+ };
79
+ };
80
+ export const SecretDataField = (i18n) => {
81
+ return {
82
+ key: 'data',
83
+ title: i18n.t('dovetail.data'),
84
+ path: ['data'],
85
+ renderContent: val => {
86
+ const decodeVal = {};
87
+ for (const key in val) {
88
+ decodeVal[key] = atob(val[key]);
89
+ }
90
+ return _jsx(KeyValue, { value: decodeVal });
91
+ },
92
+ };
93
+ };
94
+ export const StartTimeField = (i18n) => {
95
+ return {
96
+ key: 'started',
97
+ title: i18n.t('dovetail.started'),
98
+ path: ['status', 'startTime'],
99
+ col: 12,
100
+ renderContent(value) {
101
+ return _jsx(Time, { date: value });
102
+ },
103
+ };
104
+ };
105
+ export const ServiceTypeField = (i18n) => {
106
+ return {
107
+ key: 'type',
108
+ title: i18n.t('dovetail.type'),
109
+ path: ['spec', 'type'],
110
+ };
111
+ };
112
+ export const ClusterIpField = (i18n) => {
113
+ return {
114
+ key: 'clusterIp',
115
+ title: i18n.t('dovetail.clusterIp'),
116
+ path: ['spec', 'clusterIP'],
117
+ };
118
+ };
119
+ export const SessionAffinityField = (i18n) => {
120
+ return {
121
+ key: 'clusterIp',
122
+ title: i18n.t('dovetail.sessionAffinity'),
123
+ path: ['spec', 'sessionAffinity'],
124
+ };
125
+ };
126
+ export const ServicePodsField = () => {
127
+ return {
128
+ key: 'pods',
129
+ title: 'Pods',
130
+ path: [],
131
+ renderContent: (_, record) => {
132
+ return (_jsx(WorkloadPodsTable, { selector: record.metadata.relations?.find(r => {
133
+ return r.kind === 'Pod' && r.type === 'selects';
134
+ })?.selector }));
135
+ },
136
+ };
137
+ };
138
+ export const IngressRulesTableTabField = (i18n) => {
139
+ return {
140
+ key: 'rules',
141
+ title: i18n.t('dovetail.rule'),
142
+ path: ['spec', 'rules'],
143
+ renderContent: (_, record) => {
144
+ return _jsx(IngressRulesTable, { ingress: record });
145
+ },
146
+ };
147
+ };
148
+ export const EventsTableTabField = (i18n) => {
149
+ return {
150
+ key: 'event',
151
+ title: i18n.t('dovetail.event'),
152
+ path: [],
153
+ renderContent: () => {
154
+ return _jsx(EventsTable, {});
155
+ },
156
+ };
157
+ };
@@ -0,0 +1,2 @@
1
+ export * from './fields';
2
+ export * from './ShowContent';
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { WorkloadState } from '../../constants';
4
+ import { useD2Translation } from '../../i18n';
5
+ export const StateTag = ({ state = WorkloadState.UPDATEING, className }) => {
6
+ const kit = useUIKit();
7
+ const { t } = useD2Translation();
8
+ const colorMap = {
9
+ updating: 'blue',
10
+ ready: 'green',
11
+ completed: 'green',
12
+ failed: 'red',
13
+ suspended: 'gray',
14
+ running: 'blue',
15
+ succeeded: 'green',
16
+ unknown: 'gray',
17
+ terminating: 'gray',
18
+ pending: 'gray',
19
+ waiting: 'gray',
20
+ };
21
+ return _jsx(kit.tag, { className: className, color: colorMap[state], children: t(`dovetail.${state || 'updaing'}`) });
22
+ };
@@ -0,0 +1 @@
1
+ export * from './StateTag';
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { kitContext } from '@cloudtower/eagle';
3
+ import { Typo } from '@cloudtower/eagle';
4
+ import { cx, css } from '@linaria/core';
5
+ import { useContext } from 'react';
6
+ import { useD2Translation } from '../../i18n';
7
+ export const ErrorWrapper = css `
8
+ display: flex;
9
+ flex-direction: column;
10
+ justify-content: center;
11
+ align-items: center;
12
+ height: 100%;
13
+ `;
14
+ export const ErrorContent = css `
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: center;
18
+
19
+ .title {
20
+ margin-bottom: 8px;
21
+ background-clip: text;
22
+ -webkit-background-clip: text;
23
+ -webkit-text-fill-color: transparent;
24
+ background-image: linear-gradient(211.41deg, #929dad 0%, #d3dbe3 100%);
25
+ }
26
+ `;
27
+ const WidgetErrorContent = props => {
28
+ const { refetch } = props;
29
+ const kit = useContext(kitContext);
30
+ const { t } = useD2Translation();
31
+ return (_jsx("div", { className: ErrorWrapper, style: props.style, children: _jsxs("div", { className: ErrorContent, children: [_jsx("p", { className: cx(Typo.Label.l1_regular_title, 'title'), children: props.errorText || t('dovetail.obtain_data_error') }), refetch ? (_jsx(kit.button, { type: "ordinary", onClick: e => {
32
+ e.stopPropagation();
33
+ refetch?.();
34
+ }, children: t('dovetail.retry') })) : null] }) }));
35
+ };
36
+ export default WidgetErrorContent;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useUIKit, Typo } from '@cloudtower/eagle';
3
+ import { css, cx } from '@linaria/core';
4
+ import { CreateButton } from '../CreateButton';
5
+ import { DeleteManyButton } from '../DeleteManyButton';
6
+ const ToolbarStyle = css `
7
+ justify-content: space-between;
8
+ width: 100%;
9
+ margin-bottom: 16px;
10
+ `;
11
+ export const TableToolBar = ({ title, selectedKeys, hideCreate }) => {
12
+ const kit = useUIKit();
13
+ return (_jsxs(kit.space, { className: cx(ToolbarStyle, 'table-toolbar'), children: [_jsx("span", { className: Typo.Display.d2_bold_title, children: title }), _jsxs(kit.space, { children: [selectedKeys.length > 0 ? _jsx(DeleteManyButton, { ids: selectedKeys }) : undefined, !hideCreate ? _jsx(CreateButton, {}) : null] })] }));
14
+ };
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowChevronUp16BoldSecondaryIcon } from '@cloudtower/icons-react';
3
+ import { cx } from '@linaria/core';
4
+ import { styled } from '@linaria/react';
5
+ export const ColumnTitle = props => {
6
+ const { title, sortOrder } = props;
7
+ return (_jsxs(_Fragment, { children: [title, _jsx(ArrowChevronUp16BoldSecondaryIcon, { className: cx('order-icon', sortOrder) })] }));
8
+ };
9
+ export const AuxiliaryLine = styled.div `
10
+ position: absolute;
11
+ top: 0;
12
+ left: 0;
13
+ bottom: 0;
14
+ width: 1px;
15
+ background: $blue-60;
16
+ transform: translateX(-9999px);
17
+ z-index: 999;
18
+
19
+ &::before {
20
+ content: '';
21
+ position: absolute;
22
+ height: 34px;
23
+ width: 3px;
24
+ top: 0;
25
+ left: -1px;
26
+ background: $blue-60;
27
+ }
28
+ `;
@@ -0,0 +1,69 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { css, cx } from '@linaria/core';
4
+ import { useMemo, useRef } from 'react';
5
+ import { useD2Translation } from '../../i18n';
6
+ import ErrorContent from './ErrorContent';
7
+ import { AuxiliaryLine } from './TableWidgets';
8
+ const TableContainerStyle = css `
9
+ width: 100%;
10
+ border-top: 1px solid rgba(211, 218, 235, 0.6);
11
+ display: flex;
12
+ flex-direction: column;
13
+
14
+ // use eagle's own pagination component, hide antd's
15
+ .ant-table-pagination {
16
+ display: none;
17
+ }
18
+
19
+ .table-container {
20
+ min-height: 0;
21
+ }
22
+ `;
23
+ function Table(props) {
24
+ const kit = useUIKit();
25
+ const { t } = useD2Translation();
26
+ const { loading, error, data: dataSource, rowKey, columns, scroll, currentPage, currentSize, RowMenu, refetch, onSelect, onPageChange, onSizeChange, } = props;
27
+ const auxiliaryLineRef = useRef(null);
28
+ const wrapperRef = useRef(null);
29
+ const pagination = useMemo(() => ({
30
+ current: currentPage,
31
+ pageSize: currentSize,
32
+ onChange: onPageChange,
33
+ }), [currentPage, currentSize, onPageChange]);
34
+ const finalColumns = useMemo(() => {
35
+ if (RowMenu) {
36
+ const actionColumn = {
37
+ key: '_action_',
38
+ display: true,
39
+ dataIndex: [],
40
+ title: '',
41
+ render: (_, record) => {
42
+ return _jsx(RowMenu, { record: record });
43
+ },
44
+ };
45
+ return [
46
+ ...columns,
47
+ actionColumn
48
+ ];
49
+ }
50
+ return columns;
51
+ }, [columns, RowMenu]);
52
+ if (loading) {
53
+ return _jsx(kit.loading, {});
54
+ }
55
+ else if (error) {
56
+ return (_jsx(ErrorContent, { errorText: t('dovetail.retry_when_access_data_failed'), refetch: refetch, style: { padding: '15px 0' } }));
57
+ }
58
+ else if (dataSource.length === 0) {
59
+ return _jsx(ErrorContent, { errorText: t('dovetail.empty'), style: { padding: '15px 0' } });
60
+ }
61
+ return (_jsxs("div", { ref: wrapperRef, className: cx(TableContainerStyle, props.className, 'table-wrapper'), children: [_jsx(kit.table, { tableLayout: "fixed", rowSelection: onSelect
62
+ ? {
63
+ onChange: (keys, rows) => {
64
+ onSelect?.(keys, rows);
65
+ },
66
+ }
67
+ : undefined, columns: finalColumns, dataSource: dataSource, pagination: pagination, error: error, loading: loading, rowKey: rowKey, wrapper: wrapperRef, scroll: scroll }), _jsx(AuxiliaryLine, { ref: auxiliaryLineRef }), _jsx(kit.pagination, { current: currentPage, size: currentSize, count: dataSource.length, onChange: onPageChange, onSizeChange: onSizeChange })] }));
68
+ }
69
+ export default Table;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { css } from '@linaria/core';
4
+ const TagWrapper = css `
5
+ flex-wrap: wrap;
6
+ max-width: 100%;
7
+ `;
8
+ const TagStyle = css `
9
+ overflow: hidden;
10
+ text-overflow: ellipsis;
11
+ `;
12
+ export const Tags = props => {
13
+ const { value } = props;
14
+ const kit = useUIKit();
15
+ if (!value) {
16
+ return _jsx("span", { children: "-" });
17
+ }
18
+ const tags = Object.keys(value).map(key => {
19
+ return (_jsx(kit.tag.SplitTag, { className: TagStyle, primaryContent: key, secondaryContent: value[key], title: `${key}:${value[key]}`, color: "gray" }, key));
20
+ });
21
+ return (_jsx(kit.space, { className: TagWrapper, size: 8, children: tags }));
22
+ };
@@ -0,0 +1,14 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // TODO: use ui-kit
3
+ import dayjs from 'dayjs';
4
+ const Time = props => {
5
+ const { className, date, dateTemplate = 'YYYY-MM-DD', timeTemplate = 'HH:mm', plainText, } = props;
6
+ if (!date)
7
+ return _jsx(_Fragment, { children: "-" });
8
+ const time = dayjs(date);
9
+ if (plainText) {
10
+ return (_jsxs(_Fragment, { children: [dateTemplate !== null && time.format(dateTemplate), ' ', timeTemplate !== null && time.format(timeTemplate)] }));
11
+ }
12
+ return (_jsxs("span", { className: `time-wrapper ${className || ''}`, children: [dateTemplate !== null && (_jsxs("span", { className: "date", children: [" ", time.format(dateTemplate)] })), timeTemplate !== null && (_jsxs("span", { className: "time", children: [" ", time.format(timeTemplate)] }))] }));
13
+ };
14
+ export default Time;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Icon, useUIKit } from '@cloudtower/eagle';
3
+ import { DynamicResourceSchedule16BlueIcon } from '@cloudtower/icons-react';
4
+ import { useResource, useUpdate } from '@refinedev/core';
5
+ import { useD2Translation } from '../../i18n';
6
+ import { pruneBeforeEdit } from '../../utils/k8s';
7
+ import K8sDropdown from '../K8sDropdown';
8
+ export function WorkloadDropdown(props) {
9
+ const { record } = props;
10
+ const kit = useUIKit();
11
+ const { resource } = useResource();
12
+ const { mutate } = useUpdate();
13
+ const { t } = useD2Translation();
14
+ return (_jsx(K8sDropdown, { record: record, children: _jsx(kit.menu.Item, { onClick: () => {
15
+ const v = record.redeploy();
16
+ const id = v.id;
17
+ pruneBeforeEdit(v);
18
+ mutate({
19
+ id,
20
+ resource: resource?.name || '',
21
+ values: v,
22
+ });
23
+ }, children: _jsx(Icon, { src: DynamicResourceSchedule16BlueIcon, children: t('dovetail.redeploy') }) }) }));
24
+ }