Skip to content

Commit

Permalink
[ML] Disabling create data view for data frame analytics and transfor…
Browse files Browse the repository at this point in the history
…ms wizards (elastic#117690)

* [ML] Disabling create data view for data frame analytics and transforms wizards

* removing dfa results link

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
  • Loading branch information
jgowdyelastic and kibanamachine committed Nov 15, 2021
1 parent 281aa19 commit 0af1c27
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,19 @@

import React, { FC, Fragment, useEffect, useMemo, useRef } from 'react';
import { debounce } from 'lodash';
import { EuiCallOut, EuiFieldText, EuiForm, EuiFormRow, EuiSpacer, EuiSwitch } from '@elastic/eui';
import {
EuiCallOut,
EuiFieldText,
EuiForm,
EuiFormRow,
EuiSpacer,
EuiSwitch,
EuiText,
} from '@elastic/eui';

import { i18n } from '@kbn/i18n';

import { useMlKibana } from '../../../../../contexts/kibana';
import { CodeEditor } from '../../../../../../../../../../src/plugins/kibana_react/public';
import { useNotifications } from '../../../../../contexts/kibana';
import { ml } from '../../../../../services/ml_api_service';
Expand All @@ -36,11 +45,22 @@ export const CreateAnalyticsAdvancedEditor: FC<CreateAnalyticsFormProps> = (prop

const forceInput = useRef<HTMLInputElement | null>(null);
const { toasts } = useNotifications();
const {
services: {
application: { capabilities },
},
} = useMlKibana();

const onChange = (str: string) => {
setAdvancedEditorRawString(str);
};

const canCreateDataView = useMemo(
() =>
capabilities.savedObjectsManagement.edit === true || capabilities.indexPatterns.save === true,
[capabilities]
);

const debouncedJobIdCheck = useMemo(
() =>
debounce(async () => {
Expand Down Expand Up @@ -200,18 +220,34 @@ export const CreateAnalyticsAdvancedEditor: FC<CreateAnalyticsFormProps> = (prop
{!isJobCreated && (
<Fragment>
<EuiFormRow
isInvalid={createIndexPattern && destinationIndexPatternTitleExists}
error={
createIndexPattern &&
destinationIndexPatternTitleExists && [
i18n.translate('xpack.ml.dataframe.analytics.create.dataViewAlreadyExistsError', {
defaultMessage: 'A data view with this title already exists.',
}),
]
isInvalid={
(createIndexPattern && destinationIndexPatternTitleExists) ||
canCreateDataView === false
}
error={[
...(canCreateDataView === false
? [
<EuiText size="xs" color="warning">
{i18n.translate(
'xpack.ml.dataframe.analytics.create.dataViewPermissionWarning',
{
defaultMessage: 'You need permission to create data views.',
}
)}
</EuiText>,
]
: []),
...(createIndexPattern && destinationIndexPatternTitleExists
? [
i18n.translate('xpack.ml.dataframe.analytics.create.dataViewExistsError', {
defaultMessage: 'A data view with this title already exists.',
}),
]
: []),
]}
>
<EuiSwitch
disabled={isJobCreated}
disabled={canCreateDataView === false}
name="mlDataFrameAnalyticsCreateIndexPattern"
label={i18n.translate('xpack.ml.dataframe.analytics.create.createDataViewLabel', {
defaultMessage: 'Create data view',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ export const DetailsStepForm: FC<CreateAnalyticsStepProps> = ({
setCurrentStep,
}) => {
const {
services: { docLinks, notifications },
services: {
docLinks,
notifications,
application: { capabilities },
},
} = useMlKibana();
const createIndexLink = docLinks.links.apis.createIndex;
const { setFormState } = actions;
Expand Down Expand Up @@ -71,6 +75,11 @@ export const DetailsStepForm: FC<CreateAnalyticsStepProps> = ({
(cloneJob !== undefined && resultsField === DEFAULT_RESULTS_FIELD)
);

const canCreateDataView = useMemo(
() =>
capabilities.savedObjectsManagement.edit === true || capabilities.indexPatterns.save === true,
[capabilities]
);
const forceInput = useRef<HTMLInputElement | null>(null);

const isStepInvalid =
Expand Down Expand Up @@ -149,6 +158,12 @@ export const DetailsStepForm: FC<CreateAnalyticsStepProps> = ({
}
}, [destIndexSameAsId, jobId]);

useEffect(() => {
if (canCreateDataView === false) {
setFormState({ createIndexPattern: false });
}
}, [capabilities]);

return (
<Fragment>
<EuiFormRow
Expand Down Expand Up @@ -347,9 +362,20 @@ export const DetailsStepForm: FC<CreateAnalyticsStepProps> = ({
<EuiFormRow
fullWidth
isInvalid={
(createIndexPattern && destinationIndexPatternTitleExists) || !createIndexPattern
(createIndexPattern && destinationIndexPatternTitleExists) ||
createIndexPattern === false ||
canCreateDataView === false
}
error={[
...(canCreateDataView === false
? [
<EuiText size="xs" color="warning">
{i18n.translate('xpack.ml.dataframe.analytics.create.dataViewPermissionWarning', {
defaultMessage: 'You need permission to create data views.',
})}
</EuiText>,
]
: []),
...(createIndexPattern && destinationIndexPatternTitleExists
? [
i18n.translate('xpack.ml.dataframe.analytics.create.dataViewExistsError', {
Expand All @@ -373,7 +399,7 @@ export const DetailsStepForm: FC<CreateAnalyticsStepProps> = ({
]}
>
<EuiSwitch
disabled={isJobCreated}
disabled={isJobCreated === true || canCreateDataView === false}
name="mlDataFrameAnalyticsCreateIndexPattern"
label={i18n.translate('xpack.ml.dataframe.analytics.create.createDataViewLabel', {
defaultMessage: 'Create data view',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* 2.0.
*/

import React, { FC } from 'react';
import React, { FC, useMemo } from 'react';
import { FormattedMessage } from '@kbn/i18n/react';
import { EuiLink, EuiText } from '@elastic/eui';
import { useMlKibana } from '../../../../../contexts/kibana';
Expand All @@ -18,30 +18,46 @@ export const IndexPatternPrompt: FC<Props> = ({ destIndex }) => {
const {
services: {
http: { basePath },
application: { capabilities },
},
} = useMlKibana();

const canCreateDataView = useMemo(
() =>
capabilities.savedObjectsManagement.edit === true || capabilities.indexPatterns.save === true,
[capabilities]
);

return (
<>
<EuiText size="xs" color="warning">
<FormattedMessage
id="xpack.ml.dataframe.analytics.dataViewPromptMessage"
defaultMessage="No data view exists for index {destIndex}. {linkToDataViewManagement} for {destIndex}."
defaultMessage="No data view exists for index {destIndex}. "
values={{
destIndex,
linkToDataViewManagement: (
<EuiLink
href={`${basePath.get()}/app/management/kibana/dataViews/create`}
target="_blank"
>
<FormattedMessage
id="xpack.ml.dataframe.analytics.dataViewPromptLinkText"
defaultMessage="Create a data view"
/>
</EuiLink>
),
}}
/>
{canCreateDataView === true ? (
<FormattedMessage
id="xpack.ml.dataframe.analytics.dataViewPromptLink"
defaultMessage="{linkToDataViewManagement} for {destIndex}."
values={{
destIndex,
linkToDataViewManagement: (
<EuiLink
href={`${basePath.get()}/app/management/kibana/dataViews/create`}
target="_blank"
>
<FormattedMessage
id="xpack.ml.dataframe.analytics.dataViewPromptLinkText"
defaultMessage="Create a data view"
/>
</EuiLink>
),
}}
/>
) : null}
</EuiText>
</>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* 2.0.
*/

import React, { FC, useEffect, useState } from 'react';
import React, { FC, useEffect, useState, useMemo } from 'react';

import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
Expand All @@ -20,6 +20,7 @@ import {
EuiSelect,
EuiSpacer,
EuiCallOut,
EuiText,
} from '@elastic/eui';

import { KBN_FIELD_TYPES } from '../../../../../../../../../src/plugins/data/common';
Expand Down Expand Up @@ -68,6 +69,7 @@ interface StepDetailsFormProps {
export const StepDetailsForm: FC<StepDetailsFormProps> = React.memo(
({ overrides = {}, onChange, searchItems, stepDefineState }) => {
const deps = useAppDependencies();
const { capabilities } = deps.application;
const toastNotifications = useToastNotifications();
const { esIndicesCreateIndex } = useDocumentationLinks();

Expand All @@ -83,9 +85,18 @@ export const StepDetailsForm: FC<StepDetailsFormProps> = React.memo(
const [transformIds, setTransformIds] = useState<TransformId[]>([]);
const [indexNames, setIndexNames] = useState<EsIndexName[]>([]);

const canCreateDataView = useMemo(
() =>
capabilities.savedObjectsManagement.edit === true ||
capabilities.indexPatterns.save === true,
[capabilities]
);

// Index pattern state
const [indexPatternTitles, setIndexPatternTitles] = useState<IndexPatternTitle[]>([]);
const [createIndexPattern, setCreateIndexPattern] = useState(defaults.createIndexPattern);
const [createIndexPattern, setCreateIndexPattern] = useState(
canCreateDataView === false ? false : defaults.createIndexPattern
);
const [indexPatternAvailableTimeFields, setIndexPatternAvailableTimeFields] = useState<
string[]
>([]);
Expand Down Expand Up @@ -443,18 +454,31 @@ export const StepDetailsForm: FC<StepDetailsFormProps> = React.memo(
) : null}

<EuiFormRow
isInvalid={createIndexPattern && indexPatternTitleExists}
error={
createIndexPattern &&
indexPatternTitleExists && [
i18n.translate('xpack.transform.stepDetailsForm.dataViewTitleError', {
defaultMessage: 'A data view with this title already exists.',
}),
]
isInvalid={
(createIndexPattern && indexPatternTitleExists) || canCreateDataView === false
}
error={[
...(canCreateDataView === false
? [
<EuiText size="xs" color="warning">
{i18n.translate('xpack.transform.stepDetailsForm.dataViewPermissionWarning', {
defaultMessage: 'You need permission to create data views.',
})}
</EuiText>,
]
: []),
...(createIndexPattern && indexPatternTitleExists
? [
i18n.translate('xpack.transform.stepDetailsForm.dataViewTitleError', {
defaultMessage: 'A data view with this title already exists.',
}),
]
: []),
]}
>
<EuiSwitch
name="transformCreateIndexPattern"
disabled={canCreateDataView === false}
label={i18n.translate('xpack.transform.stepCreateForm.createDataViewLabel', {
defaultMessage: 'Create Kibana data view',
})}
Expand Down

0 comments on commit 0af1c27

Please sign in to comment.