@perses-dev/dashboards 0.29.1 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/cjs/components/DashboardStickyToolbar/DashboardStickyToolbar.js +79 -0
  2. package/dist/cjs/{stories/decorators/WithQueryClient.js → components/DashboardStickyToolbar/index.js} +11 -12
  3. package/dist/cjs/components/DashboardToolbar/DashboardToolbar.js +8 -24
  4. package/dist/cjs/components/EditJsonButton/EditJsonButton.js +1 -0
  5. package/dist/cjs/components/EditJsonDialog/EditJsonDialog.js +5 -0
  6. package/dist/cjs/components/GridLayout/GridTitle.js +30 -9
  7. package/dist/cjs/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +88 -0
  8. package/dist/cjs/{stories/decorators/WithQueryParams.js → components/SaveChangesConfirmationDialog/index.js} +11 -12
  9. package/dist/cjs/components/SaveDashboardButton/SaveDashboardButton.js +78 -0
  10. package/dist/cjs/components/SaveDashboardButton/index.js +28 -0
  11. package/dist/cjs/components/TimeRangeControls/TimeRangeControls.js +5 -5
  12. package/dist/cjs/components/Variables/VariableEditorForm/VariableEditorForm.js +124 -198
  13. package/dist/cjs/components/Variables/VariableEditorForm/VariablePreview.js +178 -0
  14. package/dist/cjs/components/Variables/VariableEditorForm/index.js +1 -0
  15. package/dist/cjs/components/Variables/VariableEditorForm/variable-editor-form-model.js +7 -8
  16. package/dist/cjs/components/Variables/VariableList.js +16 -55
  17. package/dist/cjs/components/Variables/index.js +1 -0
  18. package/dist/cjs/components/index.js +2 -0
  19. package/dist/cjs/context/DashboardProvider/DashboardProvider.js +5 -4
  20. package/dist/cjs/context/DashboardProvider/dashboard-provider-api.js +13 -4
  21. package/dist/cjs/context/DashboardProvider/save-changes-dialog-slice.js +33 -0
  22. package/dist/cjs/context/TemplateVariableProvider/TemplateVariableProvider.js +56 -7
  23. package/dist/cjs/context/TemplateVariableProvider/hydrationUtils.js +2 -0
  24. package/dist/cjs/context/TemplateVariableProvider/utils.js +37 -0
  25. package/dist/cjs/context/useDashboard.js +4 -4
  26. package/dist/cjs/stories/decorators/index.js +0 -5
  27. package/dist/cjs/views/ViewDashboard/DashboardApp.js +2 -1
  28. package/dist/components/DashboardStickyToolbar/DashboardStickyToolbar.d.ts +9 -0
  29. package/dist/components/DashboardStickyToolbar/DashboardStickyToolbar.d.ts.map +1 -0
  30. package/dist/components/DashboardStickyToolbar/DashboardStickyToolbar.js +68 -0
  31. package/dist/components/DashboardStickyToolbar/DashboardStickyToolbar.js.map +1 -0
  32. package/dist/components/DashboardStickyToolbar/index.d.ts +2 -0
  33. package/dist/components/DashboardStickyToolbar/index.d.ts.map +1 -0
  34. package/dist/{stories/decorators/WithQueryClient.js → components/DashboardStickyToolbar/index.js} +2 -10
  35. package/dist/components/DashboardStickyToolbar/index.js.map +1 -0
  36. package/dist/components/DashboardToolbar/DashboardToolbar.d.ts.map +1 -1
  37. package/dist/components/DashboardToolbar/DashboardToolbar.js +10 -26
  38. package/dist/components/DashboardToolbar/DashboardToolbar.js.map +1 -1
  39. package/dist/components/EditJsonButton/EditJsonButton.js +1 -0
  40. package/dist/components/EditJsonButton/EditJsonButton.js.map +1 -1
  41. package/dist/components/EditJsonDialog/EditJsonDialog.d.ts.map +1 -1
  42. package/dist/components/EditJsonDialog/EditJsonDialog.js +5 -0
  43. package/dist/components/EditJsonDialog/EditJsonDialog.js.map +1 -1
  44. package/dist/components/GridLayout/GridTitle.d.ts.map +1 -1
  45. package/dist/components/GridLayout/GridTitle.js +30 -9
  46. package/dist/components/GridLayout/GridTitle.js.map +1 -1
  47. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.d.ts +3 -0
  48. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.d.ts.map +1 -0
  49. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +82 -0
  50. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js.map +1 -0
  51. package/dist/components/SaveChangesConfirmationDialog/index.d.ts +2 -0
  52. package/dist/components/SaveChangesConfirmationDialog/index.d.ts.map +1 -0
  53. package/dist/{stories/decorators/WithQueryParams.js → components/SaveChangesConfirmationDialog/index.js} +2 -10
  54. package/dist/components/SaveChangesConfirmationDialog/index.js.map +1 -0
  55. package/dist/components/SaveDashboardButton/SaveDashboardButton.d.ts +10 -0
  56. package/dist/components/SaveDashboardButton/SaveDashboardButton.d.ts.map +1 -0
  57. package/dist/components/SaveDashboardButton/SaveDashboardButton.js +72 -0
  58. package/dist/components/SaveDashboardButton/SaveDashboardButton.js.map +1 -0
  59. package/dist/components/SaveDashboardButton/index.d.ts +2 -0
  60. package/dist/components/SaveDashboardButton/index.d.ts.map +1 -0
  61. package/dist/components/SaveDashboardButton/index.js +15 -0
  62. package/dist/components/SaveDashboardButton/index.js.map +1 -0
  63. package/dist/components/TimeRangeControls/TimeRangeControls.js +6 -6
  64. package/dist/components/TimeRangeControls/TimeRangeControls.js.map +1 -1
  65. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.d.ts +4 -2
  66. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.d.ts.map +1 -1
  67. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js +127 -196
  68. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js.map +1 -1
  69. package/dist/components/Variables/VariableEditorForm/VariablePreview.d.ts +16 -0
  70. package/dist/components/Variables/VariableEditorForm/VariablePreview.d.ts.map +1 -0
  71. package/dist/components/Variables/VariableEditorForm/VariablePreview.js +122 -0
  72. package/dist/components/Variables/VariableEditorForm/VariablePreview.js.map +1 -0
  73. package/dist/components/Variables/VariableEditorForm/index.d.ts +1 -0
  74. package/dist/components/Variables/VariableEditorForm/index.d.ts.map +1 -1
  75. package/dist/components/Variables/VariableEditorForm/index.js +1 -0
  76. package/dist/components/Variables/VariableEditorForm/index.js.map +1 -1
  77. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.d.ts.map +1 -1
  78. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.js +7 -8
  79. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.js.map +1 -1
  80. package/dist/components/Variables/VariableList.d.ts +1 -7
  81. package/dist/components/Variables/VariableList.d.ts.map +1 -1
  82. package/dist/components/Variables/VariableList.js +18 -52
  83. package/dist/components/Variables/VariableList.js.map +1 -1
  84. package/dist/components/Variables/index.d.ts +1 -0
  85. package/dist/components/Variables/index.d.ts.map +1 -1
  86. package/dist/components/Variables/index.js +1 -0
  87. package/dist/components/Variables/index.js.map +1 -1
  88. package/dist/components/index.d.ts +2 -0
  89. package/dist/components/index.d.ts.map +1 -1
  90. package/dist/components/index.js +2 -0
  91. package/dist/components/index.js.map +1 -1
  92. package/dist/context/DashboardProvider/DashboardProvider.d.ts +4 -3
  93. package/dist/context/DashboardProvider/DashboardProvider.d.ts.map +1 -1
  94. package/dist/context/DashboardProvider/DashboardProvider.js +5 -4
  95. package/dist/context/DashboardProvider/DashboardProvider.js.map +1 -1
  96. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts +6 -1
  97. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts.map +1 -1
  98. package/dist/context/DashboardProvider/dashboard-provider-api.js +11 -3
  99. package/dist/context/DashboardProvider/dashboard-provider-api.js.map +1 -1
  100. package/dist/context/DashboardProvider/save-changes-dialog-slice.d.ts +15 -0
  101. package/dist/context/DashboardProvider/save-changes-dialog-slice.d.ts.map +1 -0
  102. package/dist/context/DashboardProvider/save-changes-dialog-slice.js +27 -0
  103. package/dist/context/DashboardProvider/save-changes-dialog-slice.js.map +1 -0
  104. package/dist/context/TemplateVariableProvider/TemplateVariableProvider.d.ts +4 -0
  105. package/dist/context/TemplateVariableProvider/TemplateVariableProvider.d.ts.map +1 -1
  106. package/dist/context/TemplateVariableProvider/TemplateVariableProvider.js +51 -7
  107. package/dist/context/TemplateVariableProvider/TemplateVariableProvider.js.map +1 -1
  108. package/dist/context/TemplateVariableProvider/hydrationUtils.d.ts.map +1 -1
  109. package/dist/context/TemplateVariableProvider/hydrationUtils.js +2 -0
  110. package/dist/context/TemplateVariableProvider/hydrationUtils.js.map +1 -1
  111. package/dist/context/TemplateVariableProvider/utils.d.ts +4 -0
  112. package/dist/context/TemplateVariableProvider/utils.d.ts.map +1 -0
  113. package/dist/context/TemplateVariableProvider/utils.js +33 -0
  114. package/dist/context/TemplateVariableProvider/utils.js.map +1 -0
  115. package/dist/context/useDashboard.d.ts.map +1 -1
  116. package/dist/context/useDashboard.js +4 -4
  117. package/dist/context/useDashboard.js.map +1 -1
  118. package/dist/stories/decorators/WithDashboard.js.map +1 -1
  119. package/dist/stories/decorators/WithDatasourceStore.js.map +1 -1
  120. package/dist/stories/decorators/WithTemplateVariables.js.map +1 -1
  121. package/dist/stories/decorators/index.js +0 -5
  122. package/dist/stories/decorators/index.js.map +1 -1
  123. package/dist/views/ViewDashboard/DashboardApp.d.ts.map +1 -1
  124. package/dist/views/ViewDashboard/DashboardApp.js +3 -2
  125. package/dist/views/ViewDashboard/DashboardApp.js.map +1 -1
  126. package/package.json +6 -6
  127. package/dist/cjs/stories/decorators/WithDataQueriesProvider.js +0 -39
  128. package/dist/cjs/stories/decorators/WithPluginRegistry.js +0 -94
  129. package/dist/cjs/stories/decorators/WithTimeRange.js +0 -38
  130. package/dist/stories/decorators/WithDataQueriesProvider.js +0 -33
  131. package/dist/stories/decorators/WithDataQueriesProvider.js.map +0 -1
  132. package/dist/stories/decorators/WithPluginRegistry.js +0 -49
  133. package/dist/stories/decorators/WithPluginRegistry.js.map +0 -1
  134. package/dist/stories/decorators/WithQueryClient.js.map +0 -1
  135. package/dist/stories/decorators/WithQueryParams.js.map +0 -1
  136. package/dist/stories/decorators/WithTimeRange.js +0 -32
  137. package/dist/stories/decorators/WithTimeRange.js.map +0 -1
