Convert security management pages to new layout (#101660)
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
parent
770aa79121
commit
6c172ead19
|
@ -17,11 +17,9 @@ import {
|
|||
EuiInMemoryTable,
|
||||
EuiPageContent,
|
||||
EuiPageContentBody,
|
||||
EuiPageContentHeader,
|
||||
EuiPageContentHeaderSection,
|
||||
EuiPageHeader,
|
||||
EuiSpacer,
|
||||
EuiText,
|
||||
EuiTitle,
|
||||
EuiToolTip,
|
||||
} from '@elastic/eui';
|
||||
import type { History } from 'history';
|
||||
|
@ -126,7 +124,7 @@ export class APIKeysGridPage extends Component<Props, State> {
|
|||
if (!apiKeys) {
|
||||
if (isLoadingApp) {
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="subdued">
|
||||
<SectionLoading>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.apiKeys.table.loadingApiKeysDescription"
|
||||
|
@ -143,7 +141,7 @@ export class APIKeysGridPage extends Component<Props, State> {
|
|||
|
||||
if (error) {
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="danger">
|
||||
<ApiKeysEmptyPrompt error={error}>
|
||||
<EuiButton iconType="refresh" onClick={this.reloadApiKeys}>
|
||||
<FormattedMessage
|
||||
|
@ -167,9 +165,13 @@ export class APIKeysGridPage extends Component<Props, State> {
|
|||
|
||||
if (!isLoadingTable && apiKeys && apiKeys.length === 0) {
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="subdued">
|
||||
<ApiKeysEmptyPrompt>
|
||||
<EuiButton {...reactRouterNavigate(this.props.history, '/create')} fill>
|
||||
<EuiButton
|
||||
{...reactRouterNavigate(this.props.history, '/create')}
|
||||
fill
|
||||
iconType="plusInCircleFilled"
|
||||
>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.apiKeys.table.createButton"
|
||||
defaultMessage="Create API key"
|
||||
|
@ -183,19 +185,17 @@ export class APIKeysGridPage extends Component<Props, State> {
|
|||
const concatenated = `${this.state.createdApiKey?.id}:${this.state.createdApiKey?.api_key}`;
|
||||
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContentHeader>
|
||||
<EuiPageContentHeaderSection>
|
||||
<EuiTitle>
|
||||
<h1>
|
||||
<>
|
||||
<EuiPageHeader
|
||||
bottomBorder
|
||||
pageTitle={
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.apiKeys.table.apiKeysTitle"
|
||||
defaultMessage="API Keys"
|
||||
/>
|
||||
</h1>
|
||||
</EuiTitle>
|
||||
<EuiText color="subdued" size="s" data-test-subj="apiKeysDescriptionText">
|
||||
<p>
|
||||
}
|
||||
description={
|
||||
<>
|
||||
{isAdmin ? (
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.apiKeys.table.apiKeysAllDescription"
|
||||
|
@ -207,18 +207,23 @@ export class APIKeysGridPage extends Component<Props, State> {
|
|||
defaultMessage="View and delete your API keys. An API key sends requests on your behalf."
|
||||
/>
|
||||
)}
|
||||
</p>
|
||||
</EuiText>
|
||||
</EuiPageContentHeaderSection>
|
||||
<EuiPageContentHeaderSection>
|
||||
<EuiButton {...reactRouterNavigate(this.props.history, '/create')}>
|
||||
</>
|
||||
}
|
||||
rightSideItems={[
|
||||
<EuiButton
|
||||
{...reactRouterNavigate(this.props.history, '/create')}
|
||||
fill
|
||||
iconType="plusInCircleFilled"
|
||||
>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.apiKeys.table.createButton"
|
||||
defaultMessage="Create API key"
|
||||
/>
|
||||
</EuiButton>
|
||||
</EuiPageContentHeaderSection>
|
||||
</EuiPageContentHeader>
|
||||
</EuiButton>,
|
||||
]}
|
||||
/>
|
||||
|
||||
<EuiSpacer size="l" />
|
||||
|
||||
{this.state.createdApiKey && !this.state.isLoadingTable && (
|
||||
<>
|
||||
|
@ -302,7 +307,7 @@ export class APIKeysGridPage extends Component<Props, State> {
|
|||
)}
|
||||
|
||||
<EuiPageContentBody>{this.renderTable()}</EuiPageContentBody>
|
||||
</EuiPageContent>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -5,14 +5,13 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import { EuiEmptyPrompt, EuiFlexGroup, EuiPageContent } from '@elastic/eui';
|
||||
import { EuiEmptyPrompt, EuiPageContent } from '@elastic/eui';
|
||||
import React from 'react';
|
||||
|
||||
import { FormattedMessage } from '@kbn/i18n/react';
|
||||
|
||||
export const PermissionDenied = () => (
|
||||
<EuiFlexGroup gutterSize="none">
|
||||
<EuiPageContent horizontalPosition="center">
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="danger">
|
||||
<EuiEmptyPrompt
|
||||
iconType="securityApp"
|
||||
title={
|
||||
|
@ -33,5 +32,4 @@ export const PermissionDenied = () => (
|
|||
}
|
||||
/>
|
||||
</EuiPageContent>
|
||||
</EuiFlexGroup>
|
||||
);
|
||||
|
|
|
@ -19,7 +19,7 @@ export const NoCompatibleRealms: React.FunctionComponent = () => {
|
|||
title={
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.roleMappings.noCompatibleRealmsErrorTitle"
|
||||
defaultMessage="No compatible realms are enabled in Elasticsearch"
|
||||
defaultMessage="No compatible realms appear to be enabled in Elasticsearch"
|
||||
/>
|
||||
}
|
||||
color="warning"
|
||||
|
@ -27,7 +27,7 @@ export const NoCompatibleRealms: React.FunctionComponent = () => {
|
|||
>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.roleMappings.noCompatibleRealmsErrorDescription"
|
||||
defaultMessage="Role mappings will not be applied to any users. Contact your system administrator and refer to the {link} for more information."
|
||||
defaultMessage="Role mappings may not be applied to users. Contact your system administrator and refer to the {link} for more information."
|
||||
values={{
|
||||
link: (
|
||||
<EuiLink href={docLinks.links.security.mappingRoles} external target="_blank">
|
||||
|
|
|
@ -5,14 +5,13 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import { EuiEmptyPrompt, EuiFlexGroup, EuiPageContent } from '@elastic/eui';
|
||||
import { EuiEmptyPrompt, EuiPageContent } from '@elastic/eui';
|
||||
import React from 'react';
|
||||
|
||||
import { FormattedMessage } from '@kbn/i18n/react';
|
||||
|
||||
export const PermissionDenied = () => (
|
||||
<EuiFlexGroup gutterSize="none">
|
||||
<EuiPageContent horizontalPosition="center">
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="subdued">
|
||||
<EuiEmptyPrompt
|
||||
iconType="securityApp"
|
||||
title={
|
||||
|
@ -33,5 +32,4 @@ export const PermissionDenied = () => (
|
|||
}
|
||||
/>
|
||||
</EuiPageContent>
|
||||
</EuiFlexGroup>
|
||||
);
|
||||
|
|
|
@ -13,11 +13,10 @@ import {
|
|||
EuiForm,
|
||||
EuiLink,
|
||||
EuiPageContent,
|
||||
EuiPageHeader,
|
||||
EuiSpacer,
|
||||
EuiText,
|
||||
EuiTitle,
|
||||
} from '@elastic/eui';
|
||||
import React, { Component, Fragment } from 'react';
|
||||
import React, { Component } from 'react';
|
||||
|
||||
import { i18n } from '@kbn/i18n';
|
||||
import { FormattedMessage } from '@kbn/i18n/react';
|
||||
|
@ -96,17 +95,50 @@ export class EditRoleMappingPage extends Component<Props, State> {
|
|||
|
||||
if (loadState === 'loading') {
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContent horizontalPosition="center" verticalPosition="center" color="subdued">
|
||||
<SectionLoading />
|
||||
</EuiPageContent>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
<>
|
||||
<EuiPageHeader
|
||||
bottomBorder
|
||||
pageTitle={this.getFormTitle()}
|
||||
description={
|
||||
<>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.editRoleMapping.roleMappingDescription"
|
||||
defaultMessage="Use role mappings to control which roles are assigned to your users. {learnMoreLink}"
|
||||
values={{
|
||||
learnMoreLink: (
|
||||
<EuiLink
|
||||
href={this.props.docLinks.links.security.mappingRoles}
|
||||
external={true}
|
||||
target="_blank"
|
||||
>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.editRoleMapping.learnMoreLinkText"
|
||||
defaultMessage="Learn more about role mappings."
|
||||
/>
|
||||
</EuiLink>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
{!this.state.hasCompatibleRealms && (
|
||||
<>
|
||||
<EuiSpacer size="s" />
|
||||
<NoCompatibleRealms />
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
}
|
||||
/>
|
||||
|
||||
<EuiSpacer size="l" />
|
||||
|
||||
<EuiForm isInvalid={this.state.formError.isInvalid} error={this.state.formError.error}>
|
||||
{this.getFormTitle()}
|
||||
<EuiSpacer />
|
||||
<MappingInfoPanel
|
||||
roleMapping={this.state.roleMapping!}
|
||||
onChange={(roleMapping) => this.setState({ roleMapping })}
|
||||
|
@ -135,57 +167,24 @@ export class EditRoleMappingPage extends Component<Props, State> {
|
|||
<EuiSpacer />
|
||||
{this.getFormButtons()}
|
||||
</EuiForm>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
private getFormTitle = () => {
|
||||
if (this.editingExistingRoleMapping()) {
|
||||
return (
|
||||
<Fragment>
|
||||
<EuiTitle size="l">
|
||||
<h1>
|
||||
{this.editingExistingRoleMapping() ? (
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.editRoleMapping.editRoleMappingTitle"
|
||||
defaultMessage="Edit role mapping"
|
||||
/>
|
||||
) : (
|
||||
);
|
||||
}
|
||||
return (
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.editRoleMapping.createRoleMappingTitle"
|
||||
defaultMessage="Create role mapping"
|
||||
/>
|
||||
)}
|
||||
</h1>
|
||||
</EuiTitle>
|
||||
<EuiText color="subdued" size="s">
|
||||
<p>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.editRoleMapping.roleMappingDescription"
|
||||
defaultMessage="Use role mappings to control which roles are assigned to your users. {learnMoreLink}"
|
||||
values={{
|
||||
learnMoreLink: (
|
||||
<EuiLink
|
||||
href={this.props.docLinks.links.security.mappingRoles}
|
||||
external={true}
|
||||
target="_blank"
|
||||
>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.editRoleMapping.learnMoreLinkText"
|
||||
defaultMessage="Learn more."
|
||||
/>
|
||||
</EuiLink>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
</EuiText>
|
||||
{!this.state.hasCompatibleRealms && (
|
||||
<>
|
||||
<EuiSpacer size="s" />
|
||||
<NoCompatibleRealms />
|
||||
</>
|
||||
)}
|
||||
</Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ export class MappingInfoPanel extends Component<Props, State> {
|
|||
}
|
||||
public render() {
|
||||
return (
|
||||
<EuiPanel>
|
||||
<EuiPanel hasShadow={false} hasBorder={true}>
|
||||
<EuiTitle>
|
||||
<h2>
|
||||
<FormattedMessage
|
||||
|
|
|
@ -76,7 +76,7 @@ export class RuleEditorPanel extends Component<Props, State> {
|
|||
}
|
||||
|
||||
return (
|
||||
<EuiPanel>
|
||||
<EuiPanel hasShadow={false} hasBorder={true}>
|
||||
<EuiTitle>
|
||||
<h2>
|
||||
<FormattedMessage
|
||||
|
|
|
@ -37,6 +37,8 @@ export class RuleGroupEditor extends Component<Props, {}> {
|
|||
return (
|
||||
<EuiPanel
|
||||
className={`secRoleMapping__ruleEditorGroup--${this.props.ruleDepth % 2 ? 'odd' : 'even'}`}
|
||||
hasBorder={true}
|
||||
hasShadow={false}
|
||||
>
|
||||
<EuiFlexGroup direction="column">
|
||||
<EuiFlexItem>
|
||||
|
|
|
@ -88,7 +88,7 @@ export class RoleMappingsGridPage extends Component<Props, State> {
|
|||
|
||||
if (loadState === 'loadingApp') {
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="subdued">
|
||||
<SectionLoading>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.roleMappings.loadingRoleMappingsDescription"
|
||||
|
@ -105,7 +105,7 @@ export class RoleMappingsGridPage extends Component<Props, State> {
|
|||
} = error;
|
||||
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="danger">
|
||||
<EuiCallOut
|
||||
title={
|
||||
<FormattedMessage
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`it renders without blowing up 1`] = `
|
||||
<EuiPanel>
|
||||
<EuiPanel
|
||||
hasBorder={true}
|
||||
hasShadow={false}
|
||||
>
|
||||
<EuiFlexGroup
|
||||
alignItems="baseline"
|
||||
gutterSize="s"
|
||||
|
|
|
@ -46,7 +46,7 @@ export class CollapsiblePanel extends Component<Props, State> {
|
|||
|
||||
public render() {
|
||||
return (
|
||||
<EuiPanel>
|
||||
<EuiPanel hasShadow={false} hasBorder={true}>
|
||||
{this.getTitle()}
|
||||
{this.getForm()}
|
||||
</EuiPanel>
|
||||
|
|
|
@ -374,7 +374,7 @@ export const EditRolePage: FunctionComponent<Props> = ({
|
|||
|
||||
const getRoleName = () => {
|
||||
return (
|
||||
<EuiPanel>
|
||||
<EuiPanel hasShadow={false} hasBorder={true}>
|
||||
<EuiFormRow
|
||||
label={
|
||||
<FormattedMessage
|
||||
|
|
|
@ -208,7 +208,7 @@ exports[`it renders without crashing 1`] = `
|
|||
/>
|
||||
<EuiHorizontalRule />
|
||||
<EuiButton
|
||||
iconType="plusInCircleFilled"
|
||||
iconType="plusInCircle"
|
||||
onClick={[Function]}
|
||||
>
|
||||
<FormattedMessage
|
||||
|
|
|
@ -176,7 +176,7 @@ export class ElasticsearchPrivileges extends Component<Props, {}> {
|
|||
<EuiHorizontalRule />
|
||||
|
||||
{this.props.editable && (
|
||||
<EuiButton iconType={'plusInCircleFilled'} onClick={this.addIndexPrivilege}>
|
||||
<EuiButton iconType={'plusInCircle'} onClick={this.addIndexPrivilege}>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.editRole.elasticSearchPrivileges.addIndexPrivilegesButtonLabel"
|
||||
defaultMessage="Add index privilege"
|
||||
|
|
|
@ -199,7 +199,7 @@ export class SpaceAwarePrivilegeSection extends Component<Props, State> {
|
|||
<EuiButton
|
||||
color="primary"
|
||||
onClick={this.addSpacePrivilege}
|
||||
iconType={'plusInCircleFilled'}
|
||||
iconType={'plusInCircle'}
|
||||
data-test-subj={'addSpacePrivilegeButton'}
|
||||
isDisabled={!hasAvailableSpaces || !this.props.editable}
|
||||
>
|
||||
|
|
|
@ -2,22 +2,19 @@
|
|||
|
||||
exports[`<RolesGridPage /> renders permission denied if required 1`] = `
|
||||
<PermissionDenied>
|
||||
<EuiFlexGroup
|
||||
gutterSize="none"
|
||||
>
|
||||
<div
|
||||
className="euiFlexGroup euiFlexGroup--directionRow euiFlexGroup--responsive"
|
||||
>
|
||||
<EuiPageContent
|
||||
color="danger"
|
||||
horizontalPosition="center"
|
||||
verticalPosition="center"
|
||||
>
|
||||
<EuiPanel
|
||||
className="euiPageContent euiPageContent--horizontalCenter"
|
||||
className="euiPageContent euiPageContent--verticalCenter euiPageContent--horizontalCenter"
|
||||
color="danger"
|
||||
paddingSize="l"
|
||||
role="main"
|
||||
>
|
||||
<div
|
||||
className="euiPanel euiPanel--paddingLarge euiPanel--borderRadiusMedium euiPanel--plain euiPanel--hasShadow euiPageContent euiPageContent--horizontalCenter"
|
||||
className="euiPanel euiPanel--paddingLarge euiPanel--borderRadiusMedium euiPanel--danger euiPanel--noShadow euiPanel--noBorder euiPageContent euiPageContent--verticalCenter euiPageContent--horizontalCenter"
|
||||
role="main"
|
||||
>
|
||||
<EuiEmptyPrompt
|
||||
|
@ -116,7 +113,5 @@ exports[`<RolesGridPage /> renders permission denied if required 1`] = `
|
|||
</div>
|
||||
</EuiPanel>
|
||||
</EuiPageContent>
|
||||
</div>
|
||||
</EuiFlexGroup>
|
||||
</PermissionDenied>
|
||||
`;
|
||||
|
|
|
@ -5,14 +5,13 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import { EuiEmptyPrompt, EuiFlexGroup, EuiPageContent } from '@elastic/eui';
|
||||
import { EuiEmptyPrompt, EuiPageContent } from '@elastic/eui';
|
||||
import React from 'react';
|
||||
|
||||
import { FormattedMessage } from '@kbn/i18n/react';
|
||||
|
||||
export const PermissionDenied = () => (
|
||||
<EuiFlexGroup gutterSize="none">
|
||||
<EuiPageContent horizontalPosition="center">
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="danger">
|
||||
<EuiEmptyPrompt
|
||||
iconType="securityApp"
|
||||
title={
|
||||
|
@ -33,5 +32,4 @@ export const PermissionDenied = () => (
|
|||
}
|
||||
/>
|
||||
</EuiPageContent>
|
||||
</EuiFlexGroup>
|
||||
);
|
||||
|
|
|
@ -13,13 +13,10 @@ import {
|
|||
EuiFlexItem,
|
||||
EuiInMemoryTable,
|
||||
EuiLink,
|
||||
EuiPageContent,
|
||||
EuiPageContentBody,
|
||||
EuiPageContentHeader,
|
||||
EuiPageContentHeaderSection,
|
||||
EuiPageHeader,
|
||||
EuiSpacer,
|
||||
EuiSwitch,
|
||||
EuiText,
|
||||
EuiTitle,
|
||||
} from '@elastic/eui';
|
||||
import _ from 'lodash';
|
||||
import React, { Component } from 'react';
|
||||
|
@ -90,39 +87,38 @@ export class RolesGridPage extends Component<Props, State> {
|
|||
private getPageContent = () => {
|
||||
const { roles } = this.state;
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContentHeader>
|
||||
<EuiPageContentHeaderSection>
|
||||
<EuiTitle>
|
||||
<h1>
|
||||
<>
|
||||
<EuiPageHeader
|
||||
bottomBorder
|
||||
pageTitle={
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.roles.roleTitle"
|
||||
defaultMessage="Roles"
|
||||
/>
|
||||
</h1>
|
||||
</EuiTitle>
|
||||
<EuiText color="subdued" size="s">
|
||||
<p>
|
||||
}
|
||||
description={
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.roles.subtitle"
|
||||
defaultMessage="Apply roles to groups of users and manage permissions across the stack."
|
||||
/>
|
||||
</p>
|
||||
</EuiText>
|
||||
</EuiPageContentHeaderSection>
|
||||
<EuiPageContentHeaderSection>
|
||||
}
|
||||
rightSideItems={[
|
||||
<EuiButton
|
||||
data-test-subj="createRoleButton"
|
||||
{...reactRouterNavigate(this.props.history, getRoleManagementHref('edit'))}
|
||||
fill
|
||||
iconType="plusInCircleFilled"
|
||||
>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.roles.createRoleButtonLabel"
|
||||
defaultMessage="Create role"
|
||||
/>
|
||||
</EuiButton>
|
||||
</EuiPageContentHeaderSection>
|
||||
</EuiPageContentHeader>
|
||||
<EuiPageContentBody>
|
||||
</EuiButton>,
|
||||
]}
|
||||
/>
|
||||
|
||||
<EuiSpacer size="l" />
|
||||
|
||||
{this.state.showDeleteConfirmation ? (
|
||||
<ConfirmDelete
|
||||
onCancel={this.onCancelDelete}
|
||||
|
@ -133,7 +129,6 @@ export class RolesGridPage extends Component<Props, State> {
|
|||
/>
|
||||
) : null}
|
||||
|
||||
{
|
||||
<EuiInMemoryTable
|
||||
itemId="name"
|
||||
responsive={false}
|
||||
|
@ -181,9 +176,7 @@ export class RolesGridPage extends Component<Props, State> {
|
|||
}}
|
||||
isSelectable
|
||||
/>
|
||||
}
|
||||
</EuiPageContentBody>
|
||||
</EuiPageContent>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
|
@ -5,14 +5,7 @@
|
|||
* 2.0.
|
||||
*/
|
||||
|
||||
import {
|
||||
EuiHorizontalRule,
|
||||
EuiPageContent,
|
||||
EuiPageContentBody,
|
||||
EuiPageContentHeader,
|
||||
EuiPageContentHeaderSection,
|
||||
EuiTitle,
|
||||
} from '@elastic/eui';
|
||||
import { EuiPageHeader, EuiSpacer } from '@elastic/eui';
|
||||
import type { FunctionComponent } from 'react';
|
||||
import React from 'react';
|
||||
import { useHistory } from 'react-router-dom';
|
||||
|
@ -26,23 +19,20 @@ export const CreateUserPage: FunctionComponent = () => {
|
|||
const backToUsers = () => history.push('/');
|
||||
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContentHeader>
|
||||
<EuiPageContentHeaderSection>
|
||||
<EuiTitle>
|
||||
<h1>
|
||||
<>
|
||||
<EuiPageHeader
|
||||
bottomBorder
|
||||
pageTitle={
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.users.createUserPage.title"
|
||||
defaultMessage="Create user"
|
||||
/>
|
||||
</h1>
|
||||
</EuiTitle>
|
||||
</EuiPageContentHeaderSection>
|
||||
</EuiPageContentHeader>
|
||||
<EuiPageContentBody>
|
||||
<EuiHorizontalRule />
|
||||
}
|
||||
/>
|
||||
|
||||
<EuiSpacer size="l" />
|
||||
|
||||
<UserForm isNewUser onCancel={backToUsers} onSuccess={backToUsers} />
|
||||
</EuiPageContentBody>
|
||||
</EuiPageContent>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -15,10 +15,7 @@ import {
|
|||
EuiFlexGroup,
|
||||
EuiFlexItem,
|
||||
EuiHorizontalRule,
|
||||
EuiPageContent,
|
||||
EuiPageContentBody,
|
||||
EuiPageContentHeader,
|
||||
EuiPageContentHeaderSection,
|
||||
EuiPageHeader,
|
||||
EuiPanel,
|
||||
EuiSpacer,
|
||||
EuiText,
|
||||
|
@ -82,9 +79,10 @@ export const EditUserPage: FunctionComponent<EditUserPageProps> = ({ username })
|
|||
const displayName = getUserDisplayName(user);
|
||||
|
||||
return (
|
||||
<EuiPageContent>
|
||||
<EuiPageContentHeader>
|
||||
<EuiPageContentHeaderSection>
|
||||
<>
|
||||
<EuiPageHeader
|
||||
bottomBorder
|
||||
pageTitle={
|
||||
<EuiFlexGroup alignItems="center" responsive={false}>
|
||||
<EuiFlexItem grow={false}>
|
||||
<EuiAvatar name={displayName!} size="xl" />
|
||||
|
@ -96,10 +94,11 @@ export const EditUserPage: FunctionComponent<EditUserPageProps> = ({ username })
|
|||
<EuiText>{user.email}</EuiText>
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
</EuiPageContentHeaderSection>
|
||||
</EuiPageContentHeader>
|
||||
<EuiPageContentBody>
|
||||
<EuiHorizontalRule />
|
||||
}
|
||||
/>
|
||||
|
||||
<EuiSpacer size="l" />
|
||||
|
||||
{isDeprecatedUser ? (
|
||||
<>
|
||||
<EuiCallOut
|
||||
|
@ -192,7 +191,7 @@ export const EditUserPage: FunctionComponent<EditUserPageProps> = ({ username })
|
|||
<EuiSpacer />
|
||||
<EuiHorizontalRule />
|
||||
|
||||
<EuiPanel color="subdued" hasShadow={false}>
|
||||
<EuiPanel color="subdued" hasShadow={false} grow={false}>
|
||||
<EuiFlexGroup justifyContent="spaceBetween" alignItems="center">
|
||||
<EuiFlexItem>
|
||||
<EuiDescriptionList>
|
||||
|
@ -224,7 +223,7 @@ export const EditUserPage: FunctionComponent<EditUserPageProps> = ({ username })
|
|||
|
||||
<EuiSpacer />
|
||||
{user.enabled === false ? (
|
||||
<EuiPanel color="subdued" hasShadow={false}>
|
||||
<EuiPanel color="subdued" hasShadow={false} grow={false}>
|
||||
<EuiFlexGroup justifyContent="spaceBetween" alignItems="center">
|
||||
<EuiFlexItem>
|
||||
<EuiDescriptionList>
|
||||
|
@ -253,7 +252,7 @@ export const EditUserPage: FunctionComponent<EditUserPageProps> = ({ username })
|
|||
</EuiFlexGroup>
|
||||
</EuiPanel>
|
||||
) : (
|
||||
<EuiPanel color="subdued" hasShadow={false}>
|
||||
<EuiPanel color="subdued" hasShadow={false} grow={false}>
|
||||
<EuiFlexGroup justifyContent="spaceBetween" alignItems="center">
|
||||
<EuiFlexItem>
|
||||
<EuiDescriptionList>
|
||||
|
@ -286,7 +285,7 @@ export const EditUserPage: FunctionComponent<EditUserPageProps> = ({ username })
|
|||
{!isReservedUser && (
|
||||
<>
|
||||
<EuiSpacer />
|
||||
<EuiPanel color="subdued" hasShadow={false}>
|
||||
<EuiPanel color="subdued" hasShadow={false} grow={false}>
|
||||
<EuiFlexGroup justifyContent="spaceBetween" alignItems="center">
|
||||
<EuiFlexItem>
|
||||
<EuiDescriptionList>
|
||||
|
@ -316,7 +315,6 @@ export const EditUserPage: FunctionComponent<EditUserPageProps> = ({ username })
|
|||
</EuiPanel>
|
||||
</>
|
||||
)}
|
||||
</EuiPageContentBody>
|
||||
</EuiPageContent>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -14,11 +14,9 @@ import {
|
|||
EuiInMemoryTable,
|
||||
EuiLink,
|
||||
EuiPageContent,
|
||||
EuiPageContentBody,
|
||||
EuiPageContentHeader,
|
||||
EuiPageContentHeaderSection,
|
||||
EuiPageHeader,
|
||||
EuiSpacer,
|
||||
EuiSwitch,
|
||||
EuiTitle,
|
||||
} from '@elastic/eui';
|
||||
import React, { Component } from 'react';
|
||||
|
||||
|
@ -80,7 +78,7 @@ export class UsersGridPage extends Component<Props, State> {
|
|||
if (permissionDenied) {
|
||||
return (
|
||||
<EuiFlexGroup gutterSize="none">
|
||||
<EuiPageContent horizontalPosition="center">
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="danger">
|
||||
<EuiEmptyPrompt
|
||||
iconType="securityApp"
|
||||
title={
|
||||
|
@ -223,32 +221,32 @@ export class UsersGridPage extends Component<Props, State> {
|
|||
};
|
||||
|
||||
return (
|
||||
<div className="secUsersListingPage">
|
||||
<EuiPageContent className="secUsersListingPage__content">
|
||||
<EuiPageContentHeader>
|
||||
<EuiPageContentHeaderSection>
|
||||
<EuiTitle>
|
||||
<h1>
|
||||
<>
|
||||
<EuiPageHeader
|
||||
bottomBorder
|
||||
pageTitle={
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.users.usersTitle"
|
||||
defaultMessage="Users"
|
||||
/>
|
||||
</h1>
|
||||
</EuiTitle>
|
||||
</EuiPageContentHeaderSection>
|
||||
<EuiPageContentHeaderSection>
|
||||
}
|
||||
rightSideItems={[
|
||||
<EuiButton
|
||||
data-test-subj="createUserButton"
|
||||
{...reactRouterNavigate(this.props.history, `/create`)}
|
||||
fill
|
||||
iconType="plusInCircleFilled"
|
||||
>
|
||||
<FormattedMessage
|
||||
id="xpack.security.management.users.createNewUserButtonLabel"
|
||||
defaultMessage="Create user"
|
||||
/>
|
||||
</EuiButton>
|
||||
</EuiPageContentHeaderSection>
|
||||
</EuiPageContentHeader>
|
||||
<EuiPageContentBody>
|
||||
</EuiButton>,
|
||||
]}
|
||||
/>
|
||||
|
||||
<EuiSpacer size="l" />
|
||||
|
||||
{showDeleteConfirmation ? (
|
||||
<ConfirmDeleteUsers
|
||||
onCancel={this.onCancelDelete}
|
||||
|
@ -277,9 +275,7 @@ export class UsersGridPage extends Component<Props, State> {
|
|||
isSelectable
|
||||
/>
|
||||
}
|
||||
</EuiPageContentBody>
|
||||
</EuiPageContent>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
"ui": true,
|
||||
"extraPublicDirs": ["common"],
|
||||
"requiredBundles": [
|
||||
"esUiShared",
|
||||
"kibanaReact",
|
||||
"savedObjectsManagement",
|
||||
"home"
|
||||
|
|
|
@ -10,10 +10,9 @@ import {
|
|||
EuiButtonEmpty,
|
||||
EuiFlexGroup,
|
||||
EuiFlexItem,
|
||||
EuiLoadingSpinner,
|
||||
EuiPageContentBody,
|
||||
EuiPageContent,
|
||||
EuiPageHeader,
|
||||
EuiSpacer,
|
||||
EuiText,
|
||||
EuiTitle,
|
||||
} from '@elastic/eui';
|
||||
import _ from 'lodash';
|
||||
|
@ -29,8 +28,10 @@ import type {
|
|||
} from 'src/core/public';
|
||||
import type { Space } from 'src/plugins/spaces_oss/common';
|
||||
|
||||
import { SectionLoading } from '../../../../../../src/plugins/es_ui_shared/public';
|
||||
import type { FeaturesPluginStart, KibanaFeature } from '../../../../features/public';
|
||||
import { isReservedSpace } from '../../../common';
|
||||
import { getSpacesFeatureDescription } from '../../constants';
|
||||
import type { SpacesManager } from '../../spaces_manager';
|
||||
import { UnauthorizedPrompt } from '../components';
|
||||
import { toSpaceIdentifier } from '../lib';
|
||||
|
@ -110,46 +111,48 @@ export class ManageSpacePage extends Component<Props, State> {
|
|||
}
|
||||
|
||||
public render() {
|
||||
const content = this.state.isLoading ? this.getLoadingIndicator() : this.getForm();
|
||||
if (!this.props.capabilities.spaces.manage) {
|
||||
return (
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="danger">
|
||||
<UnauthorizedPrompt />
|
||||
</EuiPageContent>
|
||||
);
|
||||
}
|
||||
|
||||
if (this.state.isLoading) {
|
||||
return this.getLoadingIndicator();
|
||||
}
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<EuiPageContentBody>{content}</EuiPageContentBody>
|
||||
<EuiPageHeader
|
||||
bottomBorder
|
||||
pageTitle={this.getTitle()}
|
||||
description={getSpacesFeatureDescription()}
|
||||
/>
|
||||
<EuiSpacer size="l" />
|
||||
|
||||
{this.getForm()}
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
|
||||
public getLoadingIndicator = () => (
|
||||
<div>
|
||||
<EuiLoadingSpinner size={'xl'} />{' '}
|
||||
<EuiTitle>
|
||||
<h1>Loading...</h1>
|
||||
</EuiTitle>
|
||||
</div>
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="subdued">
|
||||
<SectionLoading>
|
||||
<FormattedMessage
|
||||
id="xpack.spaces.management.manageSpacePage.loadingMessage"
|
||||
defaultMessage="Loading…"
|
||||
/>
|
||||
</SectionLoading>
|
||||
</EuiPageContent>
|
||||
);
|
||||
|
||||
public getForm = () => {
|
||||
if (!this.props.capabilities.spaces.manage) {
|
||||
return <UnauthorizedPrompt />;
|
||||
}
|
||||
|
||||
const { showAlteringActiveSpaceDialog } = this.state;
|
||||
|
||||
return (
|
||||
<div data-test-subj="spaces-edit-page">
|
||||
{this.getFormHeading()}
|
||||
|
||||
<EuiSpacer size={'s'} />
|
||||
|
||||
<EuiText size="s">
|
||||
<FormattedMessage
|
||||
id="xpack.spaces.management.manageSpacePage.manageDescription"
|
||||
defaultMessage="Organize your saved objects into meaningful categories."
|
||||
/>
|
||||
</EuiText>
|
||||
|
||||
<EuiSpacer />
|
||||
|
||||
<CustomizeSpace
|
||||
space={this.state.space}
|
||||
onChange={this.onSpaceChange}
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`it renders without blowing up 1`] = `
|
||||
<EuiPanel>
|
||||
<EuiPanel
|
||||
hasBorder={true}
|
||||
hasShadow={false}
|
||||
>
|
||||
<EuiFlexGroup
|
||||
alignItems="baseline"
|
||||
gutterSize="s"
|
||||
|
|
|
@ -19,7 +19,7 @@ interface Props {
|
|||
export class SectionPanel extends Component<Props, {}> {
|
||||
public render() {
|
||||
return (
|
||||
<EuiPanel>
|
||||
<EuiPanel hasShadow={false} hasBorder={true}>
|
||||
{this.getTitle()}
|
||||
{this.getForm()}
|
||||
</EuiPanel>
|
||||
|
|
|
@ -5,41 +5,22 @@ exports[`SpacesGridPage renders as expected 1`] = `
|
|||
className="spcGridPage"
|
||||
data-test-subj="spaces-grid-page"
|
||||
>
|
||||
<EuiPageContent
|
||||
horizontalPosition="center"
|
||||
>
|
||||
<EuiFlexGroup
|
||||
justifyContent="spaceBetween"
|
||||
>
|
||||
<EuiFlexItem
|
||||
grow={false}
|
||||
>
|
||||
<EuiTitle
|
||||
size="m"
|
||||
>
|
||||
<h1>
|
||||
<EuiPageHeader
|
||||
bottomBorder={true}
|
||||
description="Organize your dashboards and other saved objects into meaningful categories."
|
||||
pageTitle={
|
||||
<FormattedMessage
|
||||
defaultMessage="Spaces"
|
||||
id="xpack.spaces.management.spacesGridPage.spacesTitle"
|
||||
values={Object {}}
|
||||
/>
|
||||
</h1>
|
||||
</EuiTitle>
|
||||
<EuiText
|
||||
color="subdued"
|
||||
size="s"
|
||||
>
|
||||
<p>
|
||||
Organize your dashboards and other saved objects into meaningful categories.
|
||||
</p>
|
||||
</EuiText>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem
|
||||
grow={false}
|
||||
>
|
||||
}
|
||||
rightSideItems={
|
||||
Array [
|
||||
<EuiButton
|
||||
data-test-subj="createSpace"
|
||||
fill={true}
|
||||
iconType="plusInCircleFilled"
|
||||
onClick={[Function]}
|
||||
>
|
||||
<FormattedMessage
|
||||
|
@ -47,9 +28,10 @@ exports[`SpacesGridPage renders as expected 1`] = `
|
|||
id="xpack.spaces.management.spacesGridPage.createSpaceButtonLabel"
|
||||
values={Object {}}
|
||||
/>
|
||||
</EuiButton>
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
</EuiButton>,
|
||||
]
|
||||
}
|
||||
/>
|
||||
<EuiSpacer
|
||||
size="l"
|
||||
/>
|
||||
|
@ -124,7 +106,6 @@ exports[`SpacesGridPage renders as expected 1`] = `
|
|||
tableCaption="Kibana spaces"
|
||||
tableLayout="fixed"
|
||||
/>
|
||||
</EuiPageContent>
|
||||
</div>
|
||||
`;
|
||||
|
||||
|
|
|
@ -8,17 +8,15 @@
|
|||
import {
|
||||
EuiButton,
|
||||
EuiButtonIcon,
|
||||
EuiFlexGroup,
|
||||
EuiFlexItem,
|
||||
EuiInMemoryTable,
|
||||
EuiLink,
|
||||
EuiLoadingSpinner,
|
||||
EuiPageContent,
|
||||
EuiPageHeader,
|
||||
EuiSpacer,
|
||||
EuiText,
|
||||
EuiTitle,
|
||||
} from '@elastic/eui';
|
||||
import React, { Component, Fragment, lazy, Suspense } from 'react';
|
||||
import React, { Component, lazy, Suspense } from 'react';
|
||||
|
||||
import { i18n } from '@kbn/i18n';
|
||||
import { FormattedMessage } from '@kbn/i18n/react';
|
||||
|
@ -83,7 +81,19 @@ export class SpacesGridPage extends Component<Props, State> {
|
|||
public render() {
|
||||
return (
|
||||
<div className="spcGridPage" data-test-subj="spaces-grid-page">
|
||||
<EuiPageContent horizontalPosition="center">{this.getPageContent()}</EuiPageContent>
|
||||
<EuiPageHeader
|
||||
bottomBorder
|
||||
pageTitle={
|
||||
<FormattedMessage
|
||||
id="xpack.spaces.management.spacesGridPage.spacesTitle"
|
||||
defaultMessage="Spaces"
|
||||
/>
|
||||
}
|
||||
description={getSpacesFeatureDescription()}
|
||||
rightSideItems={[this.getPrimaryActionButton()]}
|
||||
/>
|
||||
<EuiSpacer size="l" />
|
||||
{this.getPageContent()}
|
||||
{this.getConfirmDeleteModal()}
|
||||
</div>
|
||||
);
|
||||
|
@ -91,29 +101,14 @@ export class SpacesGridPage extends Component<Props, State> {
|
|||
|
||||
public getPageContent() {
|
||||
if (!this.props.capabilities.spaces.manage) {
|
||||
return <UnauthorizedPrompt />;
|
||||
return (
|
||||
<EuiPageContent verticalPosition="center" horizontalPosition="center" color="danger">
|
||||
<UnauthorizedPrompt />
|
||||
</EuiPageContent>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<EuiFlexGroup justifyContent={'spaceBetween'}>
|
||||
<EuiFlexItem grow={false}>
|
||||
<EuiTitle size="m">
|
||||
<h1>
|
||||
<FormattedMessage
|
||||
id="xpack.spaces.management.spacesGridPage.spacesTitle"
|
||||
defaultMessage="Spaces"
|
||||
/>
|
||||
</h1>
|
||||
</EuiTitle>
|
||||
<EuiText color="subdued" size="s">
|
||||
<p>{getSpacesFeatureDescription()}</p>
|
||||
</EuiText>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem grow={false}>{this.getPrimaryActionButton()}</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
<EuiSpacer size="l" />
|
||||
|
||||
<EuiInMemoryTable
|
||||
itemId={'id'}
|
||||
items={this.state.spaces}
|
||||
|
@ -145,7 +140,6 @@ export class SpacesGridPage extends Component<Props, State> {
|
|||
) : undefined
|
||||
}
|
||||
/>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -153,6 +147,7 @@ export class SpacesGridPage extends Component<Props, State> {
|
|||
return (
|
||||
<EuiButton
|
||||
fill
|
||||
iconType="plusInCircleFilled"
|
||||
{...reactRouterNavigate(this.props.history, '/create')}
|
||||
data-test-subj="createSpace"
|
||||
>
|
||||
|
|
|
@ -83,7 +83,7 @@ describe('spacesManagementApp', () => {
|
|||
expect(container).toMatchInlineSnapshot(`
|
||||
<div>
|
||||
<div
|
||||
class="kbnRedirectCrossAppLinks"
|
||||
class="kbnAppWrapper kbnRedirectCrossAppLinks"
|
||||
>
|
||||
Spaces Page: {"capabilities":{"catalogue":{},"management":{},"navLinks":{}},"notifications":{"toasts":{}},"spacesManager":{"onActiveSpaceChange$":{"_isScalar":false}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/","search":"","hash":""}}}
|
||||
</div>
|
||||
|
@ -109,7 +109,7 @@ describe('spacesManagementApp', () => {
|
|||
expect(container).toMatchInlineSnapshot(`
|
||||
<div>
|
||||
<div
|
||||
class="kbnRedirectCrossAppLinks"
|
||||
class="kbnAppWrapper kbnRedirectCrossAppLinks"
|
||||
>
|
||||
Spaces Edit Page: {"capabilities":{"catalogue":{},"management":{},"navLinks":{}},"notifications":{"toasts":{}},"spacesManager":{"onActiveSpaceChange$":{"_isScalar":false}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/create","search":"","hash":""}}}
|
||||
</div>
|
||||
|
@ -141,7 +141,7 @@ describe('spacesManagementApp', () => {
|
|||
expect(container).toMatchInlineSnapshot(`
|
||||
<div>
|
||||
<div
|
||||
class="kbnRedirectCrossAppLinks"
|
||||
class="kbnAppWrapper kbnRedirectCrossAppLinks"
|
||||
>
|
||||
Spaces Edit Page: {"capabilities":{"catalogue":{},"management":{},"navLinks":{}},"notifications":{"toasts":{}},"spacesManager":{"onActiveSpaceChange$":{"_isScalar":false}},"spaceId":"some-space","history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/some-space","search":"","hash":""}}}
|
||||
</div>
|
||||
|
|
|
@ -14,6 +14,7 @@ import type { StartServicesAccessor } from 'src/core/public';
|
|||
import type { RegisterManagementAppArgs } from 'src/plugins/management/public';
|
||||
import type { Space } from 'src/plugins/spaces_oss/common';
|
||||
|
||||
import { APP_WRAPPER_CLASS } from '../../../../../src/core/public';
|
||||
import {
|
||||
KibanaContextProvider,
|
||||
RedirectAppLinks,
|
||||
|
@ -125,7 +126,7 @@ export const spacesManagementApp = Object.freeze({
|
|||
render(
|
||||
<KibanaContextProvider services={coreStart}>
|
||||
<i18nStart.Context>
|
||||
<RedirectAppLinks application={application}>
|
||||
<RedirectAppLinks application={application} className={APP_WRAPPER_CLASS}>
|
||||
<Router history={history}>
|
||||
<Switch>
|
||||
<Route path={['', '/']} exact>
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
"references": [
|
||||
{ "path": "../features/tsconfig.json" },
|
||||
{ "path": "../licensing/tsconfig.json" },
|
||||
{ "path": "../../../src/plugins/es_ui_shared/tsconfig.json" },
|
||||
{ "path": "../../../src/plugins/advanced_settings/tsconfig.json" },
|
||||
{ "path": "../../../src/plugins/home/tsconfig.json" },
|
||||
{ "path": "../../../src/plugins/kibana_react/tsconfig.json" },
|
||||
|
|
|
@ -22017,7 +22017,6 @@
|
|||
"xpack.spaces.management.manageSpacePage.errorLoadingSpaceTitle": "スペースの読み込み中にエラーが発生:{message}",
|
||||
"xpack.spaces.management.manageSpacePage.errorSavingSpaceTitle": "スペースの保存中にエラーが発生:{message}",
|
||||
"xpack.spaces.management.manageSpacePage.loadErrorTitle": "利用可能な機能の読み込みエラー",
|
||||
"xpack.spaces.management.manageSpacePage.manageDescription": "保存済みオブジェクトをわかりやすいカテゴリー別に整理します。",
|
||||
"xpack.spaces.management.manageSpacePage.nameFormRowLabel": "名前",
|
||||
"xpack.spaces.management.manageSpacePage.spaceDescriptionFormRowLabel": "説明 (オプション) ",
|
||||
"xpack.spaces.management.manageSpacePage.spaceDescriptionHelpText": "説明はスペース選択画面に表示されます。",
|
||||
|
|
|
@ -22371,7 +22371,6 @@
|
|||
"xpack.spaces.management.manageSpacePage.errorLoadingSpaceTitle": "加载空间时出错:{message}",
|
||||
"xpack.spaces.management.manageSpacePage.errorSavingSpaceTitle": "保存空间时出错:{message}",
|
||||
"xpack.spaces.management.manageSpacePage.loadErrorTitle": "加载可用功能时出错",
|
||||
"xpack.spaces.management.manageSpacePage.manageDescription": "将已保存对象组织到有意义的类别中。",
|
||||
"xpack.spaces.management.manageSpacePage.nameFormRowLabel": "名称",
|
||||
"xpack.spaces.management.manageSpacePage.spaceDescriptionFormRowLabel": "描述 (可选) ",
|
||||
"xpack.spaces.management.manageSpacePage.spaceDescriptionHelpText": "描述显示在”工作区选择“屏幕上。",
|
||||
|
|
Loading…
Reference in a new issue