@opensumi/ide-debug 2.24.6-rc-1685671765.0 → 2.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/lib/browser/components/floating-click-widget/index.d.ts.map +1 -1
  2. package/lib/browser/components/floating-click-widget/index.js +3 -2
  3. package/lib/browser/components/floating-click-widget/index.js.map +1 -1
  4. package/lib/browser/components/floating-click-widget/index.module.less +4 -0
  5. package/lib/browser/debug-configuration-manager.d.ts +6 -0
  6. package/lib/browser/debug-configuration-manager.d.ts.map +1 -1
  7. package/lib/browser/debug-configuration-manager.js +64 -17
  8. package/lib/browser/debug-configuration-manager.js.map +1 -1
  9. package/lib/browser/debug-contribution.d.ts.map +1 -1
  10. package/lib/browser/debug-contribution.js +11 -3
  11. package/lib/browser/debug-contribution.js.map +1 -1
  12. package/lib/browser/{debug-schema-updater.d.ts → debug-schema-manager.d.ts} +2 -2
  13. package/lib/browser/debug-schema-manager.d.ts.map +1 -0
  14. package/lib/browser/{debug-schema-updater.js → debug-schema-manager.js} +10 -10
  15. package/lib/browser/debug-schema-manager.js.map +1 -0
  16. package/lib/browser/debugUtils.d.ts +1 -0
  17. package/lib/browser/debugUtils.d.ts.map +1 -1
  18. package/lib/browser/debugUtils.js +22 -1
  19. package/lib/browser/debugUtils.js.map +1 -1
  20. package/lib/browser/editor/debug-breakpoint-zone-widget.d.ts +2 -0
  21. package/lib/browser/editor/debug-breakpoint-zone-widget.d.ts.map +1 -1
  22. package/lib/browser/editor/debug-breakpoint-zone-widget.js +14 -0
  23. package/lib/browser/editor/debug-breakpoint-zone-widget.js.map +1 -1
  24. package/lib/browser/index.d.ts.map +1 -1
  25. package/lib/browser/index.js +5 -0
  26. package/lib/browser/index.js.map +1 -1
  27. package/lib/browser/preferences/components/checkbox-widget.d.ts +4 -0
  28. package/lib/browser/preferences/components/checkbox-widget.d.ts.map +1 -0
  29. package/lib/browser/preferences/components/checkbox-widget.js +27 -0
  30. package/lib/browser/preferences/components/checkbox-widget.js.map +1 -0
  31. package/lib/browser/preferences/components/fields/any-of-field.d.ts +4 -0
  32. package/lib/browser/preferences/components/fields/any-of-field.d.ts.map +1 -0
  33. package/lib/browser/preferences/components/fields/any-of-field.js +28 -0
  34. package/lib/browser/preferences/components/fields/any-of-field.js.map +1 -0
  35. package/lib/browser/preferences/components/fields/array-field.d.ts +5 -0
  36. package/lib/browser/preferences/components/fields/array-field.d.ts.map +1 -0
  37. package/lib/browser/preferences/components/fields/array-field.js +19 -0
  38. package/lib/browser/preferences/components/fields/array-field.js.map +1 -0
  39. package/lib/browser/preferences/components/fields/object-filed.d.ts +5 -0
  40. package/lib/browser/preferences/components/fields/object-filed.d.ts.map +1 -0
  41. package/lib/browser/preferences/components/fields/object-filed.js +26 -0
  42. package/lib/browser/preferences/components/fields/object-filed.js.map +1 -0
  43. package/lib/browser/preferences/components/fields/title-field.d.ts +4 -0
  44. package/lib/browser/preferences/components/fields/title-field.d.ts.map +1 -0
  45. package/lib/browser/preferences/components/fields/title-field.js +12 -0
  46. package/lib/browser/preferences/components/fields/title-field.js.map +1 -0
  47. package/lib/browser/preferences/components/json-widget.module.less +36 -0
  48. package/lib/browser/preferences/components/select-widget.d.ts +4 -0
  49. package/lib/browser/preferences/components/select-widget.d.ts.map +1 -0
  50. package/lib/browser/preferences/components/select-widget.js +28 -0
  51. package/lib/browser/preferences/components/select-widget.js.map +1 -0
  52. package/lib/browser/preferences/components/text-widget.d.ts +4 -0
  53. package/lib/browser/preferences/components/text-widget.d.ts.map +1 -0
  54. package/lib/browser/preferences/components/text-widget.js +41 -0
  55. package/lib/browser/preferences/components/text-widget.js.map +1 -0
  56. package/lib/browser/preferences/launch-preferences-contribution.d.ts +14 -2
  57. package/lib/browser/preferences/launch-preferences-contribution.d.ts.map +1 -1
  58. package/lib/browser/preferences/launch-preferences-contribution.js +61 -2
  59. package/lib/browser/preferences/launch-preferences-contribution.js.map +1 -1
  60. package/lib/browser/preferences/launch.module.less +102 -0
  61. package/lib/browser/preferences/launch.service.d.ts +31 -0
  62. package/lib/browser/preferences/launch.service.d.ts.map +1 -0
  63. package/lib/browser/preferences/launch.service.js +109 -0
  64. package/lib/browser/preferences/launch.service.js.map +1 -0
  65. package/lib/browser/preferences/launch.view.d.ts +3 -0
  66. package/lib/browser/preferences/launch.view.d.ts.map +1 -0
  67. package/lib/browser/preferences/launch.view.js +287 -0
  68. package/lib/browser/preferences/launch.view.js.map +1 -0
  69. package/lib/browser/preferences/model/configuration-items.d.ts +12 -0
  70. package/lib/browser/preferences/model/configuration-items.d.ts.map +1 -0
  71. package/lib/browser/preferences/model/configuration-items.js +22 -0
  72. package/lib/browser/preferences/model/configuration-items.js.map +1 -0
  73. package/lib/browser/preferences/templates/additional-template.d.ts +4 -0
  74. package/lib/browser/preferences/templates/additional-template.d.ts.map +1 -0
  75. package/lib/browser/preferences/templates/additional-template.js +30 -0
  76. package/lib/browser/preferences/templates/additional-template.js.map +1 -0
  77. package/lib/browser/preferences/templates/array-field-item-template.d.ts +4 -0
  78. package/lib/browser/preferences/templates/array-field-item-template.d.ts.map +1 -0
  79. package/lib/browser/preferences/templates/array-field-item-template.js +31 -0
  80. package/lib/browser/preferences/templates/array-field-item-template.js.map +1 -0
  81. package/lib/browser/preferences/templates/array-field-template.d.ts +4 -0
  82. package/lib/browser/preferences/templates/array-field-template.d.ts.map +1 -0
  83. package/lib/browser/preferences/templates/array-field-template.js +31 -0
  84. package/lib/browser/preferences/templates/array-field-template.js.map +1 -0
  85. package/lib/browser/preferences/templates/base-input-template.d.ts +4 -0
  86. package/lib/browser/preferences/templates/base-input-template.d.ts.map +1 -0
  87. package/lib/browser/preferences/templates/base-input-template.js +29 -0
  88. package/lib/browser/preferences/templates/base-input-template.js.map +1 -0
  89. package/lib/browser/preferences/templates/button-template.d.ts +12 -0
  90. package/lib/browser/preferences/templates/button-template.d.ts.map +1 -0
  91. package/lib/browser/preferences/templates/button-template.js +71 -0
  92. package/lib/browser/preferences/templates/button-template.js.map +1 -0
  93. package/lib/browser/preferences/templates/description-field-template.d.ts +4 -0
  94. package/lib/browser/preferences/templates/description-field-template.d.ts.map +1 -0
  95. package/lib/browser/preferences/templates/description-field-template.js +16 -0
  96. package/lib/browser/preferences/templates/description-field-template.js.map +1 -0
  97. package/lib/browser/preferences/templates/field-template.d.ts +4 -0
  98. package/lib/browser/preferences/templates/field-template.d.ts.map +1 -0
  99. package/lib/browser/preferences/templates/field-template.js +19 -0
  100. package/lib/browser/preferences/templates/field-template.js.map +1 -0
  101. package/lib/browser/preferences/templates/json-templates.module.less +133 -0
  102. package/lib/browser/preferences/templates/object-field-template.d.ts +4 -0
  103. package/lib/browser/preferences/templates/object-field-template.d.ts.map +1 -0
  104. package/lib/browser/preferences/templates/object-field-template.js +74 -0
  105. package/lib/browser/preferences/templates/object-field-template.js.map +1 -0
  106. package/lib/browser/view/breakpoints/debug-breakpoints.module.less +19 -17
  107. package/lib/browser/view/breakpoints/debug-breakpoints.view.d.ts.map +1 -1
  108. package/lib/browser/view/breakpoints/debug-breakpoints.view.js +15 -7
  109. package/lib/browser/view/breakpoints/debug-breakpoints.view.js.map +1 -1
  110. package/lib/browser/view/configuration/debug-configuration.service.d.ts +1 -0
  111. package/lib/browser/view/configuration/debug-configuration.service.d.ts.map +1 -1
  112. package/lib/browser/view/configuration/debug-configuration.service.js +3 -0
  113. package/lib/browser/view/configuration/debug-configuration.service.js.map +1 -1
  114. package/lib/common/constants.d.ts +2 -0
  115. package/lib/common/constants.d.ts.map +1 -1
  116. package/lib/common/constants.js +4 -2
  117. package/lib/common/constants.js.map +1 -1
  118. package/lib/common/debug-schema.d.ts +5 -0
  119. package/lib/common/debug-schema.d.ts.map +1 -0
  120. package/lib/common/debug-schema.js +7 -0
  121. package/lib/common/debug-schema.js.map +1 -0
  122. package/lib/common/debug-service.d.ts +10 -0
  123. package/lib/common/debug-service.d.ts.map +1 -1
  124. package/lib/common/debug-service.js +8 -1
  125. package/lib/common/debug-service.js.map +1 -1
  126. package/lib/common/index.d.ts +1 -1
  127. package/lib/common/index.d.ts.map +1 -1
  128. package/lib/common/index.js +1 -1
  129. package/lib/common/index.js.map +1 -1
  130. package/package.json +26 -23
  131. package/src/browser/components/floating-click-widget/index.module.less +4 -0
  132. package/src/browser/components/floating-click-widget/index.tsx +4 -1
  133. package/src/browser/debug-configuration-manager.ts +82 -18
  134. package/src/browser/debug-contribution.ts +12 -4
  135. package/src/browser/{debug-schema-updater.ts → debug-schema-manager.ts} +5 -4
  136. package/src/browser/debugUtils.ts +23 -0
  137. package/src/browser/editor/debug-breakpoint-zone-widget.tsx +16 -1
  138. package/src/browser/index.ts +6 -0
  139. package/src/browser/preferences/components/checkbox-widget.tsx +78 -0
  140. package/src/browser/preferences/components/fields/any-of-field.tsx +90 -0
  141. package/src/browser/preferences/components/fields/array-field.tsx +25 -0
  142. package/src/browser/preferences/components/fields/object-filed.tsx +33 -0
  143. package/src/browser/preferences/components/fields/title-field.tsx +16 -0
  144. package/src/browser/preferences/components/json-widget.module.less +36 -0
  145. package/src/browser/preferences/components/select-widget.tsx +68 -0
  146. package/src/browser/preferences/components/text-widget.tsx +114 -0
  147. package/src/browser/preferences/launch-preferences-contribution.ts +84 -3
  148. package/src/browser/preferences/launch.module.less +102 -0
  149. package/src/browser/preferences/launch.service.ts +133 -0
  150. package/src/browser/preferences/launch.view.tsx +494 -0
  151. package/src/browser/preferences/model/configuration-items.ts +24 -0
  152. package/src/browser/preferences/templates/additional-template.tsx +77 -0
  153. package/src/browser/preferences/templates/array-field-item-template.tsx +90 -0
  154. package/src/browser/preferences/templates/array-field-template.tsx +92 -0
  155. package/src/browser/preferences/templates/base-input-template.tsx +79 -0
  156. package/src/browser/preferences/templates/button-template.tsx +107 -0
  157. package/src/browser/preferences/templates/description-field-template.tsx +29 -0
  158. package/src/browser/preferences/templates/field-template.tsx +71 -0
  159. package/src/browser/preferences/templates/json-templates.module.less +133 -0
  160. package/src/browser/preferences/templates/object-field-template.tsx +156 -0
  161. package/src/browser/view/breakpoints/debug-breakpoints.module.less +19 -17
  162. package/src/browser/view/breakpoints/debug-breakpoints.view.tsx +22 -10
  163. package/src/browser/view/configuration/debug-configuration.service.ts +4 -0
  164. package/src/common/constants.ts +3 -0
  165. package/src/common/debug-schema.ts +5 -0
  166. package/src/common/debug-service.ts +13 -0
  167. package/src/common/index.ts +1 -1
  168. package/lib/browser/debug-schema-updater.d.ts.map +0 -1
  169. package/lib/browser/debug-schema-updater.js.map +0 -1
  170. package/lib/common/debug-schema-updater.d.ts +0 -3
  171. package/lib/common/debug-schema-updater.d.ts.map +0 -1
  172. package/lib/common/debug-schema-updater.js +0 -5
  173. package/lib/common/debug-schema-updater.js.map +0 -1
  174. package/src/common/debug-schema-updater.ts +0 -3
