input control read only (#158853)

Part of https://github.com/elastic/kibana/issues/154307

### Test
* Start kibana with `yarn start --serverless=es`
* set the following yaml configuration values
    ```
    input_control_vis.readOnly: true
    ```

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Nathan Reese 2023-06-02 09:08:06 -06:00 committed by GitHub
parent 7c8ddd0ec5
commit 0eab3fbea3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 74 additions and 6 deletions

View file

@ -0,0 +1,24 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import { schema, TypeOf } from '@kbn/config-schema';
export const configSchema = schema.object({
readOnly: schema.conditional(
schema.contextRef('serverless'),
true,
schema.maybe(schema.boolean({ defaultValue: false })),
schema.never()
),
});
export type InputControlConfig = TypeOf<typeof configSchema>;
export interface InputControlPublicConfig {
readOnly?: boolean;
}

View file

@ -5,7 +5,7 @@
"description": "Adds Input Control visualization to Kibana",
"plugin": {
"id": "inputControlVis",
"server": false,
"server": true,
"browser": true,
"requiredPlugins": [
"data",

View file

@ -8,7 +8,8 @@
import { PluginInitializerContext } from '@kbn/core/public';
import { InputControlVisPlugin as Plugin } from './plugin';
import { InputControlPublicConfig } from '../config';
export function plugin(initializerContext: PluginInitializerContext) {
export function plugin(initializerContext: PluginInitializerContext<InputControlPublicConfig>) {
return new Plugin(initializerContext);
}

View file

@ -14,7 +14,8 @@ import { toExpressionAst } from './to_ast';
import { InputControlVisParams } from './types';
export function createInputControlVisTypeDefinition(
deps: InputControlVisDependencies
deps: InputControlVisDependencies,
readOnly: boolean
): VisTypeDefinition<InputControlVisParams> {
const ControlsTab = getControlsTab(deps);
@ -29,7 +30,8 @@ export function createInputControlVisTypeDefinition(
defaultMessage: 'Input controls are deprecated and will be removed in a future version.',
}),
stage: 'experimental',
disableCreate: true,
disableCreate: true, // input controls are deprecated and input control creation has been permanently disabled
disableEdit: readOnly,
isDeprecated: true,
visConfig: {
defaults: {

View file

@ -18,6 +18,7 @@ import { VisualizationsSetup, VisualizationsStart } from '@kbn/visualizations-pl
import { createInputControlVisFn } from './input_control_fn';
import { getInputControlVisRenderer } from './input_control_vis_renderer';
import { createInputControlVisTypeDefinition } from './input_control_vis_type';
import { InputControlPublicConfig } from '../config';
type InputControlVisCoreSetup = CoreSetup<InputControlVisPluginStartDependencies, void>;
@ -51,7 +52,7 @@ export interface InputControlVisPluginStartDependencies {
/** @internal */
export class InputControlVisPlugin implements Plugin<void, void> {
constructor(public initializerContext: PluginInitializerContext) {}
constructor(public initializerContext: PluginInitializerContext<InputControlPublicConfig>) {}
public setup(
core: InputControlVisCoreSetup,
@ -69,8 +70,9 @@ export class InputControlVisPlugin implements Plugin<void, void> {
expressions.registerFunction(createInputControlVisFn);
expressions.registerRenderer(getInputControlVisRenderer(visualizationDependencies));
const { readOnly } = this.initializerContext.config.get<InputControlPublicConfig>();
visualizations.createBaseVisualization(
createInputControlVisTypeDefinition(visualizationDependencies)
createInputControlVisTypeDefinition(visualizationDependencies, Boolean(readOnly))
);
}

View file

@ -0,0 +1,36 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import { CoreSetup, PluginConfigDescriptor, PluginInitializerContext } from '@kbn/core/server';
import type { VisualizationsServerSetup } from '@kbn/visualizations-plugin/server';
import { configSchema, InputControlConfig } from '../config';
export const config: PluginConfigDescriptor<InputControlConfig> = {
exposeToBrowser: {
readOnly: true,
},
schema: configSchema,
};
interface PluginSetupDependencies {
visualizations: VisualizationsServerSetup;
}
export const plugin = (initializerContext: PluginInitializerContext) => ({
setup(core: CoreSetup, plugins: PluginSetupDependencies) {
const { readOnly } = initializerContext.config.get<InputControlConfig>();
if (readOnly) {
plugins.visualizations.registerReadOnlyVisType('input_control_vis');
}
return {};
},
start() {},
});

View file

@ -6,6 +6,7 @@
"include": [
"public/**/*",
"server/**/*",
"*.ts",
],
"kbn_references": [
"@kbn/kibana-react-plugin",
@ -21,6 +22,7 @@
"@kbn/expect",
"@kbn/i18n-react",
"@kbn/test-jest-helpers",
"@kbn/config-schema",
],
"exclude": [
"target/**/*",

View file

@ -161,6 +161,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) {
'usageCollection.uiCounters.debug (boolean)',
'usageCollection.uiCounters.enabled (boolean)',
// readOnly is boolean flag
'input_control_vis.readOnly (any)',
'vis_type_gauge.readOnly (any)',
'vis_type_heatmap.readOnly (any)',
'vis_type_metric.readOnly (any)',