@dovetail-v2/refine 0.0.3 → 0.0.5

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.
package/dist/style.css CHANGED
@@ -1,6 +1,14 @@
1
- @charset "UTF-8";.w1akirqw{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
2
- .t30srnq{line-height:32px !important;}
3
- .s1bsn3us{width:1px;height:16px;border-radius:1px;background:rgba(172,186,211,0.6);}
1
+ @charset "UTF-8";.b142d7q8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.b142d7q8 .breadcrumb-item:not(:last-of-type):after{content:'>';margin:0 8px;}
2
+ .m1u1f5zp{color:#bec1d2;}
3
+ .m8ychfk{margin-right:8px;}
4
+ .p1o004do{margin-left:8px;}
5
+ .eckm4od{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;}
6
+ .e1hl982n{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.e1hl982n .title{margin-bottom:8px;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-image:linear-gradient(211.41deg,#929dad 0%,#d3dbe3 100%);}
7
+ .ax1qopv{position:absolute;top:0;left:0;bottom:0;width:1px;background:$blue-60;-webkit-transform:translateX(-9999px);-ms-transform:translateX(-9999px);transform:translateX(-9999px);z-index:999;}.ax1qopv::before{content:'';position:absolute;height:34px;width:3px;top:0;left:-1px;background:$blue-60;}
8
+ .t1upn1sz{width:100%;border-top:1px solid rgba(211,218,235,0.6);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.t1upn1sz .ant-table-pagination{display:none;}.t1upn1sz .table-container{min-height:0;}
9
+ .t1v3ienx{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:100%;margin-bottom:16px;}
10
+ .c16agr8o{width:100%;}
11
+ .c1dicff8{width:100%;}
4
12
  .t1joof7s{width:100%;padding:11px;border-bottom:1px solid rgba(211,218,235,0.6);background:rgba(225,230,241,0.6);border-top-left-radius:8px;border-top-right-radius:8px;}.t1joof7s.collapsed{border-bottom:0;}.t1joof7s svg{margin:auto;}.t1joof7s > .dovetail-ant-space-item{line-height:16px;}
5
13
  .tti58uh{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:20px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}.tti58uh .ant-space-item{line-height:1;}
6
14
  .e15yt16p{margin-top:1px;}
@@ -12,24 +20,18 @@
12
20
  .eh2qjnl{color:#f0483e;font-size:12px;line-height:18px;word-break:break-all;}
13
21
  .e19q2bnp{margin-top:8px;}
14
22
  .y16u5v3w .monaco-editor{border-bottom-left-radius:8px;border-bottom-right-radius:8px;}.y16u5v3w .monaco-editor .margin{border-bottom-left-radius:8px;}.y16u5v3w .monaco-editor .monaco-scrollable-element{border-bottom-right-radius:8px;}
15
- .e5ks0bl{-webkit-flex:1;-ms-flex:1;flex:1;height:100%;}
16
- .m1u1f5zp{color:#bec1d2;}
17
- .m8ychfk{margin-right:8px;}
18
- .p1o004do{margin-left:8px;}
19
- .eckm4od{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%;}
20
- .e1hl982n{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.e1hl982n .title{margin-bottom:8px;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-image:linear-gradient(211.41deg,#929dad 0%,#d3dbe3 100%);}
21
- .ax1qopv{position:absolute;top:0;left:0;bottom:0;width:1px;background:$blue-60;-webkit-transform:translateX(-9999px);-ms-transform:translateX(-9999px);transform:translateX(-9999px);z-index:999;}.ax1qopv::before{content:'';position:absolute;height:34px;width:3px;top:0;left:-1px;background:$blue-60;}
22
- .t1upn1sz{width:100%;border-top:1px solid rgba(211,218,235,0.6);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.t1upn1sz .ant-table-pagination{display:none;}.t1upn1sz .table-container{min-height:0;}
23
- .t1v3ienx{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:100%;margin-bottom:16px;}
24
- .laykzsq{width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
25
- .t1ng0psc.table-wrapper{height:auto;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;min-height:0;}
26
- .c16agr8o{width:100%;}
27
23
  .t13a6vox{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;}
28
24
  .t12ikbmp{max-width:256px;overflow:hidden;text-overflow:ellipsis;}
29
- .c1dicff8{width:100%;}
30
25
  .t9agep2{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:100%;}
31
26
  .so89gfi{width:100%;overflow:auto;height:100%;width:100%;}
32
27
  .e1ohe42f{margin-top:16px;}
28
+ .w1akirqw{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
29
+ .t30srnq{line-height:32px !important;}
30
+ .s1bsn3us{width:1px;height:16px;border-radius:1px;background:rgba(172,186,211,0.6);}
31
+ .e5ks0bl{-webkit-flex:1;-ms-flex:1;flex:1;height:100%;}
32
+ .laykzsq{width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
33
+ .t1ng0psc.table-wrapper{height:auto;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;min-height:0;}
34
+ .wfg6u6g{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.wfg6u6g .usage-text{width:50px;text-align:right;}.wfg6u6g .usage-bar{height:12px;width:100px;position:relative;border-radius:2px;}.wfg6u6g .request-anchor{position:absolute;left:10%;top:-3px;height:18px;width:2px;background:#777;z-index:9;}.wfg6u6g .usage-fill-bar{position:absolute;left:0;top:0;height:100%;background:rgba(0,128,255,0.6);z-index:7;}.wfg6u6g .request-bar{position:absolute;left:0;top:0;height:100%;background:#d8deeb;z-index:5;}.wfg6u6g .request-to-limit-bar{position:absolute;right:0;top:0;height:100%;background:#d8deeb;z-index:5;}.wfg6u6g .request-to-limit-bar.no-limit{background:linear-gradient(to right,#d8deeb 50%,#d8deeb 50%);background-size:4px 100%;}.wfg6u6g .request-to-limit-bar.no-limit.exceed-request{background:linear-gradient(to right,#d8deeb 50%,rgba(0,128,255,0.6) 50%);background-size:4px 100%;}
33
35
  .mdppgn0.ant-menu{background:#edf0f7;padding:8px;}.mdppgn0.ant-menu .ant-menu-item-selected{background:linear-gradient(90deg,#0080ff,#005ed1);border-radius:6px;box-shadow:0 1px 2px rgba(184,192,204,0.6);color:#fff;}.mdppgn0.ant-menu .ant-menu-item-selected a:hover{color:#fff;}.mdppgn0.ant-menu .ant-menu-item:not(.ant-menu-item-selected):hover{background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0.6));border-radius:6px;box-shadow:0 0 4px rgba(235,239,245,0.6),0 8px 16px rgba(129,138,153,0.18);}
34
36
  .h16z07g.ant-layout-header{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#fff;border-bottom:2px solid #edf0f7;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:50px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:0 24px 0 14px;position:relative;z-index:10;}
35
37
  .c1i80kj{height:100%;}
package/lib/src/App.d.ts CHANGED
@@ -1,6 +1,3 @@
1
1
  /// <reference types="react" />
2
- import './styles.css';
3
- import 'antd/dist/antd.css';
4
- import '@cloudtower/eagle/dist/style.css';
5
2
  declare function App(): JSX.Element;
6
3
  export default App;
@@ -1,11 +1,15 @@
1
+ import { ResourceProps } from '@refinedev/core';
1
2
  import React from 'react';
3
+ import './i18n';
2
4
  import './styles.css';
3
5
  import 'antd/dist/antd.css';
4
6
  import '@cloudtower/eagle/dist/style.css';
5
7
  import { ResourceConfig } from './types';
6
8
  type Props = {
7
9
  resourcesConfig: ResourceConfig[];
10
+ useHashUrl?: boolean;
8
11
  urlPrefix: string;
12
+ refineResources?: ResourceProps[];
9
13
  };
10
14
  export declare const Dovetail: React.FC<Props>;
11
15
  export {};
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ usage: string;
4
+ requestNum: number;
5
+ limitNum: number;
6
+ };
7
+ export declare const ResourceUsageBar: React.FC<Props>;
8
+ export {};
@@ -13,4 +13,5 @@ export declare const ConditionsField: (i18n: i18n) => ShowField<WorkloadModel>;
13
13
  export declare const PodsField: (_: i18n) => ShowField<WorkloadModel>;
14
14
  export declare const JobsField: (_: i18n) => ShowField<WorkloadModel>;
15
15
  export declare const DataField: (i18n: i18n) => ShowField<ResourceModel>;
16
+ export declare const SecretDataField: (i18n: i18n) => ShowField<ResourceModel>;
16
17
  export declare const StartTimeField: (i18n: i18n) => ShowField<JobModel>;
@@ -0,0 +1,33 @@
1
+ export * from './Breadcrumb';
2
+ export * from './Form';
3
+ export * from './PageShow';
4
+ export * from './Time';
5
+ export * from './ConditionsTable';
6
+ export * from './FormLayout';
7
+ export * from './PodContainersTable';
8
+ export * from './WorkloadDropdown';
9
+ export * from './CreateButton';
10
+ export * from './ImageNames';
11
+ export * from './ResourceCRUD';
12
+ export * from './WorkloadPodsTable';
13
+ export * from './CronJobDropdown';
14
+ export * from './K8sDropdown';
15
+ export * from './ResourceUsageBar';
16
+ export * from './WorkloadReplicas';
17
+ export * from './CronjobJobsTable';
18
+ export * from './KeyValue';
19
+ export * from './Separator';
20
+ export * from './YamlEditor';
21
+ export * from './DeleteButton';
22
+ export * from './Layout';
23
+ export * from './ShowContent';
24
+ export * from './YamlForm';
25
+ export * from './DeleteManyButton';
26
+ export * from './ListPage';
27
+ export * from './StateTag';
28
+ export * from './DrawerShow';
29
+ export * from './Menu';
30
+ export * from './Table';
31
+ export * from './EditButton';
32
+ export * from './NamespacesFilter';
33
+ export * from './Tags';
@@ -0,0 +1 @@
1
+ export * from './k8s';
@@ -1,2 +1,6 @@
1
1
  export * from './useEagleForm';
2
2
  export * from './useSchema';
3
+ export * from './useDeleteModal';
4
+ export * from './useEagleTable';
5
+ export * from './useDownloadYAML';
6
+ export * from './useEdit';
@@ -1,6 +1,7 @@
1
1
  export * from './providers';
2
2
  export * from './hooks';
3
- export * from './components/Form';
4
- export * from './components/ResourceCRUD';
3
+ export * from './components';
4
+ export * from './constants';
5
+ export * from './hooks';
5
6
  export * from './Dovetail';
6
7
  export * from './types';
@@ -1,5 +1,6 @@
1
1
  export * from './job-model';
2
2
  export * from './pod-model';
3
+ export * from './pod-metrics-model';
3
4
  export * from './resource-model';
4
5
  export * from './workload-model';
5
6
  export * from './cronjob-model';
@@ -2,8 +2,8 @@ import { Job } from 'kubernetes-types/batch/v1';
2
2
  import { WithId } from '../types';
3
3
  import { WorkloadModel } from './workload-model';
4
4
  export declare class JobModel extends WorkloadModel<Job> {
5
- data: WithId<Job>;
6
- constructor(data: WithId<Job>);
5
+ rawYaml: WithId<Job>;
6
+ constructor(rawYaml: WithId<Job>);
7
7
  get duration(): number;
8
8
  get durationDisplay(): string | undefined;
9
9
  get completionsDisplay(): string;
@@ -0,0 +1,7 @@
1
+ import { PodMetrics, ResourceQuantity } from 'src/types/metric';
2
+ import { ResourceModel } from './resource-model';
3
+ export declare class PodMetricsModel extends ResourceModel {
4
+ data: PodMetrics;
5
+ usage: ResourceQuantity;
6
+ constructor(data: PodMetrics);
7
+ }
@@ -1,9 +1,12 @@
1
1
  import type { Pod } from 'kubernetes-types/core/v1';
2
+ import { ResourceQuantity } from 'src/types/metric';
2
3
  import { WithId } from '../types';
3
4
  import { WorkloadModel } from './workload-model';
4
5
  export declare class PodModel extends WorkloadModel<Pod> {
5
- data: WithId<Pod>;
6
- constructor(data: WithId<Pod>);
6
+ rawYaml: WithId<Pod>;
7
+ request: ResourceQuantity;
8
+ limit: ResourceQuantity;
9
+ constructor(rawYaml: WithId<Pod>);
7
10
  get imageNames(): string[];
8
11
  get restartCount(): number;
9
12
  get readyDisplay(): string;
@@ -1,11 +1,11 @@
1
1
  import { Resource } from '../types';
2
2
  export declare class ResourceModel implements Resource {
3
- data: Resource;
3
+ rawYaml: Resource;
4
4
  id: Resource['id'];
5
5
  apiVersion: Resource['apiVersion'];
6
6
  kind: Resource['kind'];
7
7
  metadata: Resource['metadata'];
8
- constructor(data: Resource);
8
+ constructor(rawYaml: Resource);
9
9
  get name(): string | undefined;
10
10
  get namespace(): string | undefined;
11
11
  get labels(): {
@@ -5,8 +5,8 @@ import { WithId } from '../types';
5
5
  import { ResourceModel } from './resource-model';
6
6
  type WorkloadTypes = Deployment | StatefulSet | Job | DaemonSet | CronJob | Pod;
7
7
  export declare class WorkloadModel<T extends WorkloadTypes = WorkloadTypes> extends ResourceModel {
8
- data: WithId<T>;
9
- constructor(data: WithId<T>);
8
+ rawYaml: WithId<T>;
9
+ constructor(rawYaml: WithId<T>);
10
10
  get status(): T['status'];
11
11
  get spec(): T['spec'];
12
12
  get imageNames(): string[];
@@ -11,7 +11,7 @@ export declare const convertToNumberIfPossible: (value: string | undefined) => s
11
11
  export declare const routerProvider: {
12
12
  go: () => ({ to, type, query, hash, options: { keepQuery, keepHash } }: GoConfig) => string | void;
13
13
  back: () => () => void;
14
- parse: () => () => ParseResponse<Record<string, any>>;
14
+ parse: () => () => ParseResponse;
15
15
  Link: React.ForwardRefExoticComponent<Pick<{
16
16
  [prop: string]: any;
17
17
  to: string;
@@ -0,0 +1,25 @@
1
+ import { Resource } from './resource';
2
+ type Quantity = string;
3
+ export type ContainerMetrics = {
4
+ name: string;
5
+ usage: {
6
+ cpu?: Quantity;
7
+ memory?: Quantity;
8
+ };
9
+ };
10
+ export type PodMetrics = {
11
+ timestamp: string;
12
+ window: string;
13
+ containers: ContainerMetrics[];
14
+ } & Resource;
15
+ export type ResourceQuantity = {
16
+ cpu: {
17
+ si: string;
18
+ value: number;
19
+ };
20
+ memory: {
21
+ si: string;
22
+ value: number;
23
+ };
24
+ };
25
+ export {};
@@ -28,6 +28,7 @@ export type ResourceConfig<Raw extends Resource = Resource, Model extends Resour
28
28
  kind: string;
29
29
  basePath: string;
30
30
  apiVersion: string;
31
+ label: string;
31
32
  parent?: RESOURCE_GROUP;
32
33
  formatter?: (v: Raw) => Model;
33
34
  initValue?: Record<string, unknown>;
@@ -36,4 +37,5 @@ export type ResourceConfig<Raw extends Resource = Resource, Model extends Resour
36
37
  Dropdown?: React.FC<{
37
38
  data: Model;
38
39
  }>;
40
+ isCustom?: boolean;
39
41
  };
@@ -0,0 +1,12 @@
1
+ type FormatOptions = {
2
+ increment: number;
3
+ suffix: string | null;
4
+ firstSuffix: string | null;
5
+ startingExponent: number;
6
+ minExponent: number;
7
+ maxPrecision: number;
8
+ atLeastOne: boolean;
9
+ };
10
+ export declare function formatSi(inValue: number, options?: Partial<FormatOptions>): string;
11
+ export declare function parseSi(inValue: string, increment?: number | null, allowFractional?: boolean): number;
12
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dovetail-v2/refine",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -37,6 +37,7 @@
37
37
  "@linaria/core": "^4.5.4",
38
38
  "@linaria/react": "^4.5.4",
39
39
  "@linaria/vite": "^4.5.4",
40
+ "@playwright/test": "^1.39.0",
40
41
  "@refinedev/cli": "^2.9.0",
41
42
  "@types/js-yaml": "^4.0.6",
42
43
  "@types/json-schema": "^7.0.13",
@@ -67,9 +68,11 @@
67
68
  },
68
69
  "scripts": {
69
70
  "dev": "refine dev",
71
+ "dev:test": "VITE_IS_TEST=true refine dev",
70
72
  "build": "tsc --emitDeclarationOnly && vite build",
71
73
  "preview": "refine start",
72
74
  "refine": "refine",
75
+ "test": "npx playwright test --workers 1",
73
76
  "lint": "eslint src --ext .ts,.tsx"
74
77
  },
75
78
  "browserslist": {