@@ -24,16 +24,9 @@ const _material = require("@mui/material");
24
24
  const _useImmer = require("use-immer");
25
25
  const _pluginSystem = require("@perses-dev/plugin-system");
26
26
  const _components = require("@perses-dev/components");
27
- const _refresh = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/Refresh"));
28
- const _clipboardOutline = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/ClipboardOutline"));
29
- const _constants = require("../../../constants");
30
27
  const _variableModel = require("../variable-model");
28
+ const _variablePreview = require("./VariablePreview");
31
29
  const _variableEditorFormModel = require("./variable-editor-form-model");
32
- function _interopRequireDefault(obj) {
33
- return obj && obj.__esModule ? obj : {
34
- default: obj
35
- };
36
- }
37
30
  function _getRequireWildcardCache(nodeInterop) {
38
31
  if (typeof WeakMap !== "function") return null;
39
32
  var cacheBabelInterop = new WeakMap();
@@ -73,7 +66,6 @@ function _interopRequireWildcard(obj, nodeInterop) {
73
66
  }
74
67
  return newObj;
75
68
  }
76
- const DEFAULT_MAX_PREVIEW_VALUES = 50;
77
69
  // TODO: Replace with proper validation library
78
70
  function getValidation(state) {
79
71
  /** Name validation */ let name = null;
@@ -89,100 +81,22 @@ function getValidation(state) {
89
81
  isValid: !name
90
82
  };
91
83
  }
