@dovetail-v2/refine 0.0.49-alpha.0 → 0.0.51

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 (211) hide show
  1. package/dist/{MonacoYamlDiffEditor-7cb1e598.js → MonacoYamlDiffEditor-b82fbea9.js} +1 -1
  2. package/dist/{index-8f27c902.js → index-51cc13dd.js} +116 -82
  3. package/dist/refine.js +1 -1
  4. package/dist/refine.umd.cjs +114 -80
  5. package/dist/style.css +2 -1
  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/KeyValueListWidget.js +56 -0
  24. package/lib/src/components/Form/MetadataForm.js +9 -0
  25. package/lib/src/components/Form/NameInputWidget.js +50 -0
  26. package/lib/src/components/Form/NamespaceSelectWidget.js +21 -0
  27. package/lib/src/components/Form/index.js +4 -0
  28. package/lib/src/components/Form/widget.js +1 -0
  29. package/lib/src/components/FormErrorAlert/index.js +8 -0
  30. package/lib/src/components/FormLayout/index.js +21 -0
  31. package/lib/src/components/FormModal/index.js +51 -0
  32. package/lib/src/components/ImageNames/index.js +14 -0
  33. package/lib/src/components/IngressRulesComponent/index.js +11 -0
  34. package/lib/src/components/IngressRulesTable/IngressRulesTable.js +51 -0
  35. package/lib/src/components/IngressRulesTable/index.js +1 -0
  36. package/lib/src/components/K8sDropdown/index.js +31 -0
  37. package/lib/src/components/KeyValue/KeyValue.js +27 -0
  38. package/lib/src/components/KeyValue/index.js +1 -0
  39. package/lib/src/components/KeyValueData/index.js +50 -0
  40. package/lib/src/components/Layout/index.js +39 -0
  41. package/lib/src/components/ListPage/index.js +25 -0
  42. package/lib/src/components/Menu/index.js +36 -0
  43. package/lib/src/components/NamespacesFilter/index.js +34 -0
  44. package/lib/src/components/NetworkPolicyRulesTable/NetworkPolicyRulesTable.d.ts +1 -2
  45. package/lib/src/components/NetworkPolicyRulesTable/NetworkPolicyRulesTable.js +77 -0
  46. package/lib/src/components/NetworkPolicyRulesTable/index.js +1 -0
  47. package/lib/src/components/PageShow/PageShow.js +11 -0
  48. package/lib/src/components/PageShow/index.js +1 -0
  49. package/lib/src/components/PodContainersTable/PodContainersTable.js +78 -0
  50. package/lib/src/components/PodContainersTable/index.js +1 -0
  51. package/lib/src/components/PodLog/index.js +136 -0
  52. package/lib/src/components/ReferenceLink/index.js +17 -0
  53. package/lib/src/components/RefineForm/RefineFormContent.d.ts +10 -0
  54. package/lib/src/components/RefineForm/RefineFormModal.d.ts +8 -0
  55. package/lib/src/components/RefineForm/RefineFormPage.d.ts +7 -0
  56. package/lib/src/components/RefineForm/index.d.ts +3 -0
  57. package/lib/src/components/RefineForm/type.d.ts +20 -0
  58. package/lib/src/components/RefineForm/useRefineForm.d.ts +10 -0
  59. package/lib/src/components/ResourceCRUD/ResourceCRUD.js +15 -0
  60. package/lib/src/components/ResourceCRUD/create/index.js +13 -0
  61. package/lib/src/components/ResourceCRUD/index.js +4 -0
  62. package/lib/src/components/ResourceCRUD/list/index.js +19 -0
  63. package/lib/src/components/ResourceCRUD/show/index.js +6 -0
  64. package/lib/src/components/ResourceLink/index.js +21 -0
  65. package/lib/src/components/ResourceUsageBar/index.js +81 -0
  66. package/lib/src/components/Separator/index.js +11 -0
  67. package/lib/src/components/ServiceComponents/index.d.ts +0 -1
  68. package/lib/src/components/ShowContent/ShowContent.d.ts +1 -1
  69. package/lib/src/components/ShowContent/ShowContent.js +157 -0
  70. package/lib/src/components/ShowContent/fields.d.ts +1 -1
  71. package/lib/src/components/ShowContent/fields.js +157 -0
  72. package/lib/src/components/ShowContent/index.js +2 -0
  73. package/lib/src/components/StateTag/StateTag.js +22 -0
  74. package/lib/src/components/StateTag/index.js +1 -0
  75. package/lib/src/components/Table/ErrorContent.js +36 -0
  76. package/lib/src/components/Table/TableToolBar.js +14 -0
  77. package/lib/src/components/Table/TableWidgets.js +28 -0
  78. package/lib/src/components/Table/index.js +69 -0
  79. package/lib/src/components/Tags/index.js +22 -0
  80. package/lib/src/components/Time/index.js +14 -0
  81. package/lib/src/components/WorkloadDropdown/index.js +24 -0
  82. package/lib/src/components/WorkloadPodsTable/WorkloadPodsTable.js +39 -0
  83. package/lib/src/components/WorkloadPodsTable/index.js +1 -0
  84. package/lib/src/components/WorkloadReplicas/index.js +50 -0
  85. package/lib/src/components/YamlEditor/MonacoYamlDiffEditor.js +34 -0
  86. package/lib/src/components/YamlEditor/MonacoYamlEditor.js +149 -0
  87. package/lib/src/components/YamlEditor/YamlEditorComponent.js +90 -0
  88. package/lib/src/components/YamlEditor/index.js +1 -0
  89. package/lib/src/components/YamlEditor/style.js +102 -0
  90. package/lib/src/components/YamlEditor/yaml.worker.js +1 -0
  91. package/lib/src/components/YamlForm/index.d.ts +0 -4
  92. package/lib/src/components/YamlForm/index.js +61 -0
  93. package/lib/src/components/index.js +38 -0
  94. package/lib/src/constants/index.js +2 -0
  95. package/lib/src/constants/k8s.js +203 -0
  96. package/lib/src/constants/state.d.ts +2 -1
  97. package/lib/src/constants/state.js +15 -0
  98. package/lib/src/contexts/component.js +3 -0
  99. package/lib/src/contexts/configs.js +3 -0
  100. package/lib/src/contexts/global-store.js +3 -0
  101. package/lib/src/contexts/index.js +3 -0
  102. package/lib/src/hooks/index.js +7 -0
  103. package/lib/src/hooks/useDeleteModal/index.js +1 -0
  104. package/lib/src/hooks/useDeleteModal/useDeleteManyModal.js +31 -0
  105. package/lib/src/hooks/useDeleteModal/useDeleteModal.js +38 -0
  106. package/lib/src/hooks/useDownloadYAML.js +10 -0
  107. package/lib/src/hooks/useEagleForm.d.ts +1 -2
  108. package/lib/src/hooks/useEagleForm.js +177 -0
  109. package/lib/src/hooks/useEagleTable/columns.d.ts +1 -1
  110. package/lib/src/hooks/useEagleTable/columns.js +246 -0
  111. package/lib/src/hooks/useEagleTable/index.js +2 -0
  112. package/lib/src/hooks/useEagleTable/useEagleTable.js +63 -0
  113. package/lib/src/hooks/useEdit.js +19 -0
  114. package/lib/src/hooks/useGlobalStore.js +5 -0
  115. package/lib/src/hooks/useK8sYamlEditor.js +37 -0
  116. package/lib/src/hooks/useOpenForm.js +43 -0
  117. package/lib/src/hooks/useSchema.js +37 -0
  118. package/lib/src/hooks/useSubmitForm.js +42 -0
  119. package/lib/src/i18n.d.ts +4 -0
  120. package/lib/src/i18n.js +19 -0
  121. package/lib/src/index.js +13 -0
  122. package/lib/src/locales/en-US/dovetail.json +18 -0
  123. package/lib/src/locales/en-US/index.d.ts +2 -0
  124. package/lib/src/locales/en-US/index.js +4 -0
  125. package/lib/src/locales/index.js +6 -0
  126. package/lib/src/locales/zh-CN/dovetail.json +91 -0
  127. package/lib/src/locales/zh-CN/index.d.ts +2 -0
  128. package/lib/src/locales/zh-CN/index.js +4 -0
  129. package/lib/src/main.js +12 -0
  130. package/lib/src/models/cronjob-model.js +32 -0
  131. package/lib/src/models/daemonset-model.js +17 -0
  132. package/lib/src/models/deployment-model.d.ts +1 -1
  133. package/lib/src/models/deployment-model.js +17 -0
  134. package/lib/src/models/event-model.js +11 -0
  135. package/lib/src/models/index.js +14 -0
  136. package/lib/src/models/ingress-model.js +24 -0
  137. package/lib/src/models/job-model.js +56 -0
  138. package/lib/src/models/network-policy-model.js +10 -0
  139. package/lib/src/models/pod-metrics-model.js +34 -0
  140. package/lib/src/models/pod-model.js +78 -0
  141. package/lib/src/models/resource-model.js +34 -0
  142. package/lib/src/models/server-instance-model.d.ts +10 -0
  143. package/lib/src/models/service-model.d.ts +2 -1
  144. package/lib/src/models/service-model.js +17 -0
  145. package/lib/src/models/statefulset-model.d.ts +1 -1
  146. package/lib/src/models/statefulset-model.js +17 -0
  147. package/lib/src/models/types/index.js +1 -0
  148. package/lib/src/models/types/metric.js +1 -0
  149. package/lib/src/models/workload-base-model.js +22 -0
  150. package/lib/src/models/workload-model.js +51 -0
  151. package/lib/src/pages/configmaps/index.js +15 -0
  152. package/lib/src/pages/cronjobs/create/index.js +6 -0
  153. package/lib/src/pages/cronjobs/index.js +3 -0
  154. package/lib/src/pages/cronjobs/list/index.js +42 -0
  155. package/lib/src/pages/cronjobs/show/index.js +16 -0
  156. package/lib/src/pages/daemonsets/create/index.js +6 -0
  157. package/lib/src/pages/daemonsets/index.js +3 -0
  158. package/lib/src/pages/daemonsets/list/index.js +32 -0
  159. package/lib/src/pages/daemonsets/show/index.js +16 -0
  160. package/lib/src/pages/deployments/create/index.js +7 -0
  161. package/lib/src/pages/deployments/index.js +3 -0
  162. package/lib/src/pages/deployments/list/index.js +26 -0
  163. package/lib/src/pages/deployments/show/index.js +16 -0
  164. package/lib/src/pages/ingresses/index.js +26 -0
  165. package/lib/src/pages/jobs/index.js +34 -0
  166. package/lib/src/pages/networkPolicies/index.js +67 -0
  167. package/lib/src/pages/pods/create/index.js +6 -0
  168. package/lib/src/pages/pods/index.js +3 -0
  169. package/lib/src/pages/pods/list/index.js +81 -0
  170. package/lib/src/pages/pods/show/index.js +54 -0
  171. package/lib/src/pages/secrets/index.js +15 -0
  172. package/lib/src/pages/services/index.js +26 -0
  173. package/lib/src/pages/statefulsets/create/index.js +6 -0
  174. package/lib/src/pages/statefulsets/index.js +3 -0
  175. package/lib/src/pages/statefulsets/list/index.js +26 -0
  176. package/lib/src/pages/statefulsets/show/index.js +16 -0
  177. package/lib/src/plugins/index.js +3 -0
  178. package/lib/src/plugins/model-plugin.js +46 -0
  179. package/lib/src/plugins/relation-plugin.js +81 -0
  180. package/lib/src/plugins/type.js +1 -0
  181. package/lib/src/providers/index.js +1 -0
  182. package/lib/src/providers/router-provider/index.js +100 -0
  183. package/lib/src/types/index.js +1 -0
  184. package/lib/src/types/resource.js +12 -0
  185. package/lib/src/utils/addId.js +8 -0
  186. package/lib/src/utils/download.js +9 -0
  187. package/lib/src/utils/error.js +53 -0
  188. package/lib/src/utils/form.js +9 -0
  189. package/lib/src/utils/k8s.js +6 -0
  190. package/lib/src/utils/labels.js +15 -0
  191. package/lib/src/utils/match-selector.js +12 -0
  192. package/lib/src/utils/openapi.js +33 -0
  193. package/lib/src/utils/schema.js +117 -0
  194. package/lib/src/utils/selector.js +12 -0
  195. package/lib/src/utils/string.js +6 -0
  196. package/lib/src/utils/time.js +46 -0
  197. package/lib/src/utils/unit.js +69 -0
  198. package/lib/src/utils/yaml.js +44 -0
  199. package/lib/vite.config.js +60 -0
  200. package/package.json +2 -2
  201. package/lib/src/components/ModalContextProvider/index.d.ts +0 -12
  202. package/lib/src/hooks/useModal.d.ts +0 -0
  203. package/lib/src/hooks/useNamespaceFilter.d.ts +0 -5
  204. package/lib/src/model/cronjob-model.d.ts +0 -9
  205. package/lib/src/model/index.d.ts +0 -6
  206. package/lib/src/model/job-model.d.ts +0 -10
  207. package/lib/src/model/pod-metrics-model.d.ts +0 -7
  208. package/lib/src/model/pod-model.d.ts +0 -15
  209. package/lib/src/model/resource-model.d.ts +0 -17
  210. package/lib/src/model/workload-model.d.ts +0 -17
  211. package/lib/src/types/metric.d.ts +0 -25
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { ResourceConfig } from '../../types';
3
+ export type RefineFormModalProps = {
4
+ config: ResourceConfig;
5
+ id?: string;
6
+ };
7
+ export declare function RefineFormModal(props: RefineFormModalProps): JSX.Element;
8
+ export default RefineFormModal;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { ResourceConfig } from '../../types';
3
+ type Props = {
4
+ config: ResourceConfig<any>;
5
+ };
6
+ export declare const RefineFormPage: (props: Props) => JSX.Element;
7
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './RefineFormPage';
2
+ export * from './RefineFormModal';
3
+ export * from './type';
@@ -0,0 +1,20 @@
1
+ /// <reference types="react" />
2
+ export type RefineFormValidator = (value: unknown, formValue: unknown) => {
3
+ isValid: boolean;
4
+ errorMsg: string;
5
+ };
6
+ export type RefineFormField = {
7
+ path: string[];
8
+ key: string;
9
+ label: string;
10
+ type?: 'number';
11
+ validators?: RefineFormValidator[];
12
+ render?: React.FC<{
13
+ value: unknown;
14
+ onChange: (event: unknown) => void;
15
+ onBlur: () => void;
16
+ }>;
17
+ };
18
+ export type RefineFormConfig = {
19
+ fields: RefineFormField[];
20
+ };
@@ -0,0 +1,10 @@
1
+ import { UseFormProps } from '@refinedev/core';
2
+ import { ResourceConfig } from '../../types';
3
+ export declare const useRefineForm: (props: {
4
+ config: ResourceConfig;
5
+ id?: string;
6
+ refineProps?: UseFormProps;
7
+ }) => {
8
+ formResult: import("@refinedev/react-hook-form").UseFormReturnType<import("@refinedev/core").BaseRecord, import("@refinedev/core").HttpError, Record<string, unknown>, {}, import("@refinedev/core").BaseRecord, import("@refinedev/core").BaseRecord, import("@refinedev/core").HttpError>;
9
+ responseErrorMsg: string;
10
+ };
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Route } from 'react-router-dom';
4
+ import { FormType } from 'src/types';
5
+ import { ResourceForm } from './create';
6
+ import { ResourceList } from './list';
7
+ import { ResourceShow } from './show';
8
+ export function ResourceCRUD(props) {
9
+ const { configs, urlPrefix } = props;
10
+ return (_jsx(_Fragment, { children: configs.map(config => {
11
+ return (_jsxs(React.Fragment, { children: [_jsx(Route, { path: `${urlPrefix}/${config.name}`, exact: true, children: _jsx(ResourceList, { name: config.kind, formatter: config.formatter, columns: config.columns?.() || [], Dropdown: config.Dropdown }) }), _jsx(Route, { path: `${urlPrefix}/${config.name}/show`, children: _jsx(ResourceShow, { formatter: config.formatter, showConfig: config.showConfig?.() || {}, Dropdown: config.Dropdown }) }),
12
+ // the modals would render in ModalStack
13
+ config.formType === FormType.PAGE ? (_jsxs(_Fragment, { children: [_jsx(Route, { path: `${urlPrefix}/${config.name}/create`, children: _jsx(ResourceForm, { config: config }) }), _jsx(Route, { path: `${urlPrefix}/${config.name}/edit`, children: _jsx(ResourceForm, { config: config }) })] })) : null] }, config.name));
14
+ }) }));
15
+ }
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import YamlForm from 'src/components/YamlForm';
4
+ import { getInitialValues } from 'src/utils/form';
5
+ export function ResourceForm(props) {
6
+ const { config } = props;
7
+ const formProps = useMemo(() => {
8
+ return {
9
+ initialValues: getInitialValues(config),
10
+ };
11
+ }, [config]);
12
+ return (_jsx(YamlForm, { ...formProps }));
13
+ }
@@ -0,0 +1,4 @@
1
+ export * from './list';
2
+ export * from './show';
3
+ export * from './create';
4
+ export * from './ResourceCRUD';
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEagleTable } from '../../../hooks/useEagleTable';
3
+ import { NameColumnRenderer } from '../../../hooks/useEagleTable/columns';
4
+ import { useD2Translation } from '../../../i18n';
5
+ import { ListPage } from '../../ListPage';
6
+ export function ResourceList(props) {
7
+ const { formatter, name, columns, Dropdown } = props;
8
+ const { i18n } = useD2Translation();
9
+ const { tableProps, selectedKeys } = useEagleTable({
10
+ useTableParams: {},
11
+ columns: [NameColumnRenderer(i18n), ...columns],
12
+ tableProps: {
13
+ currentSize: 10,
14
+ },
15
+ formatter,
16
+ Dropdown,
17
+ });
18
+ return (_jsx(ListPage, { title: name || '', selectedKeys: selectedKeys, tableProps: tableProps }));
19
+ }
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { PageShow } from '../../PageShow';
3
+ export function ResourceShow(props) {
4
+ const { formatter, showConfig, Dropdown } = props;
5
+ return (_jsx(PageShow, { showConfig: showConfig, formatter: formatter, Dropdown: Dropdown }));
6
+ }
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { useGo, useNavigation } from '@refinedev/core';
4
+ export const ResourceLink = props => {
5
+ const { name, namespace, resourceId } = props;
6
+ const kit = useUIKit();
7
+ const navigation = useNavigation();
8
+ const go = useGo();
9
+ const onClick = () => {
10
+ go({
11
+ to: navigation.showUrl(name, ''),
12
+ query: {
13
+ id: `${namespace}/${resourceId}`,
14
+ },
15
+ options: {
16
+ keepQuery: true,
17
+ },
18
+ });
19
+ };
20
+ return _jsx(kit.Link, { onClick: onClick, children: resourceId });
21
+ };
@@ -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
+ };
@@ -5,7 +5,6 @@ type Props = {
5
5
  };
