@perses-dev/dashboards 0.52.0-beta.4 → 0.52.0-rc.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.
- package/dist/cjs/components/GridLayout/GridItemContent.js +137 -17
- package/dist/cjs/components/GridLayout/GridLayout.js +78 -126
- package/dist/cjs/components/GridLayout/Row.js +150 -0
- package/dist/cjs/components/GridLayout/index.js +1 -0
- package/dist/cjs/components/LeaveDialog/LeaveDialog.js +44 -0
- package/dist/cjs/components/LeaveDialog/index.js +30 -0
- package/dist/cjs/components/Panel/Panel.js +7 -2
- package/dist/cjs/components/Panel/PanelActions.js +25 -5
- package/dist/cjs/components/Panel/PanelHeader.js +33 -15
- package/dist/cjs/components/PanelDrawer/PanelDrawer.js +58 -21
- package/dist/cjs/components/PanelGroupDialog/PanelGroupDialog.js +3 -0
- package/dist/cjs/components/PanelGroupDialog/PanelGroupEditorForm.js +35 -15
- package/dist/cjs/components/index.js +1 -0
- package/dist/cjs/constants/user-interface-text.js +4 -2
- package/dist/cjs/context/DashboardProvider/DashboardProvider.js +7 -8
- package/dist/cjs/context/DashboardProvider/DashboardProviderWithQueryParams.js +3 -3
- package/dist/cjs/context/DashboardProvider/panel-editor-slice.js +1 -0
- package/dist/cjs/context/DashboardProvider/panel-group-editor-slice.js +6 -2
- package/dist/cjs/context/DashboardProvider/panel-group-slice.js +1 -0
- package/dist/cjs/context/DashboardProvider/view-panel-slice.js +10 -3
- package/dist/cjs/context/VariableProvider/VariableProvider.js +1 -1
- package/dist/cjs/context/useDashboard.js +5 -4
- package/dist/cjs/views/ViewDashboard/DashboardApp.js +7 -3
- package/dist/cjs/views/ViewDashboard/ViewDashboard.js +9 -8
- package/dist/components/DashboardToolbar/DashboardToolbar.d.ts +2 -2
- package/dist/components/DashboardToolbar/DashboardToolbar.d.ts.map +1 -1
- package/dist/components/DashboardToolbar/DashboardToolbar.js.map +1 -1
- package/dist/components/GridLayout/GridItemContent.d.ts.map +1 -1
- package/dist/components/GridLayout/GridItemContent.js +99 -20
- package/dist/components/GridLayout/GridItemContent.js.map +1 -1
- package/dist/components/GridLayout/GridLayout.d.ts +8 -0
- package/dist/components/GridLayout/GridLayout.d.ts.map +1 -1
- package/dist/components/GridLayout/GridLayout.js +72 -126
- package/dist/components/GridLayout/GridLayout.js.map +1 -1
- package/dist/components/GridLayout/Row.d.ts +17 -0
- package/dist/components/GridLayout/Row.d.ts.map +1 -0
- package/dist/components/GridLayout/Row.js +142 -0
- package/dist/components/GridLayout/Row.js.map +1 -0
- package/dist/components/GridLayout/index.d.ts +1 -0
- package/dist/components/GridLayout/index.d.ts.map +1 -1
- package/dist/components/GridLayout/index.js +1 -0
- package/dist/components/GridLayout/index.js.map +1 -1
- package/dist/components/LeaveDialog/LeaveDialog.d.ts +7 -0
- package/dist/components/LeaveDialog/LeaveDialog.d.ts.map +1 -0
- package/dist/components/LeaveDialog/LeaveDialog.js +36 -0
- package/dist/components/LeaveDialog/LeaveDialog.js.map +1 -0
- package/dist/components/LeaveDialog/index.d.ts +2 -0
- package/dist/components/LeaveDialog/index.d.ts.map +1 -0
- package/dist/components/LeaveDialog/index.js +15 -0
- package/dist/components/LeaveDialog/index.js.map +1 -0
- package/dist/components/Panel/Panel.d.ts +6 -0
- package/dist/components/Panel/Panel.d.ts.map +1 -1
- package/dist/components/Panel/Panel.js +7 -2
- package/dist/components/Panel/Panel.js.map +1 -1
- package/dist/components/Panel/PanelActions.d.ts +5 -0
- package/dist/components/Panel/PanelActions.d.ts.map +1 -1
- package/dist/components/Panel/PanelActions.js +25 -5
- package/dist/components/Panel/PanelActions.js.map +1 -1
- package/dist/components/Panel/PanelHeader.d.ts +7 -1
- package/dist/components/Panel/PanelHeader.d.ts.map +1 -1
- package/dist/components/Panel/PanelHeader.js +34 -16
- package/dist/components/Panel/PanelHeader.js.map +1 -1
- package/dist/components/PanelDrawer/PanelDrawer.d.ts.map +1 -1
- package/dist/components/PanelDrawer/PanelDrawer.js +59 -22
- package/dist/components/PanelDrawer/PanelDrawer.js.map +1 -1
- package/dist/components/PanelGroupDialog/PanelGroupDialog.d.ts.map +1 -1
- package/dist/components/PanelGroupDialog/PanelGroupDialog.js +3 -0
- package/dist/components/PanelGroupDialog/PanelGroupDialog.js.map +1 -1
- package/dist/components/PanelGroupDialog/PanelGroupEditorForm.d.ts +1 -0
- package/dist/components/PanelGroupDialog/PanelGroupEditorForm.d.ts.map +1 -1
- package/dist/components/PanelGroupDialog/PanelGroupEditorForm.js +36 -16
- package/dist/components/PanelGroupDialog/PanelGroupEditorForm.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/constants/user-interface-text.d.ts +2 -0
- package/dist/constants/user-interface-text.d.ts.map +1 -1
- package/dist/constants/user-interface-text.js +4 -2
- package/dist/constants/user-interface-text.js.map +1 -1
- package/dist/context/DashboardProvider/DashboardProvider.d.ts +5 -5
- package/dist/context/DashboardProvider/DashboardProvider.d.ts.map +1 -1
- package/dist/context/DashboardProvider/DashboardProvider.js +7 -8
- package/dist/context/DashboardProvider/DashboardProvider.js.map +1 -1
- package/dist/context/DashboardProvider/DashboardProviderWithQueryParams.js +4 -4
- package/dist/context/DashboardProvider/DashboardProviderWithQueryParams.js.map +1 -1
- package/dist/context/DashboardProvider/common.d.ts +1 -1
- package/dist/context/DashboardProvider/common.d.ts.map +1 -1
- package/dist/context/DashboardProvider/common.js.map +1 -1
- package/dist/context/DashboardProvider/panel-editor-slice.d.ts +1 -0
- package/dist/context/DashboardProvider/panel-editor-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/panel-editor-slice.js +1 -0
- package/dist/context/DashboardProvider/panel-editor-slice.js.map +1 -1
- package/dist/context/DashboardProvider/panel-group-editor-slice.d.ts +1 -0
- package/dist/context/DashboardProvider/panel-group-editor-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/panel-group-editor-slice.js +6 -2
- package/dist/context/DashboardProvider/panel-group-editor-slice.js.map +1 -1
- package/dist/context/DashboardProvider/panel-group-slice.d.ts +3 -0
- package/dist/context/DashboardProvider/panel-group-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/panel-group-slice.js +1 -0
- package/dist/context/DashboardProvider/panel-group-slice.js.map +1 -1
- package/dist/context/DashboardProvider/view-panel-slice.d.ts +6 -2
- package/dist/context/DashboardProvider/view-panel-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/view-panel-slice.js +10 -3
- package/dist/context/DashboardProvider/view-panel-slice.js.map +1 -1
- package/dist/context/VariableProvider/VariableProvider.js +1 -1
- package/dist/context/VariableProvider/VariableProvider.js.map +1 -1
- package/dist/context/useDashboard.js +5 -4
- package/dist/context/useDashboard.js.map +1 -1
- package/dist/views/ViewDashboard/DashboardApp.d.ts +7 -6
- package/dist/views/ViewDashboard/DashboardApp.d.ts.map +1 -1
- package/dist/views/ViewDashboard/DashboardApp.js +8 -4
- package/dist/views/ViewDashboard/DashboardApp.js.map +1 -1
- package/dist/views/ViewDashboard/ViewDashboard.d.ts.map +1 -1
- package/dist/views/ViewDashboard/ViewDashboard.js +9 -8
- package/dist/views/ViewDashboard/ViewDashboard.js.map +1 -1
- package/package.json +5 -5
|
@@ -28,7 +28,7 @@ const _pluginsystem = require("@perses-dev/plugin-system");
|
|
|
28
28
|
const _components1 = require("../../components");
|
|
29
29
|
const _context = require("../../context");
|
|
30
30
|
const DashboardApp = (props)=>{
|
|
31
|
-
const { dashboardResource,
|
|
31
|
+
const { dashboardResource, emptyDashboardProps, isReadonly, isVariableEnabled, isDatasourceEnabled, isCreating, isInitialVariableSticky, isLeavingConfirmDialogEnabled, dashboardTitleComponent, onSave, onDiscard } = props;
|
|
32
32
|
const chartsTheme = (0, _components.useChartsTheme)();
|
|
33
33
|
const { isEditMode, setEditMode } = (0, _context.useEditMode)();
|
|
34
34
|
const { dashboard, setDashboard } = (0, _context.useDashboard)();
|
|
@@ -78,7 +78,7 @@ const DashboardApp = (props)=>{
|
|
|
78
78
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_components1.DashboardToolbar, {
|
|
79
79
|
dashboardName: dashboardResource.metadata.name,
|
|
80
80
|
dashboardTitleComponent: dashboardTitleComponent,
|
|
81
|
-
initialVariableIsSticky:
|
|
81
|
+
initialVariableIsSticky: isInitialVariableSticky,
|
|
82
82
|
onSave: onSave,
|
|
83
83
|
isReadonly: isReadonly,
|
|
84
84
|
isVariableEnabled: isVariableEnabled,
|
|
@@ -116,7 +116,11 @@ const DashboardApp = (props)=>{
|
|
|
116
116
|
isReadonly: !isEditMode,
|
|
117
117
|
disableMetadataEdition: !isCreating
|
|
118
118
|
}),
|
|
119
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)(_components1.SaveChangesConfirmationDialog, {})
|
|
119
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_components1.SaveChangesConfirmationDialog, {}),
|
|
120
|
+
isLeavingConfirmDialogEnabled && isEditMode && /*#__PURE__*/ (0, _jsxruntime.jsx)(_components1.LeaveDialog, {
|
|
121
|
+
original: originalDashboard,
|
|
122
|
+
current: dashboard
|
|
123
|
+
})
|
|
120
124
|
]
|
|
121
125
|
})
|
|
122
126
|
]
|
|
@@ -30,7 +30,7 @@ const _context = require("../../context");
|
|
|
30
30
|
const _DashboardProviderWithQueryParams = require("../../context/DashboardProvider/DashboardProviderWithQueryParams");
|
|
31
31
|
const _DashboardApp = require("./DashboardApp");
|
|
32
32
|
function ViewDashboard(props) {
|
|
33
|
-
const { dashboardResource, datasourceApi, externalVariableDefinitions,
|
|
33
|
+
const { dashboardResource, datasourceApi, externalVariableDefinitions, emptyDashboardProps, isReadonly, isVariableEnabled, isDatasourceEnabled, isEditing, isCreating, isInitialVariableSticky, isLeavingConfirmDialogEnabled, dashboardTitleComponent, onSave, onDiscard, sx, ...others } = props;
|
|
34
34
|
const { spec } = dashboardResource;
|
|
35
35
|
const dashboardDuration = spec.duration ?? _core.DEFAULT_DASHBOARD_DURATION;
|
|
36
36
|
const dashboardRefreshInterval = spec.refreshInterval ?? _core.DEFAULT_REFRESH_INTERVAL;
|
|
@@ -80,8 +80,8 @@ function ViewDashboard(props) {
|
|
|
80
80
|
datasourceApi: datasourceApi,
|
|
81
81
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_DashboardProviderWithQueryParams.DashboardProviderWithQueryParams, {
|
|
82
82
|
initialState: {
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
isEditMode: !!isEditing,
|
|
84
|
+
dashboardResource
|
|
85
85
|
},
|
|
86
86
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_pluginsystem.TimeRangeProviderWithQueryParams, {
|
|
87
87
|
initialTimeRange: initialTimeRange,
|
|
@@ -103,15 +103,16 @@ function ViewDashboard(props) {
|
|
|
103
103
|
FallbackComponent: _components.ErrorAlert,
|
|
104
104
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_DashboardApp.DashboardApp, {
|
|
105
105
|
dashboardResource: dashboardResource,
|
|
106
|
-
dashboardTitleComponent: dashboardTitleComponent,
|
|
107
106
|
emptyDashboardProps: emptyDashboardProps,
|
|
108
|
-
onSave: onSave,
|
|
109
|
-
onDiscard: onDiscard,
|
|
110
|
-
initialVariableIsSticky: initialVariableIsSticky,
|
|
111
107
|
isReadonly: isReadonly,
|
|
112
108
|
isVariableEnabled: isVariableEnabled,
|
|
113
109
|
isDatasourceEnabled: isDatasourceEnabled,
|
|
114
|
-
isCreating: isCreating
|
|
110
|
+
isCreating: isCreating,
|
|
111
|
+
isInitialVariableSticky: isInitialVariableSticky,
|
|
112
|
+
isLeavingConfirmDialogEnabled: isLeavingConfirmDialogEnabled,
|
|
113
|
+
dashboardTitleComponent: dashboardTitleComponent,
|
|
114
|
+
onSave: onSave,
|
|
115
|
+
onDiscard: onDiscard
|
|
115
116
|
})
|
|
116
117
|
})
|
|
117
118
|
})
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { ReactElement } from 'react';
|
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
|
2
2
|
import { OnSaveDashboard } from '../../context';
|
|
3
3
|
export interface DashboardToolbarProps {
|
|
4
4
|
dashboardName: string;
|
|
5
|
-
dashboardTitleComponent?:
|
|
5
|
+
dashboardTitleComponent?: ReactNode;
|
|
6
6
|
initialVariableIsSticky?: boolean;
|
|
7
7
|
isReadonly: boolean;
|
|
8
8
|
isVariableEnabled: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardToolbar.d.ts","sourceRoot":"","sources":["../../../src/components/DashboardToolbar/DashboardToolbar.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DashboardToolbar.d.ts","sourceRoot":"","sources":["../../../src/components/DashboardToolbar/DashboardToolbar.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,eAAe,EAAe,MAAM,eAAe,CAAC;AAW7D,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,SAAS,CAAC;IACpC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,eAAO,MAAM,gBAAgB,UAAW,qBAAqB,KAAG,YAgG/D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/DashboardToolbar/DashboardToolbar.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 { Typography, Stack, Button, Box, useTheme, useMediaQuery, Alert } from '@mui/material';\nimport { ErrorBoundary, ErrorAlert } from '@perses-dev/components';\nimport { TimeRangeControls } from '@perses-dev/plugin-system';\nimport { ReactElement } from 'react';\nimport { OnSaveDashboard, useEditMode } from '../../context';\nimport { AddPanelButton } from '../AddPanelButton';\nimport { AddGroupButton } from '../AddGroupButton';\nimport { DownloadButton } from '../DownloadButton';\nimport { EditVariablesButton } from '../Variables';\nimport { EditDatasourcesButton } from '../Datasources';\nimport { EditButton } from '../EditButton';\nimport { EditJsonButton } from '../EditJsonButton';\nimport { SaveDashboardButton } from '../SaveDashboardButton';\nimport { DashboardStickyToolbar } from '../DashboardStickyToolbar';\n\nexport interface DashboardToolbarProps {\n dashboardName: string;\n dashboardTitleComponent?:
|
|
1
|
+
{"version":3,"sources":["../../../src/components/DashboardToolbar/DashboardToolbar.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 { Typography, Stack, Button, Box, useTheme, useMediaQuery, Alert } from '@mui/material';\nimport { ErrorBoundary, ErrorAlert } from '@perses-dev/components';\nimport { TimeRangeControls } from '@perses-dev/plugin-system';\nimport { ReactElement, ReactNode } from 'react';\nimport { OnSaveDashboard, useEditMode } from '../../context';\nimport { AddPanelButton } from '../AddPanelButton';\nimport { AddGroupButton } from '../AddGroupButton';\nimport { DownloadButton } from '../DownloadButton';\nimport { EditVariablesButton } from '../Variables';\nimport { EditDatasourcesButton } from '../Datasources';\nimport { EditButton } from '../EditButton';\nimport { EditJsonButton } from '../EditJsonButton';\nimport { SaveDashboardButton } from '../SaveDashboardButton';\nimport { DashboardStickyToolbar } from '../DashboardStickyToolbar';\n\nexport interface DashboardToolbarProps {\n dashboardName: string;\n dashboardTitleComponent?: ReactNode;\n initialVariableIsSticky?: boolean;\n isReadonly: boolean;\n isVariableEnabled: boolean;\n isDatasourceEnabled: boolean;\n onEditButtonClick: () => void;\n onCancelButtonClick: () => void;\n onSave?: OnSaveDashboard;\n}\n\nexport const DashboardToolbar = (props: DashboardToolbarProps): ReactElement => {\n const {\n dashboardName,\n dashboardTitleComponent,\n initialVariableIsSticky,\n isReadonly,\n isVariableEnabled,\n isDatasourceEnabled,\n onEditButtonClick,\n onCancelButtonClick,\n onSave,\n } = props;\n\n const { isEditMode } = useEditMode();\n\n const isBiggerThanSm = useMediaQuery(useTheme().breakpoints.up('sm'));\n const isBiggerThanMd = useMediaQuery(useTheme().breakpoints.up('md'));\n\n const dashboardTitle = dashboardTitleComponent ? (\n dashboardTitleComponent\n ) : (\n <Typography variant=\"h2\">{dashboardName}</Typography>\n );\n\n const testId = 'dashboard-toolbar';\n\n return (\n <>\n <Stack data-testid={testId}>\n <Box\n px={2}\n py={1.5}\n display=\"flex\"\n sx={{ backgroundColor: (theme) => theme.palette.primary.main + (isEditMode ? '30' : '0') }}\n >\n {dashboardTitle}\n {isEditMode ? (\n <Stack direction=\"row\" gap={1} ml=\"auto\">\n {isReadonly && (\n <Alert severity=\"warning\" sx={{ backgroundColor: 'transparent', padding: 0 }}>\n Dashboard managed via code only. Download JSON and commit changes to save.\n </Alert>\n )}\n <Stack direction=\"row\" spacing={0.5} ml={1} whiteSpace=\"nowrap\">\n {isVariableEnabled && <EditVariablesButton />}\n {isDatasourceEnabled && <EditDatasourcesButton />}\n <AddPanelButton />\n <AddGroupButton />\n </Stack>\n <SaveDashboardButton onSave={onSave} isDisabled={isReadonly} />\n <Button variant=\"outlined\" onClick={onCancelButtonClick}>\n Cancel\n </Button>\n </Stack>\n ) : (\n <>\n {isBiggerThanSm && (\n <Stack direction=\"row\" gap={1} ml=\"auto\">\n <EditButton onClick={onEditButtonClick} />\n </Stack>\n )}\n </>\n )}\n </Box>\n <Box\n sx={{\n display: 'flex',\n width: '100%',\n alignItems: 'start',\n padding: (theme) => theme.spacing(1, 2, 0, 2),\n flexDirection: isBiggerThanMd ? 'row' : 'column',\n flexWrap: 'nowrap',\n gap: 1,\n }}\n >\n <Box width=\"100%\">\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <DashboardStickyToolbar\n initialVariableIsSticky={initialVariableIsSticky}\n sx={{\n backgroundColor: ({ palette }) => palette.background.default,\n }}\n />\n </ErrorBoundary>\n </Box>\n <Stack direction=\"row\" ml=\"auto\" flexWrap=\"wrap\" justifyContent=\"end\">\n <Stack direction=\"row\" spacing={1} mt={1} ml={1}>\n <TimeRangeControls />\n <DownloadButton />\n <EditJsonButton isReadonly={!isEditMode} />\n </Stack>\n </Stack>\n </Box>\n </Stack>\n </>\n );\n};\n"],"names":["Typography","Stack","Button","Box","useTheme","useMediaQuery","Alert","ErrorBoundary","ErrorAlert","TimeRangeControls","useEditMode","AddPanelButton","AddGroupButton","DownloadButton","EditVariablesButton","EditDatasourcesButton","EditButton","EditJsonButton","SaveDashboardButton","DashboardStickyToolbar","DashboardToolbar","props","dashboardName","dashboardTitleComponent","initialVariableIsSticky","isReadonly","isVariableEnabled","isDatasourceEnabled","onEditButtonClick","onCancelButtonClick","onSave","isEditMode","isBiggerThanSm","breakpoints","up","isBiggerThanMd","dashboardTitle","variant","testId","data-testid","px","py","display","sx","backgroundColor","theme","palette","primary","main","direction","gap","ml","severity","padding","spacing","whiteSpace","isDisabled","onClick","width","alignItems","flexDirection","flexWrap","FallbackComponent","background","default","justifyContent","mt"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridItemContent.d.ts","sourceRoot":"","sources":["../../../src/components/GridLayout/GridItemContent.tsx"],"names":[],"mappings":"AAgBA,
|
|
1
|
+
{"version":3,"file":"GridItemContent.d.ts","sourceRoot":"","sources":["../../../src/components/GridLayout/GridItemContent.tsx"],"names":[],"mappings":"AAgBA,OAAc,EAAE,YAAY,EAAqB,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAA6D,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAqB,YAAY,EAAE,MAAM,UAAU,CAAC;AAG3D,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,CA8IzE"}
|
|
@@ -10,10 +10,11 @@
|
|
|
10
10
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
// See the License for the specific language governing permissions and
|
|
12
12
|
// limitations under the License.
|
|
13
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
|
-
import { Box } from '@mui/material';
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Divider } from '@mui/material';
|
|
15
15
|
import { useInView } from 'react-intersection-observer';
|
|
16
|
-
import { DataQueriesProvider, usePlugin, useSuggestedStepMs } from '@perses-dev/plugin-system';
|
|
16
|
+
import { DataQueriesProvider, PluginSpecEditor, usePlugin, useSuggestedStepMs } from '@perses-dev/plugin-system';
|
|
17
|
+
import React, { useMemo, useState } from 'react';
|
|
17
18
|
import { useEditMode, usePanel, usePanelActions, useViewPanelGroup } from '../../context';
|
|
18
19
|
import { Panel } from '../Panel';
|
|
19
20
|
import { isPanelGroupItemIdEqual } from '../../context/DashboardProvider/panel-group-slice';
|
|
@@ -31,6 +32,17 @@ import { isPanelGroupItemIdEqual } from '../../context/DashboardProvider/panel-g
|
|
|
31
32
|
initialInView: false,
|
|
32
33
|
triggerOnce: true
|
|
33
34
|
});
|
|
35
|
+
const [openQueryViewer, setOpenQueryViewer] = useState(false);
|
|
36
|
+
const viewQueriesHandler = useMemo(()=>{
|
|
37
|
+
return isEditMode || !queries?.length ? undefined : {
|
|
38
|
+
onClick: ()=>{
|
|
39
|
+
setOpenQueryViewer(true);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}, [
|
|
43
|
+
isEditMode,
|
|
44
|
+
queries
|
|
45
|
+
]);
|
|
34
46
|
const readHandlers = {
|
|
35
47
|
isPanelViewed: isPanelGroupItemIdEqual(viewPanelGroupItemId, panelGroupItemId),
|
|
36
48
|
onViewPanelClick: function() {
|
|
@@ -61,29 +73,96 @@ import { isPanelGroupItemIdEqual } from '../../context/DashboardProvider/panel-g
|
|
|
61
73
|
};
|
|
62
74
|
});
|
|
63
75
|
const pluginQueryOptions = typeof plugin?.queryOptions === 'function' ? plugin?.queryOptions(panelDefinition.spec.plugin.spec) : plugin?.queryOptions;
|
|
64
|
-
|
|
76
|
+
const queryRows = useMemo(()=>{
|
|
77
|
+
if (!queries?.length) return null;
|
|
78
|
+
const queryItems = [];
|
|
79
|
+
queries.forEach((query, index)=>{
|
|
80
|
+
if (query?.spec?.plugin?.kind && query?.kind) {
|
|
81
|
+
queryItems.push(/*#__PURE__*/ _jsxs(React.Fragment, {
|
|
82
|
+
children: [
|
|
83
|
+
/*#__PURE__*/ _jsx(PluginSpecEditor, {
|
|
84
|
+
value: query.spec.plugin.spec,
|
|
85
|
+
pluginSelection: {
|
|
86
|
+
kind: query.spec.plugin.kind,
|
|
87
|
+
type: query.kind
|
|
88
|
+
},
|
|
89
|
+
onChange: ()=>{},
|
|
90
|
+
isReadonly: true
|
|
91
|
+
}),
|
|
92
|
+
index < queries.length - 1 && /*#__PURE__*/ _jsx(Divider, {
|
|
93
|
+
sx: {
|
|
94
|
+
my: 2
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
]
|
|
98
|
+
}, `query-${index}`));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return queryItems;
|
|
102
|
+
}, [
|
|
103
|
+
queries
|
|
104
|
+
]);
|
|
105
|
+
const onCloseHandler = ()=>{
|
|
106
|
+
setOpenQueryViewer(false);
|
|
107
|
+
};
|
|
108
|
+
return /*#__PURE__*/ _jsxs(Box, {
|
|
65
109
|
ref: ref,
|
|
66
110
|
sx: {
|
|
67
111
|
width: '100%',
|
|
68
112
|
height: '100%'
|
|
69
113
|
},
|
|
70
|
-
children:
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
114
|
+
children: [
|
|
115
|
+
/*#__PURE__*/ _jsxs(Dialog, {
|
|
116
|
+
fullWidth: true,
|
|
117
|
+
PaperProps: {
|
|
118
|
+
sx: {
|
|
119
|
+
margin: '10px',
|
|
120
|
+
width: 'calc(100% - 20px)'
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
maxWidth: "lg",
|
|
124
|
+
open: openQueryViewer,
|
|
125
|
+
children: [
|
|
126
|
+
/*#__PURE__*/ _jsx(DialogTitle, {
|
|
127
|
+
children: "Query Viewer"
|
|
128
|
+
}),
|
|
129
|
+
/*#__PURE__*/ _jsx(DialogContent, {
|
|
130
|
+
children: /*#__PURE__*/ _jsx(Box, {
|
|
131
|
+
sx: {
|
|
132
|
+
padding: '5px'
|
|
133
|
+
},
|
|
134
|
+
children: queryRows
|
|
135
|
+
})
|
|
136
|
+
}),
|
|
137
|
+
/*#__PURE__*/ _jsx(DialogActions, {
|
|
138
|
+
children: /*#__PURE__*/ _jsx(Button, {
|
|
139
|
+
variant: "outlined",
|
|
140
|
+
onClick: onCloseHandler,
|
|
141
|
+
color: "primary",
|
|
142
|
+
children: "Close"
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
]
|
|
146
|
+
}),
|
|
147
|
+
/*#__PURE__*/ _jsx(DataQueriesProvider, {
|
|
148
|
+
definitions: definitions,
|
|
149
|
+
options: {
|
|
150
|
+
suggestedStepMs,
|
|
151
|
+
...pluginQueryOptions
|
|
152
|
+
},
|
|
153
|
+
queryOptions: {
|
|
154
|
+
enabled: inView
|
|
155
|
+
},
|
|
156
|
+
children: inView && /*#__PURE__*/ _jsx(Panel, {
|
|
157
|
+
definition: panelDefinition,
|
|
158
|
+
readHandlers: readHandlers,
|
|
159
|
+
editHandlers: editHandlers,
|
|
160
|
+
viewQueriesHandler: viewQueriesHandler,
|
|
161
|
+
panelOptions: props.panelOptions,
|
|
162
|
+
panelGroupItemId: panelGroupItemId
|
|
163
|
+
})
|
|
85
164
|
})
|
|
86
|
-
|
|
165
|
+
]
|
|
87
166
|
});
|
|
88
167
|
}
|
|
89
168
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/GridLayout/GridItemContent.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 { Box } from '@mui/material';\nimport { useInView } from 'react-intersection-observer';\nimport { DataQueriesProvider, usePlugin, useSuggestedStepMs } from '@perses-dev/plugin-system';\nimport { ReactElement } from 'react';\nimport { PanelGroupItemId, useEditMode, usePanel, usePanelActions, useViewPanelGroup } from '../../context';\nimport { Panel, PanelProps, PanelOptions } from '../Panel';\nimport { isPanelGroupItemIdEqual } from '../../context/DashboardProvider/panel-group-slice';\n\nexport interface GridItemContentProps {\n panelGroupItemId: PanelGroupItemId;\n width: number; // necessary for determining the suggested step ms\n panelOptions?: PanelOptions;\n}\n\n/**\n * Resolves the reference to panel content in a GridItemDefinition and renders the panel.\n */\nexport function GridItemContent(props: GridItemContentProps): ReactElement {\n const { panelGroupItemId, width } = props;\n const panelDefinition = usePanel(panelGroupItemId);\n const {\n spec: { queries },\n } = panelDefinition;\n const { isEditMode } = useEditMode();\n const { openEditPanel, openDeletePanelDialog, duplicatePanel, viewPanel } = usePanelActions(panelGroupItemId);\n const viewPanelGroupItemId = useViewPanelGroup();\n const { ref, inView } = useInView({\n threshold: 0.2, // we have the flexibility to adjust this threshold to trigger queries slightly earlier or later based on performance\n initialInView: false,\n triggerOnce: true,\n });\n\n const readHandlers = {\n isPanelViewed: isPanelGroupItemIdEqual(viewPanelGroupItemId, panelGroupItemId),\n onViewPanelClick: function (): void {\n if (viewPanelGroupItemId === undefined) {\n viewPanel(panelGroupItemId);\n } else {\n viewPanel(undefined);\n }\n },\n };\n\n // Provide actions to the panel when in edit mode\n let editHandlers: PanelProps['editHandlers'] = undefined;\n if (isEditMode) {\n editHandlers = {\n onEditPanelClick: openEditPanel,\n onDuplicatePanelClick: duplicatePanel,\n onDeletePanelClick: openDeletePanelDialog,\n };\n }\n\n // map TimeSeriesQueryDefinition to Definition<UnknownSpec>\n const suggestedStepMs = useSuggestedStepMs(width);\n\n const { data: plugin } = usePlugin('Panel', panelDefinition.spec.plugin.kind);\n\n const queryDefinitions = queries ?? [];\n const definitions = queryDefinitions.map((query) => {\n return {\n kind: query.spec.plugin.kind,\n spec: query.spec.plugin.spec,\n };\n });\n const pluginQueryOptions =\n typeof plugin?.queryOptions === 'function'\n ? plugin?.queryOptions(panelDefinition.spec.plugin.spec)\n : plugin?.queryOptions;\n\n return (\n <Box\n ref={ref}\n sx={{\n width: '100%',\n height: '100%',\n }}\n >\n <DataQueriesProvider\n definitions={definitions}\n options={{ suggestedStepMs, ...pluginQueryOptions }}\n queryOptions={{ enabled: inView }}\n >\n {inView && (\n <Panel\n definition={panelDefinition}\n readHandlers={readHandlers}\n editHandlers={editHandlers}\n panelOptions={props.panelOptions}\n panelGroupItemId={panelGroupItemId}\n />\n )}\n </DataQueriesProvider>\n </Box>\n );\n}\n"],"names":["Box","useInView","DataQueriesProvider","usePlugin","useSuggestedStepMs","useEditMode","usePanel","usePanelActions","useViewPanelGroup","Panel","isPanelGroupItemIdEqual","GridItemContent","props","panelGroupItemId","width","panelDefinition","spec","queries","isEditMode","openEditPanel","openDeletePanelDialog","duplicatePanel","viewPanel","viewPanelGroupItemId","ref","inView","threshold","initialInView","triggerOnce","readHandlers","isPanelViewed","onViewPanelClick","undefined","editHandlers","onEditPanelClick","onDuplicatePanelClick","onDeletePanelClick","suggestedStepMs","data","plugin","kind","queryDefinitions","definitions","map","query","pluginQueryOptions","queryOptions","sx","height","options","enabled","definition","panelOptions"],"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,GAAG,QAAQ,gBAAgB;AACpC,SAASC,SAAS,QAAQ,8BAA8B;AACxD,SAASC,mBAAmB,EAAEC,SAAS,EAAEC,kBAAkB,QAAQ,4BAA4B;AAE/F,SAA2BC,WAAW,EAAEC,QAAQ,EAAEC,eAAe,EAAEC,iBAAiB,QAAQ,gBAAgB;AAC5G,SAASC,KAAK,QAAkC,WAAW;AAC3D,SAASC,uBAAuB,QAAQ,oDAAoD;AAQ5F;;CAEC,GACD,OAAO,SAASC,gBAAgBC,KAA2B;IACzD,MAAM,EAAEC,gBAAgB,EAAEC,KAAK,EAAE,GAAGF;IACpC,MAAMG,kBAAkBT,SAASO;IACjC,MAAM,EACJG,MAAM,EAAEC,OAAO,EAAE,EAClB,GAAGF;IACJ,MAAM,EAAEG,UAAU,EAAE,GAAGb;IACvB,MAAM,EAAEc,aAAa,EAAEC,qBAAqB,EAAEC,cAAc,EAAEC,SAAS,EAAE,GAAGf,gBAAgBM;IAC5F,MAAMU,uBAAuBf;IAC7B,MAAM,EAAEgB,GAAG,EAAEC,MAAM,EAAE,GAAGxB,UAAU;QAChCyB,WAAW;QACXC,eAAe;QACfC,aAAa;IACf;IAEA,MAAMC,eAAe;QACnBC,eAAepB,wBAAwBa,sBAAsBV;QAC7DkB,kBAAkB;YAChB,IAAIR,yBAAyBS,WAAW;gBACtCV,UAAUT;YACZ,OAAO;gBACLS,UAAUU;YACZ;QACF;IACF;IAEA,iDAAiD;IACjD,IAAIC,eAA2CD;IAC/C,IAAId,YAAY;QACde,eAAe;YACbC,kBAAkBf;YAClBgB,uBAAuBd;YACvBe,oBAAoBhB;QACtB;IACF;IAEA,2DAA2D;IAC3D,MAAMiB,kBAAkBjC,mBAAmBU;IAE3C,MAAM,EAAEwB,MAAMC,MAAM,EAAE,GAAGpC,UAAU,SAASY,gBAAgBC,IAAI,CAACuB,MAAM,CAACC,IAAI;IAE5E,MAAMC,mBAAmBxB,WAAW,EAAE;IACtC,MAAMyB,cAAcD,iBAAiBE,GAAG,CAAC,CAACC;QACxC,OAAO;YACLJ,MAAMI,MAAM5B,IAAI,CAACuB,MAAM,CAACC,IAAI;YAC5BxB,MAAM4B,MAAM5B,IAAI,CAACuB,MAAM,CAACvB,IAAI;QAC9B;IACF;IACA,MAAM6B,qBACJ,OAAON,QAAQO,iBAAiB,aAC5BP,QAAQO,aAAa/B,gBAAgBC,IAAI,CAACuB,MAAM,CAACvB,IAAI,IACrDuB,QAAQO;IAEd,qBACE,KAAC9C;QACCwB,KAAKA;QACLuB,IAAI;YACFjC,OAAO;YACPkC,QAAQ;QACV;kBAEA,cAAA,KAAC9C;YACCwC,aAAaA;YACbO,SAAS;gBAAEZ;gBAAiB,GAAGQ,kBAAkB;YAAC;YAClDC,cAAc;gBAAEI,SAASzB;YAAO;sBAE/BA,wBACC,KAAChB;gBACC0C,YAAYpC;gBACZc,cAAcA;gBACdI,cAAcA;gBACdmB,cAAcxC,MAAMwC,YAAY;gBAChCvC,kBAAkBA;;;;AAM9B"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/GridLayout/GridItemContent.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 { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Divider } from '@mui/material';\nimport { useInView } from 'react-intersection-observer';\nimport { DataQueriesProvider, PluginSpecEditor, usePlugin, useSuggestedStepMs } from '@perses-dev/plugin-system';\nimport React, { ReactElement, useMemo, useState } from 'react';\nimport { PanelGroupItemId, useEditMode, usePanel, usePanelActions, useViewPanelGroup } from '../../context';\nimport { Panel, PanelProps, PanelOptions } from '../Panel';\nimport { isPanelGroupItemIdEqual } from '../../context/DashboardProvider/panel-group-slice';\n\nexport interface GridItemContentProps {\n panelGroupItemId: PanelGroupItemId;\n width: number; // necessary for determining the suggested step ms\n panelOptions?: PanelOptions;\n}\n\n/**\n * Resolves the reference to panel content in a GridItemDefinition and renders the panel.\n */\nexport function GridItemContent(props: GridItemContentProps): ReactElement {\n const { panelGroupItemId, width } = props;\n const panelDefinition = usePanel(panelGroupItemId);\n\n const {\n spec: { queries },\n } = panelDefinition;\n\n const { isEditMode } = useEditMode();\n const { openEditPanel, openDeletePanelDialog, duplicatePanel, viewPanel } = usePanelActions(panelGroupItemId);\n const viewPanelGroupItemId = useViewPanelGroup();\n const { ref, inView } = useInView({\n threshold: 0.2, // we have the flexibility to adjust this threshold to trigger queries slightly earlier or later based on performance\n initialInView: false,\n triggerOnce: true,\n });\n\n const [openQueryViewer, setOpenQueryViewer] = useState(false);\n\n const viewQueriesHandler = useMemo(() => {\n return isEditMode || !queries?.length\n ? undefined\n : {\n onClick: (): void => {\n setOpenQueryViewer(true);\n },\n };\n }, [isEditMode, queries]);\n\n const readHandlers = {\n isPanelViewed: isPanelGroupItemIdEqual(viewPanelGroupItemId, panelGroupItemId),\n onViewPanelClick: function (): void {\n if (viewPanelGroupItemId === undefined) {\n viewPanel(panelGroupItemId);\n } else {\n viewPanel(undefined);\n }\n },\n };\n\n // Provide actions to the panel when in edit mode\n let editHandlers: PanelProps['editHandlers'] = undefined;\n if (isEditMode) {\n editHandlers = {\n onEditPanelClick: openEditPanel,\n onDuplicatePanelClick: duplicatePanel,\n onDeletePanelClick: openDeletePanelDialog,\n };\n }\n\n // map TimeSeriesQueryDefinition to Definition<UnknownSpec>\n const suggestedStepMs = useSuggestedStepMs(width);\n\n const { data: plugin } = usePlugin('Panel', panelDefinition.spec.plugin.kind);\n\n const queryDefinitions = queries ?? [];\n const definitions = queryDefinitions.map((query) => {\n return {\n kind: query.spec.plugin.kind,\n spec: query.spec.plugin.spec,\n };\n });\n\n const pluginQueryOptions =\n typeof plugin?.queryOptions === 'function'\n ? plugin?.queryOptions(panelDefinition.spec.plugin.spec)\n : plugin?.queryOptions;\n\n const queryRows = useMemo(() => {\n if (!queries?.length) return null;\n\n const queryItems: ReactElement[] = [];\n queries.forEach((query, index) => {\n if (query?.spec?.plugin?.kind && query?.kind) {\n queryItems.push(\n <React.Fragment key={`query-${index}`}>\n <PluginSpecEditor\n value={query.spec.plugin.spec}\n pluginSelection={{ kind: query.spec.plugin.kind, type: query.kind }}\n onChange={(): void => {}}\n isReadonly\n />\n {index < queries.length - 1 && <Divider sx={{ my: 2 }} />}\n </React.Fragment>\n );\n }\n });\n\n return queryItems;\n }, [queries]);\n\n const onCloseHandler = (): void => {\n setOpenQueryViewer(false);\n };\n\n return (\n <Box\n ref={ref}\n sx={{\n width: '100%',\n height: '100%',\n }}\n >\n <Dialog\n fullWidth\n PaperProps={{\n sx: {\n margin: '10px',\n width: 'calc(100% - 20px)',\n },\n }}\n maxWidth=\"lg\"\n open={openQueryViewer}\n >\n <DialogTitle>Query Viewer</DialogTitle>\n <DialogContent>\n <Box sx={{ padding: '5px' }}>{queryRows}</Box>\n </DialogContent>\n <DialogActions>\n <Button variant=\"outlined\" onClick={onCloseHandler} color=\"primary\">\n Close\n </Button>\n </DialogActions>\n </Dialog>\n <DataQueriesProvider\n definitions={definitions}\n options={{ suggestedStepMs, ...pluginQueryOptions }}\n queryOptions={{ enabled: inView }}\n >\n {inView && (\n <Panel\n definition={panelDefinition}\n readHandlers={readHandlers}\n editHandlers={editHandlers}\n viewQueriesHandler={viewQueriesHandler}\n panelOptions={props.panelOptions}\n panelGroupItemId={panelGroupItemId}\n />\n )}\n </DataQueriesProvider>\n </Box>\n );\n}\n"],"names":["Box","Button","Dialog","DialogActions","DialogContent","DialogTitle","Divider","useInView","DataQueriesProvider","PluginSpecEditor","usePlugin","useSuggestedStepMs","React","useMemo","useState","useEditMode","usePanel","usePanelActions","useViewPanelGroup","Panel","isPanelGroupItemIdEqual","GridItemContent","props","panelGroupItemId","width","panelDefinition","spec","queries","isEditMode","openEditPanel","openDeletePanelDialog","duplicatePanel","viewPanel","viewPanelGroupItemId","ref","inView","threshold","initialInView","triggerOnce","openQueryViewer","setOpenQueryViewer","viewQueriesHandler","length","undefined","onClick","readHandlers","isPanelViewed","onViewPanelClick","editHandlers","onEditPanelClick","onDuplicatePanelClick","onDeletePanelClick","suggestedStepMs","data","plugin","kind","queryDefinitions","definitions","map","query","pluginQueryOptions","queryOptions","queryRows","queryItems","forEach","index","push","Fragment","value","pluginSelection","type","onChange","isReadonly","sx","my","onCloseHandler","height","fullWidth","PaperProps","margin","maxWidth","open","padding","variant","color","options","enabled","definition","panelOptions"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
2
|
import { PanelGroupId } from '@perses-dev/core';
|
|
3
3
|
import { PanelOptions } from '../Panel';
|
|
4
|
+
import { RowProps } from './Row';
|
|
4
5
|
export interface GridLayoutProps {
|
|
5
6
|
panelGroupId: PanelGroupId;
|
|
6
7
|
panelOptions?: PanelOptions;
|
|
@@ -10,4 +11,11 @@ export interface GridLayoutProps {
|
|
|
10
11
|
* Layout component that arranges children in a Grid based on the definition.
|
|
11
12
|
*/
|
|
12
13
|
export declare function GridLayout(props: GridLayoutProps): ReactElement;
|
|
14
|
+
export interface RepeatGridLayoutProps extends RowProps {
|
|
15
|
+
repeatVariableName: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Renders a grid layout for a repeated variable, where each value of the variable will create a new row.
|
|
19
|
+
*/
|
|
20
|
+
export declare function RepeatGridLayout({ repeatVariableName, panelGroupId, groupDefinition, gridColWidth, panelFullHeight, panelOptions, isEditMode, onLayoutChange, onWidthChange, }: RepeatGridLayoutProps): ReactElement | null;
|
|
13
21
|
//# sourceMappingURL=GridLayout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridLayout.d.ts","sourceRoot":"","sources":["../../../src/components/GridLayout/GridLayout.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"GridLayout.d.ts","sourceRoot":"","sources":["../../../src/components/GridLayout/GridLayout.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,YAAY,EAAY,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUhD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAO,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAmE/D;AAED,MAAM,WAAW,qBAAsB,SAAQ,QAAQ;IACrD,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,UAAkB,EAClB,cAAc,EACd,aAAa,GACd,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CA0C7C"}
|
|
@@ -10,63 +10,22 @@
|
|
|
10
10
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
// See the License for the specific language governing permissions and
|
|
12
12
|
// limitations under the License.
|
|
13
|
-
import { jsx as _jsx,
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { Collapse, useTheme } from '@mui/material';
|
|
17
|
-
import { ErrorAlert, ErrorBoundary } from '@perses-dev/components';
|
|
13
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
14
|
+
import { useState } from 'react';
|
|
15
|
+
import { useVariableValues, VariableContext } from '@perses-dev/plugin-system';
|
|
18
16
|
import { useEditMode, usePanelGroup, usePanelGroupActions, useViewPanelGroup } from '../../context';
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { GridItemContent } from './GridItemContent';
|
|
22
|
-
import { GridContainer } from './GridContainer';
|
|
23
|
-
const DEFAULT_MARGIN = 10;
|
|
24
|
-
const ROW_HEIGHT = 30;
|
|
17
|
+
import { GRID_LAYOUT_SMALL_BREAKPOINT } from '../../constants';
|
|
18
|
+
import { Row } from './Row';
|
|
25
19
|
/**
|
|
26
20
|
* Layout component that arranges children in a Grid based on the definition.
|
|
27
21
|
*/ export function GridLayout(props) {
|
|
28
22
|
const { panelGroupId, panelOptions, panelFullHeight } = props;
|
|
29
|
-
const theme = useTheme();
|
|
30
23
|
const groupDefinition = usePanelGroup(panelGroupId);
|
|
31
24
|
const { updatePanelGroupLayouts } = usePanelGroupActions(panelGroupId);
|
|
32
|
-
const
|
|
25
|
+
const viewPanelItemId = useViewPanelGroup();
|
|
33
26
|
const { isEditMode } = useEditMode();
|
|
34
27
|
const [gridColWidth, setGridColWidth] = useState(0);
|
|
35
|
-
const viewPanelItemId = useViewPanelGroup();
|
|
36
28
|
const hasViewPanel = viewPanelItemId?.panelGroupId === panelGroupId; // current panelGroup contains the panel extended?
|
|
37
|
-
const itemLayoutViewed = viewPanelItemId?.panelGroupItemLayoutId;
|
|
38
|
-
useEffect(()=>{
|
|
39
|
-
if (hasViewPanel) {
|
|
40
|
-
setIsOpen(true);
|
|
41
|
-
}
|
|
42
|
-
}, [
|
|
43
|
-
hasViewPanel
|
|
44
|
-
]);
|
|
45
|
-
// If there is a panel in view mode, we should hide the grid if the panel is not in the current group.
|
|
46
|
-
const isGridDisplayed = viewPanelItemId === undefined || hasViewPanel;
|
|
47
|
-
// Item layout is override if there is a panel in view mode
|
|
48
|
-
const itemLayouts = useMemo(()=>{
|
|
49
|
-
if (itemLayoutViewed) {
|
|
50
|
-
return groupDefinition.itemLayouts.map((itemLayout)=>{
|
|
51
|
-
if (itemLayout.i === itemLayoutViewed) {
|
|
52
|
-
const rowTitleHeight = 40 + 8; // 40 is the height of the row title and 8 is the margin height
|
|
53
|
-
return {
|
|
54
|
-
h: Math.round(((panelFullHeight ?? window.innerHeight) - rowTitleHeight) / (ROW_HEIGHT + DEFAULT_MARGIN)),
|
|
55
|
-
i: itemLayoutViewed,
|
|
56
|
-
w: 48,
|
|
57
|
-
x: 0,
|
|
58
|
-
y: 0
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
return itemLayout;
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
return groupDefinition.itemLayouts;
|
|
65
|
-
}, [
|
|
66
|
-
groupDefinition.itemLayouts,
|
|
67
|
-
itemLayoutViewed,
|
|
68
|
-
panelFullHeight
|
|
69
|
-
]);
|
|
70
29
|
const handleLayoutChange = (currentLayout, allLayouts)=>{
|
|
71
30
|
// Using the value from `allLayouts` instead of `currentLayout` because of
|
|
72
31
|
// a bug in react-layout-grid where `currentLayout` does not adjust properly
|
|
@@ -87,87 +46,74 @@ const ROW_HEIGHT = 30;
|
|
|
87
46
|
// exclude margin and padding from total width
|
|
88
47
|
setGridColWidth((containerWidth - marginWidth - containerPaddingWidth) / cols);
|
|
89
48
|
};
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
"data-testid": "panel-group-content",
|
|
112
|
-
children: /*#__PURE__*/ _jsx(ResponsiveGridLayout, {
|
|
113
|
-
className: "layout",
|
|
114
|
-
breakpoints: {
|
|
115
|
-
sm: theme.breakpoints.values.sm,
|
|
116
|
-
xxs: 0
|
|
117
|
-
},
|
|
118
|
-
cols: GRID_LAYOUT_COLS,
|
|
119
|
-
rowHeight: ROW_HEIGHT,
|
|
120
|
-
draggableHandle: ".drag-handle",
|
|
121
|
-
resizeHandles: [
|
|
122
|
-
'se'
|
|
123
|
-
],
|
|
124
|
-
isDraggable: isEditMode && !hasViewPanel,
|
|
125
|
-
isResizable: isEditMode && !hasViewPanel,
|
|
126
|
-
margin: [
|
|
127
|
-
DEFAULT_MARGIN,
|
|
128
|
-
DEFAULT_MARGIN
|
|
129
|
-
],
|
|
130
|
-
containerPadding: [
|
|
131
|
-
0,
|
|
132
|
-
10
|
|
133
|
-
],
|
|
134
|
-
layouts: {
|
|
135
|
-
[GRID_LAYOUT_SMALL_BREAKPOINT]: itemLayouts
|
|
136
|
-
},
|
|
137
|
-
onLayoutChange: handleLayoutChange,
|
|
138
|
-
onWidthChange: handleWidthChange,
|
|
139
|
-
allowOverlap: hasViewPanel,
|
|
140
|
-
children: itemLayouts.map(({ i, w })=>/*#__PURE__*/ _jsx("div", {
|
|
141
|
-
style: {
|
|
142
|
-
display: itemLayoutViewed !== undefined ? itemLayoutViewed === i ? 'unset' : 'none' : 'unset'
|
|
143
|
-
},
|
|
144
|
-
children: /*#__PURE__*/ _jsx(ErrorBoundary, {
|
|
145
|
-
FallbackComponent: ErrorAlert,
|
|
146
|
-
children: /*#__PURE__*/ _jsx(GridItemContent, {
|
|
147
|
-
panelOptions: panelOptions,
|
|
148
|
-
panelGroupItemId: {
|
|
149
|
-
panelGroupId,
|
|
150
|
-
panelGroupItemLayoutId: i
|
|
151
|
-
},
|
|
152
|
-
width: calculateGridItemWidth(w, gridColWidth)
|
|
153
|
-
})
|
|
154
|
-
})
|
|
155
|
-
}, i))
|
|
156
|
-
})
|
|
157
|
-
})
|
|
158
|
-
]
|
|
49
|
+
return /*#__PURE__*/ _jsx(_Fragment, {
|
|
50
|
+
children: !groupDefinition.repeatVariable ? /*#__PURE__*/ _jsx(Row, {
|
|
51
|
+
panelGroupId: panelGroupId,
|
|
52
|
+
groupDefinition: groupDefinition,
|
|
53
|
+
gridColWidth: gridColWidth,
|
|
54
|
+
panelFullHeight: panelFullHeight,
|
|
55
|
+
panelOptions: panelOptions,
|
|
56
|
+
isEditMode: isEditMode,
|
|
57
|
+
onLayoutChange: handleLayoutChange,
|
|
58
|
+
onWidthChange: handleWidthChange
|
|
59
|
+
}) : /*#__PURE__*/ _jsx(RepeatGridLayout, {
|
|
60
|
+
repeatVariableName: groupDefinition.repeatVariable,
|
|
61
|
+
panelGroupId: panelGroupId,
|
|
62
|
+
groupDefinition: groupDefinition,
|
|
63
|
+
gridColWidth: gridColWidth,
|
|
64
|
+
panelFullHeight: panelFullHeight,
|
|
65
|
+
panelOptions: panelOptions,
|
|
66
|
+
isEditMode: isEditMode,
|
|
67
|
+
onLayoutChange: handleLayoutChange,
|
|
68
|
+
onWidthChange: handleWidthChange
|
|
69
|
+
})
|
|
159
70
|
});
|
|
160
71
|
}
|
|
161
72
|
/**
|
|
162
|
-
*
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
73
|
+
* Renders a grid layout for a repeated variable, where each value of the variable will create a new row.
|
|
74
|
+
*/ export function RepeatGridLayout({ repeatVariableName, panelGroupId, groupDefinition, gridColWidth, panelFullHeight, panelOptions, isEditMode = false, onLayoutChange, onWidthChange }) {
|
|
75
|
+
const variables = useVariableValues();
|
|
76
|
+
const variable = variables[repeatVariableName];
|
|
77
|
+
// If the variable is not defined, or if it is defined but has no values, render a standard row without repeating
|
|
78
|
+
if (variable === undefined || !Array.isArray(variable.value) || variable.value.length === 0) {
|
|
79
|
+
return /*#__PURE__*/ _jsx(Row, {
|
|
80
|
+
panelGroupId: panelGroupId,
|
|
81
|
+
groupDefinition: groupDefinition,
|
|
82
|
+
gridColWidth: gridColWidth,
|
|
83
|
+
panelFullHeight: panelFullHeight,
|
|
84
|
+
panelOptions: panelOptions,
|
|
85
|
+
isEditMode: isEditMode,
|
|
86
|
+
onLayoutChange: onLayoutChange,
|
|
87
|
+
onWidthChange: onWidthChange
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return /*#__PURE__*/ _jsx(_Fragment, {
|
|
91
|
+
children: variable.value.map((value)=>/*#__PURE__*/ _jsx(VariableContext.Provider, {
|
|
92
|
+
value: {
|
|
93
|
+
state: {
|
|
94
|
+
...variables,
|
|
95
|
+
[repeatVariableName]: {
|
|
96
|
+
value,
|
|
97
|
+
loading: false
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
children: /*#__PURE__*/ _jsx(Row, {
|
|
102
|
+
panelGroupId: panelGroupId,
|
|
103
|
+
groupDefinition: groupDefinition,
|
|
104
|
+
gridColWidth: gridColWidth,
|
|
105
|
+
panelFullHeight: panelFullHeight,
|
|
106
|
+
panelOptions: panelOptions,
|
|
107
|
+
isEditMode: isEditMode,
|
|
108
|
+
onLayoutChange: onLayoutChange,
|
|
109
|
+
onWidthChange: onWidthChange,
|
|
110
|
+
repeatVariable: [
|
|
111
|
+
repeatVariableName,
|
|
112
|
+
value
|
|
113
|
+
]
|
|
114
|
+
})
|
|
115
|
+
}, `${repeatVariableName}-${value}`))
|
|
116
|
+
});
|
|
117
|
+
}
|
|
172
118
|
|
|
173
119
|
//# sourceMappingURL=GridLayout.js.map
|