@perses-dev/plugin-system 0.53.0-beta.2 → 0.53.0-beta.4

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 (101) hide show
  1. package/dist/cjs/components/DatasourceSelect/DatasourceSelect.js +8 -8
  2. package/dist/cjs/components/HTTPSettingsEditor/HTTPSettingsEditor.js +104 -73
  3. package/dist/cjs/components/MultiQueryEditor/MultiQueryEditor.js +5 -1
  4. package/dist/cjs/components/MultiQueryEditor/QueryEditorContainer.js +6 -6
  5. package/dist/cjs/components/PanelSpecEditor/PanelSpecEditor.js +8 -1
  6. package/dist/cjs/components/PluginEditor/PluginEditor.js +11 -45
  7. package/dist/cjs/components/PluginEditor/plugin-editor-api.js +2 -1
  8. package/dist/cjs/components/PluginRegistry/plugin-indexes.js +3 -3
  9. package/dist/cjs/components/TimeRangeControls/TimeRangeControls.js +3 -3
  10. package/dist/cjs/components/Variables/VariableEditorForm/VariableEditorForm.js +24 -18
  11. package/dist/cjs/components/Variables/VariableEditorForm/VariablePreview.js +3 -3
  12. package/dist/cjs/components/Variables/VariableEditorForm/variable-editor-form-model.js +4 -4
  13. package/dist/cjs/components/Variables/variable-model.js +5 -5
  14. package/dist/cjs/context/ValidationProvider.js +4 -4
  15. package/dist/cjs/model/legend.js +8 -8
  16. package/dist/cjs/model/panels.js +0 -6
  17. package/dist/cjs/model/plugin-base.js +0 -6
  18. package/dist/cjs/remote/PluginRuntime.js +13 -13
  19. package/dist/cjs/runtime/DataQueriesProvider/DataQueriesProvider.js +5 -5
  20. package/dist/cjs/runtime/DataQueriesProvider/model.js +3 -3
  21. package/dist/cjs/runtime/QueryCountProvider.js +3 -3
  22. package/dist/cjs/runtime/RouterProvider.js +5 -5
  23. package/dist/cjs/runtime/TimeRangeProvider/TimeRangeProvider.js +6 -6
  24. package/dist/cjs/runtime/TimeRangeProvider/TimeRangeProviders.js +3 -3
  25. package/dist/cjs/runtime/TimeRangeProvider/TimeRangeSettingsProvider.js +8 -8
  26. package/dist/cjs/runtime/TimeRangeProvider/query-params.js +10 -10
  27. package/dist/cjs/runtime/UsageMetricsProvider.js +5 -5
  28. package/dist/cjs/runtime/builtin-variables.js +5 -5
  29. package/dist/cjs/runtime/datasources.js +6 -6
  30. package/dist/cjs/runtime/log-queries.js +9 -5
  31. package/dist/cjs/runtime/plugin-registry.js +7 -7
  32. package/dist/cjs/runtime/profile-queries.js +11 -6
  33. package/dist/cjs/runtime/time-series-queries.js +10 -6
  34. package/dist/cjs/runtime/trace-queries.js +9 -5
  35. package/dist/cjs/runtime/utils.js +3 -3
  36. package/dist/cjs/runtime/variables.js +7 -7
  37. package/dist/cjs/test/mock-data.js +13 -13
  38. package/dist/cjs/test/test-plugins/bert/index.js +3 -3
  39. package/dist/cjs/test/test-plugins/ernie/index.js +3 -3
  40. package/dist/cjs/test-utils/mock-plugin-registry.js +3 -3
  41. package/dist/cjs/utils/action.js +3 -3
  42. package/dist/cjs/utils/variables.js +7 -7
  43. package/dist/components/HTTPSettingsEditor/HTTPSettingsEditor.d.ts.map +1 -1
  44. package/dist/components/HTTPSettingsEditor/HTTPSettingsEditor.js +105 -74
  45. package/dist/components/HTTPSettingsEditor/HTTPSettingsEditor.js.map +1 -1
  46. package/dist/components/MultiQueryEditor/MultiQueryEditor.d.ts +1 -0
  47. package/dist/components/MultiQueryEditor/MultiQueryEditor.d.ts.map +1 -1
  48. package/dist/components/MultiQueryEditor/MultiQueryEditor.js +5 -1
  49. package/dist/components/MultiQueryEditor/MultiQueryEditor.js.map +1 -1
  50. package/dist/components/MultiQueryEditor/QueryEditorContainer.d.ts +1 -0
  51. package/dist/components/MultiQueryEditor/QueryEditorContainer.d.ts.map +1 -1
  52. package/dist/components/MultiQueryEditor/QueryEditorContainer.js +6 -6
  53. package/dist/components/MultiQueryEditor/QueryEditorContainer.js.map +1 -1
  54. package/dist/components/PanelSpecEditor/PanelSpecEditor.d.ts +1 -0
  55. package/dist/components/PanelSpecEditor/PanelSpecEditor.d.ts.map +1 -1
  56. package/dist/components/PanelSpecEditor/PanelSpecEditor.js +8 -1
  57. package/dist/components/PanelSpecEditor/PanelSpecEditor.js.map +1 -1
  58. package/dist/components/PluginEditor/PluginEditor.d.ts +3 -3
  59. package/dist/components/PluginEditor/PluginEditor.d.ts.map +1 -1
  60. package/dist/components/PluginEditor/PluginEditor.js +12 -46
  61. package/dist/components/PluginEditor/PluginEditor.js.map +1 -1
  62. package/dist/components/PluginEditor/plugin-editor-api.d.ts +1 -1
  63. package/dist/components/PluginEditor/plugin-editor-api.d.ts.map +1 -1
  64. package/dist/components/PluginEditor/plugin-editor-api.js +2 -1
  65. package/dist/components/PluginEditor/plugin-editor-api.js.map +1 -1
  66. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.d.ts.map +1 -1
  67. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js +24 -18
  68. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js.map +1 -1
  69. package/dist/components/Variables/VariableEditorForm/VariablePreview.d.ts.map +1 -1
  70. package/dist/components/Variables/VariableEditorForm/VariablePreview.js.map +1 -1
  71. package/dist/model/log-queries.d.ts +1 -1
  72. package/dist/model/log-queries.d.ts.map +1 -1
  73. package/dist/model/log-queries.js.map +1 -1
  74. package/dist/model/panels.js +1 -1
  75. package/dist/model/panels.js.map +1 -1
  76. package/dist/model/plugin-base.d.ts +1 -6
  77. package/dist/model/plugin-base.d.ts.map +1 -1
  78. package/dist/model/plugin-base.js +3 -1
  79. package/dist/model/plugin-base.js.map +1 -1
  80. package/dist/model/profile-queries.d.ts +1 -1
  81. package/dist/model/profile-queries.d.ts.map +1 -1
  82. package/dist/model/profile-queries.js.map +1 -1
  83. package/dist/model/trace-queries.d.ts +1 -1
  84. package/dist/model/trace-queries.d.ts.map +1 -1
  85. package/dist/model/trace-queries.js.map +1 -1
  86. package/dist/remote/PluginRuntime.js +10 -10
  87. package/dist/remote/PluginRuntime.js.map +1 -1
  88. package/dist/runtime/log-queries.d.ts.map +1 -1
  89. package/dist/runtime/log-queries.js +6 -2
  90. package/dist/runtime/log-queries.js.map +1 -1
  91. package/dist/runtime/profile-queries.d.ts.map +1 -1
  92. package/dist/runtime/profile-queries.js +8 -3
  93. package/dist/runtime/profile-queries.js.map +1 -1
  94. package/dist/runtime/time-series-queries.d.ts.map +1 -1
  95. package/dist/runtime/time-series-queries.js +4 -0
  96. package/dist/runtime/time-series-queries.js.map +1 -1
  97. package/dist/runtime/trace-queries.d.ts.map +1 -1
  98. package/dist/runtime/trace-queries.js +6 -2
  99. package/dist/runtime/trace-queries.js.map +1 -1
  100. package/package.json +6 -5
  101. package/LICENSE +0 -201