@@ -0,0 +1,92 @@
1
+ import {
2
+ getTemplate,
3
+ getUiOptions,
4
+ ArrayFieldTemplateProps,
5
+ ArrayFieldTemplateItemType,
6
+ FormContextType,
7
+ RJSFSchema,
8
+ StrictRJSFSchema,
9
+ } from '@rjsf/utils';
10
+ import cls from 'classnames';
11
+ import React from 'react';
12
+
13
+ import styles from './json-templates.module.less';
14
+
15
+ export const ArrayFieldTemplate = <T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
16
+ props: ArrayFieldTemplateProps<T, S, F>,
17
+ ) => {
18
+ const {
19
+ canAdd,
20
+ className,
21
+ disabled,
22
+ formContext,
23
+ idSchema,
24
+ items,
25
+ onAddClick,
26
+ readonly,
27
+ registry,
28
+ required,
29
+ schema,
30
+ title,
31
+ uiSchema,
32
+ } = props;
33
+ const uiOptions = getUiOptions<T, S, F>(uiSchema);
34
+ const ArrayFieldDescriptionTemplate = getTemplate<'ArrayFieldDescriptionTemplate', T, S, F>(
35
+ 'ArrayFieldDescriptionTemplate',
36
+ registry,
37
+ uiOptions,
38
+ );
39
+ const ArrayFieldItemTemplate = getTemplate<'ArrayFieldItemTemplate', T, S, F>(
40
+ 'ArrayFieldItemTemplate',
41
+ registry,
42
+ uiOptions,
43
+ );
44
+ const ArrayFieldTitleTemplate = getTemplate<'ArrayFieldTitleTemplate', T, S, F>(
45
+ 'ArrayFieldTitleTemplate',
46
+ registry,
47
+ uiOptions,
48
+ );
49
+ const {
50
+ ButtonTemplates: { AddButton },
51
+ } = registry.templates;
52
+
53
+ return (
54
+ <fieldset className={cls(className)} id={idSchema.$id}>
55
+ <div className={styles.array_field_template}>
56
+ {(uiOptions.title || title) && (
57
+ <div className={styles.array_item_label}>
58
+ <ArrayFieldTitleTemplate
59
+ idSchema={idSchema}
60
+ required={required}
61
+ title={uiOptions.title || title}
62
+ schema={schema}
63
+ uiSchema={uiSchema}
64
+ registry={registry}
65
+ />
66
+ </div>
67
+ )}
68
+ {(uiOptions.description || schema.description) && (
69
+ <div className={styles.array_item_description}>
70
+ <ArrayFieldDescriptionTemplate
71
+ description={uiOptions.description || schema.description}
72
+ idSchema={idSchema}
73
+ schema={schema}
74
+ uiSchema={uiSchema}
75
+ registry={registry}
76
+ />
77
+ </div>
78
+ )}
79
+ {items &&
80
+ items.map(({ key, ...itemProps }: ArrayFieldTemplateItemType<T, S, F>) => (
81
+ <ArrayFieldItemTemplate key={key} {...itemProps} />
82
+ ))}
83
+
84
+ {canAdd && (
85
+ <div className={styles.array_item_add}>
86
+ <AddButton disabled={disabled || readonly} onClick={onAddClick} registry={registry} />
87
+ </div>
88
+ )}
89
+ </div>
90
+ </fieldset>
91
+ );
92
+ };
@@ -0,0 +1,79 @@
1
+ import {
2
+ ariaDescribedByIds,
3
+ BaseInputTemplateProps,
4
+ examplesId,
5
+ getInputProps,
6
+ FormContextType,
7
+ GenericObjectType,
8
+ RJSFSchema,
9
+ StrictRJSFSchema,
10
+ } from '@rjsf/utils';
11
+ import React, { ChangeEvent, FocusEvent } from 'react';
12
+
13
+ import { Input } from '@opensumi/ide-components';
14
+
15
+ const INPUT_STYLE = {
16
+ width: '100%',
17
+ };
18
+
19
+ export const BaseInputTemplate = <T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
20
+ props: BaseInputTemplateProps<T, S, F>,
21
+ ) => {
22
+ const {
23
+ disabled,
24
+ formContext,
25
+ id,
26
+ onBlur,
27
+ onChange,
28
+ onChangeOverride,
29
+ onFocus,
30
+ options,
31
+ placeholder,
32
+ readonly,
33
+ schema,
34
+ value,
35
+ type,
36
+ } = props;
37
+ const inputProps = getInputProps<T, S, F>(schema, type, options, false);
38
+ const { readonlyAsDisabled = true } = formContext as GenericObjectType;
39
+
40
+ const handleNumberChange = (nextValue: number | null) => onChange(nextValue);
41
+
42
+ const handleTextChange = onChangeOverride
43
+ ? onChangeOverride
44
+ : ({ target }: ChangeEvent<HTMLInputElement>) => onChange(target.value === '' ? options.emptyValue : target.value);
45
+
46
+ const handleBlur = ({ target }: FocusEvent<HTMLInputElement>) => onBlur(id, target.value);
47
+
48
+ const handleFocus = ({ target }: FocusEvent<HTMLInputElement>) => onFocus(id, target.value);
49
+
50
+ const input = (
51
+ <Input
52
+ disabled={disabled || (readonlyAsDisabled && readonly)}
53
+ id={id}
54
+ name={id}
55
+ onBlur={!readonly ? handleBlur : undefined}
56
+ onChange={!readonly ? handleTextChange : undefined}
57
+ onFocus={!readonly ? handleFocus : undefined}
58
+ placeholder={placeholder}
59
+ style={INPUT_STYLE}
60
+ list={schema.examples ? examplesId<T>(id) : undefined}
61
+ {...inputProps}
62
+ value={value}
63
+ aria-describedby={ariaDescribedByIds<T>(id, !!schema.examples)}
64
+ />
65
+ );
66
+
67
+ return (
68
+ <>
69
+ {input}
70
+ {Array.isArray(schema.examples) && (
71
+ <datalist id={examplesId<T>(id)}>
72
+ {(schema.examples as string[])
73
+ .concat(schema.default && !schema.examples.includes(schema.default) ? ([schema.default] as string[]) : [])
74
+ .map((example) => <option key={example} value={example} />)}
75
+ </datalist>
76
+ )}
77
+ </>
78
+ );
79
+ };
@@ -0,0 +1,107 @@
1
+ import { IconButtonProps, SubmitButtonProps } from '@rjsf/utils';
2
+ import React, { useCallback, useEffect, useMemo } from 'react';
3
+
4
+ import { Button, ButtonProps, getIcon } from '@opensumi/ide-components';
5
+ import { defaultIconfont } from '@opensumi/ide-components/lib/icon/iconfont/iconMap';
6
+ import { useInjectable } from '@opensumi/ide-core-browser';
7
+ import { MenuActionList } from '@opensumi/ide-core-browser/lib/components/actions/index';
8
+ import { MenuNode } from '@opensumi/ide-core-browser/lib/menu/next/base';
9
+ import { LabelMenuItemNode } from '@opensumi/ide-core-browser/lib/menu/next/menu.interface';
10
+ import { Disposable, localize } from '@opensumi/ide-core-common';
11
+
12
+ import { ILaunchService } from '../../../common';
13
+ import { LaunchService } from '../launch.service';
14
+
15
+ import styles from './json-templates.module.less';
16
+
17
+ export const MoveUpButton = (props: IconButtonProps) => (
18
+ <Button {...props} type='primary' icon={defaultIconfont.arrowup}>
19
+ <span className={getIcon(defaultIconfont.arrowup)}></span>
20
+ </Button>
21
+ );
22
+
23
+ export const MoveDownButton = (props: IconButtonProps) => (
24
+ <Button {...props} type='primary' icon={defaultIconfont.arrowdown}>
25
+ <span className={getIcon(defaultIconfont.arrowdown)}></span>
26
+ </Button>
27
+ );
28
+
29
+ export const RemoveButton = (props: IconButtonProps) => (
30
+ <Button {...props} type='danger' icon={defaultIconfont.delete}>
31
+ <span className={getIcon(defaultIconfont.delete)}></span>
32
+ </Button>
33
+ );
34
+
35
+ export const AddButton = (props: IconButtonProps) => (
36
+ <Button {...props} type='primary' icon={defaultIconfont.plus}>
37
+ <span className={getIcon(defaultIconfont.plus)}></span> {localize('debug.launch.view.template.button.addItem')}
38
+ </Button>
39
+ );
40
+
41
+ export const CopyButton = (props: IconButtonProps) => (
42
+ <Button {...props} type='primary' icon={defaultIconfont['file-copy']}>
43
+ <span className={getIcon(defaultIconfont['file-copy'])}></span>
44
+ </Button>
45
+ );
46
+
47
+ export const AddItemButton = (props: SubmitButtonProps & { onAddClick: (item: LabelMenuItemNode) => void }) => {
48
+ const {
49
+ registry: { rootSchema },
50
+ onAddClick,
51
+ } = props;
52
+ const launchService = useInjectable<LaunchService>(ILaunchService);
53
+ const [menuOpen, setMenuOpen] = React.useState<boolean>(false);
54
+ const [snippetMenu, setSnippetMenu] = React.useState<MenuNode[]>([]);
55
+ const { rawSchemaProperties: schemaProperties } = launchService;
56
+
57
+ const handleVisibleChange = useCallback((visible: boolean) => setMenuOpen(visible), []);
58
+
59
+ const handleMenuItemClick = useCallback((item: LabelMenuItemNode) => {
60
+ setMenuOpen(false);
61
+ onAddClick(item);
62
+ }, []);
63
+
64
+ const handleSnippetMenu = useCallback(() => {
65
+ const { properties } = schemaProperties;
66
+ const { properties: existedProperties } = rootSchema;
67
+
68
+ if (!properties || !existedProperties) {
69
+ return;
70
+ }
71
+ // schema
72
+ const menuItemNode = Object.keys(properties)
73
+ // 过滤已存在于视图中的 properties
74
+ .filter((key) => !Object.hasOwn(existedProperties, key))
75
+ .map((item) => new LabelMenuItemNode(item));
76
+
77
+ setSnippetMenu(menuItemNode);
78
+ }, [rootSchema, schemaProperties]);
79
+
80
+ useEffect(() => {
81
+ const disposable = new Disposable();
82
+
83
+ disposable.addDispose(
84
+ launchService.onChangeSchema(() => {
85
+ requestAnimationFrame(() => {
86
+ handleSnippetMenu();
87
+ });
88
+ }),
89
+ );
90
+ handleSnippetMenu();
91
+
92
+ return () => disposable.dispose();
93
+ }, [schemaProperties, rootSchema]);
94
+
95
+ return (
96
+ <Button
97
+ type='secondary'
98
+ icon={defaultIconfont.plus}
99
+ className={styles.add_new_field}
100
+ menu={<MenuActionList afterClick={handleMenuItemClick} data={snippetMenu} style={{ maxHeight: 600 }} />}
101
+ moreVisible={menuOpen}
102
+ onVisibleChange={handleVisibleChange}
103
+ >
104
+ <span className={getIcon(defaultIconfont.plus)}></span> {localize('debug.launch.view.template.button.submit')}
105
+ </Button>
106
+ );
107
+ };
@@ -0,0 +1,29 @@
1
+ import { DescriptionFieldProps, FormContextType, RJSFSchema, StrictRJSFSchema } from '@rjsf/utils';
2
+ import React, { useMemo } from 'react';
3
+
4
+ import { IJSONSchema } from '@opensumi/ide-core-common';
5
+
6
+ import styles from './json-templates.module.less';
7
+
8
+ export const DescriptionFieldTemplate = <
9
+ T = any,
10
+ S extends StrictRJSFSchema = RJSFSchema,
11
+ F extends FormContextType = any,
12
+ >(
13
+ props: DescriptionFieldProps<T, S, F>,
14
+ ) => {
15
+ const { id, schema } = props;
16
+ const description = useMemo(
17
+ () => schema.description ?? (schema as IJSONSchema).markdownDescription,
18
+ [schema, schema.description, (schema as IJSONSchema).markdownDescription],
19
+ );
20
+
21
+ if (!description) {
22
+ return null;
23
+ }
24
+ return (
25
+ <span id={id} className={styles.description_field_template}>
26
+ {description}
27
+ </span>
28
+ );
29
+ };
@@ -0,0 +1,71 @@
1
+ import {
2
+ FieldTemplateProps,
3
+ FormContextType,
4
+ GenericObjectType,
5
+ getTemplate,
6
+ getUiOptions,
7
+ RJSFSchema,
8
+ StrictRJSFSchema,
9
+ } from '@rjsf/utils';
10
+ import cls from 'classnames';
11
+ import React from 'react';
12
+
13
+ export const FieldTemplate = <T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
14
+ props: FieldTemplateProps<T, S, F>,
15
+ ) => {
16
+ const {
17
+ classNames,
18
+ style,
19
+ children,
20
+ id,
21
+ schema,
22
+ label,
23
+ hidden,
24
+ formContext,
25
+ uiSchema,
26
+ registry,
27
+ disabled,
28
+ onDropPropertyClick,
29
+ onKeyChange,
30
+ required,
31
+ readonly,
32
+ } = props;
33
+
34
+ const { wrapperStyle } = formContext as GenericObjectType;
35
+
36
+ const uiOptions = getUiOptions<T, S, F>(uiSchema);
37
+ const WrapIfAdditionalTemplate = getTemplate<'WrapIfAdditionalTemplate', T, S, F>(
38
+ 'WrapIfAdditionalTemplate',
39
+ registry,
40
+ uiOptions,
41
+ );
42
+
43
+ if (hidden) {
44
+ return null;
45
+ }
46
+
47
+ return (
48
+ <WrapIfAdditionalTemplate
49
+ classNames={classNames}
50
+ style={style}
51
+ disabled={disabled}
52
+ id={id}
53
+ label={label}
54
+ onDropPropertyClick={onDropPropertyClick}
55
+ onKeyChange={onKeyChange}
56
+ readonly={readonly}
57
+ required={required}
58
+ schema={schema}
59
+ uiSchema={uiSchema}
60
+ registry={registry}
61
+ >
62
+ {id === 'root' ? (
63
+ children
64
+ ) : (
65
+ <div className={cls(classNames)} style={wrapperStyle}>
66
+ {children}
67
+ </div>
68
+ )}
69
+ </WrapIfAdditionalTemplate>
70
+ );
71
+ };
@@ -0,0 +1,133 @@
1
+ .array_field_item_template {
2
+ display: flex;
3
+ align-items: center;
4
+ margin-bottom: 8px;
5
+
6
+ .control_field {
7
+ margin-right: 8px;
8
+ min-width: 180px;
9
+ }
10
+
11
+ .toolbar {
12
+ button {
13
+ border-radius: 0;
14
+ }
15
+ }
16
+ }
17
+
18
+ .field_template {
19
+ display: flex;
20
+ flex-direction: column;
21
+ }
22
+
23
+ .array_field_template {
24
+ display: flex;
25
+ flex-direction: column;
26
+
27
+ .array_item_description {
28
+ margin-bottom: 8px;
29
+ }
30
+ }
31
+
32
+ .object_field_template {
33
+ .object_field_container {
34
+ .root_property_wrapper {
35
+ margin-bottom: 0;
36
+ }
37
+
38
+ &.root_object_field_container {
39
+ margin-bottom: 16px;
40
+
41
+ > .object_title {
42
+ padding-left: 16px;
43
+ }
44
+
45
+ .root_property_wrapper {
46
+ padding: 16px;
47
+ position: relative;
48
+
49
+ .wrapper_delete {
50
+ display: none;
51
+ position: absolute;
52
+ cursor: pointer;
53
+ right: 16px;
54
+ top: 16px;
55
+
56
+ .close_icon {
57
+ font-size: 21px;
58
+ color: var(--kt-dangerButton-background);
59
+ }
60
+ }
61
+
62
+ &:hover {
63
+ background-color: var(--kt-tree-hoverBackground);
64
+
65
+ .wrapper_delete {
66
+ display: block;
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ .description_field_template {
75
+ display: inline-block;
76
+ margin-bottom: 10px;
77
+ font-size: 14px;
78
+ opacity: 0.75;
79
+ white-space: pre-wrap;
80
+ color: var(--descriptionForeground);
81
+ }
82
+
83
+ .add_new_field {
84
+ min-width: 300px;
85
+ max-width: 500px;
86
+ width: 100%;
87
+ border-style: dashed;
88
+ margin-left: 16px;
89
+ }
90
+
91
+ .additional_field_template {
92
+ display: flex;
93
+ flex-direction: column;
94
+
95
+ .form_additional_container {
96
+ display: flex;
97
+ min-width: 300px;
98
+ max-width: 500px;
99
+ width: 100%;
100
+ margin-bottom: 8px;
101
+
102
+ .form_additional_children {
103
+ label[class*='field_label'] {
104
+ display: none;
105
+ }
106
+ }
107
+
108
+ .form_additional,
109
+ .form_additional_children {
110
+ margin-right: 16px;
111
+ }
112
+ }
113
+
114
+ .children_field {
115
+ position: relative;
116
+
117
+ .object_title,
118
+ .object_description {
119
+ display: none;
120
+ }
121
+
122
+ .dividing {
123
+ width: 2px;
124
+ background-color: var(--editorGroup-border);
125
+ height: 100%;
126
+ position: absolute;
127
+ }
128
+
129
+ .children_container {
130
+ margin-left: 16px;
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,156 @@
1
+ import {
2
+ ObjectFieldTemplateProps,
3
+ StrictRJSFSchema,
4
+ RJSFSchema,
5
+ FormContextType,
6
+ getTemplate,
7
+ getUiOptions,
8
+ descriptionId,
9
+ canExpand,
10
+ titleId,
11
+ ADDITIONAL_PROPERTY_FLAG,
12
+ ObjectFieldTemplatePropertyType,
13
+ } from '@rjsf/utils';
14
+ import cls from 'classnames';
15
+ import React, { useCallback, useMemo } from 'react';
16
+
17
+ import { getIcon } from '@opensumi/ide-components';
18
+ import { IJSONSchema, useInjectable } from '@opensumi/ide-core-browser';
19
+ import { Key } from '@opensumi/ide-core-browser';
20
+
21
+ import { ILaunchService } from '../../../common/debug-service';
22
+ import { LaunchService } from '../launch.service';
23
+
24
+ import styles from './json-templates.module.less';
25
+
26
+ /**
27
+ * 情况一: properties 为空则表明该属性的值是任意的 key:value 对象组合,所以需要显示添加按钮
28
+ * 情况二: 如果 properties 当中存在 ADDITIONAL_PROPERTY_FLAG 字段,则允许继续添加
29
+ */
30
+ const extendCanExpand = <T, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
31
+ props: ObjectFieldTemplateProps<T, S, F>,
32
+ ) => {
33
+ const { schema, uiSchema, formData } = props;
34
+ const { properties } = schema;
35
+
36
+ if (!properties) {
37
+ return false;
38
+ }
39
+
40
+ if (Object.keys(properties).length === 0) {
41
+ return true;
42
+ }
43
+
44
+ if (!Object.values(properties).some((item) => item[ADDITIONAL_PROPERTY_FLAG])) {
45
+ return false;
46
+ }
47
+
48
+ return canExpand(schema, uiSchema, formData);
49
+ };
50
+
51
+ export const ObjectFieldTemplate = <T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
52
+ props: ObjectFieldTemplateProps<T, S, F>,
53
+ ) => {
54
+ const { schema, uiSchema, required, registry, idSchema, title, disabled, readonly, properties, onAddClick } = props;
55
+ const launchService = useInjectable<LaunchService>(ILaunchService);
56
+ const uiOptions = getUiOptions<T, S, F>(uiSchema);
57
+ const TitleFieldTemplate = getTemplate<'TitleFieldTemplate', T, S, F>('TitleFieldTemplate', registry, uiOptions);
58
+ const DescriptionFieldTemplate = getTemplate<'DescriptionFieldTemplate', T, S, F>(
59
+ 'DescriptionFieldTemplate',
60
+ registry,
61
+ uiOptions,
62
+ );
63
+ const {
64
+ ButtonTemplates: { AddButton },
65
+ } = registry.templates;
66
+
67
+ const description = useMemo(() => props.description ?? (schema as IJSONSchema).markdownDescription, [props.description, schema]);
68
+
69
+ const fieldContainerClass = useMemo(
70
+ () =>
71
+ idSchema.$id === 'root'
72
+ ? cls(styles.object_field_container, styles.root_object_field_container)
73
+ : styles.object_field_container,
74
+ [idSchema],
75
+ );
76
+
77
+ const propertyWrapperClass = useMemo(
78
+ () =>
79
+ idSchema.$id === 'root' ? cls(styles.property_wrapper, styles.root_property_wrapper) : styles.property_wrapper,
80
+ [idSchema],
81
+ );
82
+
83
+ const handleDelProperties = useCallback((node: ObjectFieldTemplatePropertyType) => {
84
+ const { name } = node;
85
+ launchService.delItem(name);
86
+ }, []);
87
+
88
+ const renderProperties = useCallback(
89
+ (node: ObjectFieldTemplatePropertyType) => {
90
+ const { rawSchemaProperties: schemaProperties } = launchService;
91
+ if (!schemaProperties) {
92
+ return null;
93
+ }
94
+
95
+ const required = schemaProperties.required || [];
96
+
97
+ return (
98
+ <div
99
+ key={node.name}
100
+ className={propertyWrapperClass}
101
+ onKeyDown={(event) => {
102
+ if (event.key === Key.ENTER.code) {
103
+ event.preventDefault();
104
+ event.stopPropagation();
105
+ }
106
+ }}
107
+ >
108
+ {node.content}
109
+ {/* 非 root 节点不允许删除 */}
110
+ {required.includes(node.name) || idSchema.$id !== 'root' ? null : (
111
+ <div className={styles.wrapper_delete} onClick={() => handleDelProperties(node)}>
112
+ <span className={cls(getIcon('close-circle'), styles.close_icon)}></span>
113
+ </div>
114
+ )}
115
+ </div>
116
+ );
117
+ },
118
+ [properties, launchService.rawSchemaProperties, idSchema],
119
+ );
120
+
121
+ return (
122
+ <div className={styles.object_field_template}>
123
+ <fieldset>
124
+ <div className={fieldContainerClass}>
125
+ {title && (
126
+ <div className={styles.object_title}>
127
+ <TitleFieldTemplate
128
+ id={titleId<T>(idSchema)}
129
+ title={title}
130
+ required={required}
131
+ schema={schema}
132
+ uiSchema={uiSchema}
133
+ registry={registry}
134
+ />
135
+ </div>
136
+ )}
137
+ {description && (
138
+ <div className={styles.object_description}>
139
+ <DescriptionFieldTemplate
140
+ id={descriptionId<T>(idSchema)}
141
+ description={description}
142
+ schema={schema}
143
+ uiSchema={uiSchema}
144
+ registry={registry}
145
+ />
146
+ </div>
147
+ )}
148
+ {properties.filter((e) => !e.hidden).map((element) => renderProperties(element))}
149
+ </div>
150
+ {extendCanExpand<T, S, F>(props) && (
151
+ <AddButton onClick={onAddClick(schema)} disabled={disabled || readonly} registry={registry} />
152
+ )}
153
+ </fieldset>
154
+ </div>
155
+ );
156
+ };