92
- const SectionHeader = ({ children })=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
93
- pb: 2,
94
- variant: "subtitle1",
95
- children: children
96
- });
97
- function VariableListPreview({ definition , onRefresh }) {
98
- const { data , isFetching , error } = (0, _variableModel.useListVariablePluginValues)(definition);
99
- const [maxValues, setMaxValues] = (0, _react.useState)(DEFAULT_MAX_PREVIEW_VALUES);
100
- const showAll = ()=>{
101
- setMaxValues(undefined);
102
- };
103
- let notShown = 0;
104
- if (data && (data === null || data === void 0 ? void 0 : data.length) > 0 && maxValues) {
105
- notShown = data.length - maxValues;
106
- }
107
- const errorMessage = error === null || error === void 0 ? void 0 : error.message;
108
- return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Box, {
109
- children: [
110
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
111
- direction: 'row',
112
- spacing: 1,
113
- alignItems: "center",
114
- children: [
115
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
116
- variant: "caption",
117
- children: "Preview Values"
118
- }),
119
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
120
- description: _constants.TOOLTIP_TEXT.refreshVariableValues,
121
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
122
- onClick: onRefresh,
123
- size: "small",
124
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_refresh.default, {})
125
- })
126
- }),
127
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
128
- description: _constants.TOOLTIP_TEXT.copyVariableValues,
129
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
130
- onClick: async ()=>{
131
- if (data === null || data === void 0 ? void 0 : data.length) {
132
- await navigator.clipboard.writeText(data.map((d)=>d.label).join(','));
133
- alert('Copied to clipboard!');
134
- }
135
- },
136
- size: "small",
137
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_clipboardOutline.default, {})
138
- })
139
- })
140
- ]
141
- }),
142
- errorMessage && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Alert, {
143
- severity: "error",
144
- children: errorMessage
145
- }),
146
- isFetching && 'Loading...',
147
- (data === null || data === void 0 ? void 0 : data.length) === 0 && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Alert, {
148
- severity: "info",
149
- children: "No results"
150
- }),
151
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
152
- children: [
153
- data === null || data === void 0 ? void 0 : data.slice(0, maxValues).map((val)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Chip, {
154
- sx: {
155
- mr: 1,
156
- mb: 1
157
- },
158
- size: "small",
159
- label: val.label
160
- }, val.value)),
161
- notShown > 0 && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Chip, {
162
- onClick: showAll,
163
- variant: "outlined",
164
- sx: {
165
- mr: 1,
166
- mb: 1
167
- },
168
- size: "small",
169
- label: `+${notShown} more`
170
- })
171
- ]
172
- })
173
- ]
84
+ function FallbackPreview() {
85
+ return /*#__PURE__*/ (0, _jsxRuntime.jsx)("div", {
86
+ children: "Error previewing values"
174
87
  });
175
88
  }