@@ -17,14 +17,14 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- TRACE_QUERY_KEY: function() {
24
+ get TRACE_QUERY_KEY () {
25
25
  return TRACE_QUERY_KEY;
26
26
  },
27
- useTraceQueries: function() {
27
+ get useTraceQueries () {
28
28
  return useTraceQueries;
29
29
  }
30
30
  });
@@ -55,9 +55,13 @@ function useTraceQueries(definitions) {
55
55
  return {
56
56
  enabled: queryEnabled,
57
57
  queryKey: queryKey,
58
- queryFn: async ()=>{
58
+ refetchOnMount: false,
59
+ refetchOnWindowFocus: false,
60
+ refetchOnReconnect: false,
61
+ staleTime: Infinity,
62
+ queryFn: async ({ signal })=>{
59
63
  const plugin = await getPlugin(TRACE_QUERY_KEY, traceQueryKind);
60
- const data = await plugin.getTraceData(definition.spec.plugin.spec, context);
64
+ const data = await plugin.getTraceData(definition.spec.plugin.spec, context, signal);
61
65
  return data;
62
66
  }
63
67
  };
@@ -17,14 +17,14 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- filterVariableStateMap: function() {
24
+ get filterVariableStateMap () {
25
25
  return filterVariableStateMap;
26
26
  },
27
- getVariableValuesKey: function() {
27
+ get getVariableValuesKey () {
28
28
  return getVariableValuesKey;
29
29
  }
30
30
  });
@@ -17,26 +17,26 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- VariableContext: function() {
24
+ get VariableContext () {
25
25
  return VariableContext;
26
26
  },
27
- VariableStoreStateMap: function() {
27
+ get VariableStoreStateMap () {
28
28
  return VariableStoreStateMap;
29
29
  },
30
- replaceVariablesInString: function() {
30
+ get replaceVariablesInString () {
31
31
  return replaceVariablesInString;
32
32
  },
33
- useAllVariableValues: function() {
33
+ get useAllVariableValues () {
34
34
  return useAllVariableValues;
35
35
  },
36
- useReplaceVariablesInString: function() {
36
+ get useReplaceVariablesInString () {
37
37
  return useReplaceVariablesInString;
38
38
  },
39
- useVariableValues: function() {
39
+ get useVariableValues () {
40
40
  return useVariableValues;
41
41
  }
42
42
  });
@@ -17,44 +17,44 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- MOCK_EMPTY_PLUGIN_MODULE: function() {
24
+ get MOCK_EMPTY_PLUGIN_MODULE () {
25
25
  return MOCK_EMPTY_PLUGIN_MODULE;
26
26
  },
27
- MOCK_INVALID_PLUGIN_MODULE: function() {
27
+ get MOCK_INVALID_PLUGIN_MODULE () {
28
28
  return MOCK_INVALID_PLUGIN_MODULE;
29
29
  },
30
- MOCK_LOG_DATA: function() {
30
+ get MOCK_LOG_DATA () {
31
31
  return MOCK_LOG_DATA;
32
32
  },
33
- MOCK_MIXED_VALIDITY_PLUGIN_MODULES: function() {
33
+ get MOCK_MIXED_VALIDITY_PLUGIN_MODULES () {
34
34
  return MOCK_MIXED_VALIDITY_PLUGIN_MODULES;
35
35
  },
36
- MOCK_MULTI_PLUGIN_MODULE: function() {
36
+ get MOCK_MULTI_PLUGIN_MODULE () {
37
37
  return MOCK_MULTI_PLUGIN_MODULE;
38
38
  },
39
- MOCK_PARTIAL_FAILURE_MODULE: function() {
39
+ get MOCK_PARTIAL_FAILURE_MODULE () {
40
40
  return MOCK_PARTIAL_FAILURE_MODULE;
41
41
  },
42
- MOCK_PROFILE_DATA: function() {
42
+ get MOCK_PROFILE_DATA () {
43
43
  return MOCK_PROFILE_DATA;
44
44
  },
45
- MOCK_REMOTE_PLUGIN_MODULE: function() {
45
+ get MOCK_REMOTE_PLUGIN_MODULE () {
46
46
  return MOCK_REMOTE_PLUGIN_MODULE;
47
47
  },
48
- MOCK_TIME_SERIES_DATA: function() {
48
+ get MOCK_TIME_SERIES_DATA () {
49
49
  return MOCK_TIME_SERIES_DATA;
50
50
  },
51
- MOCK_TRACE_DATA: function() {
51
+ get MOCK_TRACE_DATA () {
52
52
  return MOCK_TRACE_DATA;
53
53
  },
54
- MOCK_VALID_PLUGIN_METADATA: function() {
54
+ get MOCK_VALID_PLUGIN_METADATA () {
55
55
  return MOCK_VALID_PLUGIN_METADATA;
56
56
  },
57
- MOCK_VALID_PLUGIN_MODULE_RESOURCE: function() {
57
+ get MOCK_VALID_PLUGIN_MODULE_RESOURCE () {
58
58
  return MOCK_VALID_PLUGIN_MODULE_RESOURCE;
59
59
  }
60
60
  });
@@ -17,14 +17,14 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- BertPanel1: function() {
24
+ get BertPanel1 () {
25
25
  return BertPanel1;
26
26
  },
27
- BertPanel2: function() {
27
+ get BertPanel2 () {
28
28
  return BertPanel2;
29
29
  }
30
30
  });
@@ -17,14 +17,14 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- ErnieVariable1: function() {
24
+ get ErnieVariable1 () {
25
25
  return ErnieVariable1;
26
26
  },
27
- ErnieVariable2: function() {
27
+ get ErnieVariable2 () {
28
28
  return ErnieVariable2;
29
29
  }
30
30
  });
@@ -17,14 +17,14 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- getMockPluginName: function() {
24
+ get getMockPluginName () {
25
25
  return getMockPluginName;
26
26
  },
27
- mockPluginRegistry: function() {
27
+ get mockPluginRegistry () {
28
28
  return mockPluginRegistry;
29
29
  }
30
30
  });
@@ -17,14 +17,14 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- getSubmitText: function() {
24
+ get getSubmitText () {
25
25
  return getSubmitText;
26
26
  },
27
- getTitleAction: function() {
27
+ get getTitleAction () {
28
28
  return getTitleAction;
29
29
  }
30
30
  });
@@ -17,26 +17,26 @@ Object.defineProperty(exports, "__esModule", {
17
17
  function _export(target, all) {
18
18
  for(var name in all)Object.defineProperty(target, name, {
19
19
  enumerable: true,
20
- get: all[name]
20
+ get: Object.getOwnPropertyDescriptor(all, name).get
21
21
  });
22
22
  }
23
23
  _export(exports, {
24
- InterpolationFormat: function() {
24
+ get InterpolationFormat () {
25
25
  return InterpolationFormat;
26
26
  },
27
- interpolate: function() {
27
+ get interpolate () {
28
28
  return interpolate;
29
29
  },
30
- parseVariables: function() {
30
+ get parseVariables () {
31
31
  return parseVariables;
32
32
  },
33
- parseVariablesAndFormat: function() {
33
+ get parseVariablesAndFormat () {
34
34
  return parseVariablesAndFormat;
35
35
  },
36
- replaceVariable: function() {
36
+ get replaceVariable () {
37
37
  return replaceVariable;
38
38
  },
39
- replaceVariables: function() {
39
+ get replaceVariables () {
40
40
  return replaceVariables;
41
41
  }
42
42
  });
@@ -1 +1 @@
1
- {"version":3,"file":"HTTPSettingsEditor.d.ts","sourceRoot":"","sources":["../../../src/components/HTTPSettingsEditor/HTTPSettingsEditor.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAc,EAAY,YAAY,EAAY,MAAM,OAAO,CAAC;AAOhE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CA4b1E"}
1
+ {"version":3,"file":"HTTPSettingsEditor.d.ts","sourceRoot":"","sources":["../../../src/components/HTTPSettingsEditor/HTTPSettingsEditor.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAc,EAAY,YAAY,EAAY,MAAM,OAAO,CAAC;AAgBhE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,gBAAgB,EAAE,kBAAkB,CAAC;CACtC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CA8b1E"}
@@ -14,7 +14,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
14
14
  import { Grid, IconButton, MenuItem, TextField, Typography } from '@mui/material';
15
15
  import React, { Fragment, useState } from 'react';
16
16
  import { produce } from 'immer';
17
- import { Controller } from 'react-hook-form';
17
+ import { Controller, useForm, useFieldArray } from 'react-hook-form';
18
18
  import MinusIcon from 'mdi-material-ui/Minus';
19
19
  import PlusIcon from 'mdi-material-ui/Plus';
20
20
  import { OptionsEditorRadios } from '../OptionsEditorRadios';
@@ -26,22 +26,50 @@ export function HTTPSettingsEditor(props) {
26
26
  if (value.directUrl === undefined && value.proxy === undefined) {
27
27
  Object.assign(value, initialSpecProxy);
28
28
  }
29
- // utilitary function used for headers when renaming a property
30
- // -> TODO it would be cleaner to manipulate headers as an intermediary list instead, to avoid doing this.
31
- const buildNewHeaders = (oldHeaders, oldName, newName)=>{
32
- if (oldHeaders === undefined) return oldHeaders;
33
- const keys = Object.keys(oldHeaders);
34
- const newHeaders = keys.reduce((acc, val)=>{
35
- if (val === oldName) {
36
- acc[newName] = oldHeaders[oldName] || '';
37
- } else {
38
- acc[val] = oldHeaders[val] || '';
29
+ // Use local state to maintain an array of header entries during editing, instead of
30
+ // manipulating a map directly which causes weird UX.
31
+ const headersForm = useForm({
32
+ defaultValues: {
33
+ headers: Object.entries(value.proxy?.spec.headers ?? {}).map(([name, headerValue])=>({
34
+ name,
35
+ value: headerValue
36
+ }))
37
+ }
38
+ });
39
+ const { fields, append, remove } = useFieldArray({
40
+ control: headersForm.control,
41
+ name: 'headers'
42
+ });
43
+ // Watch the headers array for changes to detect duplicates
44
+ const watchedHeaders = headersForm.watch('headers');
45
+ // Check for duplicate header names
46
+ // TODO: duplication detection logic to be replaced by proper zod schema validation in the future
47
+ // ref https://github.com/perses/perses/issues/3014
48
+ const nameMap = new Map();
49
+ const duplicateNames = new Set();
50
+ watchedHeaders.forEach(({ name })=>{
51
+ if (name !== '') {
52
+ const count = (nameMap.get(name) || 0) + 1;
53
+ nameMap.set(name, count);
54
+ if (count > 1) {
55
+ duplicateNames.add(name);
56
+ }
57
+ }
58
+ });
59
+ const hasDuplicates = duplicateNames.size > 0;
60
+ // Sync headers to parent
61
+ const syncHeadersToParent = (headers)=>{
62
+ const headersObject = {};
63
+ headers.forEach(({ name, value: headerValue })=>{
64
+ if (name !== '') {
65
+ headersObject[name] = headerValue;
39
66
  }
40
- return acc;
41
- }, {});
42
- return {
43
- ...newHeaders
44
- };
67
+ });
68
+ onChange(produce(value, (draft)=>{
69
+ if (draft.proxy !== undefined) {
70
+ draft.proxy.spec.headers = Object.keys(headersObject).length > 0 ? headersObject : undefined;
71
+ }
72
+ }));
45
73
  };
46
74
  const tabs = [
47
75
  {
@@ -77,7 +105,7 @@ export function HTTPSettingsEditor(props) {
77
105
  })
78
106
  }),
79
107
  /*#__PURE__*/ _jsx(Typography, {
80
- variant: "h4",
108
+ variant: "h5",
81
109
  mb: 2,
82
110
  children: "Allowed endpoints"
83
111
  }),
@@ -252,7 +280,7 @@ export function HTTPSettingsEditor(props) {
252
280
  ]
253
281
  }),
254
282
  /*#__PURE__*/ _jsx(Typography, {
255
- variant: "h4",
283
+ variant: "h5",
256
284
  mb: 2,
257
285
  children: "Request Headers"
258
286
  }),
@@ -261,20 +289,19 @@ export function HTTPSettingsEditor(props) {
261
289
  spacing: 2,
262
290
  mb: 2,
263
291
  children: [
264
- value.proxy?.spec.headers && Object.keys(value.proxy.spec.headers).map((headerName, i)=>{
265
- return /*#__PURE__*/ _jsxs(Fragment, {
292
+ fields.length > 0 ? fields.map((field, index)=>/*#__PURE__*/ _jsxs(Fragment, {
266
293
  children: [
267
294
  /*#__PURE__*/ _jsx(Grid, {
268
295
  item: true,
269
296
  xs: 4,
270
297
  children: /*#__PURE__*/ _jsx(Controller, {
271
- name: `Header name ${i}`,
272
- render: ({ field, fieldState })=>/*#__PURE__*/ _jsx(TextField, {
273
- ...field,
298
+ control: headersForm.control,
299
+ name: `headers.${index}.name`,
300
+ render: ({ field: controllerField, fieldState })=>/*#__PURE__*/ _jsx(TextField, {
301
+ ...controllerField,
274
302
  fullWidth: true,
275
303
  label: "Header name",
276
- value: headerName,
277
- error: !!fieldState.error,
304
+ error: !!fieldState.error || duplicateNames.has(controllerField.value),
278
305
  helperText: fieldState.error?.message,
279
306
  InputProps: {
280
307
  readOnly: isReadonly
@@ -283,12 +310,15 @@ export function HTTPSettingsEditor(props) {
283
310
  shrink: isReadonly ? true : undefined
284
311
  },
285
312
  onChange: (e)=>{
286
- field.onChange(e);
287
- onChange(produce(value, (draft)=>{
288
- if (draft.proxy !== undefined) {
289
- draft.proxy.spec.headers = buildNewHeaders(draft.proxy.spec.headers, headerName, e.target.value);
290
- }
291
- }));
313
+ controllerField.onChange(e);
314
+ const updatedHeaders = [
315
+ ...watchedHeaders
316
+ ];
317
+ updatedHeaders[index] = {
318
+ name: e.target.value,
319
+ value: updatedHeaders[index]?.value ?? ''
320
+ };
321
+ syncHeadersToParent(updatedHeaders);
292
322
  }
293
323
  })
294
324
  })
@@ -297,12 +327,12 @@ export function HTTPSettingsEditor(props) {
297
327
  item: true,
298
328
  xs: 7,
299
329
  children: /*#__PURE__*/ _jsx(Controller, {
300
- name: `Header value ${i}`,
301
- render: ({ field, fieldState })=>/*#__PURE__*/ _jsx(TextField, {
302
- ...field,
330
+ control: headersForm.control,
331
+ name: `headers.${index}.value`,
332
+ render: ({ field: controllerField, fieldState })=>/*#__PURE__*/ _jsx(TextField, {
333
+ ...controllerField,
303
334
  fullWidth: true,
304
335
  label: "Header value",
305
- value: value.proxy?.spec.headers?.[headerName],
306
336
  error: !!fieldState.error,
307
337
  helperText: fieldState.error?.message,
308
338
  InputProps: {
@@ -312,15 +342,15 @@ export function HTTPSettingsEditor(props) {
312
342
  shrink: isReadonly ? true : undefined
313
343
  },
314
344
  onChange: (e)=>{
315
- field.onChange(e);
316
- onChange(produce(value, (draft)=>{
317
- if (draft.proxy !== undefined) {
318
- draft.proxy.spec.headers = {
319
- ...draft.proxy.spec.headers,
320
- [headerName]: e.target.value
321
- };
322
- }
323
- }));
345
+ controllerField.onChange(e);
346
+ const updatedHeaders = [
347
+ ...watchedHeaders
348
+ ];
349
+ updatedHeaders[index] = {
350
+ name: updatedHeaders[index]?.name ?? '',
351
+ value: e.target.value
352
+ };
353
+ syncHeadersToParent(updatedHeaders);
324
354
  }
325
355
  })
326
356
  })
@@ -328,30 +358,36 @@ export function HTTPSettingsEditor(props) {
328
358
  /*#__PURE__*/ _jsx(Grid, {
329
359
  item: true,
330
360
  xs: 1,
331
- children: /*#__PURE__*/ _jsx(Controller, {
332
- name: `Remove Header ${i}`,
333
- render: ({ field })=>/*#__PURE__*/ _jsx(IconButton, {
334
- ...field,
335
- disabled: isReadonly,
336
- // Remove the given header from the list
337
- onClick: (e)=>{
338
- field.onChange(e);
339
- const newHeaders = {
340
- ...value.proxy?.spec.headers
341
- };
342
- delete newHeaders[headerName];
343
- onChange(produce(value, (draft)=>{
344
- if (draft.proxy !== undefined) {
345
- draft.proxy.spec.headers = newHeaders;
346
- }
347
- }));
348
- },
349
- children: /*#__PURE__*/ _jsx(MinusIcon, {})
350
- })
361
+ children: /*#__PURE__*/ _jsx(IconButton, {
362
+ disabled: isReadonly,
363
+ "aria-label": `Remove header ${watchedHeaders[index]?.name || index}`,
364
+ onClick: ()=>{
365
+ remove(index);
366
+ const updatedHeaders = watchedHeaders.filter((_, i)=>i !== index);
367
+ syncHeadersToParent(updatedHeaders);
368
+ },
369
+ children: /*#__PURE__*/ _jsx(MinusIcon, {})
351
370
  })
352
371
  })
353
372
  ]
354
- }, i);
373
+ }, field.id)) : /*#__PURE__*/ _jsx(Grid, {
374
+ item: true,
375
+ xs: 4,
376
+ children: /*#__PURE__*/ _jsx(Typography, {
377
+ sx: {
378
+ fontStyle: 'italic'
379
+ },
380
+ children: "None"
381
+ })
382
+ }),
383
+ hasDuplicates && /*#__PURE__*/ _jsx(Grid, {
384
+ item: true,
385
+ xs: 12,
386
+ children: /*#__PURE__*/ _jsx(Typography, {
387
+ variant: "body2",
388
+ color: "error",
389
+ children: "Duplicate header names detected. Each header name must be unique."
390
+ })
355
391
  }),
356
392
  /*#__PURE__*/ _jsx(Grid, {
357
393
  item: true,
@@ -362,15 +398,10 @@ export function HTTPSettingsEditor(props) {
362
398
  },
363
399
  children: /*#__PURE__*/ _jsx(IconButton, {
364
400
  disabled: isReadonly,
365
- // Add a new (empty) header to the list
366
- onClick: ()=>onChange(produce(value, (draft)=>{
367
- if (draft.proxy !== undefined) {
368
- draft.proxy.spec.headers = {
369
- ...draft.proxy.spec.headers,
370
- '': ''
371
- };
372
- }
373
- })),
401
+ onClick: ()=>append({
402
+ name: '',
403
+ value: ''
404
+ }),
374
405
  children: /*#__PURE__*/ _jsx(PlusIcon, {})
375
406
  })
376
407
  })