@dovetail-v2/refine 0.0.32 → 0.0.33

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 (248) hide show
  1. package/dist/{MonacoYamlDiffEditor-6563a22b.js → MonacoYamlDiffEditor-cf5e1ebf.js} +3 -3
  2. package/dist/{MonacoYamlEditor-a6e20f8c.js → MonacoYamlEditor-816f672c.js} +3 -3
  3. package/dist/{index-3d05d4c7.js → index-57b8cbed.js} +11048 -7588
  4. package/dist/refine.js +158 -127
  5. package/dist/refine.umd.cjs +11248 -7788
  6. package/dist/style.css +69 -43
  7. package/lib/src/App.js +91 -0
  8. package/lib/src/Dovetail.js +45 -0
  9. package/lib/src/components/Breadcrumb/index.js +20 -0
  10. package/lib/src/components/ConditionsTable/ConditionsTable.js +56 -0
  11. package/lib/src/components/ConditionsTable/index.js +1 -0
  12. package/lib/src/components/CreateButton/index.js +10 -0
  13. package/lib/src/components/CronJobDropdown/index.js +26 -0
  14. package/lib/src/components/CronjobJobsTable/index.js +49 -0
  15. package/lib/src/components/DeleteButton/index.js +13 -0
  16. package/lib/src/components/DeleteManyButton/index.js +16 -0
  17. package/lib/src/components/DrawerShow/DrawerShow.js +13 -0
  18. package/lib/src/components/DrawerShow/index.js +1 -0
  19. package/lib/src/components/EditButton/index.js +13 -0
  20. package/lib/src/components/EditField/index.js +47 -0
  21. package/lib/src/components/ErrorContent/index.js +36 -0
  22. package/lib/src/components/EventsTable/EventsTable.js +59 -0
  23. package/lib/src/components/EventsTable/index.js +1 -0
  24. package/lib/src/components/Form/FormModal.d.ts +9 -0
  25. package/lib/src/components/Form/KeyValueListWidget.js +56 -0
  26. package/lib/src/components/Form/MetadataForm.js +9 -0
  27. package/lib/src/components/Form/NameInputWidget.js +50 -0
  28. package/lib/src/components/Form/NamespaceSelectWidget.js +21 -0
  29. package/lib/src/components/Form/RefineFormContent.d.ts +12 -0
  30. package/lib/src/components/Form/RefineFormPage.d.ts +7 -0
  31. package/lib/src/components/Form/YamlForm.d.ts +26 -0
  32. package/lib/src/components/Form/index.d.ts +7 -4
  33. package/lib/src/components/Form/index.js +4 -0
  34. package/lib/src/components/Form/type.d.ts +17 -0
  35. package/lib/src/components/Form/useRefineForm.d.ts +10 -0
  36. package/lib/src/components/Form/useYamlForm.d.ts +49 -0
  37. package/lib/src/components/Form/widget.js +1 -0
  38. package/lib/src/components/FormErrorAlert/index.d.ts +1 -0
  39. package/lib/src/components/FormErrorAlert/index.js +8 -0
  40. package/lib/src/components/FormLayout/index.js +21 -0
  41. package/lib/src/components/FormModal/index.js +51 -0
  42. package/lib/src/components/FormWidgets/KeyValueListWidget.d.ts +6 -0
  43. package/lib/src/components/FormWidgets/MetadataForm.d.ts +2 -0
  44. package/lib/src/components/FormWidgets/NameInputWidget.d.ts +51 -0
  45. package/lib/src/components/FormWidgets/NamespaceSelectWidget.d.ts +9 -0
  46. package/lib/src/components/FormWidgets/index.d.ts +4 -0
  47. package/lib/src/components/FormWidgets/widget.d.ts +5 -0
  48. package/lib/src/components/ImageNames/index.d.ts +1 -0
  49. package/lib/src/components/ImageNames/index.js +14 -0
  50. package/lib/src/components/IngressRulesComponent/index.js +11 -0
  51. package/lib/src/components/IngressRulesTable/IngressRulesTable.js +51 -0
  52. package/lib/src/components/IngressRulesTable/index.js +1 -0
  53. package/lib/src/components/K8sDropdown/index.js +31 -0
  54. package/lib/src/components/KeyValue/KeyValue.d.ts +5 -5
  55. package/lib/src/components/KeyValue/KeyValue.js +27 -0
  56. package/lib/src/components/KeyValue/KeyValueAnnotation.d.ts +6 -0
  57. package/lib/src/components/KeyValue/KeyValueSecret.d.ts +5 -0
  58. package/lib/src/components/KeyValue/index.d.ts +2 -0
  59. package/lib/src/components/KeyValue/index.js +1 -0
  60. package/lib/src/components/KeyValueData/index.js +50 -0
  61. package/lib/src/components/Layout/index.js +39 -0
  62. package/lib/src/components/ListPage/index.d.ts +0 -1
  63. package/lib/src/components/ListPage/index.js +25 -0
  64. package/lib/src/components/Menu/index.js +36 -0
  65. package/lib/src/components/NamespacesFilter/index.d.ts +6 -2
  66. package/lib/src/components/NamespacesFilter/index.js +34 -0
  67. package/lib/src/components/NetworkPolicyRulesTable/NetworkPolicyRulesTable.js +77 -0
  68. package/lib/src/components/NetworkPolicyRulesTable/index.js +1 -0
  69. package/lib/src/components/PageShow/PageShow.js +11 -0
  70. package/lib/src/components/PageShow/index.js +1 -0
  71. package/lib/src/components/PodContainersTable/PodContainersTable.js +78 -0
  72. package/lib/src/components/PodContainersTable/index.js +1 -0
  73. package/lib/src/components/PodLog/index.js +136 -0
  74. package/lib/src/components/PodSelectorTable/index.d.ts +6 -0
  75. package/lib/src/components/PortsTable/index.d.ts +7 -0
  76. package/lib/src/components/ReferenceLink/index.js +17 -0
  77. package/lib/src/components/RefineForm/RefineFormContent.d.ts +10 -0
  78. package/lib/src/components/RefineForm/RefineFormModal.d.ts +8 -0
  79. package/lib/src/components/RefineForm/RefineFormPage.d.ts +7 -0
  80. package/lib/src/components/RefineForm/index.d.ts +3 -0
  81. package/lib/src/components/RefineForm/type.d.ts +20 -0
  82. package/lib/src/components/RefineForm/useRefineForm.d.ts +10 -0
  83. package/lib/src/components/ReplicasDropdown/index.d.ts +9 -0
  84. package/lib/src/components/ResourceCRUD/ResourceCRUD.js +15 -0
  85. package/lib/src/components/ResourceCRUD/create/index.js +13 -0
  86. package/lib/src/components/ResourceCRUD/index.js +4 -0
  87. package/lib/src/components/ResourceCRUD/list/index.d.ts +3 -7
  88. package/lib/src/components/ResourceCRUD/list/index.js +19 -0
  89. package/lib/src/components/ResourceCRUD/show/index.d.ts +3 -7
  90. package/lib/src/components/ResourceCRUD/show/index.js +6 -0
  91. package/lib/src/components/ResourceLink/index.js +21 -0
  92. package/lib/src/components/ResourceUsageBar/index.js +81 -0
  93. package/lib/src/components/Separator/index.js +11 -0
  94. package/lib/src/components/ServiceComponents/index.d.ts +4 -1
  95. package/lib/src/components/ShowContent/ShowContent.d.ts +5 -0
  96. package/lib/src/components/ShowContent/ShowContent.js +157 -0
  97. package/lib/src/components/ShowContent/fields.d.ts +17 -11
  98. package/lib/src/components/ShowContent/fields.js +157 -0
  99. package/lib/src/components/ShowContent/groups.d.ts +11 -3
  100. package/lib/src/components/ShowContent/index.js +2 -0
  101. package/lib/src/components/ShowContent/tabs.d.ts +3 -7
  102. package/lib/src/components/StateTag/StateTag.d.ts +1 -0
  103. package/lib/src/components/StateTag/StateTag.js +22 -0
  104. package/lib/src/components/StateTag/index.js +1 -0
  105. package/lib/src/components/Table/ErrorContent.js +36 -0
  106. package/lib/src/components/Table/TableToolBar.d.ts +1 -1
  107. package/lib/src/components/Table/TableToolBar.js +14 -0
  108. package/lib/src/components/Table/TableWidgets.js +28 -0
  109. package/lib/src/components/Table/index.js +69 -0
  110. package/lib/src/components/Tags/index.js +22 -0
  111. package/lib/src/components/Time/index.js +14 -0
  112. package/lib/src/components/ValueDisplay/index.d.ts +8 -0
  113. package/lib/src/components/WorkloadDropdown/index.d.ts +2 -2
  114. package/lib/src/components/WorkloadDropdown/index.js +24 -0
  115. package/lib/src/components/WorkloadPodsTable/WorkloadPodsTable.js +39 -0
  116. package/lib/src/components/WorkloadPodsTable/index.js +1 -0
  117. package/lib/src/components/WorkloadReplicas/index.d.ts +11 -1
  118. package/lib/src/components/WorkloadReplicas/index.js +50 -0
  119. package/lib/src/components/YamlEditor/MonacoYamlDiffEditor.js +34 -0
  120. package/lib/src/components/YamlEditor/MonacoYamlEditor.js +149 -0
  121. package/lib/src/components/YamlEditor/YamlEditorComponent.js +90 -0
  122. package/lib/src/components/YamlEditor/index.js +1 -0
  123. package/lib/src/components/YamlEditor/style.js +102 -0
  124. package/lib/src/components/YamlEditor/yaml.worker.js +1 -0
  125. package/lib/src/components/YamlForm/index.js +61 -0
  126. package/lib/src/components/index.d.ts +2 -3
  127. package/lib/src/components/index.js +38 -0
  128. package/lib/src/constants/index.js +2 -0
  129. package/lib/src/constants/k8s.d.ts +289 -89
  130. package/lib/src/constants/k8s.js +203 -0
  131. package/lib/src/constants/state.d.ts +2 -1
  132. package/lib/src/constants/state.js +15 -0
  133. package/lib/src/contexts/component.js +3 -0
  134. package/lib/src/contexts/configs.js +3 -0
  135. package/lib/src/contexts/global-store.js +3 -0
  136. package/lib/src/contexts/index.js +3 -0
  137. package/lib/src/hooks/index.d.ts +1 -1
  138. package/lib/src/hooks/index.js +7 -0
  139. package/lib/src/hooks/useDeleteModal/index.js +1 -0
  140. package/lib/src/hooks/useDeleteModal/useDeleteManyModal.js +31 -0
  141. package/lib/src/hooks/useDeleteModal/useDeleteModal.js +38 -0
  142. package/lib/src/hooks/useDownloadYAML.js +10 -0
  143. package/lib/src/hooks/useEagleForm.js +177 -0
  144. package/lib/src/hooks/useEagleTable/columns.d.ts +7 -2
  145. package/lib/src/hooks/useEagleTable/columns.js +246 -0
  146. package/lib/src/hooks/useEagleTable/index.js +2 -0
  147. package/lib/src/hooks/useEagleTable/useEagleTable.js +63 -0
  148. package/lib/src/hooks/useEdit.js +19 -0
  149. package/lib/src/hooks/useGlobalStore.js +5 -0
  150. package/lib/src/hooks/useK8sYamlEditor.js +37 -0
  151. package/lib/src/hooks/useOpenForm.d.ts +3 -0
  152. package/lib/src/hooks/useOpenForm.js +43 -0
  153. package/lib/src/hooks/useSchema.js +37 -0
  154. package/lib/src/hooks/useSubmitForm.js +42 -0
  155. package/lib/src/i18n.d.ts +140 -13
  156. package/lib/src/i18n.js +19 -0
  157. package/lib/src/index.js +13 -0
  158. package/lib/src/locales/en-US/dovetail.json +18 -0
  159. package/lib/src/locales/en-US/index.d.ts +98 -1
  160. package/lib/src/locales/en-US/index.js +4 -0
  161. package/lib/src/locales/index.js +6 -0
  162. package/lib/src/locales/zh-CN/dovetail.json +91 -0
  163. package/lib/src/locales/zh-CN/index.d.ts +42 -12
  164. package/lib/src/locales/zh-CN/index.js +4 -0
  165. package/lib/src/main.js +12 -0
  166. package/lib/src/models/cronjob-model.js +32 -0
  167. package/lib/src/models/daemonset-model.d.ts +3 -1
  168. package/lib/src/models/daemonset-model.js +17 -0
  169. package/lib/src/models/deployment-model.d.ts +1 -1
  170. package/lib/src/models/deployment-model.js +17 -0
  171. package/lib/src/models/event-model.js +11 -0
  172. package/lib/src/models/index.js +14 -0
  173. package/lib/src/models/ingress-model.d.ts +5 -3
  174. package/lib/src/models/ingress-model.js +24 -0
  175. package/lib/src/models/job-model.js +56 -0
  176. package/lib/src/models/network-policy-model.js +10 -0
  177. package/lib/src/models/pod-metrics-model.js +34 -0
  178. package/lib/src/models/pod-model.js +78 -0
  179. package/lib/src/models/resource-model.js +34 -0
  180. package/lib/src/models/service-model.js +17 -0
  181. package/lib/src/models/statefulset-model.d.ts +1 -1
  182. package/lib/src/models/statefulset-model.js +17 -0
  183. package/lib/src/models/types/index.js +1 -0
  184. package/lib/src/models/types/metric.js +1 -0
  185. package/lib/src/models/workload-base-model.js +22 -0
  186. package/lib/src/models/workload-model.js +51 -0
  187. package/lib/src/pages/configmaps/index.js +15 -0
  188. package/lib/src/pages/cronjobs/create/index.js +6 -0
  189. package/lib/src/pages/cronjobs/index.js +3 -0
  190. package/lib/src/pages/cronjobs/list/index.js +42 -0
  191. package/lib/src/pages/cronjobs/show/index.js +16 -0
  192. package/lib/src/pages/daemonsets/create/index.js +6 -0
  193. package/lib/src/pages/daemonsets/index.js +3 -0
  194. package/lib/src/pages/daemonsets/list/index.js +32 -0
  195. package/lib/src/pages/daemonsets/show/index.js +16 -0
  196. package/lib/src/pages/deployments/create/index.js +7 -0
  197. package/lib/src/pages/deployments/index.d.ts +0 -1
  198. package/lib/src/pages/deployments/index.js +3 -0
  199. package/lib/src/pages/deployments/list/index.js +26 -0
  200. package/lib/src/pages/deployments/show/index.js +16 -0
  201. package/lib/src/pages/ingresses/index.js +26 -0
  202. package/lib/src/pages/jobs/index.js +34 -0
  203. package/lib/src/pages/networkPolicies/index.js +67 -0
  204. package/lib/src/pages/pods/create/index.js +6 -0
  205. package/lib/src/pages/pods/index.js +3 -0
  206. package/lib/src/pages/pods/list/index.js +81 -0
  207. package/lib/src/pages/pods/show/index.js +54 -0
  208. package/lib/src/pages/secrets/index.js +15 -0
  209. package/lib/src/pages/services/index.js +26 -0
  210. package/lib/src/pages/statefulsets/create/index.js +6 -0
  211. package/lib/src/pages/statefulsets/index.js +3 -0
  212. package/lib/src/pages/statefulsets/list/index.js +26 -0
  213. package/lib/src/pages/statefulsets/show/index.js +16 -0
  214. package/lib/src/plugins/index.js +3 -0
  215. package/lib/src/plugins/model-plugin.js +46 -0
  216. package/lib/src/plugins/relation-plugin.js +81 -0
  217. package/lib/src/plugins/type.js +1 -0
  218. package/lib/src/providers/index.js +1 -0
  219. package/lib/src/providers/router-provider/index.js +100 -0
  220. package/lib/src/types/index.js +1 -0
  221. package/lib/src/types/resource.d.ts +12 -3
  222. package/lib/src/types/resource.js +12 -0
  223. package/lib/src/utils/addId.js +8 -0
  224. package/lib/src/utils/download.js +9 -0
  225. package/lib/src/utils/error.js +53 -0
  226. package/lib/src/utils/form.js +9 -0
  227. package/lib/src/utils/k8s.js +6 -0
  228. package/lib/src/utils/labels.js +15 -0
  229. package/lib/src/utils/match-selector.js +12 -0
  230. package/lib/src/utils/openapi.js +33 -0
  231. package/lib/src/utils/schema.js +117 -0
  232. package/lib/src/utils/selector.js +12 -0
  233. package/lib/src/utils/string.js +6 -0
  234. package/lib/src/utils/time.js +46 -0
  235. package/lib/src/utils/unit.js +69 -0
  236. package/lib/src/utils/yaml.js +44 -0
  237. package/lib/vite.config.js +60 -0
  238. package/package.json +6 -4
  239. package/lib/src/components/ModalContextProvider/index.d.ts +0 -12
  240. package/lib/src/hooks/useModal.d.ts +0 -0
  241. package/lib/src/model/cronjob-model.d.ts +0 -9
  242. package/lib/src/model/index.d.ts +0 -6
  243. package/lib/src/model/job-model.d.ts +0 -10
  244. package/lib/src/model/pod-metrics-model.d.ts +0 -7
  245. package/lib/src/model/pod-model.d.ts +0 -15
  246. package/lib/src/model/resource-model.d.ts +0 -17
  247. package/lib/src/model/workload-model.d.ts +0 -17
  248. package/lib/src/types/metric.d.ts +0 -25
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useList, useParsed } from '@refinedev/core';
3
+ import { useMemo, useState } from 'react';
4
+ import { AgeColumnRenderer, CommonSorter, NameSpaceColumnRenderer, } from '../../hooks/useEagleTable/columns';
5
+ import { useD2Translation } from '../../i18n';
6
+ import Table from '../Table';
7
+ export const EventsTable = ({}) => {
8
+ const { i18n } = useD2Translation();
9
+ const [currentPage, setCurrentPage] = useState(1);
10
+ const { data, isLoading } = useList({
11
+ resource: 'events',
12
+ meta: { resourceBasePath: '/apis/events.k8s.io/v1', kind: 'Event' },
13
+ });
14
+ const parsed = useParsed();
15
+ const columns = useMemo(() => [
16
+ NameSpaceColumnRenderer(i18n),
17
+ {
18
+ key: 'type',
19
+ display: true,
20
+ dataIndex: ['type'],
21
+ title: i18n.t('dovetail.type'),
22
+ sortable: true,
23
+ sorter: CommonSorter(['type']),
24
+ },
25
+ {
26
+ key: 'reason',
27
+ display: true,
28
+ dataIndex: ['reason'],
29
+ title: i18n.t('dovetail.reason'),
30
+ sortable: true,
31
+ sorter: CommonSorter(['reason']),
32
+ },
33
+ {
34
+ key: 'object',
35
+ display: true,
36
+ dataIndex: ['regarding', 'name'],
37
+ title: i18n.t('dovetail.object'),
38
+ sortable: true,
39
+ sorter: CommonSorter(['regarding', 'name']),
40
+ },
41
+ {
42
+ key: 'note',
43
+ display: true,
44
+ dataIndex: ['note'],
45
+ title: i18n.t('dovetail.note'),
46
+ sortable: true,
47
+ sorter: CommonSorter(['note']),
48
+ },
49
+ AgeColumnRenderer(i18n),
50
+ ], [i18n]);
51
+ const dataSource = useMemo(() => {
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
+ return data?.data.filter((d) => {
54
+ const objectId = `${d.regarding.namespace}/${d.regarding.name}`;
55
+ return objectId === parsed.id;
56
+ });
57
+ }, [data?.data, parsed]);
58
+ return (_jsx(Table, { tableKey: "events", loading: isLoading, data: dataSource || [], columns: columns, rowKey: "id", error: false, currentPage: currentPage, onPageChange: p => setCurrentPage(p), currentSize: 10, refetch: () => null }));
59
+ };
@@ -0,0 +1 @@
1
+ export * from './EventsTable';
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { YamlFormProps } from './YamlForm';
3
+ export type FormModalProps = {
4
+ resource?: string;
5
+ id?: string;
6
+ formProps?: YamlFormProps;
7
+ renderForm?: (props: YamlFormProps) => React.ReactNode;
8
+ };
9
+ export declare function FormModal(props: FormModalProps): JSX.Element;
@@ -0,0 +1,56 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { useCallback, useMemo } from 'react';
4
+ function KeyValueInput(props) {
5
+ const { children, item } = props;
6
+ const kit = useUIKit();
7
+ const onKeyChange = useCallback((event) => {
8
+ const key = event.target.value;
9
+ props.onChange?.({
10
+ ...item,
11
+ key,
12
+ });
13
+ }, [item, props]);
14
+ const onValueChange = useCallback((event) => {
15
+ const value = event.target.value;
16
+ props.onChange?.({
17
+ ...item,
18
+ value,
19
+ });
20
+ }, [item, props]);
21
+ return (_jsxs(kit.space, { children: [_jsx(kit.input, { value: item.key, onChange: onKeyChange }), _jsx(kit.textArea, { value: item.value, onChange: onValueChange }), children] }));
22
+ }
23
+ export function KeyValueListWidget(props) {
24
+ const kit = useUIKit();
25
+ const { value } = props;
26
+ const items = useMemo(() => {
27
+ return Object.entries(value || {}).map(([key, value]) => ({
28
+ key,
29
+ value,
30
+ }));
31
+ }, [value]);
32
+ const onChange = useCallback((newItems) => {
33
+ const newValue = newItems.reduce((result, item) => {
34
+ result[item.key] = item.value;
35
+ return result;
36
+ }, {});
37
+ props.onChange?.(newValue);
38
+ }, [props]);
39
+ const onRemove = useCallback((index) => {
40
+ const result = [...items];
41
+ result.splice(index, 1);
42
+ onChange(result);
43
+ }, [onChange, items]);
44
+ const onAdd = useCallback(() => {
45
+ onChange([...items, { key: '', value: '' }]);
46
+ }, [onChange, items]);
47
+ return (_jsxs(_Fragment, { children: [items.map((item, index) => {
48
+ return (_jsx(KeyValueInput, { item: item, onChange: newItem => {
49
+ const temp = [...items];
50
+ temp.splice(index, 1, newItem);
51
+ onChange(temp);
52
+ }, children: _jsx(kit.button, { onClick: () => {
53
+ onRemove(index);
54
+ }, danger: true, children: "Remove" }) }, index));
55
+ }), _jsx(kit.form.Item, { children: _jsx(kit.button, { type: "primary", onClick: onAdd, children: "Add" }) })] }));
56
+ }
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { KeyValueListWidget } from './KeyValueListWidget';
4
+ import { NameInputWidget, rfc1123LabelRules } from './NameInputWidget';
5
+ import { NamespaceSelectWidget, namespaceRules } from './NamespaceSelectWidget';
6
+ export function MetadataForm() {
7
+ const kit = useUIKit();
8
+ return (_jsxs(_Fragment, { children: [_jsx(kit.form.Item, { label: "Name", name: ['metadata', 'name'], rules: rfc1123LabelRules, children: _jsx(NameInputWidget, {}) }), _jsx(kit.form.Item, { label: "Namespace", name: ['metadata', 'namespace'], rules: namespaceRules, children: _jsx(NamespaceSelectWidget, {}) }), _jsx(kit.form.Item, { name: ['metadata', 'labels'], label: "Labels", children: _jsx(KeyValueListWidget, {}) }), _jsx(kit.form.Item, { name: ['metadata', 'annotations'], label: "Annotations", children: _jsx(KeyValueListWidget, {}) })] }));
9
+ }
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { useResource } from '@refinedev/core';
4
+ export function NameInputWidget(props) {
5
+ const kit = useUIKit();
6
+ const { action } = useResource();
7
+ return _jsx(kit.input, { ...props, disabled: action === 'edit' });
8
+ }
9
+ export const dnsSubDomainRules = [
10
+ {
11
+ required: true,
12
+ message: '名称不能为空',
13
+ },
14
+ {
15
+ pattern: /^[a-z0-9]([-.a-z0-9]*[a-z0-9])?$/,
16
+ message: '名称只能包含小写字母、数字,以及 \'-\' 和 \'.\',且必须以字母或数字开头和结束',
17
+ },
18
+ {
19
+ max: 253,
20
+ message: '名称长度不能超过253个字符',
21
+ },
22
+ ];
23
+ export const rfc1123LabelRules = [
24
+ {
25
+ required: true,
26
+ message: '名称不能为空',
27
+ },
28
+ {
29
+ pattern: /^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/,
30
+ message: '名称只能包含小写字母、数字,以及 \'-\',且以字母或数字开头和结束',
31
+ },
32
+ {
33
+ max: 63,
34
+ message: '名称长度不能超过63个字符',
35
+ },
36
+ ];
37
+ export const rfc1035LabelRules = [
38
+ {
39
+ required: true,
40
+ message: '名称不能为空',
41
+ },
42
+ {
43
+ pattern: /^[a-z]([-a-z0-9]*[a-z0-9])?$/,
44
+ message: '名称只能包含小写字母、数字,以及 \'-\',且以字母开头,字母或数字结束',
45
+ },
46
+ {
47
+ max: 63,
48
+ message: '名称长度不能超过63个字符',
49
+ },
50
+ ];
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { useList, useResource } from '@refinedev/core';
4
+ export function NamespaceSelectWidget(props) {
5
+ const kit = useUIKit();
6
+ const { action } = useResource();
7
+ const { data } = useList({
8
+ resource: 'namespaces',
9
+ meta: {
10
+ resourceBasePath: '/api/v1',
11
+ kind: 'Namespace',
12
+ },
13
+ });
14
+ return (_jsx(kit.select, { input: props, disabled: action === 'edit', children: data?.data.map(namespace => (_jsx(kit.option, { value: namespace.metadata.name, children: namespace.metadata.name }, namespace.metadata.name))) }));
15
+ }
16
+ export const namespaceRules = [
17
+ {
18
+ required: true,
19
+ message: 'Please input the namespace.',
20
+ },
21
+ ];
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import { Control } from 'react-hook-form';
3
+ import { ResourceModel } from '../../models';
4
+ import { ResourceConfig } from '../../types';
5
+ type Props<Model extends ResourceModel> = {
6
+ config?: ResourceConfig<Model>;
7
+ control: Control;
8
+ errorMsg?: string;
9
+ action?: 'create' | 'edit';
10
+ };
11
+ export declare const RefineFormContent: <Model extends ResourceModel<import("k8s-api-provider").Unstructured>>(props: Props<Model>) => JSX.Element;
12
+ export {};
@@ -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,26 @@
1
+ /// <reference types="react" />
2
+ import { FormAction } from '@refinedev/core';
3
+ import { Unstructured } from 'k8s-api-provider';
4
+ import useYamlForm from './useYamlForm';
5
+ export declare enum SchemaStrategy {
6
+ Required = "Required",
7
+ Optional = "Optional",
8
+ None = "None"
9
+ }
10
+ export interface YamlFormProps {
11
+ id?: string;
12
+ action?: FormAction;
13
+ initialValues?: Record<string, unknown>;
14
+ schemaStrategy?: SchemaStrategy;
15
+ isShowLayout?: boolean;
16
+ useFormProps?: Parameters<typeof useYamlForm>[0];
17
+ transformInitValues?: (values: Unstructured) => Unstructured;
18
+ transformApplyValues?: (values: Unstructured) => Unstructured;
19
+ onSaveButtonPropsChange?: (saveButtonProps: {
20
+ disabled?: boolean;
21
+ onClick: () => void;
22
+ }) => void;
23
+ onErrorsChange?: (errors: string[]) => void;
24
+ onFinish?: () => void;
25
+ }
26
+ export declare function YamlForm(props: YamlFormProps): JSX.Element;
@@ -1,4 +1,7 @@
1
- export * from './NameInputWidget';
2
- export * from './NamespaceSelectWidget';
3
- export * from './KeyValueListWidget';
4
- export * from './MetadataForm';
1
+ export * from './FormModal';
2
+ export * from './RefineFormContent';
3
+ export * from './RefineFormPage';
4
+ export * from './YamlForm';
5
+ export * from './useRefineForm';
6
+ export * from './useYamlForm';
7
+ export * from './type';
@@ -0,0 +1,4 @@
1
+ export * from './NameInputWidget';
2
+ export * from './NamespaceSelectWidget';
3
+ export * from './KeyValueListWidget';
4
+ export * from './MetadataForm';
@@ -0,0 +1,17 @@
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
+ };
@@ -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,49 @@
1
+ import { HttpError, BaseRecord, UseFormReturnType as UseFormReturnTypeCore, UseFormProps as UseFormPropsCore, CreateResponse, UpdateResponse } from '@refinedev/core';
2
+ import { ButtonProps } from 'antd/lib/button';
3
+ import { FormInstance, FormProps } from 'antd/lib/form';
4
+ import { JSONSchema7 } from 'json-schema';
5
+ import { Unstructured } from 'k8s-api-provider';
6
+ import React from 'react';
7
+ import { type YamlEditorHandle, type YamlEditorProps } from 'src/components/YamlEditor';
8
+ type EditorProps = Omit<YamlEditorProps, 'schema'> & {
9
+ ref: React.RefObject<YamlEditorHandle>;
10
+ schema: JSONSchema7 | null;
11
+ };
12
+ export type UseFormProps<TQueryFnData extends BaseRecord = BaseRecord, TError extends HttpError = HttpError, TVariables extends object = object, TData extends BaseRecord = TQueryFnData, TResponse extends BaseRecord = TData, TResponseError extends HttpError = TError> = UseFormPropsCore<TQueryFnData, TError, TVariables, TData, TResponse, TResponseError> & {
13
+ submitOnEnter?: boolean;
14
+ /**
15
+ * Shows notification when unsaved changes exist
16
+ */
17
+ warnWhenUnsavedChanges?: boolean;
18
+ editorOptions?: {
19
+ isGenerateAnnotations?: boolean;
20
+ isSkipSchema?: boolean;
21
+ };
22
+ initialValuesForCreate?: Record<string, unknown>;
23
+ transformInitValues?: (values: Unstructured) => Unstructured;
24
+ transformApplyValues?: (values: Unstructured) => Unstructured;
25
+ };
26
+ export type UseFormReturnType<TQueryFnData extends BaseRecord = BaseRecord, TError extends HttpError = HttpError, TVariables extends object = object, TData extends BaseRecord = TQueryFnData, TResponse extends BaseRecord = TData, TResponseError extends HttpError = TError> = UseFormReturnTypeCore<TQueryFnData, TError, TVariables, TData, TResponse, TResponseError> & {
27
+ form: FormInstance;
28
+ formProps: FormProps;
29
+ saveButtonProps: ButtonProps & {
30
+ onClick: () => void;
31
+ };
32
+ editorProps: EditorProps;
33
+ schema: JSONSchema7 | null;
34
+ isLoadingSchema: boolean;
35
+ loadSchemaError: Error | null;
36
+ fetchSchema: () => void;
37
+ enableEditor: boolean;
38
+ errorResponseBody?: Record<string, unknown> | null;
39
+ switchEditor: () => void;
40
+ onFinish: (values?: TVariables) => Promise<CreateResponse<TResponse> | UpdateResponse<TResponse> | void>;
41
+ };
42
+ declare const useYamlForm: <TQueryFnData extends Unstructured = Unstructured & {
43
+ id: string;
44
+ }, TError extends HttpError = HttpError, TVariables extends {
45
+ [prop: string]: unknown;
46
+ } = {
47
+ [prop: string]: unknown;
48
+ }, TData extends Unstructured = TQueryFnData, TResponse extends BaseRecord = TData, TResponseError extends HttpError = TError>({ action: actionFromProps, resource, onMutationSuccess: onMutationSuccessProp, onMutationError, submitOnEnter, warnWhenUnsavedChanges: warnWhenUnsavedChangesProp, redirect, successNotification, errorNotification, meta, metaData, queryMeta, mutationMeta, liveMode, liveParams, mutationMode, dataProviderName, onLiveEvent, invalidates, undoableTimeout, queryOptions, createMutationOptions, updateMutationOptions, id: idFromProps, overtimeOptions, editorOptions, initialValuesForCreate, transformInitValues, transformApplyValues, }?: UseFormProps<TQueryFnData, TError, TVariables, TData, TResponse, TResponseError>) => UseFormReturnType<TQueryFnData, TError, TVariables, TData, TResponse, TResponseError>;
49
+ export default useYamlForm;
@@ -0,0 +1 @@
1
+ export {};
@@ -3,6 +3,7 @@ interface FormErrorAlertProps {
3
3
  errorMsgs: string[];
4
4
  style?: React.CSSProperties;
5
5
  className?: string;
6
+ isEdit?: boolean;
6
7
  }