176
- function VariableEditForm({ initialVariableDefinition , onChange , onCancel }) {
89
+ function VariableEditForm(props) {
90
+ const { initialVariableDefinition , onChange , onCancel } = props;
177
91
  const [state, setState] = (0, _useImmer.useImmer)((0, _variableEditorFormModel.getInitialState)(initialVariableDefinition));
178
92
  const validation = (0, _react.useMemo)(()=>getValidation(state), [
179
93
  state
180
94
  ]);
181
- const [previewKey, setPreviewKey] = _react.default.useState(0);
95
+ const [previewKey, setPreviewKey] = (0, _react.useState)(0);
182
96
  const refreshPreview = ()=>{
183
97
  setPreviewKey((prev)=>prev + 1);
184
98
  };
185
- /** We use the `previewKey` that we increment to know when to explicity update the
99
+ /** We use the `previewKey` that we increment to know when to explicitly update the
186
100
  * spec that will be used for preview. The reason why we do this is to avoid
187
101
  * having to re-fetch the values when the user is still editing the spec.
188
102
  */ const previewSpec = (0, _react.useMemo)(()=>{
@@ -238,9 +152,6 @@ function VariableEditForm({ initialVariableDefinition , onChange , onCancel })
238
152
  overflowY: 'scroll'
239
153
  },
240
154
  children: [
241
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(SectionHeader, {
242
- children: "General"
243
- }),
244
155
  /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Grid, {
245
156
  container: true,
246
157
  spacing: 2,
@@ -248,7 +159,7 @@ function VariableEditForm({ initialVariableDefinition , onChange , onCancel })
248
159
  children: [
249
160
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Grid, {
250
161
  item: true,
251
- xs: 6,
162
+ xs: 8,
252
163
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
253
164
  required: true,
254
165
  error: !!validation.name,
@@ -265,7 +176,35 @@ function VariableEditForm({ initialVariableDefinition , onChange , onCancel })
265
176
  }),
266
177
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Grid, {
267
178
  item: true,
268
- xs: 6,
179
+ xs: 4,
180
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
181
+ fullWidth: true,
182
+ label: "Display Label",
183
+ value: state.title || '',
184
+ onChange: (v)=>{
185
+ setState((draft)=>{
186
+ draft.title = v.target.value;
187
+ });
188
+ }
189
+ })
190
+ }),
191
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Grid, {
192
+ item: true,
193
+ xs: 8,
194
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
195
+ fullWidth: true,
196
+ label: "Description",
197
+ value: state.description,
198
+ onChange: (v)=>{
199
+ setState((draft)=>{
200
+ draft.description = v.target.value;
201
+ });
202
+ }
203
+ })
204
+ }),
205
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Grid, {
206
+ item: true,
207
+ xs: 4,
269
208
  children: /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.FormControl, {
270
209
  fullWidth: true,
271
210
  children: [
@@ -290,50 +229,28 @@ function VariableEditForm({ initialVariableDefinition , onChange , onCancel })
290
229
  })
291
230
  ]
