@perses-dev/plugin-system 0.47.1 → 0.48.0-rc0
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/cjs/components/DatasourceEditorForm/DatasourceEditorForm.js +6 -6
- package/dist/cjs/components/PanelSpecEditor/PanelSpecEditor.js +3 -3
- package/dist/cjs/components/Variables/VariableEditorForm/VariableEditorForm.js +24 -24
- package/dist/components/CalculationSelector/CalculationSelector.js.map +1 -1
- package/dist/components/DatasourceEditorForm/DatasourceEditorForm.js +6 -6
- package/dist/components/DatasourceEditorForm/DatasourceEditorForm.js.map +1 -1
- package/dist/components/DatasourceSelect.js.map +1 -1
- package/dist/components/PanelSpecEditor/PanelSpecEditor.js +3 -3
- package/dist/components/PanelSpecEditor/PanelSpecEditor.js.map +1 -1
- package/dist/components/PluginRegistry/PluginRegistry.js.map +1 -1
- package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js +24 -24
- package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js.map +1 -1
- package/package.json +4 -4
|
@@ -160,10 +160,10 @@ function DatasourceEditorForm(props) {
|
|
|
160
160
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
161
161
|
control: form.control,
|
|
162
162
|
name: "name",
|
|
163
|
-
render: ({ field, fieldState })
|
|
163
|
+
render: ({ field, fieldState })=>{
|
|
164
164
|
var _fieldState_error;
|
|
165
165
|
var _field_value;
|
|
166
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
166
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
167
167
|
...field,
|
|
168
168
|
required: true,
|
|
169
169
|
fullWidth: true,
|
|
@@ -192,10 +192,10 @@ function DatasourceEditorForm(props) {
|
|
|
192
192
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
193
193
|
control: form.control,
|
|
194
194
|
name: "spec.display.name",
|
|
195
|
-
render: ({ field, fieldState })
|
|
195
|
+
render: ({ field, fieldState })=>{
|
|
196
196
|
var _fieldState_error;
|
|
197
197
|
var _field_value;
|
|
198
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
198
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
199
199
|
...field,
|
|
200
200
|
fullWidth: true,
|
|
201
201
|
name: "title",
|
|
@@ -222,10 +222,10 @@ function DatasourceEditorForm(props) {
|
|
|
222
222
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
223
223
|
control: form.control,
|
|
224
224
|
name: "spec.display.description",
|
|
225
|
-
render: ({ field, fieldState })
|
|
225
|
+
render: ({ field, fieldState })=>{
|
|
226
226
|
var _fieldState_error;
|
|
227
227
|
var _field_value;
|
|
228
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
228
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
229
229
|
...field,
|
|
230
230
|
fullWidth: true,
|
|
231
231
|
name: "description",
|
|
@@ -50,9 +50,9 @@ function PanelSpecEditor(props) {
|
|
|
50
50
|
content: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
51
51
|
control: control,
|
|
52
52
|
name: "panelDefinition.spec.queries",
|
|
53
|
-
render: ({ field })
|
|
53
|
+
render: ({ field })=>{
|
|
54
54
|
var _plugin_supportedQueryTypes, _panelDefinition_spec_queries;
|
|
55
|
-
return (0, _jsxruntime.jsx)(_MultiQueryEditor.MultiQueryEditor, {
|
|
55
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_MultiQueryEditor.MultiQueryEditor, {
|
|
56
56
|
queryTypes: (_plugin_supportedQueryTypes = plugin.supportedQueryTypes) !== null && _plugin_supportedQueryTypes !== void 0 ? _plugin_supportedQueryTypes : [],
|
|
57
57
|
queries: (_panelDefinition_spec_queries = panelDefinition.spec.queries) !== null && _panelDefinition_spec_queries !== void 0 ? _panelDefinition_spec_queries : [],
|
|
58
58
|
onChange: (queries)=>{
|
|
@@ -91,7 +91,7 @@ function PanelSpecEditor(props) {
|
|
|
91
91
|
label: 'JSON',
|
|
92
92
|
content: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
93
93
|
control: control,
|
|
94
|
-
name: "panelDefinition
|
|
94
|
+
name: "panelDefinition",
|
|
95
95
|
render: ({ field })=>/*#__PURE__*/ (0, _jsxruntime.jsx)(_components.JSONEditor, {
|
|
96
96
|
maxHeight: "80vh",
|
|
97
97
|
value: panelDefinition,
|
|
@@ -91,10 +91,10 @@ function TextVariableEditorForm({ action, control }) {
|
|
|
91
91
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
92
92
|
control: control,
|
|
93
93
|
name: "spec.value",
|
|
94
|
-
render: ({ field, fieldState })
|
|
94
|
+
render: ({ field, fieldState })=>{
|
|
95
95
|
var _fieldState_error;
|
|
96
96
|
var _field_value;
|
|
97
|
-
return (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
|
|
97
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
|
|
98
98
|
children: [
|
|
99
99
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Box, {
|
|
100
100
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_VariablePreview.VariablePreview, {
|
|
@@ -126,9 +126,9 @@ function TextVariableEditorForm({ action, control }) {
|
|
|
126
126
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
127
127
|
control: control,
|
|
128
128
|
name: "spec.constant",
|
|
129
|
-
render: ({ field })
|
|
129
|
+
render: ({ field })=>{
|
|
130
130
|
var _field_value;
|
|
131
|
-
return (0, _jsxruntime.jsx)(_material.FormControlLabel, {
|
|
131
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.FormControlLabel, {
|
|
132
132
|
label: "Constant",
|
|
133
133
|
control: /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Switch, {
|
|
134
134
|
...field,
|
|
@@ -210,10 +210,10 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
210
210
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
211
211
|
control: control,
|
|
212
212
|
name: "spec.plugin",
|
|
213
|
-
render: ({ field })
|
|
213
|
+
render: ({ field })=>{
|
|
214
214
|
var _field_value, _field_value1;
|
|
215
215
|
var _field_value_kind, _field_value_spec;
|
|
216
|
-
return (0, _jsxruntime.jsx)(_PluginEditor.PluginEditor, {
|
|
216
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_PluginEditor.PluginEditor, {
|
|
217
217
|
width: "100%",
|
|
218
218
|
pluginTypes: [
|
|
219
219
|
'Variable'
|
|
@@ -245,10 +245,10 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
245
245
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
246
246
|
control: control,
|
|
247
247
|
name: "spec.capturingRegexp",
|
|
248
|
-
render: ({ field, fieldState })
|
|
248
|
+
render: ({ field, fieldState })=>{
|
|
249
249
|
var _fieldState_error;
|
|
250
250
|
var _field_value;
|
|
251
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
251
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
252
252
|
...field,
|
|
253
253
|
label: "Capturing Regexp Filter",
|
|
254
254
|
InputLabelProps: {
|
|
@@ -275,10 +275,10 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
275
275
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
276
276
|
control: control,
|
|
277
277
|
name: "spec.sort",
|
|
278
|
-
render: ({ field, fieldState })
|
|
278
|
+
render: ({ field, fieldState })=>{
|
|
279
279
|
var _fieldState_error;
|
|
280
280
|
var _field_value;
|
|
281
|
-
return (0, _jsxruntime.jsxs)(_material.TextField, {
|
|
281
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.TextField, {
|
|
282
282
|
select: true,
|
|
283
283
|
...field,
|
|
284
284
|
fullWidth: true,
|
|
@@ -345,9 +345,9 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
345
345
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
346
346
|
control: control,
|
|
347
347
|
name: "spec.allowMultiple",
|
|
348
|
-
render: ({ field })
|
|
348
|
+
render: ({ field })=>{
|
|
349
349
|
var _field_value;
|
|
350
|
-
return (0, _jsxruntime.jsx)(_material.FormControlLabel, {
|
|
350
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.FormControlLabel, {
|
|
351
351
|
label: "Allow Multiple Values",
|
|
352
352
|
control: /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Switch, {
|
|
353
353
|
...field,
|
|
@@ -373,9 +373,9 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
373
373
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
374
374
|
control: control,
|
|
375
375
|
name: "spec.allowAllValue",
|
|
376
|
-
render: ({ field })
|
|
376
|
+
render: ({ field })=>{
|
|
377
377
|
var _field_value;
|
|
378
|
-
return (0, _jsxruntime.jsx)(_material.FormControlLabel, {
|
|
378
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.FormControlLabel, {
|
|
379
379
|
label: "Allow All option",
|
|
380
380
|
control: /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Switch, {
|
|
381
381
|
...field,
|
|
@@ -398,10 +398,10 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
398
398
|
_allowAllValue && /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
399
399
|
control: control,
|
|
400
400
|
name: "spec.customAllValue",
|
|
401
|
-
render: ({ field, fieldState })
|
|
401
|
+
render: ({ field, fieldState })=>{
|
|
402
402
|
var _fieldState_error;
|
|
403
403
|
var _field_value;
|
|
404
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
404
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
405
405
|
...field,
|
|
406
406
|
fullWidth: true,
|
|
407
407
|
label: "Custom All Value",
|
|
@@ -566,10 +566,10 @@ function VariableEditorForm(props) {
|
|
|
566
566
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
567
567
|
control: form.control,
|
|
568
568
|
name: "spec.name",
|
|
569
|
-
render: ({ field, fieldState })
|
|
569
|
+
render: ({ field, fieldState })=>{
|
|
570
570
|
var _fieldState_error;
|
|
571
571
|
var _field_value;
|
|
572
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
572
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
573
573
|
...field,
|
|
574
574
|
required: true,
|
|
575
575
|
fullWidth: true,
|
|
@@ -597,10 +597,10 @@ function VariableEditorForm(props) {
|
|
|
597
597
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
598
598
|
control: form.control,
|
|
599
599
|
name: "spec.display.name",
|
|
600
|
-
render: ({ field, fieldState })
|
|
600
|
+
render: ({ field, fieldState })=>{
|
|
601
601
|
var _fieldState_error;
|
|
602
602
|
var _field_value;
|
|
603
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
603
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
604
604
|
...field,
|
|
605
605
|
fullWidth: true,
|
|
606
606
|
label: "Display Label",
|
|
@@ -626,10 +626,10 @@ function VariableEditorForm(props) {
|
|
|
626
626
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
627
627
|
control: form.control,
|
|
628
628
|
name: "spec.display.description",
|
|
629
|
-
render: ({ field, fieldState })
|
|
629
|
+
render: ({ field, fieldState })=>{
|
|
630
630
|
var _fieldState_error;
|
|
631
631
|
var _field_value;
|
|
632
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
632
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
633
633
|
...field,
|
|
634
634
|
fullWidth: true,
|
|
635
635
|
label: "Description",
|
|
@@ -655,10 +655,10 @@ function VariableEditorForm(props) {
|
|
|
655
655
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reacthookform.Controller, {
|
|
656
656
|
control: form.control,
|
|
657
657
|
name: "kind",
|
|
658
|
-
render: ({ field, fieldState })
|
|
658
|
+
render: ({ field, fieldState })=>{
|
|
659
659
|
var _fieldState_error;
|
|
660
660
|
var _field_value;
|
|
661
|
-
return (0, _jsxruntime.jsx)(_material.TextField, {
|
|
661
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.TextField, {
|
|
662
662
|
select: true,
|
|
663
663
|
...field,
|
|
664
664
|
fullWidth: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/CalculationSelector/CalculationSelector.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { OptionsEditorControl, SettingsAutocomplete } from '@perses-dev/components';\nimport { CALCULATIONS_CONFIG, CalculationConfig, CalculationType } from '@perses-dev/core';\n\ntype AutocompleteCalculationOption = CalculationConfig & { id: CalculationType };\nconst CALC_OPTIONS: AutocompleteCalculationOption[] = Object.entries(CALCULATIONS_CONFIG).map(([id, config]) => {\n return {\n id: id as CalculationType,\n ...config,\n };\n});\n\nexport interface CalculationSelectorProps {\n value: CalculationType;\n onChange: (unit: CalculationType) => void;\n}\n\nexport function CalculationSelector({ value, onChange }: CalculationSelectorProps) {\n const handleCalculationChange = (_: unknown, newValue: AutocompleteCalculationOption) => {\n onChange(newValue.id);\n };\n\n const calcConfig = CALCULATIONS_CONFIG[value];\n\n return (\n <OptionsEditorControl\n label=\"Calculation\"\n control={\n <SettingsAutocomplete\n value={{\n ...calcConfig,\n id: value,\n }}\n options={CALC_OPTIONS}\n onChange={handleCalculationChange}\n disableClearable\n
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CalculationSelector/CalculationSelector.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { OptionsEditorControl, SettingsAutocomplete } from '@perses-dev/components';\nimport { CALCULATIONS_CONFIG, CalculationConfig, CalculationType } from '@perses-dev/core';\n\ntype AutocompleteCalculationOption = CalculationConfig & { id: CalculationType };\nconst CALC_OPTIONS: AutocompleteCalculationOption[] = Object.entries(CALCULATIONS_CONFIG).map(([id, config]) => {\n return {\n id: id as CalculationType,\n ...config,\n };\n});\n\nexport interface CalculationSelectorProps {\n value: CalculationType;\n onChange: (unit: CalculationType) => void;\n}\n\nexport function CalculationSelector({ value, onChange }: CalculationSelectorProps) {\n const handleCalculationChange = (_: unknown, newValue: AutocompleteCalculationOption) => {\n onChange(newValue.id);\n };\n\n const calcConfig = CALCULATIONS_CONFIG[value];\n\n return (\n <OptionsEditorControl\n label=\"Calculation\"\n control={\n <SettingsAutocomplete\n value={{\n ...calcConfig,\n id: value,\n }}\n options={CALC_OPTIONS}\n onChange={handleCalculationChange}\n disableClearable\n />\n }\n />\n );\n}\n"],"names":["OptionsEditorControl","SettingsAutocomplete","CALCULATIONS_CONFIG","CALC_OPTIONS","Object","entries","map","id","config","CalculationSelector","value","onChange","handleCalculationChange","_","newValue","calcConfig","label","control","options","disableClearable"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,SAASA,oBAAoB,EAAEC,oBAAoB,QAAQ,yBAAyB;AACpF,SAASC,mBAAmB,QAA4C,mBAAmB;AAG3F,MAAMC,eAAgDC,OAAOC,OAAO,CAACH,qBAAqBI,GAAG,CAAC,CAAC,CAACC,IAAIC,OAAO;IACzG,OAAO;QACLD,IAAIA;QACJ,GAAGC,MAAM;IACX;AACF;AAOA,OAAO,SAASC,oBAAoB,EAAEC,KAAK,EAAEC,QAAQ,EAA4B;IAC/E,MAAMC,0BAA0B,CAACC,GAAYC;QAC3CH,SAASG,SAASP,EAAE;IACtB;IAEA,MAAMQ,aAAab,mBAAmB,CAACQ,MAAM;IAE7C,qBACE,KAACV;QACCgB,OAAM;QACNC,uBACE,KAAChB;YACCS,OAAO;gBACL,GAAGK,UAAU;gBACbR,IAAIG;YACN;YACAQ,SAASf;YACTQ,UAAUC;YACVO,gBAAgB;;;AAK1B"}
|
|
@@ -150,10 +150,10 @@ export function DatasourceEditorForm(props) {
|
|
|
150
150
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
151
151
|
control: form.control,
|
|
152
152
|
name: "name",
|
|
153
|
-
render: ({ field, fieldState })
|
|
153
|
+
render: ({ field, fieldState })=>{
|
|
154
154
|
var _fieldState_error;
|
|
155
155
|
var _field_value;
|
|
156
|
-
return _jsx(TextField, {
|
|
156
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
157
157
|
...field,
|
|
158
158
|
required: true,
|
|
159
159
|
fullWidth: true,
|
|
@@ -182,10 +182,10 @@ export function DatasourceEditorForm(props) {
|
|
|
182
182
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
183
183
|
control: form.control,
|
|
184
184
|
name: "spec.display.name",
|
|
185
|
-
render: ({ field, fieldState })
|
|
185
|
+
render: ({ field, fieldState })=>{
|
|
186
186
|
var _fieldState_error;
|
|
187
187
|
var _field_value;
|
|
188
|
-
return _jsx(TextField, {
|
|
188
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
189
189
|
...field,
|
|
190
190
|
fullWidth: true,
|
|
191
191
|
name: "title",
|
|
@@ -212,10 +212,10 @@ export function DatasourceEditorForm(props) {
|
|
|
212
212
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
213
213
|
control: form.control,
|
|
214
214
|
name: "spec.display.description",
|
|
215
|
-
render: ({ field, fieldState })
|
|
215
|
+
render: ({ field, fieldState })=>{
|
|
216
216
|
var _fieldState_error;
|
|
217
217
|
var _field_value;
|
|
218
|
-
return _jsx(TextField, {
|
|
218
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
219
219
|
...field,
|
|
220
220
|
fullWidth: true,
|
|
221
221
|
name: "description",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/DatasourceEditorForm/DatasourceEditorForm.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Action, DatasourceDefinition } from '@perses-dev/core';\nimport { Box, Button, Divider, FormControlLabel, Grid, Stack, Switch, TextField, Typography } from '@mui/material';\nimport { DispatchWithoutAction, useState } from 'react';\nimport { DiscardChangesConfirmationDialog } from '@perses-dev/components';\nimport { Controller, FormProvider, SubmitHandler, useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { PluginEditor } from '../PluginEditor';\nimport { getSubmitText, getTitleAction } from '../../utils';\nimport { useValidationSchemas } from '../../context';\n\ninterface DatasourceEditorFormProps {\n initialDatasourceDefinition: DatasourceDefinition;\n initialAction: Action;\n isDraft: boolean;\n isReadonly?: boolean;\n onSave: (def: DatasourceDefinition) => void;\n onClose: DispatchWithoutAction;\n onDelete?: DispatchWithoutAction;\n}\n\nexport function DatasourceEditorForm(props: DatasourceEditorFormProps) {\n const { initialDatasourceDefinition, initialAction, isDraft, isReadonly, onSave, onClose, onDelete } = props;\n\n const [isDiscardDialogOpened, setDiscardDialogOpened] = useState<boolean>(false);\n const [action, setAction] = useState(initialAction);\n const titleAction = getTitleAction(action, isDraft);\n const submitText = getSubmitText(action, isDraft);\n\n const { datasourceEditorSchema } = useValidationSchemas();\n const form = useForm<DatasourceDefinition>({\n resolver: zodResolver(datasourceEditorSchema),\n mode: 'onBlur',\n defaultValues: initialDatasourceDefinition,\n });\n\n /*\n * Remove empty fields that are optional\n */\n function clearFormData(data: DatasourceDefinition): DatasourceDefinition {\n const result = { ...data };\n if (result.spec.display?.name === undefined && result.spec.display?.description === undefined) {\n delete result.spec.display;\n }\n return result;\n }\n\n const processForm: SubmitHandler<DatasourceDefinition> = (data: DatasourceDefinition) => {\n onSave(clearFormData(data));\n };\n\n // When user click on cancel, several possibilities:\n // - create action: ask for discard approval\n // - update action: ask for discard approval if changed\n // - read action: don´t ask for discard approval\n function handleCancel() {\n if (JSON.stringify(initialDatasourceDefinition) !== JSON.stringify(clearFormData(form.getValues()))) {\n setDiscardDialogOpened(true);\n } else {\n onClose();\n }\n }\n\n return (\n <FormProvider {...form}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: (theme) => theme.spacing(1, 2),\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h2\">{titleAction} Datasource</Typography>\n <Stack direction=\"row\" spacing={1} sx={{ marginLeft: 'auto' }}>\n {action === 'read' ? (\n <>\n <Button disabled={isReadonly} variant=\"contained\" onClick={() => setAction('update')}>\n Edit\n </Button>\n <Button color=\"error\" disabled={isReadonly} variant=\"outlined\" onClick={onDelete}>\n Delete\n </Button>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={(theme) => ({\n borderColor: theme.palette.grey['500'],\n '&.MuiDivider-root': {\n marginLeft: 2,\n marginRight: 1,\n },\n })}\n />\n <Button color=\"secondary\" variant=\"outlined\" onClick={onClose}>\n Close\n </Button>\n </>\n ) : (\n <>\n <Button variant=\"contained\" disabled={!form.formState.isValid} onClick={form.handleSubmit(processForm)}>\n {submitText}\n </Button>\n <Button color=\"secondary\" variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n </>\n )}\n </Stack>\n </Box>\n <Box padding={2} sx={{ overflowY: 'scroll' }}>\n <Grid container spacing={2} mb={2}>\n <Grid item xs={4}>\n <Controller\n control={form.control}\n name=\"name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n required\n fullWidth\n name=\"name\"\n label=\"Name\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n disabled: action === 'update' && !isDraft,\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={8}>\n <Controller\n control={form.control}\n name=\"spec.display.name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n name=\"title\"\n label=\"Display Label\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={12}>\n <Controller\n control={form.control}\n name=\"spec.display.description\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n name=\"description\"\n label=\"Description\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={6} sx={{ paddingTop: '5px !important' }}>\n <Stack>\n <Controller\n control={form.control}\n name=\"spec.default\"\n render={({ field }) => (\n <FormControlLabel\n label=\"Set as default\"\n control={\n <Switch\n {...field}\n checked={!!field.value}\n readOnly={action === 'read'}\n onChange={(event) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n field.onChange(event);\n }}\n />\n }\n />\n )}\n />\n <Typography variant=\"caption\">\n Whether this datasource should be the default {form.getValues().spec.plugin.kind} to be used\n </Typography>\n </Stack>\n </Grid>\n </Grid>\n <Divider />\n <Typography py={1} variant=\"h3\">\n Plugin Options\n </Typography>\n <Controller\n control={form.control}\n name=\"spec.plugin\"\n render={({ field }) => (\n <PluginEditor\n width=\"100%\"\n pluginTypes={['Datasource']}\n pluginKindLabel=\"Source\"\n value={{\n selection: {\n type: 'Datasource',\n kind: field.value.kind,\n },\n spec: field.value.spec,\n }}\n isReadonly={action === 'read'}\n onChange={(v) => {\n field.onChange({ kind: v.selection.kind, spec: v.spec });\n }}\n />\n )}\n />\n </Box>\n <DiscardChangesConfirmationDialog\n description=\"Are you sure you want to discard your changes? Changes cannot be recovered.\"\n isOpen={isDiscardDialogOpened}\n onCancel={() => setDiscardDialogOpened(false)}\n onDiscardChanges={() => {\n setDiscardDialogOpened(false);\n onClose();\n }}\n />\n </FormProvider>\n );\n}\n"],"names":["Box","Button","Divider","FormControlLabel","Grid","Stack","Switch","TextField","Typography","useState","DiscardChangesConfirmationDialog","Controller","FormProvider","useForm","zodResolver","PluginEditor","getSubmitText","getTitleAction","useValidationSchemas","DatasourceEditorForm","props","initialDatasourceDefinition","initialAction","isDraft","isReadonly","onSave","onClose","onDelete","isDiscardDialogOpened","setDiscardDialogOpened","action","setAction","titleAction","submitText","datasourceEditorSchema","form","resolver","mode","defaultValues","clearFormData","data","result","spec","display","name","undefined","description","processForm","handleCancel","JSON","stringify","getValues","sx","alignItems","padding","theme","spacing","borderBottom","palette","divider","variant","direction","marginLeft","disabled","onClick","color","orientation","flexItem","borderColor","grey","marginRight","formState","isValid","handleSubmit","overflowY","container","mb","item","xs","control","render","field","fieldState","required","fullWidth","label","InputLabelProps","shrink","InputProps","readOnly","error","helperText","message","value","onChange","event","paddingTop","checked","plugin","kind","py","width","pluginTypes","pluginKindLabel","selection","type","v","isOpen","onCancel","onDiscardChanges"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/DatasourceEditorForm/DatasourceEditorForm.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Action, DatasourceDefinition } from '@perses-dev/core';\nimport { Box, Button, Divider, FormControlLabel, Grid, Stack, Switch, TextField, Typography } from '@mui/material';\nimport { DispatchWithoutAction, useState } from 'react';\nimport { DiscardChangesConfirmationDialog } from '@perses-dev/components';\nimport { Controller, FormProvider, SubmitHandler, useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { PluginEditor } from '../PluginEditor';\nimport { getSubmitText, getTitleAction } from '../../utils';\nimport { useValidationSchemas } from '../../context';\n\ninterface DatasourceEditorFormProps {\n initialDatasourceDefinition: DatasourceDefinition;\n initialAction: Action;\n isDraft: boolean;\n isReadonly?: boolean;\n onSave: (def: DatasourceDefinition) => void;\n onClose: DispatchWithoutAction;\n onDelete?: DispatchWithoutAction;\n}\n\nexport function DatasourceEditorForm(props: DatasourceEditorFormProps) {\n const { initialDatasourceDefinition, initialAction, isDraft, isReadonly, onSave, onClose, onDelete } = props;\n\n const [isDiscardDialogOpened, setDiscardDialogOpened] = useState<boolean>(false);\n const [action, setAction] = useState(initialAction);\n const titleAction = getTitleAction(action, isDraft);\n const submitText = getSubmitText(action, isDraft);\n\n const { datasourceEditorSchema } = useValidationSchemas();\n const form = useForm<DatasourceDefinition>({\n resolver: zodResolver(datasourceEditorSchema),\n mode: 'onBlur',\n defaultValues: initialDatasourceDefinition,\n });\n\n /*\n * Remove empty fields that are optional\n */\n function clearFormData(data: DatasourceDefinition): DatasourceDefinition {\n const result = { ...data };\n if (result.spec.display?.name === undefined && result.spec.display?.description === undefined) {\n delete result.spec.display;\n }\n return result;\n }\n\n const processForm: SubmitHandler<DatasourceDefinition> = (data: DatasourceDefinition) => {\n onSave(clearFormData(data));\n };\n\n // When user click on cancel, several possibilities:\n // - create action: ask for discard approval\n // - update action: ask for discard approval if changed\n // - read action: don´t ask for discard approval\n function handleCancel() {\n if (JSON.stringify(initialDatasourceDefinition) !== JSON.stringify(clearFormData(form.getValues()))) {\n setDiscardDialogOpened(true);\n } else {\n onClose();\n }\n }\n\n return (\n <FormProvider {...form}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: (theme) => theme.spacing(1, 2),\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h2\">{titleAction} Datasource</Typography>\n <Stack direction=\"row\" spacing={1} sx={{ marginLeft: 'auto' }}>\n {action === 'read' ? (\n <>\n <Button disabled={isReadonly} variant=\"contained\" onClick={() => setAction('update')}>\n Edit\n </Button>\n <Button color=\"error\" disabled={isReadonly} variant=\"outlined\" onClick={onDelete}>\n Delete\n </Button>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={(theme) => ({\n borderColor: theme.palette.grey['500'],\n '&.MuiDivider-root': {\n marginLeft: 2,\n marginRight: 1,\n },\n })}\n />\n <Button color=\"secondary\" variant=\"outlined\" onClick={onClose}>\n Close\n </Button>\n </>\n ) : (\n <>\n <Button variant=\"contained\" disabled={!form.formState.isValid} onClick={form.handleSubmit(processForm)}>\n {submitText}\n </Button>\n <Button color=\"secondary\" variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n </>\n )}\n </Stack>\n </Box>\n <Box padding={2} sx={{ overflowY: 'scroll' }}>\n <Grid container spacing={2} mb={2}>\n <Grid item xs={4}>\n <Controller\n control={form.control}\n name=\"name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n required\n fullWidth\n name=\"name\"\n label=\"Name\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n disabled: action === 'update' && !isDraft,\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={8}>\n <Controller\n control={form.control}\n name=\"spec.display.name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n name=\"title\"\n label=\"Display Label\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={12}>\n <Controller\n control={form.control}\n name=\"spec.display.description\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n name=\"description\"\n label=\"Description\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={6} sx={{ paddingTop: '5px !important' }}>\n <Stack>\n <Controller\n control={form.control}\n name=\"spec.default\"\n render={({ field }) => (\n <FormControlLabel\n label=\"Set as default\"\n control={\n <Switch\n {...field}\n checked={!!field.value}\n readOnly={action === 'read'}\n onChange={(event) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n field.onChange(event);\n }}\n />\n }\n />\n )}\n />\n <Typography variant=\"caption\">\n Whether this datasource should be the default {form.getValues().spec.plugin.kind} to be used\n </Typography>\n </Stack>\n </Grid>\n </Grid>\n <Divider />\n <Typography py={1} variant=\"h3\">\n Plugin Options\n </Typography>\n <Controller\n control={form.control}\n name=\"spec.plugin\"\n render={({ field }) => (\n <PluginEditor\n width=\"100%\"\n pluginTypes={['Datasource']}\n pluginKindLabel=\"Source\"\n value={{\n selection: {\n type: 'Datasource',\n kind: field.value.kind,\n },\n spec: field.value.spec,\n }}\n isReadonly={action === 'read'}\n onChange={(v) => {\n field.onChange({ kind: v.selection.kind, spec: v.spec });\n }}\n />\n )}\n />\n </Box>\n <DiscardChangesConfirmationDialog\n description=\"Are you sure you want to discard your changes? Changes cannot be recovered.\"\n isOpen={isDiscardDialogOpened}\n onCancel={() => setDiscardDialogOpened(false)}\n onDiscardChanges={() => {\n setDiscardDialogOpened(false);\n onClose();\n }}\n />\n </FormProvider>\n );\n}\n"],"names":["Box","Button","Divider","FormControlLabel","Grid","Stack","Switch","TextField","Typography","useState","DiscardChangesConfirmationDialog","Controller","FormProvider","useForm","zodResolver","PluginEditor","getSubmitText","getTitleAction","useValidationSchemas","DatasourceEditorForm","props","initialDatasourceDefinition","initialAction","isDraft","isReadonly","onSave","onClose","onDelete","isDiscardDialogOpened","setDiscardDialogOpened","action","setAction","titleAction","submitText","datasourceEditorSchema","form","resolver","mode","defaultValues","clearFormData","data","result","spec","display","name","undefined","description","processForm","handleCancel","JSON","stringify","getValues","sx","alignItems","padding","theme","spacing","borderBottom","palette","divider","variant","direction","marginLeft","disabled","onClick","color","orientation","flexItem","borderColor","grey","marginRight","formState","isValid","handleSubmit","overflowY","container","mb","item","xs","control","render","field","fieldState","required","fullWidth","label","InputLabelProps","shrink","InputProps","readOnly","error","helperText","message","value","onChange","event","paddingTop","checked","plugin","kind","py","width","pluginTypes","pluginKindLabel","selection","type","v","isOpen","onCancel","onDiscardChanges"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/DatasourceSelect.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport OpenInNewIcon from 'mdi-material-ui/OpenInNew';\nimport { Select, SelectProps, MenuItem, Stack, Divider, ListItemText, Chip, IconButton, Box } from '@mui/material';\nimport { DatasourceSelector } from '@perses-dev/core';\nimport { useMemo } from 'react';\nimport { DatasourceSelectItemSelector, useListDatasourceSelectItems } from '../runtime';\n\n// Props on MUI Select that we don't want people to pass because we're either redefining them or providing them in\n// this component\ntype OmittedMuiProps = 'children' | 'value' | 'onChange';\n\nexport interface DatasourceSelectProps extends Omit<SelectProps<string>, OmittedMuiProps> {\n value: DatasourceSelector;\n onChange: (next: DatasourceSelector) => void;\n datasourcePluginKind: string;\n project?: string;\n}\n\n/**\n * Displays a MUI input for selecting a Datasource of a particular kind. Note: The 'value' and `onChange` handler for\n * the input deal with a `DatasourceSelector`.\n */\nexport function DatasourceSelect(props: DatasourceSelectProps) {\n const { datasourcePluginKind, value, project, onChange, ...others } = props;\n const { data, isLoading } = useListDatasourceSelectItems(datasourcePluginKind, project);\n // Rebuild the group of the value if not provided\n const defaultValue = useMemo(() => {\n const group = (data ?? [])\n .flatMap((itemGroup) => itemGroup.items)\n .find((item) => {\n return value.kind === item.selector.kind && value.name === item.selector.name && !item.overridden;\n })?.selector.group;\n return { ...value, group };\n }, [value, data]);\n\n // Convert the datasource list into menu items with name/group?/value strings that the Select input can work with\n const menuItems = useMemo(() => {\n return (data ?? []).map((itemGroup) => ({\n group: itemGroup.group,\n editLink: itemGroup.editLink,\n items: itemGroup.items.map((item) => ({\n name: item.name,\n overriding: item.overriding,\n overridden: item.overridden,\n saved: item.saved ?? true,\n group: item.selector.group,\n value: selectorToOptionValue(item.selector),\n })),\n }));\n }, [data]);\n\n // While loading available values, just use an empty string so MUI select doesn't warn about values out of range\n const optionValue = isLoading ? '' : selectorToOptionValue(defaultValue);\n\n // When the user makes a selection, convert the string option value back to a DatasourceSelector\n const handleChange: SelectProps<string>['onChange'] = (e) => {\n const next = optionValueToSelector(e.target.value);\n onChange(next);\n };\n\n // We use a fake action event when we click on the action of the chip (hijack the \"delete\" feature).\n // This is because the href link action is on the `deleteIcon` property already, but the `onDelete` property\n // controls its visibility.\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const fakeActionEvent = () => {};\n\n // TODO:\n // - Does this need a loading indicator of some kind?\n // - The group's edit link is not clickable once selected.\n // - The group's edit link is disabled if datasource is overridden.\n // Ref: https://github.com/mui/material-ui/issues/36572\n return (\n <Select {...others} value={optionValue} onChange={handleChange}>\n {menuItems.map((menuItemGroup) => [\n <Divider key={`${menuItemGroup.group}-divider`} />,\n ...menuItemGroup.items.map((menuItem) => (\n <MenuItem key={menuItem.value} value={menuItem.value} disabled={menuItem.overridden || !menuItem.saved}>\n <Stack direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\" width=\"100%\">\n <ListItemText>\n <DatasourceName\n name={menuItem.name}\n overridden={menuItem.overridden}\n overriding={menuItem.overriding}\n />\n </ListItemText>\n {!menuItem.saved && <ListItemText>Save the dashboard to enable this datasource</ListItemText>}\n <ListItemText style={{ textAlign: 'right' }}>\n {menuItemGroup.group && menuItemGroup.group.length > 0 && (\n <Chip\n disabled={false}\n label={menuItemGroup.group}\n size=\"small\"\n onDelete={menuItemGroup.editLink ? fakeActionEvent : undefined}\n deleteIcon={\n menuItemGroup.editLink ? (\n <IconButton href={menuItemGroup.editLink} target=\"_blank\">\n <OpenInNewIcon fontSize=\"small\" />\n </IconButton>\n ) : undefined\n }\n />\n )}\n </ListItemText>\n </Stack>\n </MenuItem>\n )),\n ])}\n </Select>\n );\n}\n\nexport function DatasourceName(props: { name: string; overridden?: boolean; overriding?: boolean }) {\n const { name, overridden, overriding } = props;\n return (\n <>\n {`${name} `}\n {!overridden && overriding && (\n <Box display=\"inline\" fontWeight=\"normal\" color={(theme) => theme.palette.primary.main}>\n (overriding)\n </Box>\n )}\n {overridden && '(overridden)'}\n </>\n );\n}\n\n// Delimiter used to stringify/parse option values\nconst OPTION_VALUE_DELIMITER = '_____';\n\n/**\n * Given a DatasourceSelectItemSelector,\n * returns a string value like `{kind}_____{group}_____{name}` that can be used as a Select input value.\n * @param selector\n */\nfunction selectorToOptionValue(selector: DatasourceSelectItemSelector): string {\n return [selector.kind, selector.group ?? '', selector.name ?? ''].join(OPTION_VALUE_DELIMITER);\n}\n\n/**\n * Given an option value name like `{kind}_____{group}_____{name}`,\n * returns a DatasourceSelector to be used by the query data model.\n * @param optionValue\n */\nfunction optionValueToSelector(optionValue: string): DatasourceSelector {\n const words = optionValue.split(OPTION_VALUE_DELIMITER);\n const kind = words[0];\n const name = words[2];\n if (kind === undefined || name === undefined) {\n throw new Error('Invalid optionValue string');\n }\n return {\n kind,\n name: name === '' ? undefined : name,\n };\n}\n"],"names":["OpenInNewIcon","Select","MenuItem","Stack","Divider","ListItemText","Chip","IconButton","Box","useMemo","useListDatasourceSelectItems","DatasourceSelect","props","datasourcePluginKind","value","project","onChange","others","data","isLoading","defaultValue","group","flatMap","itemGroup","items","find","item","kind","selector","name","overridden","menuItems","map","editLink","overriding","saved","selectorToOptionValue","optionValue","handleChange","e","next","optionValueToSelector","target","fakeActionEvent","menuItemGroup","menuItem","disabled","direction","alignItems","justifyContent","width","DatasourceName","style","textAlign","length","label","size","onDelete","undefined","deleteIcon","href","fontSize","display","fontWeight","color","theme","palette","primary","main","OPTION_VALUE_DELIMITER","join","words","split","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/DatasourceSelect.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport OpenInNewIcon from 'mdi-material-ui/OpenInNew';\nimport { Select, SelectProps, MenuItem, Stack, Divider, ListItemText, Chip, IconButton, Box } from '@mui/material';\nimport { DatasourceSelector } from '@perses-dev/core';\nimport { useMemo } from 'react';\nimport { DatasourceSelectItemSelector, useListDatasourceSelectItems } from '../runtime';\n\n// Props on MUI Select that we don't want people to pass because we're either redefining them or providing them in\n// this component\ntype OmittedMuiProps = 'children' | 'value' | 'onChange';\n\nexport interface DatasourceSelectProps extends Omit<SelectProps<string>, OmittedMuiProps> {\n value: DatasourceSelector;\n onChange: (next: DatasourceSelector) => void;\n datasourcePluginKind: string;\n project?: string;\n}\n\n/**\n * Displays a MUI input for selecting a Datasource of a particular kind. Note: The 'value' and `onChange` handler for\n * the input deal with a `DatasourceSelector`.\n */\nexport function DatasourceSelect(props: DatasourceSelectProps) {\n const { datasourcePluginKind, value, project, onChange, ...others } = props;\n const { data, isLoading } = useListDatasourceSelectItems(datasourcePluginKind, project);\n // Rebuild the group of the value if not provided\n const defaultValue = useMemo(() => {\n const group = (data ?? [])\n .flatMap((itemGroup) => itemGroup.items)\n .find((item) => {\n return value.kind === item.selector.kind && value.name === item.selector.name && !item.overridden;\n })?.selector.group;\n return { ...value, group };\n }, [value, data]);\n\n // Convert the datasource list into menu items with name/group?/value strings that the Select input can work with\n const menuItems = useMemo(() => {\n return (data ?? []).map((itemGroup) => ({\n group: itemGroup.group,\n editLink: itemGroup.editLink,\n items: itemGroup.items.map((item) => ({\n name: item.name,\n overriding: item.overriding,\n overridden: item.overridden,\n saved: item.saved ?? true,\n group: item.selector.group,\n value: selectorToOptionValue(item.selector),\n })),\n }));\n }, [data]);\n\n // While loading available values, just use an empty string so MUI select doesn't warn about values out of range\n const optionValue = isLoading ? '' : selectorToOptionValue(defaultValue);\n\n // When the user makes a selection, convert the string option value back to a DatasourceSelector\n const handleChange: SelectProps<string>['onChange'] = (e) => {\n const next = optionValueToSelector(e.target.value);\n onChange(next);\n };\n\n // We use a fake action event when we click on the action of the chip (hijack the \"delete\" feature).\n // This is because the href link action is on the `deleteIcon` property already, but the `onDelete` property\n // controls its visibility.\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const fakeActionEvent = () => {};\n\n // TODO:\n // - Does this need a loading indicator of some kind?\n // - The group's edit link is not clickable once selected.\n // - The group's edit link is disabled if datasource is overridden.\n // Ref: https://github.com/mui/material-ui/issues/36572\n return (\n <Select {...others} value={optionValue} onChange={handleChange}>\n {menuItems.map((menuItemGroup) => [\n <Divider key={`${menuItemGroup.group}-divider`} />,\n ...menuItemGroup.items.map((menuItem) => (\n <MenuItem key={menuItem.value} value={menuItem.value} disabled={menuItem.overridden || !menuItem.saved}>\n <Stack direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\" width=\"100%\">\n <ListItemText>\n <DatasourceName\n name={menuItem.name}\n overridden={menuItem.overridden}\n overriding={menuItem.overriding}\n />\n </ListItemText>\n {!menuItem.saved && <ListItemText>Save the dashboard to enable this datasource</ListItemText>}\n <ListItemText style={{ textAlign: 'right' }}>\n {menuItemGroup.group && menuItemGroup.group.length > 0 && (\n <Chip\n disabled={false}\n label={menuItemGroup.group}\n size=\"small\"\n onDelete={menuItemGroup.editLink ? fakeActionEvent : undefined}\n deleteIcon={\n menuItemGroup.editLink ? (\n <IconButton href={menuItemGroup.editLink} target=\"_blank\">\n <OpenInNewIcon fontSize=\"small\" />\n </IconButton>\n ) : undefined\n }\n />\n )}\n </ListItemText>\n </Stack>\n </MenuItem>\n )),\n ])}\n </Select>\n );\n}\n\nexport function DatasourceName(props: { name: string; overridden?: boolean; overriding?: boolean }) {\n const { name, overridden, overriding } = props;\n return (\n <>\n {`${name} `}\n {!overridden && overriding && (\n <Box display=\"inline\" fontWeight=\"normal\" color={(theme) => theme.palette.primary.main}>\n (overriding)\n </Box>\n )}\n {overridden && '(overridden)'}\n </>\n );\n}\n\n// Delimiter used to stringify/parse option values\nconst OPTION_VALUE_DELIMITER = '_____';\n\n/**\n * Given a DatasourceSelectItemSelector,\n * returns a string value like `{kind}_____{group}_____{name}` that can be used as a Select input value.\n * @param selector\n */\nfunction selectorToOptionValue(selector: DatasourceSelectItemSelector): string {\n return [selector.kind, selector.group ?? '', selector.name ?? ''].join(OPTION_VALUE_DELIMITER);\n}\n\n/**\n * Given an option value name like `{kind}_____{group}_____{name}`,\n * returns a DatasourceSelector to be used by the query data model.\n * @param optionValue\n */\nfunction optionValueToSelector(optionValue: string): DatasourceSelector {\n const words = optionValue.split(OPTION_VALUE_DELIMITER);\n const kind = words[0];\n const name = words[2];\n if (kind === undefined || name === undefined) {\n throw new Error('Invalid optionValue string');\n }\n return {\n kind,\n name: name === '' ? undefined : name,\n };\n}\n"],"names":["OpenInNewIcon","Select","MenuItem","Stack","Divider","ListItemText","Chip","IconButton","Box","useMemo","useListDatasourceSelectItems","DatasourceSelect","props","datasourcePluginKind","value","project","onChange","others","data","isLoading","defaultValue","group","flatMap","itemGroup","items","find","item","kind","selector","name","overridden","menuItems","map","editLink","overriding","saved","selectorToOptionValue","optionValue","handleChange","e","next","optionValueToSelector","target","fakeActionEvent","menuItemGroup","menuItem","disabled","direction","alignItems","justifyContent","width","DatasourceName","style","textAlign","length","label","size","onDelete","undefined","deleteIcon","href","fontSize","display","fontWeight","color","theme","palette","primary","main","OPTION_VALUE_DELIMITER","join","words","split","Error"],"mappings":"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"}
|
|
@@ -40,9 +40,9 @@ export function PanelSpecEditor(props) {
|
|
|
40
40
|
content: /*#__PURE__*/ _jsx(Controller, {
|
|
41
41
|
control: control,
|
|
42
42
|
name: "panelDefinition.spec.queries",
|
|
43
|
-
render: ({ field })
|
|
43
|
+
render: ({ field })=>{
|
|
44
44
|
var _plugin_supportedQueryTypes, _panelDefinition_spec_queries;
|
|
45
|
-
return _jsx(MultiQueryEditor, {
|
|
45
|
+
return /*#__PURE__*/ _jsx(MultiQueryEditor, {
|
|
46
46
|
queryTypes: (_plugin_supportedQueryTypes = plugin.supportedQueryTypes) !== null && _plugin_supportedQueryTypes !== void 0 ? _plugin_supportedQueryTypes : [],
|
|
47
47
|
queries: (_panelDefinition_spec_queries = panelDefinition.spec.queries) !== null && _panelDefinition_spec_queries !== void 0 ? _panelDefinition_spec_queries : [],
|
|
48
48
|
onChange: (queries)=>{
|
|
@@ -81,7 +81,7 @@ export function PanelSpecEditor(props) {
|
|
|
81
81
|
label: 'JSON',
|
|
82
82
|
content: /*#__PURE__*/ _jsx(Controller, {
|
|
83
83
|
control: control,
|
|
84
|
-
name: "panelDefinition
|
|
84
|
+
name: "panelDefinition",
|
|
85
85
|
render: ({ field })=>/*#__PURE__*/ _jsx(JSONEditor, {
|
|
86
86
|
maxHeight: "80vh",
|
|
87
87
|
value: panelDefinition,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/PanelSpecEditor/PanelSpecEditor.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ErrorAlert, JSONEditor, LinksEditor } from '@perses-dev/components';\nimport { PanelDefinition, PanelEditorValues, QueryDefinition, UnknownSpec } from '@perses-dev/core';\nimport { Control, Controller } from 'react-hook-form';\nimport { QueryCountProvider, usePlugin } from '../../runtime';\nimport { PanelPlugin } from '../../model';\nimport { OptionsEditorTabsProps, OptionsEditorTabs } from '../OptionsEditorTabs';\nimport { MultiQueryEditor } from '../MultiQueryEditor';\n\nexport interface PanelSpecEditorProps {\n control: Control<PanelEditorValues>;\n panelDefinition: PanelDefinition;\n onQueriesChange: (queries: QueryDefinition[]) => void;\n onPluginSpecChange: (spec: UnknownSpec) => void;\n onJSONChange: (panelDefinitionStr: string) => void;\n}\n\nexport function PanelSpecEditor(props: PanelSpecEditorProps) {\n const { control, panelDefinition, onJSONChange, onQueriesChange, onPluginSpecChange } = props;\n const { kind } = panelDefinition.spec.plugin;\n const { data: plugin, isLoading, error } = usePlugin('Panel', kind);\n\n if (error) {\n return <ErrorAlert error={error} />;\n }\n\n // TODO: Proper loading indicator\n if (isLoading) {\n return null;\n }\n\n if (plugin === undefined) {\n throw new Error(`Missing implementation for panel plugin with kind '${kind}'`);\n }\n\n const { panelOptionsEditorComponents, hideQueryEditor } = plugin as PanelPlugin;\n let tabs: OptionsEditorTabsProps['tabs'] = [];\n\n if (!hideQueryEditor) {\n tabs.push({\n label: 'Query',\n content: (\n <Controller\n control={control}\n name=\"panelDefinition.spec.queries\"\n render={({ field }) => (\n <MultiQueryEditor\n queryTypes={plugin.supportedQueryTypes ?? []}\n queries={panelDefinition.spec.queries ?? []}\n onChange={(queries) => {\n field.onChange(queries);\n onQueriesChange(queries);\n }}\n />\n )}\n />\n ),\n });\n }\n\n if (panelOptionsEditorComponents !== undefined) {\n tabs = tabs.concat(\n panelOptionsEditorComponents.map(({ label, content: OptionsEditorComponent }) => ({\n label,\n content: (\n <Controller\n control={control}\n name=\"panelDefinition.spec.plugin.spec\"\n render={({ field }) => (\n <OptionsEditorComponent\n value={panelDefinition.spec.plugin.spec}\n onChange={(spec) => {\n field.onChange(spec);\n onPluginSpecChange(spec);\n }}\n />\n )}\n />\n ),\n }))\n );\n }\n\n // always show json editor and links editor by default\n tabs.push({\n label: 'Links',\n content: <LinksEditor control={control} />,\n });\n tabs.push({\n label: 'JSON',\n content: (\n <Controller\n control={control}\n name=\"panelDefinition
|
|
1
|
+
{"version":3,"sources":["../../../src/components/PanelSpecEditor/PanelSpecEditor.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ErrorAlert, JSONEditor, LinksEditor } from '@perses-dev/components';\nimport { PanelDefinition, PanelEditorValues, QueryDefinition, UnknownSpec } from '@perses-dev/core';\nimport { Control, Controller } from 'react-hook-form';\nimport { QueryCountProvider, usePlugin } from '../../runtime';\nimport { PanelPlugin } from '../../model';\nimport { OptionsEditorTabsProps, OptionsEditorTabs } from '../OptionsEditorTabs';\nimport { MultiQueryEditor } from '../MultiQueryEditor';\n\nexport interface PanelSpecEditorProps {\n control: Control<PanelEditorValues>;\n panelDefinition: PanelDefinition;\n onQueriesChange: (queries: QueryDefinition[]) => void;\n onPluginSpecChange: (spec: UnknownSpec) => void;\n onJSONChange: (panelDefinitionStr: string) => void;\n}\n\nexport function PanelSpecEditor(props: PanelSpecEditorProps) {\n const { control, panelDefinition, onJSONChange, onQueriesChange, onPluginSpecChange } = props;\n const { kind } = panelDefinition.spec.plugin;\n const { data: plugin, isLoading, error } = usePlugin('Panel', kind);\n\n if (error) {\n return <ErrorAlert error={error} />;\n }\n\n // TODO: Proper loading indicator\n if (isLoading) {\n return null;\n }\n\n if (plugin === undefined) {\n throw new Error(`Missing implementation for panel plugin with kind '${kind}'`);\n }\n\n const { panelOptionsEditorComponents, hideQueryEditor } = plugin as PanelPlugin;\n let tabs: OptionsEditorTabsProps['tabs'] = [];\n\n if (!hideQueryEditor) {\n tabs.push({\n label: 'Query',\n content: (\n <Controller\n control={control}\n name=\"panelDefinition.spec.queries\"\n render={({ field }) => (\n <MultiQueryEditor\n queryTypes={plugin.supportedQueryTypes ?? []}\n queries={panelDefinition.spec.queries ?? []}\n onChange={(queries) => {\n field.onChange(queries);\n onQueriesChange(queries);\n }}\n />\n )}\n />\n ),\n });\n }\n\n if (panelOptionsEditorComponents !== undefined) {\n tabs = tabs.concat(\n panelOptionsEditorComponents.map(({ label, content: OptionsEditorComponent }) => ({\n label,\n content: (\n <Controller\n control={control}\n name=\"panelDefinition.spec.plugin.spec\"\n render={({ field }) => (\n <OptionsEditorComponent\n value={panelDefinition.spec.plugin.spec}\n onChange={(spec) => {\n field.onChange(spec);\n onPluginSpecChange(spec);\n }}\n />\n )}\n />\n ),\n }))\n );\n }\n\n // always show json editor and links editor by default\n tabs.push({\n label: 'Links',\n content: <LinksEditor control={control} />,\n });\n tabs.push({\n label: 'JSON',\n content: (\n <Controller\n control={control}\n name=\"panelDefinition\"\n render={({ field }) => (\n <JSONEditor\n maxHeight=\"80vh\"\n value={panelDefinition}\n onChange={(json) => {\n field.onChange(json);\n onJSONChange(json);\n }}\n />\n )}\n />\n ),\n });\n\n return (\n <QueryCountProvider queryCount={(panelDefinition.spec.queries ?? []).length}>\n <OptionsEditorTabs key={tabs.length} tabs={tabs} />\n </QueryCountProvider>\n );\n}\n"],"names":["ErrorAlert","JSONEditor","LinksEditor","Controller","QueryCountProvider","usePlugin","OptionsEditorTabs","MultiQueryEditor","PanelSpecEditor","props","control","panelDefinition","onJSONChange","onQueriesChange","onPluginSpecChange","kind","spec","plugin","data","isLoading","error","undefined","Error","panelOptionsEditorComponents","hideQueryEditor","tabs","push","label","content","name","render","field","queryTypes","supportedQueryTypes","queries","onChange","concat","map","OptionsEditorComponent","value","maxHeight","json","queryCount","length"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/PluginRegistry/PluginRegistry.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { UnknownSpec, useEvent } from '@perses-dev/core';\nimport { useRef, useCallback, useMemo, ReactNode } from 'react';\nimport {\n PluginModuleResource,\n PluginType,\n PluginImplementation,\n Plugin,\n PluginLoader,\n DefaultPluginKinds,\n} from '../../model';\nimport { PluginRegistryContext } from '../../runtime';\nimport { usePluginIndexes, getTypeAndKindKey } from './plugin-indexes';\n\nexport interface PluginRegistryProps {\n pluginLoader: PluginLoader;\n defaultPluginKinds?: DefaultPluginKinds;\n children?: ReactNode;\n}\n\n/**\n * PluginRegistryContext provider that keeps track of all available plugins and provides an API for getting them or\n * querying the metadata about them.\n */\nexport function PluginRegistry(props: PluginRegistryProps) {\n const {\n pluginLoader: { getInstalledPlugins, importPluginModule },\n children,\n defaultPluginKinds,\n } = props;\n\n const getPluginIndexes = usePluginIndexes(getInstalledPlugins);\n\n // De-dupe calls to import plugin modules\n const importCache = useRef(new Map<PluginModuleResource, Promise<unknown>>());\n\n // Do useEvent here since this accesses the importPluginModule prop and we want a stable reference to it for the\n // callback below\n const loadPluginModule = useEvent((resource: PluginModuleResource) => {\n let request = importCache.current.get(resource);\n if (request === undefined) {\n request = importPluginModule(resource);\n importCache.current.set(resource, request);\n\n // Remove failed requests from the cache so they can potentially be retried\n request.catch(() => importCache.current.delete(resource));\n }\n return request;\n });\n\n const getPlugin = useCallback(\n async <T extends PluginType>(pluginType: T, kind: string): Promise<PluginImplementation<T>> => {\n // Get the indexes of the installed plugins\n const pluginIndexes = await getPluginIndexes();\n\n // Figure out what module the plugin is in by looking in the index\n const typeAndKindKey = getTypeAndKindKey(pluginType, kind);\n const resource = pluginIndexes.pluginResourcesByTypeAndKind.get(typeAndKindKey);\n if (resource === undefined) {\n throw new Error(`A ${pluginType} plugin for kind '${kind}' is not installed`);\n }\n\n // Treat the plugin module as a bunch of named exports that have plugins\n const pluginModule = (await loadPluginModule(resource)) as Record<string, Plugin<UnknownSpec>>;\n\n // We currently assume that plugin modules will have named exports that match the kinds they handle\n const plugin = pluginModule[kind];\n if (plugin === undefined) {\n throw new Error(\n `The ${pluginType} plugin for kind '${kind}' is missing from the ${resource.metadata.name} plugin module`\n );\n }\n\n return plugin as PluginImplementation<T>;\n },\n [getPluginIndexes, loadPluginModule]\n );\n\n const listPluginMetadata = useCallback(\n async (pluginTypes: PluginType[]) => {\n const pluginIndexes = await getPluginIndexes();\n return pluginTypes.flatMap((type) => pluginIndexes.pluginMetadataByType.get(type) ?? []);\n },\n [getPluginIndexes]\n );\n\n // Create the registry's context value and render\n const context = useMemo(\n () => ({ getPlugin, listPluginMetadata, defaultPluginKinds }),\n [getPlugin, listPluginMetadata, defaultPluginKinds]\n );\n return <PluginRegistryContext.Provider value={context}>{children}</PluginRegistryContext.Provider>;\n}\n"],"names":["useEvent","useRef","useCallback","useMemo","PluginRegistryContext","usePluginIndexes","getTypeAndKindKey","PluginRegistry","props","pluginLoader","getInstalledPlugins","importPluginModule","children","defaultPluginKinds","getPluginIndexes","importCache","Map","loadPluginModule","resource","request","current","get","undefined","set","catch","delete","getPlugin","pluginType","kind","pluginIndexes","typeAndKindKey","pluginResourcesByTypeAndKind","Error","pluginModule","plugin","metadata","name","listPluginMetadata","pluginTypes","flatMap","type","pluginMetadataByType","context","Provider","value"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,SAAsBA,QAAQ,QAAQ,mBAAmB;AACzD,SAASC,MAAM,EAAEC,WAAW,EAAEC,OAAO,QAAmB,QAAQ;AAShE,SAASC,qBAAqB,QAAQ,gBAAgB;AACtD,SAASC,gBAAgB,EAAEC,iBAAiB,QAAQ,mBAAmB;AAQvE;;;CAGC,GACD,OAAO,SAASC,eAAeC,KAA0B;IACvD,MAAM,EACJC,cAAc,EAAEC,mBAAmB,EAAEC,kBAAkB,EAAE,EACzDC,QAAQ,EACRC,kBAAkB,EACnB,GAAGL;IAEJ,MAAMM,mBAAmBT,iBAAiBK;IAE1C,yCAAyC;IACzC,MAAMK,cAAcd,OAAO,IAAIe;IAE/B,gHAAgH;IAChH,iBAAiB;IACjB,MAAMC,mBAAmBjB,SAAS,CAACkB;QACjC,IAAIC,UAAUJ,YAAYK,OAAO,CAACC,GAAG,CAACH;QACtC,IAAIC,YAAYG,WAAW;YACzBH,UAAUR,mBAAmBO;YAC7BH,YAAYK,OAAO,CAACG,GAAG,CAACL,UAAUC;YAElC,2EAA2E;YAC3EA,QAAQK,KAAK,CAAC,IAAMT,YAAYK,OAAO,CAACK,MAAM,CAACP;QACjD;QACA,OAAOC;IACT;IAEA,MAAMO,YAAYxB,YAChB,OAA6ByB,YAAeC;QAC1C,2CAA2C;QAC3C,MAAMC,gBAAgB,MAAMf;QAE5B,kEAAkE;QAClE,MAAMgB,iBAAiBxB,kBAAkBqB,YAAYC;QACrD,MAAMV,WAAWW,cAAcE,4BAA4B,CAACV,GAAG,CAACS;QAChE,IAAIZ,aAAaI,WAAW;YAC1B,MAAM,IAAIU,MAAM,CAAC,EAAE,EAAEL,WAAW,kBAAkB,EAAEC,KAAK,kBAAkB,CAAC;QAC9E;QAEA,wEAAwE;QACxE,MAAMK,eAAgB,MAAMhB,iBAAiBC;QAE7C,mGAAmG;QACnG,MAAMgB,SAASD,YAAY,CAACL,KAAK;QACjC,IAAIM,WAAWZ,WAAW;YACxB,MAAM,IAAIU,MACR,CAAC,IAAI,EAAEL,WAAW,kBAAkB,EAAEC,KAAK,sBAAsB,EAAEV,SAASiB,QAAQ,CAACC,IAAI,CAAC,cAAc,CAAC;QAE7G;QAEA,OAAOF;IACT,GACA;QAACpB;QAAkBG;KAAiB;IAGtC,MAAMoB,qBAAqBnC,YACzB,OAAOoC;QACL,MAAMT,gBAAgB,MAAMf;QAC5B,OAAOwB,YAAYC,OAAO,CAAC,CAACC;gBAASX;mBAAAA,CAAAA,0CAAAA,cAAcY,oBAAoB,CAACpB,GAAG,CAACmB,mBAAvCX,qDAAAA,0CAAgD,EAAE
|
|
1
|
+
{"version":3,"sources":["../../../src/components/PluginRegistry/PluginRegistry.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { UnknownSpec, useEvent } from '@perses-dev/core';\nimport { useRef, useCallback, useMemo, ReactNode } from 'react';\nimport {\n PluginModuleResource,\n PluginType,\n PluginImplementation,\n Plugin,\n PluginLoader,\n DefaultPluginKinds,\n} from '../../model';\nimport { PluginRegistryContext } from '../../runtime';\nimport { usePluginIndexes, getTypeAndKindKey } from './plugin-indexes';\n\nexport interface PluginRegistryProps {\n pluginLoader: PluginLoader;\n defaultPluginKinds?: DefaultPluginKinds;\n children?: ReactNode;\n}\n\n/**\n * PluginRegistryContext provider that keeps track of all available plugins and provides an API for getting them or\n * querying the metadata about them.\n */\nexport function PluginRegistry(props: PluginRegistryProps) {\n const {\n pluginLoader: { getInstalledPlugins, importPluginModule },\n children,\n defaultPluginKinds,\n } = props;\n\n const getPluginIndexes = usePluginIndexes(getInstalledPlugins);\n\n // De-dupe calls to import plugin modules\n const importCache = useRef(new Map<PluginModuleResource, Promise<unknown>>());\n\n // Do useEvent here since this accesses the importPluginModule prop and we want a stable reference to it for the\n // callback below\n const loadPluginModule = useEvent((resource: PluginModuleResource) => {\n let request = importCache.current.get(resource);\n if (request === undefined) {\n request = importPluginModule(resource);\n importCache.current.set(resource, request);\n\n // Remove failed requests from the cache so they can potentially be retried\n request.catch(() => importCache.current.delete(resource));\n }\n return request;\n });\n\n const getPlugin = useCallback(\n async <T extends PluginType>(pluginType: T, kind: string): Promise<PluginImplementation<T>> => {\n // Get the indexes of the installed plugins\n const pluginIndexes = await getPluginIndexes();\n\n // Figure out what module the plugin is in by looking in the index\n const typeAndKindKey = getTypeAndKindKey(pluginType, kind);\n const resource = pluginIndexes.pluginResourcesByTypeAndKind.get(typeAndKindKey);\n if (resource === undefined) {\n throw new Error(`A ${pluginType} plugin for kind '${kind}' is not installed`);\n }\n\n // Treat the plugin module as a bunch of named exports that have plugins\n const pluginModule = (await loadPluginModule(resource)) as Record<string, Plugin<UnknownSpec>>;\n\n // We currently assume that plugin modules will have named exports that match the kinds they handle\n const plugin = pluginModule[kind];\n if (plugin === undefined) {\n throw new Error(\n `The ${pluginType} plugin for kind '${kind}' is missing from the ${resource.metadata.name} plugin module`\n );\n }\n\n return plugin as PluginImplementation<T>;\n },\n [getPluginIndexes, loadPluginModule]\n );\n\n const listPluginMetadata = useCallback(\n async (pluginTypes: PluginType[]) => {\n const pluginIndexes = await getPluginIndexes();\n return pluginTypes.flatMap((type) => pluginIndexes.pluginMetadataByType.get(type) ?? []);\n },\n [getPluginIndexes]\n );\n\n // Create the registry's context value and render\n const context = useMemo(\n () => ({ getPlugin, listPluginMetadata, defaultPluginKinds }),\n [getPlugin, listPluginMetadata, defaultPluginKinds]\n );\n return <PluginRegistryContext.Provider value={context}>{children}</PluginRegistryContext.Provider>;\n}\n"],"names":["useEvent","useRef","useCallback","useMemo","PluginRegistryContext","usePluginIndexes","getTypeAndKindKey","PluginRegistry","props","pluginLoader","getInstalledPlugins","importPluginModule","children","defaultPluginKinds","getPluginIndexes","importCache","Map","loadPluginModule","resource","request","current","get","undefined","set","catch","delete","getPlugin","pluginType","kind","pluginIndexes","typeAndKindKey","pluginResourcesByTypeAndKind","Error","pluginModule","plugin","metadata","name","listPluginMetadata","pluginTypes","flatMap","type","pluginMetadataByType","context","Provider","value"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,SAAsBA,QAAQ,QAAQ,mBAAmB;AACzD,SAASC,MAAM,EAAEC,WAAW,EAAEC,OAAO,QAAmB,QAAQ;AAShE,SAASC,qBAAqB,QAAQ,gBAAgB;AACtD,SAASC,gBAAgB,EAAEC,iBAAiB,QAAQ,mBAAmB;AAQvE;;;CAGC,GACD,OAAO,SAASC,eAAeC,KAA0B;IACvD,MAAM,EACJC,cAAc,EAAEC,mBAAmB,EAAEC,kBAAkB,EAAE,EACzDC,QAAQ,EACRC,kBAAkB,EACnB,GAAGL;IAEJ,MAAMM,mBAAmBT,iBAAiBK;IAE1C,yCAAyC;IACzC,MAAMK,cAAcd,OAAO,IAAIe;IAE/B,gHAAgH;IAChH,iBAAiB;IACjB,MAAMC,mBAAmBjB,SAAS,CAACkB;QACjC,IAAIC,UAAUJ,YAAYK,OAAO,CAACC,GAAG,CAACH;QACtC,IAAIC,YAAYG,WAAW;YACzBH,UAAUR,mBAAmBO;YAC7BH,YAAYK,OAAO,CAACG,GAAG,CAACL,UAAUC;YAElC,2EAA2E;YAC3EA,QAAQK,KAAK,CAAC,IAAMT,YAAYK,OAAO,CAACK,MAAM,CAACP;QACjD;QACA,OAAOC;IACT;IAEA,MAAMO,YAAYxB,YAChB,OAA6ByB,YAAeC;QAC1C,2CAA2C;QAC3C,MAAMC,gBAAgB,MAAMf;QAE5B,kEAAkE;QAClE,MAAMgB,iBAAiBxB,kBAAkBqB,YAAYC;QACrD,MAAMV,WAAWW,cAAcE,4BAA4B,CAACV,GAAG,CAACS;QAChE,IAAIZ,aAAaI,WAAW;YAC1B,MAAM,IAAIU,MAAM,CAAC,EAAE,EAAEL,WAAW,kBAAkB,EAAEC,KAAK,kBAAkB,CAAC;QAC9E;QAEA,wEAAwE;QACxE,MAAMK,eAAgB,MAAMhB,iBAAiBC;QAE7C,mGAAmG;QACnG,MAAMgB,SAASD,YAAY,CAACL,KAAK;QACjC,IAAIM,WAAWZ,WAAW;YACxB,MAAM,IAAIU,MACR,CAAC,IAAI,EAAEL,WAAW,kBAAkB,EAAEC,KAAK,sBAAsB,EAAEV,SAASiB,QAAQ,CAACC,IAAI,CAAC,cAAc,CAAC;QAE7G;QAEA,OAAOF;IACT,GACA;QAACpB;QAAkBG;KAAiB;IAGtC,MAAMoB,qBAAqBnC,YACzB,OAAOoC;QACL,MAAMT,gBAAgB,MAAMf;QAC5B,OAAOwB,YAAYC,OAAO,CAAC,CAACC;gBAASX;mBAAAA,CAAAA,0CAAAA,cAAcY,oBAAoB,CAACpB,GAAG,CAACmB,mBAAvCX,qDAAAA,0CAAgD,EAAE;;IACzF,GACA;QAACf;KAAiB;IAGpB,iDAAiD;IACjD,MAAM4B,UAAUvC,QACd,IAAO,CAAA;YAAEuB;YAAWW;YAAoBxB;QAAmB,CAAA,GAC3D;QAACa;QAAWW;QAAoBxB;KAAmB;IAErD,qBAAO,KAACT,sBAAsBuC,QAAQ;QAACC,OAAOF;kBAAU9B;;AAC1D"}
|
|
@@ -40,10 +40,10 @@ function TextVariableEditorForm({ action, control }) {
|
|
|
40
40
|
/*#__PURE__*/ _jsx(Controller, {
|
|
41
41
|
control: control,
|
|
42
42
|
name: "spec.value",
|
|
43
|
-
render: ({ field, fieldState })
|
|
43
|
+
render: ({ field, fieldState })=>{
|
|
44
44
|
var _fieldState_error;
|
|
45
45
|
var _field_value;
|
|
46
|
-
return _jsxs(_Fragment, {
|
|
46
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
47
47
|
children: [
|
|
48
48
|
/*#__PURE__*/ _jsx(Box, {
|
|
49
49
|
children: /*#__PURE__*/ _jsx(VariablePreview, {
|
|
@@ -75,9 +75,9 @@ function TextVariableEditorForm({ action, control }) {
|
|
|
75
75
|
/*#__PURE__*/ _jsx(Controller, {
|
|
76
76
|
control: control,
|
|
77
77
|
name: "spec.constant",
|
|
78
|
-
render: ({ field })
|
|
78
|
+
render: ({ field })=>{
|
|
79
79
|
var _field_value;
|
|
80
|
-
return _jsx(FormControlLabel, {
|
|
80
|
+
return /*#__PURE__*/ _jsx(FormControlLabel, {
|
|
81
81
|
label: "Constant",
|
|
82
82
|
control: /*#__PURE__*/ _jsx(Switch, {
|
|
83
83
|
...field,
|
|
@@ -159,10 +159,10 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
159
159
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
160
160
|
control: control,
|
|
161
161
|
name: "spec.plugin",
|
|
162
|
-
render: ({ field })
|
|
162
|
+
render: ({ field })=>{
|
|
163
163
|
var _field_value, _field_value1;
|
|
164
164
|
var _field_value_kind, _field_value_spec;
|
|
165
|
-
return _jsx(PluginEditor, {
|
|
165
|
+
return /*#__PURE__*/ _jsx(PluginEditor, {
|
|
166
166
|
width: "100%",
|
|
167
167
|
pluginTypes: [
|
|
168
168
|
'Variable'
|
|
@@ -194,10 +194,10 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
194
194
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
195
195
|
control: control,
|
|
196
196
|
name: "spec.capturingRegexp",
|
|
197
|
-
render: ({ field, fieldState })
|
|
197
|
+
render: ({ field, fieldState })=>{
|
|
198
198
|
var _fieldState_error;
|
|
199
199
|
var _field_value;
|
|
200
|
-
return _jsx(TextField, {
|
|
200
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
201
201
|
...field,
|
|
202
202
|
label: "Capturing Regexp Filter",
|
|
203
203
|
InputLabelProps: {
|
|
@@ -224,10 +224,10 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
224
224
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
225
225
|
control: control,
|
|
226
226
|
name: "spec.sort",
|
|
227
|
-
render: ({ field, fieldState })
|
|
227
|
+
render: ({ field, fieldState })=>{
|
|
228
228
|
var _fieldState_error;
|
|
229
229
|
var _field_value;
|
|
230
|
-
return _jsxs(TextField, {
|
|
230
|
+
return /*#__PURE__*/ _jsxs(TextField, {
|
|
231
231
|
select: true,
|
|
232
232
|
...field,
|
|
233
233
|
fullWidth: true,
|
|
@@ -294,9 +294,9 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
294
294
|
/*#__PURE__*/ _jsx(Controller, {
|
|
295
295
|
control: control,
|
|
296
296
|
name: "spec.allowMultiple",
|
|
297
|
-
render: ({ field })
|
|
297
|
+
render: ({ field })=>{
|
|
298
298
|
var _field_value;
|
|
299
|
-
return _jsx(FormControlLabel, {
|
|
299
|
+
return /*#__PURE__*/ _jsx(FormControlLabel, {
|
|
300
300
|
label: "Allow Multiple Values",
|
|
301
301
|
control: /*#__PURE__*/ _jsx(Switch, {
|
|
302
302
|
...field,
|
|
@@ -322,9 +322,9 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
322
322
|
/*#__PURE__*/ _jsx(Controller, {
|
|
323
323
|
control: control,
|
|
324
324
|
name: "spec.allowAllValue",
|
|
325
|
-
render: ({ field })
|
|
325
|
+
render: ({ field })=>{
|
|
326
326
|
var _field_value;
|
|
327
|
-
return _jsx(FormControlLabel, {
|
|
327
|
+
return /*#__PURE__*/ _jsx(FormControlLabel, {
|
|
328
328
|
label: "Allow All option",
|
|
329
329
|
control: /*#__PURE__*/ _jsx(Switch, {
|
|
330
330
|
...field,
|
|
@@ -347,10 +347,10 @@ function ListVariableEditorForm({ action, control }) {
|
|
|
347
347
|
_allowAllValue && /*#__PURE__*/ _jsx(Controller, {
|
|
348
348
|
control: control,
|
|
349
349
|
name: "spec.customAllValue",
|
|
350
|
-
render: ({ field, fieldState })
|
|
350
|
+
render: ({ field, fieldState })=>{
|
|
351
351
|
var _fieldState_error;
|
|
352
352
|
var _field_value;
|
|
353
|
-
return _jsx(TextField, {
|
|
353
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
354
354
|
...field,
|
|
355
355
|
fullWidth: true,
|
|
356
356
|
label: "Custom All Value",
|
|
@@ -515,10 +515,10 @@ export function VariableEditorForm(props) {
|
|
|
515
515
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
516
516
|
control: form.control,
|
|
517
517
|
name: "spec.name",
|
|
518
|
-
render: ({ field, fieldState })
|
|
518
|
+
render: ({ field, fieldState })=>{
|
|
519
519
|
var _fieldState_error;
|
|
520
520
|
var _field_value;
|
|
521
|
-
return _jsx(TextField, {
|
|
521
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
522
522
|
...field,
|
|
523
523
|
required: true,
|
|
524
524
|
fullWidth: true,
|
|
@@ -546,10 +546,10 @@ export function VariableEditorForm(props) {
|
|
|
546
546
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
547
547
|
control: form.control,
|
|
548
548
|
name: "spec.display.name",
|
|
549
|
-
render: ({ field, fieldState })
|
|
549
|
+
render: ({ field, fieldState })=>{
|
|
550
550
|
var _fieldState_error;
|
|
551
551
|
var _field_value;
|
|
552
|
-
return _jsx(TextField, {
|
|
552
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
553
553
|
...field,
|
|
554
554
|
fullWidth: true,
|
|
555
555
|
label: "Display Label",
|
|
@@ -575,10 +575,10 @@ export function VariableEditorForm(props) {
|
|
|
575
575
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
576
576
|
control: form.control,
|
|
577
577
|
name: "spec.display.description",
|
|
578
|
-
render: ({ field, fieldState })
|
|
578
|
+
render: ({ field, fieldState })=>{
|
|
579
579
|
var _fieldState_error;
|
|
580
580
|
var _field_value;
|
|
581
|
-
return _jsx(TextField, {
|
|
581
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
582
582
|
...field,
|
|
583
583
|
fullWidth: true,
|
|
584
584
|
label: "Description",
|
|
@@ -604,10 +604,10 @@ export function VariableEditorForm(props) {
|
|
|
604
604
|
children: /*#__PURE__*/ _jsx(Controller, {
|
|
605
605
|
control: form.control,
|
|
606
606
|
name: "kind",
|
|
607
|
-
render: ({ field, fieldState })
|
|
607
|
+
render: ({ field, fieldState })=>{
|
|
608
608
|
var _fieldState_error;
|
|
609
609
|
var _field_value;
|
|
610
|
-
return _jsx(TextField, {
|
|
610
|
+
return /*#__PURE__*/ _jsx(TextField, {
|
|
611
611
|
select: true,
|
|
612
612
|
...field,
|
|
613
613
|
fullWidth: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Variables/VariableEditorForm/VariableEditorForm.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { DispatchWithoutAction, useState } from 'react';\nimport {\n Box,\n Typography,\n Switch,\n TextField,\n Grid,\n FormControlLabel,\n MenuItem,\n Button,\n Stack,\n ClickAwayListener,\n Divider,\n} from '@mui/material';\nimport { VariableDefinition, ListVariableDefinition, Action } from '@perses-dev/core';\nimport { DiscardChangesConfirmationDialog, ErrorAlert, ErrorBoundary } from '@perses-dev/components';\nimport { Control, Controller, FormProvider, SubmitHandler, useForm, useFormContext, useWatch } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { getSubmitText, getTitleAction } from '../../../utils';\nimport { VARIABLE_TYPES } from '../variable-model';\nimport { PluginEditor } from '../../PluginEditor';\nimport { useValidationSchemas } from '../../../context';\nimport { VariableListPreview, VariablePreview } from './VariablePreview';\n\nfunction FallbackPreview() {\n return <div>Error previewing values</div>;\n}\n\ninterface KindVariableEditorFormProps {\n action: Action;\n control: Control<VariableDefinition>;\n}\n\nfunction TextVariableEditorForm({ action, control }: KindVariableEditorFormProps) {\n return (\n <>\n <Typography py={1} variant=\"subtitle1\">\n Text Options\n </Typography>\n <Stack spacing={2}>\n <Controller\n control={control}\n name=\"spec.value\"\n render={({ field, fieldState }) => (\n <>\n <Box>\n <VariablePreview values={[field.value]} />\n </Box>\n <TextField\n {...field}\n label=\"Value\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n </>\n )}\n />\n <Controller\n control={control}\n name=\"spec.constant\"\n render={({ field }) => (\n <FormControlLabel\n label=\"Constant\"\n control={\n <Switch\n {...field}\n checked={!!field.value}\n readOnly={action === 'read'}\n value={field.value ?? false}\n onChange={(event) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n field.onChange(event);\n }}\n />\n }\n />\n )}\n />\n </Stack>\n </>\n );\n}\n\nfunction ListVariableEditorForm({ action, control }: KindVariableEditorFormProps) {\n const form = useFormContext<VariableDefinition>();\n /** We use `previewSpec` to know when to explicitly update the\n * spec that will be used for preview. The reason why we do this is to avoid\n * having to re-fetch the values when the user is still editing the spec.\n */\n const [previewSpec, setPreviewSpec] = useState<ListVariableDefinition>(form.getValues() as ListVariableDefinition);\n const refreshPreview = () => {\n setPreviewSpec(form.getValues() as ListVariableDefinition);\n };\n\n const kind = useWatch<VariableDefinition, 'spec.plugin.kind'>({ control: control, name: 'spec.plugin.kind' });\n const _allowAllValue = useWatch<VariableDefinition, 'spec.allowAllValue'>({\n control: control,\n name: 'spec.allowAllValue',\n });\n\n // When variable kind is selected we need to provide default values\n // TODO: check if react-hook-form has a better way to do this\n const values = form.getValues() as ListVariableDefinition;\n if (values.spec.allowAllValue === undefined) {\n form.setValue('spec.allowAllValue', false);\n }\n\n if (values.spec.allowMultiple === undefined) {\n form.setValue('spec.allowMultiple', false);\n }\n\n return (\n <>\n <Typography py={1} variant=\"subtitle1\">\n List Options\n </Typography>\n <Stack spacing={2} mb={2}>\n {kind ? (\n <Box>\n <ErrorBoundary FallbackComponent={FallbackPreview} resetKeys={[previewSpec]}>\n <VariableListPreview definition={previewSpec} onRefresh={refreshPreview} />\n </ErrorBoundary>\n </Box>\n ) : (\n <VariablePreview isLoading={true} />\n )}\n\n <Stack>\n {/** Hack?: Cool technique to refresh the preview to simulate onBlur event */}\n <ClickAwayListener onClickAway={() => refreshPreview()}>\n <Box />\n </ClickAwayListener>\n {/** **/}\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <Controller\n control={control}\n name=\"spec.plugin\"\n render={({ field }) => (\n <PluginEditor\n width=\"100%\"\n pluginTypes={['Variable']}\n pluginKindLabel=\"Source\"\n value={{\n selection: {\n type: 'Variable',\n kind: field.value?.kind ?? 'StaticListVariable',\n },\n spec: field.value?.spec ?? { values: [] },\n }}\n isReadonly={action === 'read'}\n onChange={(v) => {\n field.onChange({ kind: v.selection.kind, spec: v.spec });\n }}\n />\n )}\n />\n </ErrorBoundary>\n </Stack>\n\n <Stack>\n <Controller\n control={control}\n name=\"spec.capturingRegexp\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n label=\"Capturing Regexp Filter\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n value={field.value ?? ''}\n onChange={(event) => {\n if (event.target.value === '') {\n field.onChange(undefined);\n } else {\n field.onChange(event);\n }\n }}\n helperText={\n fieldState.error?.message\n ? fieldState.error.message\n : 'Optional, if you want to filter on captured result.'\n }\n />\n )}\n />\n </Stack>\n\n <Stack>\n <Controller\n control={control}\n name=\"spec.sort\"\n render={({ field, fieldState }) => (\n <TextField\n select\n {...field}\n fullWidth\n label=\"Sort\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? 'none'}\n onChange={(event) => {\n field.onChange(event);\n }}\n >\n <MenuItem value=\"none\">None</MenuItem>\n <MenuItem value=\"alphabetical-asc\">Alphabetical, asc</MenuItem>\n <MenuItem value=\"alphabetical-desc\">Alphabetical, desc</MenuItem>\n <MenuItem value=\"numerical-asc\">Numerical, asc</MenuItem>\n <MenuItem value=\"numerical-desc\">Numerical, desc</MenuItem>\n <MenuItem value=\"alphabetical-ci-asc\">Alphabetical, case-insensitive, asc</MenuItem>\n <MenuItem value=\"alphabetical-ci-desc\">Alphabetical, case-insensitive, desc</MenuItem>\n </TextField>\n )}\n />\n </Stack>\n </Stack>\n\n <Divider />\n\n <Typography py={1} variant=\"subtitle1\">\n Dropdown Options\n </Typography>\n <Stack spacing=\"2\">\n <Stack>\n <Controller\n control={control}\n name=\"spec.allowMultiple\"\n render={({ field }) => (\n <FormControlLabel\n label=\"Allow Multiple Values\"\n control={\n <Switch\n {...field}\n checked={!!field.value}\n readOnly={action === 'read'}\n value={field.value ?? false}\n onChange={(event) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n field.onChange(event);\n }}\n />\n }\n />\n )}\n />\n <Typography variant=\"caption\">Enables multiple values to be selected at the same time</Typography>\n </Stack>\n <Stack>\n <Controller\n control={control}\n name=\"spec.allowAllValue\"\n render={({ field }) => (\n <FormControlLabel\n label=\"Allow All option\"\n control={\n <Switch\n {...field}\n checked={!!field.value}\n readOnly={action === 'read'}\n value={field.value ?? false}\n onChange={(event) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n field.onChange(event);\n }}\n />\n }\n />\n )}\n />\n <Typography mb={1} variant=\"caption\">\n Enables an option to include all variable values\n </Typography>\n {_allowAllValue && (\n <Controller\n control={control}\n name=\"spec.customAllValue\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n label=\"Custom All Value\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={\n fieldState.error?.message\n ? fieldState.error.message\n : 'When All is selected, this value will be used'\n }\n value={field.value ?? ''}\n onChange={(event) => {\n if (event.target.value === '') {\n field.onChange(undefined);\n } else {\n field.onChange(event);\n }\n }}\n />\n )}\n />\n )}\n </Stack>\n </Stack>\n </>\n );\n}\n\ninterface VariableEditorFormProps {\n initialVariableDefinition: VariableDefinition;\n initialAction: Action;\n isDraft: boolean;\n isReadonly?: boolean;\n onSave: (def: VariableDefinition) => void;\n onClose: () => void;\n onDelete?: DispatchWithoutAction;\n}\n\nexport function VariableEditorForm(props: VariableEditorFormProps) {\n const { initialVariableDefinition, initialAction, isDraft, isReadonly, onSave, onClose, onDelete } = props;\n\n const [isDiscardDialogOpened, setDiscardDialogOpened] = useState<boolean>(false);\n const [action, setAction] = useState(initialAction);\n const titleAction = getTitleAction(action, isDraft);\n const submitText = getSubmitText(action, isDraft);\n\n const { variableEditorSchema } = useValidationSchemas();\n const form = useForm<VariableDefinition>({\n resolver: zodResolver(variableEditorSchema),\n mode: 'onBlur',\n defaultValues: initialVariableDefinition,\n });\n\n const kind = useWatch({ control: form.control, name: 'kind' });\n\n function clearFormData(data: VariableDefinition): VariableDefinition {\n const result = { ...data };\n if (\n result.spec.display?.name === undefined &&\n result.spec.display?.description === undefined &&\n result.spec.display?.hidden === undefined\n ) {\n delete result.spec.display;\n }\n return result;\n }\n\n const processForm: SubmitHandler<VariableDefinition> = (data: VariableDefinition) => {\n // reset display attributes to undefined when empty, because we don't want to save empty strings\n onSave(clearFormData(data));\n };\n\n // When user click on cancel, several possibilities:\n // - create action: ask for discard approval\n // - update action: ask for discard approval if changed\n // - read action: don´t ask for discard approval\n function handleCancel() {\n if (JSON.stringify(initialVariableDefinition) !== JSON.stringify(clearFormData(form.getValues()))) {\n setDiscardDialogOpened(true);\n } else {\n onClose();\n }\n }\n\n return (\n <FormProvider {...form}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: (theme) => theme.spacing(1, 2),\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h2\">{titleAction} Variable</Typography>\n <Stack direction=\"row\" spacing={1} sx={{ marginLeft: 'auto' }}>\n {action === 'read' ? (\n <>\n <Button disabled={isReadonly} variant=\"contained\" onClick={() => setAction('update')}>\n Edit\n </Button>\n <Button color=\"error\" disabled={isReadonly} variant=\"outlined\" onClick={onDelete}>\n Delete\n </Button>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={(theme) => ({\n borderColor: theme.palette.grey['500'],\n '&.MuiDivider-root': {\n marginLeft: 2,\n marginRight: 1,\n },\n })}\n />\n <Button color=\"secondary\" variant=\"outlined\" onClick={onClose}>\n Close\n </Button>\n </>\n ) : (\n <>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={!form.formState.isValid}\n onClick={form.handleSubmit(processForm)}\n >\n {submitText}\n </Button>\n <Button color=\"secondary\" variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n </>\n )}\n </Stack>\n </Box>\n <Box padding={2} sx={{ overflowY: 'scroll' }}>\n <Grid container spacing={2} mb={2}>\n <Grid item xs={8}>\n <Controller\n control={form.control}\n name=\"spec.name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n required\n fullWidth\n label=\"Name\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n disabled: action === 'update' && !isDraft,\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={4}>\n <Controller\n control={form.control}\n name=\"spec.display.name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n label=\"Display Label\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={8}>\n <Controller\n control={form.control}\n name=\"spec.display.description\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n label=\"Description\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={4}>\n <Controller\n control={form.control}\n name=\"kind\"\n render={({ field, fieldState }) => (\n <TextField\n select\n {...field}\n fullWidth\n label=\"Type\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? 'TextVariable'}\n onChange={(event) => {\n field.onChange(event);\n }}\n >\n {VARIABLE_TYPES.map((v) => (\n <MenuItem key={v.kind} value={v.kind}>\n {v.label}\n </MenuItem>\n ))}\n </TextField>\n )}\n />\n </Grid>\n </Grid>\n\n <Divider />\n\n {kind === 'TextVariable' && (\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <TextVariableEditorForm action={action} control={form.control} />\n </ErrorBoundary>\n )}\n {kind === 'ListVariable' && (\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <ListVariableEditorForm action={action} control={form.control} />\n </ErrorBoundary>\n )}\n </Box>\n <DiscardChangesConfirmationDialog\n description=\"Are you sure you want to discard these changes? Changes cannot be recovered.\"\n isOpen={isDiscardDialogOpened}\n onCancel={() => {\n setDiscardDialogOpened(false);\n }}\n onDiscardChanges={() => {\n setDiscardDialogOpened(false);\n onClose();\n }}\n />\n </FormProvider>\n );\n}\n"],"names":["React","useState","Box","Typography","Switch","TextField","Grid","FormControlLabel","MenuItem","Button","Stack","ClickAwayListener","Divider","DiscardChangesConfirmationDialog","ErrorAlert","ErrorBoundary","Controller","FormProvider","useForm","useFormContext","useWatch","zodResolver","getSubmitText","getTitleAction","VARIABLE_TYPES","PluginEditor","useValidationSchemas","VariableListPreview","VariablePreview","FallbackPreview","div","TextVariableEditorForm","action","control","py","variant","spacing","name","render","field","fieldState","values","value","label","InputLabelProps","shrink","undefined","InputProps","readOnly","error","helperText","message","onChange","event","checked","ListVariableEditorForm","form","previewSpec","setPreviewSpec","getValues","refreshPreview","kind","_allowAllValue","spec","allowAllValue","setValue","allowMultiple","mb","FallbackComponent","resetKeys","definition","onRefresh","isLoading","onClickAway","width","pluginTypes","pluginKindLabel","selection","type","isReadonly","v","target","select","fullWidth","VariableEditorForm","props","initialVariableDefinition","initialAction","isDraft","onSave","onClose","onDelete","isDiscardDialogOpened","setDiscardDialogOpened","setAction","titleAction","submitText","variableEditorSchema","resolver","mode","defaultValues","clearFormData","data","result","display","description","hidden","processForm","handleCancel","JSON","stringify","sx","alignItems","padding","theme","borderBottom","palette","divider","direction","marginLeft","disabled","onClick","color","orientation","flexItem","borderColor","grey","marginRight","formState","isValid","handleSubmit","overflowY","container","item","xs","required","map","isOpen","onCancel","onDiscardChanges"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/Variables/VariableEditorForm/VariableEditorForm.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { DispatchWithoutAction, useState } from 'react';\nimport {\n Box,\n Typography,\n Switch,\n TextField,\n Grid,\n FormControlLabel,\n MenuItem,\n Button,\n Stack,\n ClickAwayListener,\n Divider,\n} from '@mui/material';\nimport { VariableDefinition, ListVariableDefinition, Action } from '@perses-dev/core';\nimport { DiscardChangesConfirmationDialog, ErrorAlert, ErrorBoundary } from '@perses-dev/components';\nimport { Control, Controller, FormProvider, SubmitHandler, useForm, useFormContext, useWatch } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { getSubmitText, getTitleAction } from '../../../utils';\nimport { VARIABLE_TYPES } from '../variable-model';\nimport { PluginEditor } from '../../PluginEditor';\nimport { useValidationSchemas } from '../../../context';\nimport { VariableListPreview, VariablePreview } from './VariablePreview';\n\nfunction FallbackPreview() {\n return <div>Error previewing values</div>;\n}\n\ninterface KindVariableEditorFormProps {\n action: Action;\n control: Control<VariableDefinition>;\n}\n\nfunction TextVariableEditorForm({ action, control }: KindVariableEditorFormProps) {\n return (\n <>\n <Typography py={1} variant=\"subtitle1\">\n Text Options\n </Typography>\n <Stack spacing={2}>\n <Controller\n control={control}\n name=\"spec.value\"\n render={({ field, fieldState }) => (\n <>\n <Box>\n <VariablePreview values={[field.value]} />\n </Box>\n <TextField\n {...field}\n label=\"Value\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n </>\n )}\n />\n <Controller\n control={control}\n name=\"spec.constant\"\n render={({ field }) => (\n <FormControlLabel\n label=\"Constant\"\n control={\n <Switch\n {...field}\n checked={!!field.value}\n readOnly={action === 'read'}\n value={field.value ?? false}\n onChange={(event) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n field.onChange(event);\n }}\n />\n }\n />\n )}\n />\n </Stack>\n </>\n );\n}\n\nfunction ListVariableEditorForm({ action, control }: KindVariableEditorFormProps) {\n const form = useFormContext<VariableDefinition>();\n /** We use `previewSpec` to know when to explicitly update the\n * spec that will be used for preview. The reason why we do this is to avoid\n * having to re-fetch the values when the user is still editing the spec.\n */\n const [previewSpec, setPreviewSpec] = useState<ListVariableDefinition>(form.getValues() as ListVariableDefinition);\n const refreshPreview = () => {\n setPreviewSpec(form.getValues() as ListVariableDefinition);\n };\n\n const kind = useWatch<VariableDefinition, 'spec.plugin.kind'>({ control: control, name: 'spec.plugin.kind' });\n const _allowAllValue = useWatch<VariableDefinition, 'spec.allowAllValue'>({\n control: control,\n name: 'spec.allowAllValue',\n });\n\n // When variable kind is selected we need to provide default values\n // TODO: check if react-hook-form has a better way to do this\n const values = form.getValues() as ListVariableDefinition;\n if (values.spec.allowAllValue === undefined) {\n form.setValue('spec.allowAllValue', false);\n }\n\n if (values.spec.allowMultiple === undefined) {\n form.setValue('spec.allowMultiple', false);\n }\n\n return (\n <>\n <Typography py={1} variant=\"subtitle1\">\n List Options\n </Typography>\n <Stack spacing={2} mb={2}>\n {kind ? (\n <Box>\n <ErrorBoundary FallbackComponent={FallbackPreview} resetKeys={[previewSpec]}>\n <VariableListPreview definition={previewSpec} onRefresh={refreshPreview} />\n </ErrorBoundary>\n </Box>\n ) : (\n <VariablePreview isLoading={true} />\n )}\n\n <Stack>\n {/** Hack?: Cool technique to refresh the preview to simulate onBlur event */}\n <ClickAwayListener onClickAway={() => refreshPreview()}>\n <Box />\n </ClickAwayListener>\n {/** **/}\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <Controller\n control={control}\n name=\"spec.plugin\"\n render={({ field }) => (\n <PluginEditor\n width=\"100%\"\n pluginTypes={['Variable']}\n pluginKindLabel=\"Source\"\n value={{\n selection: {\n type: 'Variable',\n kind: field.value?.kind ?? 'StaticListVariable',\n },\n spec: field.value?.spec ?? { values: [] },\n }}\n isReadonly={action === 'read'}\n onChange={(v) => {\n field.onChange({ kind: v.selection.kind, spec: v.spec });\n }}\n />\n )}\n />\n </ErrorBoundary>\n </Stack>\n\n <Stack>\n <Controller\n control={control}\n name=\"spec.capturingRegexp\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n label=\"Capturing Regexp Filter\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n value={field.value ?? ''}\n onChange={(event) => {\n if (event.target.value === '') {\n field.onChange(undefined);\n } else {\n field.onChange(event);\n }\n }}\n helperText={\n fieldState.error?.message\n ? fieldState.error.message\n : 'Optional, if you want to filter on captured result.'\n }\n />\n )}\n />\n </Stack>\n\n <Stack>\n <Controller\n control={control}\n name=\"spec.sort\"\n render={({ field, fieldState }) => (\n <TextField\n select\n {...field}\n fullWidth\n label=\"Sort\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? 'none'}\n onChange={(event) => {\n field.onChange(event);\n }}\n >\n <MenuItem value=\"none\">None</MenuItem>\n <MenuItem value=\"alphabetical-asc\">Alphabetical, asc</MenuItem>\n <MenuItem value=\"alphabetical-desc\">Alphabetical, desc</MenuItem>\n <MenuItem value=\"numerical-asc\">Numerical, asc</MenuItem>\n <MenuItem value=\"numerical-desc\">Numerical, desc</MenuItem>\n <MenuItem value=\"alphabetical-ci-asc\">Alphabetical, case-insensitive, asc</MenuItem>\n <MenuItem value=\"alphabetical-ci-desc\">Alphabetical, case-insensitive, desc</MenuItem>\n </TextField>\n )}\n />\n </Stack>\n </Stack>\n\n <Divider />\n\n <Typography py={1} variant=\"subtitle1\">\n Dropdown Options\n </Typography>\n <Stack spacing=\"2\">\n <Stack>\n <Controller\n control={control}\n name=\"spec.allowMultiple\"\n render={({ field }) => (\n <FormControlLabel\n label=\"Allow Multiple Values\"\n control={\n <Switch\n {...field}\n checked={!!field.value}\n readOnly={action === 'read'}\n value={field.value ?? false}\n onChange={(event) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n field.onChange(event);\n }}\n />\n }\n />\n )}\n />\n <Typography variant=\"caption\">Enables multiple values to be selected at the same time</Typography>\n </Stack>\n <Stack>\n <Controller\n control={control}\n name=\"spec.allowAllValue\"\n render={({ field }) => (\n <FormControlLabel\n label=\"Allow All option\"\n control={\n <Switch\n {...field}\n checked={!!field.value}\n readOnly={action === 'read'}\n value={field.value ?? false}\n onChange={(event) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n field.onChange(event);\n }}\n />\n }\n />\n )}\n />\n <Typography mb={1} variant=\"caption\">\n Enables an option to include all variable values\n </Typography>\n {_allowAllValue && (\n <Controller\n control={control}\n name=\"spec.customAllValue\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n label=\"Custom All Value\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={\n fieldState.error?.message\n ? fieldState.error.message\n : 'When All is selected, this value will be used'\n }\n value={field.value ?? ''}\n onChange={(event) => {\n if (event.target.value === '') {\n field.onChange(undefined);\n } else {\n field.onChange(event);\n }\n }}\n />\n )}\n />\n )}\n </Stack>\n </Stack>\n </>\n );\n}\n\ninterface VariableEditorFormProps {\n initialVariableDefinition: VariableDefinition;\n initialAction: Action;\n isDraft: boolean;\n isReadonly?: boolean;\n onSave: (def: VariableDefinition) => void;\n onClose: () => void;\n onDelete?: DispatchWithoutAction;\n}\n\nexport function VariableEditorForm(props: VariableEditorFormProps) {\n const { initialVariableDefinition, initialAction, isDraft, isReadonly, onSave, onClose, onDelete } = props;\n\n const [isDiscardDialogOpened, setDiscardDialogOpened] = useState<boolean>(false);\n const [action, setAction] = useState(initialAction);\n const titleAction = getTitleAction(action, isDraft);\n const submitText = getSubmitText(action, isDraft);\n\n const { variableEditorSchema } = useValidationSchemas();\n const form = useForm<VariableDefinition>({\n resolver: zodResolver(variableEditorSchema),\n mode: 'onBlur',\n defaultValues: initialVariableDefinition,\n });\n\n const kind = useWatch({ control: form.control, name: 'kind' });\n\n function clearFormData(data: VariableDefinition): VariableDefinition {\n const result = { ...data };\n if (\n result.spec.display?.name === undefined &&\n result.spec.display?.description === undefined &&\n result.spec.display?.hidden === undefined\n ) {\n delete result.spec.display;\n }\n return result;\n }\n\n const processForm: SubmitHandler<VariableDefinition> = (data: VariableDefinition) => {\n // reset display attributes to undefined when empty, because we don't want to save empty strings\n onSave(clearFormData(data));\n };\n\n // When user click on cancel, several possibilities:\n // - create action: ask for discard approval\n // - update action: ask for discard approval if changed\n // - read action: don´t ask for discard approval\n function handleCancel() {\n if (JSON.stringify(initialVariableDefinition) !== JSON.stringify(clearFormData(form.getValues()))) {\n setDiscardDialogOpened(true);\n } else {\n onClose();\n }\n }\n\n return (\n <FormProvider {...form}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: (theme) => theme.spacing(1, 2),\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h2\">{titleAction} Variable</Typography>\n <Stack direction=\"row\" spacing={1} sx={{ marginLeft: 'auto' }}>\n {action === 'read' ? (\n <>\n <Button disabled={isReadonly} variant=\"contained\" onClick={() => setAction('update')}>\n Edit\n </Button>\n <Button color=\"error\" disabled={isReadonly} variant=\"outlined\" onClick={onDelete}>\n Delete\n </Button>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={(theme) => ({\n borderColor: theme.palette.grey['500'],\n '&.MuiDivider-root': {\n marginLeft: 2,\n marginRight: 1,\n },\n })}\n />\n <Button color=\"secondary\" variant=\"outlined\" onClick={onClose}>\n Close\n </Button>\n </>\n ) : (\n <>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={!form.formState.isValid}\n onClick={form.handleSubmit(processForm)}\n >\n {submitText}\n </Button>\n <Button color=\"secondary\" variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n </>\n )}\n </Stack>\n </Box>\n <Box padding={2} sx={{ overflowY: 'scroll' }}>\n <Grid container spacing={2} mb={2}>\n <Grid item xs={8}>\n <Controller\n control={form.control}\n name=\"spec.name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n required\n fullWidth\n label=\"Name\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n disabled: action === 'update' && !isDraft,\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={4}>\n <Controller\n control={form.control}\n name=\"spec.display.name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n label=\"Display Label\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={8}>\n <Controller\n control={form.control}\n name=\"spec.display.description\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n label=\"Description\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? ''}\n onChange={(event) => {\n field.onChange(event);\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={4}>\n <Controller\n control={form.control}\n name=\"kind\"\n render={({ field, fieldState }) => (\n <TextField\n select\n {...field}\n fullWidth\n label=\"Type\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n value={field.value ?? 'TextVariable'}\n onChange={(event) => {\n field.onChange(event);\n }}\n >\n {VARIABLE_TYPES.map((v) => (\n <MenuItem key={v.kind} value={v.kind}>\n {v.label}\n </MenuItem>\n ))}\n </TextField>\n )}\n />\n </Grid>\n </Grid>\n\n <Divider />\n\n {kind === 'TextVariable' && (\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <TextVariableEditorForm action={action} control={form.control} />\n </ErrorBoundary>\n )}\n {kind === 'ListVariable' && (\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <ListVariableEditorForm action={action} control={form.control} />\n </ErrorBoundary>\n )}\n </Box>\n <DiscardChangesConfirmationDialog\n description=\"Are you sure you want to discard these changes? Changes cannot be recovered.\"\n isOpen={isDiscardDialogOpened}\n onCancel={() => {\n setDiscardDialogOpened(false);\n }}\n onDiscardChanges={() => {\n setDiscardDialogOpened(false);\n onClose();\n }}\n />\n </FormProvider>\n );\n}\n"],"names":["React","useState","Box","Typography","Switch","TextField","Grid","FormControlLabel","MenuItem","Button","Stack","ClickAwayListener","Divider","DiscardChangesConfirmationDialog","ErrorAlert","ErrorBoundary","Controller","FormProvider","useForm","useFormContext","useWatch","zodResolver","getSubmitText","getTitleAction","VARIABLE_TYPES","PluginEditor","useValidationSchemas","VariableListPreview","VariablePreview","FallbackPreview","div","TextVariableEditorForm","action","control","py","variant","spacing","name","render","field","fieldState","values","value","label","InputLabelProps","shrink","undefined","InputProps","readOnly","error","helperText","message","onChange","event","checked","ListVariableEditorForm","form","previewSpec","setPreviewSpec","getValues","refreshPreview","kind","_allowAllValue","spec","allowAllValue","setValue","allowMultiple","mb","FallbackComponent","resetKeys","definition","onRefresh","isLoading","onClickAway","width","pluginTypes","pluginKindLabel","selection","type","isReadonly","v","target","select","fullWidth","VariableEditorForm","props","initialVariableDefinition","initialAction","isDraft","onSave","onClose","onDelete","isDiscardDialogOpened","setDiscardDialogOpened","setAction","titleAction","submitText","variableEditorSchema","resolver","mode","defaultValues","clearFormData","data","result","display","description","hidden","processForm","handleCancel","JSON","stringify","sx","alignItems","padding","theme","borderBottom","palette","divider","direction","marginLeft","disabled","onClick","color","orientation","flexItem","borderColor","grey","marginRight","formState","isValid","handleSubmit","overflowY","container","item","xs","required","map","isOpen","onCancel","onDiscardChanges"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@perses-dev/plugin-system",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.48.0-rc0",
|
|
4
4
|
"description": "The plugin feature in Pereses",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/perses/perses/blob/main/README.md",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"lint:fix": "eslint --fix src --ext .ts,.tsx"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@perses-dev/components": "0.
|
|
32
|
-
"@perses-dev/core": "0.
|
|
31
|
+
"@perses-dev/components": "0.48.0-rc0",
|
|
32
|
+
"@perses-dev/core": "0.48.0-rc0",
|
|
33
33
|
"date-fns": "^2.30.0",
|
|
34
34
|
"immer": "^9.0.15",
|
|
35
35
|
"react-hook-form": "^7.46.1",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"zod": "^3.22.2"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@perses-dev/storybook": "0.
|
|
41
|
+
"@perses-dev/storybook": "0.48.0-rc0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@mui/material": "^5.15.20",
|