7
8
  export declare function FormErrorAlert(props: FormErrorAlertProps): JSX.Element | null;
8
9
  export {};
@@ -0,0 +1,8 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { first } from 'lodash-es';
4
+ export function FormErrorAlert(props) {
5
+ const { errorMsgs, style, className } = props;
6
+ const kit = useUIKit();
7
+ return errorMsgs.length ? (_jsx(kit.alert, { message: errorMsgs.length > 1 ? (_jsx("ul", { children: errorMsgs.map((errorMsg, index) => (_jsxs("li", { children: [index + 1 + '. ', " ", errorMsg] }, errorMsg))) })) : (first(errorMsgs)), type: "error", style: style, className: className })) : null;
8
+ }
@@ -0,0 +1,21 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useUIKit, Typo } from '@cloudtower/eagle';
3
+ import { css, cx } from '@linaria/core';
4
+ import { useResource } from '@refinedev/core';
5
+ import { useD2Translation } from '../../i18n';
6
+ const WrapperStyle = css `
7
+ height: 100%;
8
+ display: flex;
9
+ flex-direction: column;
10
+ `;
11
+ const TitleStyle = css `
12
+ line-height: 32px !important;
13
+ `;
14
+ function FormLayout(props) {
15
+ const { saveButtonProps } = props;
16
+ const kit = useUIKit();
17
+ const { resource, action } = useResource();
18
+ const { t } = useD2Translation();
19
+ return (_jsxs("div", { className: WrapperStyle, children: [_jsxs("span", { className: cx(Typo.Display.d2_bold_title, TitleStyle), children: [resource?.meta?.kind, ":", ' ', action === 'create' ? t('dovetail.create') : t('dovetail.edit')] }), _jsx(kit.divider, {}), props.children, _jsx(kit.form.Item, { children: _jsx(kit.button, { type: "primary", ...saveButtonProps, children: t('dovetail.save') }) })] }));
20
+ }
21
+ export default FormLayout;
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { CloseCircleFilled } from '@ant-design/icons';
3
+ import { useUIKit, popModal } from '@cloudtower/eagle';
4
+ import { css } from '@linaria/core';
5
+ import { useResource } from '@refinedev/core';
6
+ import { useState, useContext, useCallback, useMemo } from 'react';
7
+ import YamlForm from 'src/components/YamlForm';
8
+ import ConfigsContext from 'src/contexts/configs';
9
+ import { useD2Translation } from '../../i18n';
10
+ const FullscreenModalStyle = css `
11
+ &.ant-modal.fullscreen {
12
+ .ant-modal-header {
13
+ padding: 60px 128px 32px 128px;
14
+ }
15
+
16
+ .ant-modal-body {
17
+ padding: 0 128px;
18
+ }
19
+
20
+ .ant-modal-footer {
21
+ padding: 15px 128px;
22
+ }
23
+ }
24
+ `;
25
+ export function FormModal(props) {
26
+ const { resource: resourceFromProps, id, formProps, renderForm } = props;
27
+ const { i18n } = useD2Translation();
28
+ const { resource } = useResource();
29
+ const configs = useContext(ConfigsContext);
30
+ const [saveButtonProps, setSaveButtonProps] = useState({});
31
+ const kit = useUIKit();
32
+ const config = useMemo(() => configs[resourceFromProps || resource?.name || ''], [configs, resourceFromProps, resource]);
33
+ const title = useMemo(() => i18n.t(id ? 'dovetail.edit_resource' : 'dovetail.create_resource', { resource: config?.kind }), [id, i18n, config]);
34
+ const onCancel = useCallback(() => {
35
+ popModal();
36
+ }, []);
37
+ const onOk = useCallback(() => {
38
+ saveButtonProps.onClick?.();
39
+ }, [saveButtonProps]);
40
+ const onFinish = useCallback(() => {
41
+ popModal();
42
+ }, []);
43
+ return (_jsx(kit.modal, { className: FullscreenModalStyle, width: "calc(100vw - 16px)", title: title, okButtonProps: saveButtonProps, closeIcon: _jsx(CloseCircleFilled, {}), onOk: onOk, onCancel: onCancel, destroyOnClose: true, fullscreen: true, children: renderForm ? renderForm({
44
+ ...formProps,
45
+ initialValues: formProps?.initialValues || config?.initValue,
46
+ id,
47
+ onSaveButtonPropsChange: setSaveButtonProps,
48
+ onFinish
49
+ }) : (_jsx(YamlForm, { ...formProps, initialValues: formProps?.initialValues || config?.initValue, id: id, isShowLayout: false, onSaveButtonPropsChange: setSaveButtonProps, onFinish: onFinish })) }));
50
+ }
51
+ export default FormModal;
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import type { FormWidgetProps } from './widget';
3
+ export type KeyValueListWidgetProps = FormWidgetProps<Record<string, string>> & {
4
+ disabled?: boolean;
5
+ };
6
+ export declare function KeyValueListWidget(props: KeyValueListWidgetProps): JSX.Element;
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare function MetadataForm(): JSX.Element;
@@ -0,0 +1,51 @@
1
+ /// <reference types="react" />
2
+ import { AntdInputProps } from '@cloudtower/eagle';
3
+ export declare function NameInputWidget(props: AntdInputProps): JSX.Element;
4
+ export declare const dnsSubDomainRules: ({
5
+ required: boolean;
6
+ message: string;
7
+ pattern?: undefined;
8
+ max?: undefined;
9
+ } | {
10
+ pattern: RegExp;
11
+ message: string;
12
+ required?: undefined;
13
+ max?: undefined;
14
+ } | {
15
+ max: number;
16
+ message: string;
17
+ required?: undefined;
18
+ pattern?: undefined;
19
+ })[];
20
+ export declare const rfc1123LabelRules: ({
21
+ required: boolean;
22
+ message: string;
23
+ pattern?: undefined;
24
+ max?: undefined;
25
+ } | {
26
+ pattern: RegExp;
27
+ message: string;
28
+ required?: undefined;
29
+ max?: undefined;
30
+ } | {
31
+ max: number;
32
+ message: string;
33
+ required?: undefined;
34
+ pattern?: undefined;
35
+ })[];
36
+ export declare const rfc1035LabelRules: ({
37
+ required: boolean;
38
+ message: string;
39
+ pattern?: undefined;
40
+ max?: undefined;
41
+ } | {
42
+ pattern: RegExp;
43
+ message: string;
44
+ required?: undefined;
45
+ max?: undefined;
46
+ } | {
47
+ max: number;
48
+ message: string;
49
+ required?: undefined;
50
+ pattern?: undefined;
51
+ })[];
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ import type { FormWidgetProps } from './widget';
3
+ type NamespaceSelectProps = FormWidgetProps<string | string[]>;
4
+ export declare function NamespaceSelectWidget(props: NamespaceSelectProps): JSX.Element;
5
+ export declare const namespaceRules: {
6
+ required: boolean;
7
+ message: string;
8
+ }[];
9
+ export {};
@@ -0,0 +1,4 @@
1
+ export * from './NameInputWidget';
2
+ export * from './NamespaceSelectWidget';
3
+ export * from './KeyValueListWidget';
4
+ export * from './MetadataForm';
@@ -0,0 +1,5 @@
1
+ export interface FormWidgetProps<V> {
2
+ value?: V;
3
+ onChange?: (value: V) => void;
4
+ [prop: string]: unknown;
5
+ }
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
2
  export declare const ImageNames: React.FC<{
3
3
  value: string[];
4
+ breakLine?: boolean;
4
5
  }>;
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Typo, useUIKit } from '@cloudtower/eagle';
3
+ import { cx, css } from '@linaria/core';
4
+ import { useD2Translation } from '../../i18n';
5
+ const MoreTriggerStyle = css `
6
+ color: #bec1d2;
7
+ `;
8
+ export const ImageNames = ({ value }) => {
9
+ const kit = useUIKit();
10
+ const { t } = useD2Translation();
11
+ return (_jsxs("span", { children: [_jsx("span", { children: value[0] }), value.length > 1 && (_jsx(kit.tooltip, { title: _jsx(_Fragment, { children: value.slice(1).map((name, index) => {
12
+ return _jsx("div", { children: name }, index);
13
+ }) }), children: _jsxs("div", { className: cx(Typo.Label.l4_regular, MoreTriggerStyle), children: ["+", value.length - 1, " ", t('dovetail.more')] }) }))] }));
14
+ };
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { ResourceLink } from '../ResourceLink';
4
+ export const IngressRulesComponent = ({ ingress }) => {
5
+ const kit = useUIKit();
6
+ const result = ingress.flattenedRules.map(r => {
7
+ const divider = ' > ';
8
+ return (_jsxs("div", { children: [_jsx(kit.Link, { disabled: !r.host, href: r.fullPath, children: r.fullPath }), _jsx("span", { children: divider }), _jsx(ResourceLink, { name: "services", namespace: ingress.metadata.namespace || 'default', resourceId: r.serviceName })] }, r.fullPath));
9
+ });
10
+ return _jsx(_Fragment, { children: result });
11
+ };
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useUIKit } from '@cloudtower/eagle';
3
+ import { useMemo } from 'react';
4
+ import { useD2Translation } from '../../i18n';
5
+ import { addId } from '../../utils/addId';
6
+ import { ResourceLink } from '../ResourceLink';
7
+ import ErrorContent from '../Table/ErrorContent';
8
+ export const IngressRulesTable = ({ ingress }) => {
9
+ const kit = useUIKit();
10
+ const { t } = useD2Translation();
11
+ const rows = useMemo(() => {
12
+ return addId(ingress.flattenedRules, 'fullPath');
13
+ }, [ingress.flattenedRules]);
14
+ const columns = [
15
+ {
16
+ key: 'pathType',
17
+ display: true,
18
+ dataIndex: 'pathType',
19
+ title: t('dovetail.ingress_rule_type'),
20
+ sortable: true,
21
+ },
22
+ {
23
+ key: 'fullPath',
24
+ display: true,
25
+ dataIndex: 'fullPath',
26
+ title: t('dovetail.Path'),
27
+ sortable: true,
28
+ },
29
+ {
30
+ key: 'serviceName',
31
+ display: true,
32
+ dataIndex: 'serviceName',
33
+ title: t('dovetail.service'),
34
+ sortable: true,
35
+ render: (serviceName) => {
36
+ return (_jsx(ResourceLink, { name: "services", namespace: ingress.metadata.namespace || 'default', resourceId: serviceName }));
37
+ },
38
+ },
39
+ {
40
+ key: 'servicePort',
41
+ display: true,
42
+ dataIndex: 'servicePort',
43
+ title: t('dovetail.port'),
44
+ sortable: true,
45
+ },
46
+ ];
47
+ if (rows.length === 0) {
48
+ return _jsx(ErrorContent, { errorText: t('dovetail.empty'), style: { padding: '15px 0' } });
49
+ }
50
+ return (_jsx(kit.table, { loading: false, dataSource: rows, columns: columns, rowKey: "type", empty: t('dovetail.empty') }));
51
+ };
@@ -0,0 +1 @@
1
+ export * from './IngressRulesTable';