292
231
  })
293
- }),
294
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Grid, {
295
- item: true,
296
- xs: 6,
297
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
298
- fullWidth: true,
299
- label: "Display Label",
300
- value: state.title || '',
301
- onChange: (v)=>{
302
- setState((draft)=>{
303
- draft.title = v.target.value;
304
- });
305
- }
306
- })
307
- }),
308
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Grid, {
309
- item: true,
310
- xs: 12,
311
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
312
- fullWidth: true,
313
- label: "Description",
314
- value: state.description,
315
- onChange: (v)=>{
316
- setState((draft)=>{
317
- draft.description = v.target.value;
318
- });
319
- }
320
- })
321
232
  })
322
233
  ]
323
234
  }),
235
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Divider, {}),
324
236
  state.kind === 'TextVariable' && /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
325
237
  children: [
326
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(SectionHeader, {
238
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
239
+ py: 1,
240
+ variant: "subtitle1",
327
241
  children: "Text Options"
328
242
  }),
329
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Grid, {
330
- container: true,
243
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
331
244
  spacing: 2,
332
- mb: 2,
333
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Grid, {
334
- item: true,
335
- xs: 12,
336
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
245
+ children: [
246
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Box, {
247
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_variablePreview.VariablePreview, {
248
+ values: [
249
+ state.textVariableFields.value
250
+ ]
251
+ })
252
+ }),
253
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
337
254
  label: "Value",
338
255
  value: state.textVariableFields.value,
339
256
  onChange: (v)=>{
@@ -342,30 +259,43 @@ function VariableEditForm({ initialVariableDefinition , onChange , onCancel })
342
259
  });
343
260
  }
344
261
  })
345
- })
262
+ ]
346
263
  })
347
264
  ]
348
265
  }),
349
266
  state.kind === 'ListVariable' && /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