6
6
  export declare const ServiceInClusterAccessComponent: React.FC<Props>;
7
7
  export declare const ServiceOutClusterAccessComponent: React.FC<Props & {
8
- clusterVip: string;
9
8
  breakLine?: boolean;
10
9
  }>;
11
10
  export {};
@@ -11,7 +11,7 @@ type Props<Model extends ResourceModel> = {
11
11
  export declare function ShowGroupComponent(props: React.PropsWithChildren<{
12
12
  title: string;
13
13
  className?: string;
14
- operationEle?: React.ReactElement;
14
+ operationEle?: React.ReactElement | null;
15
15
  }>): JSX.Element;
16
16
  export declare const ShowContent: <Model extends ResourceModel<import("k8s-api-provider").Unstructured>>(props: Props<Model>) => JSX.Element | null;
17
17
  export {};
@@ -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
+ };
@@ -51,7 +51,7 @@ export declare const AgeField: <Model extends ResourceModel<Unstructured>>(i18n:
51
51
  export declare const LabelsField: <Model extends ResourceModel<Unstructured>>(i18n: I18nType) => ShowField<Model>;
52
52
  export declare const AnnotationsField: <Model extends ResourceModel<Unstructured>>(i18n: I18nType) => ShowField<Model>;
53
53
  export declare const ServiceInnerClusterAccessField: <Model extends ServiceModel>() => ShowField<Model>;
54
- export declare const ServiceOutClusterAccessField: <Model extends ServiceModel>(clusterVip: string) => ShowField<Model>;
54
+ export declare const ServiceOutClusterAccessField: <Model extends ServiceModel>() => ShowField<Model>;
55
55
  export declare const PodSelectorField: <Model extends ResourceModel<Required<Unstructured & import("kubernetes-types/core/v1").Service> | (NetworkPolicy & Unstructured)>>() => ShowField<Model>;
56
56
  export declare const PortsTableField: <Model extends ServiceModel>() => ShowField<Model>;
57
57
  export declare const DurationField: <Model extends JobModel | CronJobModel>(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
+ };