350
267
  children: [
351
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(SectionHeader, {
268
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
269
+ py: 1,
270
+ variant: "subtitle1",
352
271
  children: "List Options"
353
272
  }),
354
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Grid, {
355
- container: true,
273
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
356
274
  spacing: 2,
357
275
  mb: 2,
358
276
  children: [
359
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Grid, {
360
- item: true,
361
- xs: 6,
277
+ state.listVariableFields.plugin.kind ? /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Box, {
278
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.ErrorBoundary, {
279
+ FallbackComponent: FallbackPreview,
280
+ resetKeys: [
281
+ previewSpec
282
+ ],
283
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_variablePreview.VariableListPreview, {
284
+ definition: previewSpec,
285
+ onRefresh: refreshPreview
286
+ })
287
+ })
288
+ }) : /*#__PURE__*/ (0, _jsxRuntime.jsx)(_variablePreview.VariablePreview, {
289
+ isLoading: true
290
+ }),
291
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
362
292
  children: [
363
293
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.ClickAwayListener, {
364
294
  onClickAway: ()=>refreshPreview(),
365
295
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Box, {})
366
296
  }),
367
297
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_pluginSystem.PluginEditor, {
368
- width: 500,
298
+ width: "100%",
369
299
  pluginType: "Variable",
370
300
  pluginKindLabel: "Source",
371
301
  value: state.listVariableFields.plugin,
@@ -377,73 +307,69 @@ function VariableEditForm({ initialVariableDefinition , onChange , onCancel })
377
307
  })
378
308
  ]
379
309
  }),
380
- state.listVariableFields.plugin.kind && /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Grid, {
381
- item: true,
382
- xs: 12,
383
- children: [
384
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
385
- sx: {
386
- mb: 1
387
- },
388
- label: "Capturing Regexp Filter",
389
- value: state.listVariableFields.capturing_regexp || '',
390
- onChange: (e)=>{
391
- setState((draft)=>{
310
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Stack, {
311
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
312
+ label: "Capturing Regexp Filter",
313
+ value: state.listVariableFields.capturing_regexp || '',
314
+ onChange: (e)=>{
315
+ setState((draft)=>{
316
+ if (e.target.value) {
317
+ // TODO: do a better fix, if empty string => it should skip the filter
392
318
  draft.listVariableFields.capturing_regexp = e.target.value;
393
- });
394
- }
395
- }),
396
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.ErrorBoundary, {
397
- FallbackComponent: ()=>/*#__PURE__*/ (0, _jsxRuntime.jsx)("div", {
398
- children: "Error previewing values"
399
- }),
400
- resetKeys: [
401
- previewSpec
402
- ],
403
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(VariableListPreview, {
404
- onRefresh: refreshPreview,
405
- definition: previewSpec
406
- })
407
- })
408
- ]
319
+ } else {
320
+ draft.listVariableFields.capturing_regexp = undefined;
321
+ }
322
+ });
323
+ },
324
+ helperText: "Optional, if you want to filter on captured result."
325
+ })
409
326
  })
410
327
  ]
411
328
  }),
412
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(SectionHeader, {
329
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Divider, {}),
330
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
331
+ py: 1,
332
+ variant: "subtitle1",
413
333
  children: "Dropdown Options"
414
334
  }),
415
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Grid, {
416
- container: true,
417
- spacing: 1,
418
- mb: 1,
335
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
336
+ spacing: "2",
419
337
  children: [
420
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Grid, {
421
- item: true,
422
- xs: 12,
338
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
423
339
  children: [
424
- "Allow Multiple",
425
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Switch, {
426
- checked: state.listVariableFields.allowMultiple,
427
- onChange: (e)=>{
428
- setState((draft)=>{
429
- draft.listVariableFields.allowMultiple = e.target.checked;
430
- });
431
- }
340
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.FormControlLabel, {
341
+ control: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Switch, {
342
+ checked: state.listVariableFields.allowMultiple,
343
+ onChange: (e)=>{
344
+ setState((draft)=>{
345
+ draft.listVariableFields.allowMultiple = e.target.checked;
346
+ });
347
+ }
348
+ }),
349
+ label: "Allow Multiple Values"
350
+ }),
351
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
352
+ variant: "caption",
353
+ children: "Enables multiple values to be selected at the same time"
432
354
  })
433
355
  ]
434
356
  }),
435
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Grid, {
436
- item: true,
437
- xs: 12,
357
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
438
358
  children: [
439
- "Allow All",
440
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Switch, {
441
- checked: state.listVariableFields.allowAll,
442
- onChange: (e)=>{
443
- setState((draft)=>{
444
- draft.listVariableFields.allowAll = e.target.checked;
445
- });
446
- }
359
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.FormControlLabel, {
360
+ control: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Switch, {
361
+ checked: state.listVariableFields.allowAll,
362
+ onChange: (e)=>{
363
+ setState((draft)=>{
364
+ draft.listVariableFields.allowAll = e.target.checked;
365
+ });
366
+ }
367
+ }),
368
+ label: "Allow All option"
369
+ }),
370
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
371
+ variant: "caption",
372
+ children: "Enables an option to include all variable values"
447
373
  })
448
374
  ]
449
375
  })
@@ -0,0 +1,178 @@
1
+ // Copyright 2023 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ "use strict";
14
+ Object.defineProperty(exports, "__esModule", {
15
+ value: true
16
+ });
17
+ function _export(target, all) {
18
+ for(var name in all)Object.defineProperty(target, name, {
19
+ enumerable: true,
20
+ get: all[name]
21
+ });
22
+ }
23
+ _export(exports, {
24
+ VariablePreview: ()=>VariablePreview,
25
+ VariableListPreview: ()=>VariableListPreview
26
+ });
27
+ const _jsxRuntime = require("react/jsx-runtime");
28
+ const _react = /*#__PURE__*/ _interopRequireWildcard(require("react"));
29
+ const _material = require("@mui/material");
30
+ const _components = require("@perses-dev/components");
31
+ const _refresh = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/Refresh"));
32
+ const _clipboardOutline = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/ClipboardOutline"));
33
+ const _constants = require("../../../constants");
34
+ const _variableModel = require("../variable-model");
35
+ function _interopRequireDefault(obj) {
36
+ return obj && obj.__esModule ? obj : {
37
+ default: obj
38
+ };
39
+ }
40
+ function _getRequireWildcardCache(nodeInterop) {
41
+ if (typeof WeakMap !== "function") return null;
42
+ var cacheBabelInterop = new WeakMap();
43
+ var cacheNodeInterop = new WeakMap();
44
+ return (_getRequireWildcardCache = function(nodeInterop) {
45
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
46
+ })(nodeInterop);
47
+ }
48
+ function _interopRequireWildcard(obj, nodeInterop) {
49
+ if (!nodeInterop && obj && obj.__esModule) {
50
+ return obj;
51
+ }
52
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
53
+ return {
54
+ default: obj
55
+ };
56
+ }
57
+ var cache = _getRequireWildcardCache(nodeInterop);
58
+ if (cache && cache.has(obj)) {
59
+ return cache.get(obj);
60
+ }
61
+ var newObj = {};
62
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
63
+ for(var key in obj){
64
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
65
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
66
+ if (desc && (desc.get || desc.set)) {
67
+ Object.defineProperty(newObj, key, desc);
68
+ } else {
69
+ newObj[key] = obj[key];
70
+ }
71
+ }
72
+ }
73
+ newObj.default = obj;
74
+ if (cache) {
75
+ cache.set(obj, newObj);
76
+ }
77
+ return newObj;
78
+ }
79
+ const DEFAULT_MAX_PREVIEW_VALUES = 50;
80
+ function VariablePreview(props) {
81
+ const { values , onRefresh , isLoading , error } = props;
82
+ const [maxValues, setMaxValues] = (0, _react.useState)(DEFAULT_MAX_PREVIEW_VALUES);
83
+ const { infoSnackbar } = (0, _components.useSnackbar)();
84
+ const showAll = ()=>{
85
+ setMaxValues(undefined);
86
+ };
87
+ let notShown = 0;
88
+ if (values && (values === null || values === void 0 ? void 0 : values.length) > 0 && maxValues) {
89
+ notShown = values.length - maxValues;
90
+ }
91
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Box, {
92
+ children: [
93
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
94
+ direction: "row",
95
+ spacing: 1,
96
+ alignItems: "center",
97
+ mb: 1,
98
+ children: [
99
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
100
+ variant: "h4",
101
+ children: "Preview Values"
102
+ }),
103
+ onRefresh && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
104
+ description: _constants.TOOLTIP_TEXT.refreshVariableValues,
105
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
106
+ onClick: onRefresh,
107
+ size: "small",
108
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_refresh.default, {})
109
+ })
110
+ }),
111
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
112
+ description: _constants.TOOLTIP_TEXT.copyVariableValues,
113
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
114
+ onClick: async ()=>{
115
+ if (values === null || values === void 0 ? void 0 : values.length) {
116
+ await navigator.clipboard.writeText(values.map((value)=>value).join(', '));
117
+ infoSnackbar('Preview values copied to clipboard!');
118
+ }
119
+ },
120
+ size: "small",
121
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_clipboardOutline.default, {})
122
+ })
123
+ })
124
+ ]
125
+ }),
126
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Card, {
127
+ variant: "outlined",
128
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Box, {
129
+ sx: {
130
+ display: 'flex',
131
+ flexWrap: 'wrap',
132
+ gap: 1,
133
+ m: 2
134
+ },
135
+ children: [
136
+ error && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Alert, {
137
+ severity: "error",
138
+ children: error
139
+ }),
140
+ (values === null || values === void 0 ? void 0 : values.length) === 0 && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Alert, {
141
+ severity: "info",
142
+ children: "No results"
143
+ }),
144
+ isLoading && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Stack, {
145
+ width: "100%",
146
+ sx: {
147
+ alignItems: 'center',
148
+ justifyContent: 'center'
149
+ },
150
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.CircularProgress, {})
151
+ }),
152
+ values === null || values === void 0 ? void 0 : values.slice(0, maxValues).map((val)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Chip, {
153
+ size: "small",
154
+ label: val
155
+ }, val)),
156
+ notShown > 0 && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Chip, {
157
+ onClick: showAll,
158
+ variant: "outlined",
159
+ size: "small",
160
+ label: `+${notShown} more`
161
+ })
162
+ ]
163
+ })
164
+ })
165
+ ]
166
+ });
167
+ }
168
+ function VariableListPreview(props) {
169
+ const { definition , onRefresh } = props;
170
+ const { data , isFetching , error } = (0, _variableModel.useListVariablePluginValues)(definition);
171
+ const errorMessage = error === null || error === void 0 ? void 0 : error.message;
172
+ return /*#__PURE__*/ (0, _jsxRuntime.jsx)(VariablePreview, {
173
+ values: (data === null || data === void 0 ? void 0 : data.map((val)=>val.value)) || [],
174
+ onRefresh: onRefresh,
175
+ isLoading: isFetching,
176
+ error: errorMessage
177
+ });
178
+ }
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
17
  _exportStar(require("./VariableEditorForm"), exports);
18
+ _exportStar(require("./VariablePreview"), exports);
18
19
  function _exportStar(from, to) {
19
20
  Object.keys(from).forEach(function(k) {
20
21
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
@@ -58,17 +58,15 @@ function getInitialState(initialVariableDefinition) {
58
58
  }
59
59
  function getVariableDefinitionFromState(state) {
60
60
  const { name , title , kind } = state;
61
- const commonSpec = {
62
- name,
63
- display: {
64
- name: title
65
- }
66
- };
61
+ const display = title ? {
62
+ name: title
63
+ } : undefined;
67
64
  if (kind === 'TextVariable') {
68
65
  return {
69
66
  kind,
70
67
  spec: {
71
- ...commonSpec,
68
+ name,
69
+ display,
72
70
  ...state.textVariableFields
73
71
  }
74
72
  };
@@ -77,7 +75,8 @@ function getVariableDefinitionFromState(state) {
77
75
  return {
78
76
  kind,
79
77
  spec: {
80
- ...commonSpec,
78
+ name,
79
+ display,
81
80
  allow_multiple: state.listVariableFields.allowMultiple,
82
81
  allow_all_value: state.listVariableFields.allowAll,
83
82
  capturing_regexp: state.listVariableFields.capturing_regexp,