From 82078061e84f64cc4121722defbe00bcc04bd1a4 Mon Sep 17 00:00:00 2001 From: Radoslaw Szwajkowski Date: Sat, 20 Nov 2021 14:33:36 +0100 Subject: [PATCH 1/4] Switch to PF4 Modal 1. NavigationConfirmationModal - use titleIconVariant='warning' instead of alert - use "lead" class on first paragraph for consistency 2. About modal 3. VmConsoleInstructionsModal 4. VmDetails related modals: Snapshots, Nics, Discs --- branding/style.css | 2 +- src/components/About.js | 64 ++-- .../NavigationConfirmationModal/index.js | 40 +- src/components/Settings/style.css | 1 + src/components/VmActions/ConfirmationModal.js | 50 +-- src/components/VmActions/index.js | 2 +- .../VmConsole/VmConsoleInstructionsModal.js | 54 ++- src/components/VmConsole/style.css | 4 - .../cards/DisksCard/DiskImageEditor.js | 361 +++++++++--------- .../VmDetails/cards/DisksCard/style.css | 10 - .../VmDetails/cards/NicsCard/NicEditor.js | 206 +++++----- .../cards/SnapshotsCard/NewSnapshotModal.js | 111 +++--- .../VmDetails/cards/SnapshotsCard/style.css | 11 - src/index-nomodules.css | 10 - 14 files changed, 437 insertions(+), 489 deletions(-) diff --git a/branding/style.css b/branding/style.css index fa71f088c..64a9d8838 100644 --- a/branding/style.css +++ b/branding/style.css @@ -5,6 +5,6 @@ put anything here that should override styles from brand.css. *********************************************/ -#about-modal a { +#about-modal a, #about-modal, #about-modal button { color: #ffffff; } diff --git a/src/components/About.js b/src/components/About.js index 5ebbc7618..025137ea5 100644 --- a/src/components/About.js +++ b/src/components/About.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import { connect } from 'react-redux' import { withMsg } from '_/intl' -import { Modal } from 'patternfly-react' +import { Modal, ModalVariant } from '@patternfly/react-core' import Product from '../version' import { fixedStrings } from '../branding' @@ -56,41 +56,45 @@ class AboutDialog extends React.Component { const docLink = msg.aboutDialogDocumentationLink({ link: `${msg.aboutDialogDocumentationText()}`, }) + const closeModal = () => this.setState({ openModal: false }) return ( <> - this.setState({ openModal: true })}>{msg.about()} + this.setState({ openModal: true })}>{msg.about()} { this.state.openModal && ( - this.setState({ openModal: false })} show> - - this.setState({ openModal: false })} /> - - -

{fixedStrings.BRAND_NAME} {msg.vmPortal()}

-
-
    -
  • -
    -
  • -
  • -
    -
  • - {fixedStrings.DOCUMENTATION_LINK && ( -
  • - -
  • - )} -
  • -
    + + +

    {fixedStrings.BRAND_NAME} {msg.vmPortal()}

    +
    +
      +
    • +
      +
    • +
    • +
      +
    • + {fixedStrings.DOCUMENTATION_LINK && ( +
    • +
    • -
    -
    + )} +
  • +
    +
  • +
+
+ + +
- - - -
- )} diff --git a/src/components/NavigationConfirmationModal/index.js b/src/components/NavigationConfirmationModal/index.js index cc2c2026f..46e67607c 100644 --- a/src/components/NavigationConfirmationModal/index.js +++ b/src/components/NavigationConfirmationModal/index.js @@ -1,7 +1,6 @@ import React, { useContext } from 'react' import PropTypes from 'prop-types' -import { Modal, Button } from 'patternfly-react' -import { Alert } from '@patternfly/react-core' +import { Modal, ModalVariant, Button } from '@patternfly/react-core' import { MsgContext } from '_/intl' const NavigationConfirmationModal = ({ show, onYes, onNo, additionalNote }) => { @@ -9,25 +8,24 @@ const NavigationConfirmationModal = ({ show, onYes, onNo, additionalNote }) => { const idPrefix = 'close-dialog-confim' return ( - - - {msg.unsavedChangesTitle()} - - - - {additionalNote} - - - - - - + + {msg.yes()} + , + , + ]} + > +

{msg.unsavedChangesConfirmMessage()}

+

{additionalNote}

) } diff --git a/src/components/Settings/style.css b/src/components/Settings/style.css index 918407300..6fc927d7e 100644 --- a/src/components/Settings/style.css +++ b/src/components/Settings/style.css @@ -64,6 +64,7 @@ .section-list{ list-style-type: disc; + padding-left: var(--pf-c-modal-box__body--PaddingLeft);; } .field-list{ diff --git a/src/components/VmActions/ConfirmationModal.js b/src/components/VmActions/ConfirmationModal.js index 36c8027d2..5a8c8da5c 100644 --- a/src/components/VmActions/ConfirmationModal.js +++ b/src/components/VmActions/ConfirmationModal.js @@ -1,6 +1,6 @@ import React, { useContext } from 'react' import PropsTypes from 'prop-types' -import { Modal, Icon } from 'patternfly-react' +import { Modal, ModalVariant, Button } from '@patternfly/react-core' import { MsgContext } from '_/intl' const btnPropType = PropsTypes.shape({ @@ -8,45 +8,38 @@ const btnPropType = PropsTypes.shape({ onClick: PropsTypes.func, }) -const ConfirmationModal = ({ show, title, confirm, body, subContent, onClose, extra, accessibleDescription }) => { +const ConfirmationModal = ({ show, title, confirm, body, subContent, onClose, extra }) => { const { msg } = useContext(MsgContext) return ( - - - - {title} - - - { + { confirm.onClick(); onClose() }}>{confirm.title}, + extra && , + , + ].filter(Boolean)} + > + { typeof body === 'string' ? ( <> - -
-

- { body } -

- { +

+ { body } +

+ { subContent && typeof subContent === 'string' ?

{ subContent }

: subContent } -
) : body } -
- - { extra && } - - { confirm && } -
) } @@ -56,10 +49,9 @@ ConfirmationModal.propTypes = { title: PropsTypes.string.isRequired, onClose: PropsTypes.func, - accessibleDescription: PropsTypes.string, confirm: PropsTypes.shape({ title: PropsTypes.string, - type: PropsTypes.oneOf(['primary', 'success', 'info', 'warning', 'danger']), + type: PropsTypes.oneOf(['primary' | 'secondary' | 'tertiary' | 'danger' | 'warning' | 'link' | 'plain' | 'control']), onClick: PropsTypes.func, }), extra: btnPropType, diff --git a/src/components/VmActions/index.js b/src/components/VmActions/index.js index d31f6156c..f9b1abdf0 100644 --- a/src/components/VmActions/index.js +++ b/src/components/VmActions/index.js @@ -176,7 +176,7 @@ class VmActions extends React.Component { className: 'btn btn-default', id: `${idPrefix}-button-shutdown`, confirmation: ( - onShutdown() }} diff --git a/src/components/VmConsole/VmConsoleInstructionsModal.js b/src/components/VmConsole/VmConsoleInstructionsModal.js index cbe03cc72..13e54b51c 100644 --- a/src/components/VmConsole/VmConsoleInstructionsModal.js +++ b/src/components/VmConsole/VmConsoleInstructionsModal.js @@ -1,5 +1,5 @@ import React from 'react' -import { Icon, Modal, Button } from 'patternfly-react' +import { Modal, Button, ModalVariant } from '@patternfly/react-core' import style from './style.css' import { withMsg } from '../../intl' import PropTypes from 'prop-types' @@ -23,41 +23,33 @@ class VmConsoleInstructionsModal extends React.Component { render () { const { disabled, msg } = this.props return ( -
- - - - - { msg.consoleInstructions() } - - -
-

{ msg.remoteViewerConnection() }

-
{ msg.usingRemoteViewer() }
-
{ msg.remoteViewerAvailable() }
-
-
-
RHEL, CentOS
sudo yum install virt-viewer
-
Fedora
sudo dnf install virt-viewer
-
Ubuntu, Debian
sudo apt-get install virt-viewer
-
Windows
{ msg.downloadVirtManagerMSI() }
-
-
+ + <> +

{ msg.remoteViewerConnection() }

+

{ msg.usingRemoteViewer() }

+

{ msg.remoteViewerAvailable() }

+
+
+
RHEL, CentOS
sudo yum install virt-viewer
+
Fedora
sudo dnf install virt-viewer
+
Ubuntu, Debian
sudo apt-get install virt-viewer
+
Windows
{ msg.downloadVirtManagerMSI() }
+
- +
-
+ ) } } diff --git a/src/components/VmConsole/style.css b/src/components/VmConsole/style.css index 536fec736..5a94ba83f 100644 --- a/src/components/VmConsole/style.css +++ b/src/components/VmConsole/style.css @@ -37,10 +37,6 @@ padding-top: 2px; } -.console-modal-box { - display: inline-block; -} - .console-dropdown-label { margin-right: 10px; } diff --git a/src/components/VmDetails/cards/DisksCard/DiskImageEditor.js b/src/components/VmDetails/cards/DisksCard/DiskImageEditor.js index 88ae19517..93c03cde1 100644 --- a/src/components/VmDetails/cards/DisksCard/DiskImageEditor.js +++ b/src/components/VmDetails/cards/DisksCard/DiskImageEditor.js @@ -7,7 +7,6 @@ import { createDiskTypeList, createStorageDomainList, isDiskNameValid } from '_/ import { withMsg } from '_/intl' import { - Button, Checkbox, Col, ControlLabel, @@ -15,9 +14,13 @@ import { FormControl, FormGroup, HelpBlock, - Modal, } from 'patternfly-react' -import { Alert } from '@patternfly/react-core' +import { + Alert, + Button, + Modal, + ModalVariant, +} from '@patternfly/react-core' import SelectBox from '_/components/SelectBox' import style from './style.css' import { Tooltip, InfoTooltip } from '_/components/tooltips' @@ -321,214 +324,210 @@ class DiskImageEditor extends Component { { trigger({ onClick: this.open }) } - - - {createMode ? msg.createNewDisk() : msg.editDisk()} - - - -
{ e.preventDefault() }} - id={`${idPrefix}-modal-form`} + isOpen={this.state.showModal} + onClose={this.close} + variant={ModalVariant.medium} + position='top' + title={createMode ? msg.createNewDisk() : msg.editDisk()} + actions={[ + , + , + ]} + > + { e.preventDefault() }} + id={`${idPrefix}-modal-form`} + > + {/* Alias */} + + + { msg.diskEditorAliasLabel() } + + + + {this.state.errors.alias && {this.state.errors.alias}} + + + + {/* Size Display (for edit mode) */} + { !createMode && ( + - { msg.diskEditorAliasLabel() } + { msg.diskEditorSizeEditLabel() } + { !isImage && + + } - - {this.state.errors.alias && {this.state.errors.alias}} +
+ { diskSize / 1024 ** 3 } +
+ )} - {/* Size Display (for edit mode) */} - { !createMode && ( - - - { msg.diskEditorSizeEditLabel() } - { !isImage && - - } - - -
- { diskSize / 1024 ** 3 } -
- -
- )} - - {/* Size Editor (initial size for create, expand by size for edit) */} - { (createMode || isImage) && ( - - - { createMode && ( - <> - {msg.diskEditorSizeLabel()} - - - )} - { !createMode && msg.diskEditorResizeLabel() } - - - { createMode && ( + {/* Size Editor (initial size for create, expand by size for edit) */} + { (createMode || isImage) && ( + + + { createMode && ( + <> + {msg.diskEditorSizeLabel()} + + + )} + { !createMode && msg.diskEditorResizeLabel() } + + + { createMode && ( + + )} + { !createMode && ( + - )} - { !createMode && ( - - - - )} - - - )} - - {/* Storage Domain */} - - - { msg.diskEditorStorageDomainLabel() } - + )} + + + )} + + {/* Storage Domain */} + + + { msg.diskEditorStorageDomainLabel() } + + + + { createMode && ( + - - - { createMode && ( - - )} - { !createMode && !isDirectLUN && ( -
- { + )} + { !createMode && !isDirectLUN && ( +
+ { this.props.storageDomains.getIn([this.state.values.storageDomain, 'name']) || msg.diskEditorStorageDomainNotAvailable() } -
- )} - { isDirectLUN && ( -
- { msg.diskEditorStorageDomainNotAvailable() } -
- )} - - - - {/* Disk Type (thin vs preallocated) */} - - - { msg.diskEditorDiskTypeLabel() } - + )} + { isDirectLUN && ( +
+ { msg.diskEditorStorageDomainNotAvailable() } +
+ )} + +
+ + {/* Disk Type (thin vs preallocated) */} + + + { msg.diskEditorDiskTypeLabel() } + + + + { createMode && ( + - - - { createMode && ( - - )} - { !createMode && !isDirectLUN && ( -
- { this.state.values.diskType === 'pre' && msg.diskEditorDiskTypeOptionPre() } - { this.state.values.diskType === 'thin' && msg.diskEditorDiskTypeOptionThin() } -
- )} - { isDirectLUN && ( -
- { msg.diskEditorDiskTypeNotAvailable() } -
- )} - -
- - {/* Disk Bootable */} - - - { msg.diskEditorBootableLabel() } - {!vmIsDown && ( - - )} - + )} + { !createMode && !isDirectLUN && ( +
+ { this.state.values.diskType === 'pre' && msg.diskEditorDiskTypeOptionPre() } + { this.state.values.diskType === 'thin' && msg.diskEditorDiskTypeOptionThin() } +
+ )} + { isDirectLUN && ( +
+ { msg.diskEditorDiskTypeNotAvailable() } +
+ )} + +
+ + {/* Disk Bootable */} + + + { msg.diskEditorBootableLabel() } + {!vmIsDown && ( + + )} + + + + + + { showBootableChangeAlert && ( + + - - { showBootableChangeAlert && ( - - - - - - - )} - - - - - - + )} + ) diff --git a/src/components/VmDetails/cards/DisksCard/style.css b/src/components/VmDetails/cards/DisksCard/style.css index e6686ac0d..7daff9e6c 100644 --- a/src/components/VmDetails/cards/DisksCard/style.css +++ b/src/components/VmDetails/cards/DisksCard/style.css @@ -44,10 +44,6 @@ } /* for DiskImageEditor */ -.editor-modal { - width: 700px; -} - .editor-field-help { margin-right: -7px; } @@ -63,9 +59,3 @@ .editor-bootable-alert { --pf-c-alert__title--FontSize: 15px; } - -@media only screen and (max-width: 600px) { - .editor-modal { - width: 95%; - } -} diff --git a/src/components/VmDetails/cards/NicsCard/NicEditor.js b/src/components/VmDetails/cards/NicsCard/NicEditor.js index 3e1d54620..39e7f2964 100644 --- a/src/components/VmDetails/cards/NicsCard/NicEditor.js +++ b/src/components/VmDetails/cards/NicsCard/NicEditor.js @@ -2,16 +2,19 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' import { - Button, Col, ControlLabel, ExpandCollapse, Form, FormControl, FormGroup, - Modal, Radio, } from 'patternfly-react' +import { + Button, + Modal, + ModalVariant, +} from '@patternfly/react-core' import SelectBox from '../../../SelectBox' import NicLinkStateIcon from './NicLinkStateIcon' @@ -172,119 +175,116 @@ class NicEditor extends Component { + { msg.ok() } + , + , + + ]} > - - - {createMode ? msg.addNewNic() : msg.editNic()} - - +
{ e.preventDefault() }} + id={`${modalId}-form`} + > + + + { msg.nicEditorNameLabel() } + + + + + - { e.preventDefault() }} - id={`${modalId}-form`} - > - + + + { msg.vnicProfile() } + + + + + + + + - { msg.nicEditorNameLabel() } + { msg.nicEditorInterfaceLabel() } + { !canChangeInterface && ( + + )} - + { !canChangeInterface && ( +
+ { nicInterface ? nicInterface.value : 'N/A' } +
+ )} + { canChangeInterface && ( + + )}
- - + - { msg.vnicProfile() } + { msg.nicEditorLinkStateLabel() } - + { this.changeLinked(true) }} + > + { msg.nicEditorLinkStateUp() } + + { this.changeLinked(false) }} + > + { msg.nicEditorLinkStateDown() } + - - - - - { msg.nicEditorInterfaceLabel() } - { !canChangeInterface && ( - - )} - - - { !canChangeInterface && ( -
- { nicInterface ? nicInterface.value : 'N/A' } -
- )} - { canChangeInterface && ( - - )} - -
- - - { msg.nicEditorLinkStateLabel() } - - - { this.changeLinked(true) }} - > - { msg.nicEditorLinkStateUp() } - - { this.changeLinked(false) }} - > - { msg.nicEditorLinkStateDown() } - - - -
- - -
- - - - + +
) diff --git a/src/components/VmDetails/cards/SnapshotsCard/NewSnapshotModal.js b/src/components/VmDetails/cards/SnapshotsCard/NewSnapshotModal.js index 1d6b95392..7de4cd659 100644 --- a/src/components/VmDetails/cards/SnapshotsCard/NewSnapshotModal.js +++ b/src/components/VmDetails/cards/SnapshotsCard/NewSnapshotModal.js @@ -5,7 +5,6 @@ import { connect } from 'react-redux' import { addVmSnapshot } from './actions' import { - Button, Col, Form, FormControl, @@ -13,12 +12,15 @@ import { HelpBlock, Checkbox, Icon, - Modal, noop, } from 'patternfly-react' -import { Alert } from '@patternfly/react-core' +import { + Alert, + Button, + Modal, + ModalVariant, +} from '@patternfly/react-core' import { withMsg } from '_/intl' -import style from './style.css' class NewSnapshotModal extends Component { constructor (props) { @@ -78,51 +80,59 @@ class NewSnapshotModal extends Component { { msg.createSnapshot() } - - - , + - { msg.createSnapshot() } - - -
- - - {msg.snapshotInfo() } - - - - -
- - { + { msg.cancel() } + , + + ]} + > + + + + {msg.snapshotInfo() } + + + + +
+ + { this.state.emptyDescription && ( {msg.emptySnapshotDescription()} )} -
-
- { +
+
+ { this.props.isVmRunning && (
)} - -
- - - - + +
) diff --git a/src/components/VmDetails/cards/SnapshotsCard/style.css b/src/components/VmDetails/cards/SnapshotsCard/style.css index cb8e524ea..0280cf134 100644 --- a/src/components/VmDetails/cards/SnapshotsCard/style.css +++ b/src/components/VmDetails/cards/SnapshotsCard/style.css @@ -131,17 +131,6 @@ div.popover { font-size: 14px; } -.create-snapshot-container :global(.modal-body) { - padding: 0; -} - -.create-snapshot-container :global(.alert) { - margin-top: 10px; - margin-bottom: 10px; - margin-left: 0; - margin-right: 0; -} - .no-nics, .no-disks { font-style: italic; color: rgba(0, 0, 0, 0.65); diff --git a/src/index-nomodules.css b/src/index-nomodules.css index 03c75aa84..ddec82c00 100644 --- a/src/index-nomodules.css +++ b/src/index-nomodules.css @@ -140,16 +140,6 @@ body { padding-right: 0; } -.message-dialog-pf .modal-body .pficon { - font-size: 30px; - margin-right: 15px; -} - -.message-dialog-pf .modal-body { - display: -ms-flexbox; - display: flex; -} - .drawer-pf .blank-slate-pf .blank-slate-pf-title { font-size: 1em; margin-bottom: 0; From 3136ae103fb5fccf79fd046c571fa3efab8ee3f7 Mon Sep 17 00:00:00 2001 From: Radoslaw Szwajkowski Date: Wed, 24 Nov 2021 17:27:16 +0100 Subject: [PATCH 2/4] Replace PF3 MessageDialog --- src/components/SessionActivityTracker.js | 23 +++++----- src/components/VmActions/ConfirmationModal.js | 10 +++-- .../DetailsCard/HotPlugConfirmationModal.js | 30 +++---------- .../NextRunChangeConfirmationModal.js | 32 +++----------- .../SnapshotsCard/RestoreConfirmationModal.js | 43 +++++++++---------- .../VmModals/DeleteConfirmationModal.js | 25 +++-------- src/intl/messages.js | 1 + 7 files changed, 59 insertions(+), 105 deletions(-) diff --git a/src/components/SessionActivityTracker.js b/src/components/SessionActivityTracker.js index d08883ff3..2700f1342 100644 --- a/src/components/SessionActivityTracker.js +++ b/src/components/SessionActivityTracker.js @@ -1,12 +1,11 @@ import React from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' -import { MessageDialog, Icon } from 'patternfly-react' -import style from './sharedStyle.css' import { withMsg } from '_/intl' import { logout } from '_/actions' +import ConfirmationModal from './VmActions/ConfirmationModal' const TIME_TO_DISPLAY_MODAL = 30 // 30 seconds @@ -71,22 +70,22 @@ class SessionActivityTracker extends React.Component { const { config, onLogout, msg } = this.props if (this.state.showTimeoutModal) { return ( - 0 && this.state.counter <= TIME_TO_DISPLAY_MODAL} - primaryAction={() => this.setState({ showTimeoutModal: false, counter: config.get('userSessionTimeoutInterval') })} - secondaryAction={onLogout} - onHide={onLogout} - primaryContent={

{ msg.sessionExpired() }

} - secondaryContent={( + onClose={onLogout} + title={msg.attention()} + body={msg.sessionExpired() } + subContent={( <>

{ msg.logOutInSecondsSecondary({ seconds: this.state.counter }) }

{ msg.continueSessionSecondary() }

)} - primaryActionButtonContent={msg.continueSessionBtn()} - secondaryActionButtonContent={msg.logOut()} - className={style['header-remover']} - icon={} + closeTitle={msg.logOut()} + confirm={{ + onClick: () => this.setState({ showTimeoutModal: false, counter: config.get('userSessionTimeoutInterval') }), + title: msg.continueSessionBtn(), + }} /> ) } diff --git a/src/components/VmActions/ConfirmationModal.js b/src/components/VmActions/ConfirmationModal.js index 5a8c8da5c..e523e1af9 100644 --- a/src/components/VmActions/ConfirmationModal.js +++ b/src/components/VmActions/ConfirmationModal.js @@ -8,20 +8,20 @@ const btnPropType = PropsTypes.shape({ onClick: PropsTypes.func, }) -const ConfirmationModal = ({ show, title, confirm, body, subContent, onClose, extra }) => { +const ConfirmationModal = ({ show, title, confirm, body, subContent, onClose, extra, variant = 'warning', closeTitle }) => { const { msg } = useContext(MsgContext) return ( { confirm.onClick(); onClose() }}>{confirm.title}, extra && , - , + , ].filter(Boolean)} > { @@ -51,12 +51,14 @@ ConfirmationModal.propTypes = { onClose: PropsTypes.func, confirm: PropsTypes.shape({ title: PropsTypes.string, - type: PropsTypes.oneOf(['primary' | 'secondary' | 'tertiary' | 'danger' | 'warning' | 'link' | 'plain' | 'control']), + type: PropsTypes.oneOf(['primary', 'secondary', 'tertiary', 'danger', 'warning', 'link', 'plain', 'control']), onClick: PropsTypes.func, }), extra: btnPropType, + closeTitle: PropsTypes.string, body: PropsTypes.oneOfType([PropsTypes.node, PropsTypes.string]).isRequired, subContent: PropsTypes.oneOfType([PropsTypes.node, PropsTypes.string]), + variant: PropsTypes.oneOf(['success', 'danger', 'warning', 'info', 'default']), } export default ConfirmationModal diff --git a/src/components/VmDetails/cards/DetailsCard/HotPlugConfirmationModal.js b/src/components/VmDetails/cards/DetailsCard/HotPlugConfirmationModal.js index 88ec27660..7b39044d5 100644 --- a/src/components/VmDetails/cards/DetailsCard/HotPlugConfirmationModal.js +++ b/src/components/VmDetails/cards/DetailsCard/HotPlugConfirmationModal.js @@ -1,37 +1,21 @@ import React, { useContext } from 'react' import PropsTypes from 'prop-types' -import { - MessageDialog, - Button, - Icon, - noop, -} from 'patternfly-react' import { MsgContext } from '_/intl' +import ConfirmationModal from '_/components/VmActions/ConfirmationModal' const HotPlugChangeConfirmationModal = ({ show, onCancel, onApplyLater, onApplyNow }) => { const { msg } = useContext(MsgContext) return ( - } - primaryContent={
{msg.hotPlugConfirmContent()}
} - secondaryContent={
{msg.hotPlugConfirmContentDetail()}
} + body={msg.hotPlugConfirmContent()} + subContent={msg.hotPlugConfirmContentDetail()} - accessibleName='prompt-hot-plug' - accessibleDescription='hot-plug-configuration-change-will-be-applied-now' - - primaryAction={noop} - primaryActionButtonContent='' - footer={( - <> - - - - - )} + confirm={{ title: msg.hotPlugConfirmApplyNow(), onClick: onApplyNow }} + extra={{ title: msg.hotPlugConfirmApplyAfterRestart(), onClick: onApplyLater }} /> ) } diff --git a/src/components/VmDetails/cards/DetailsCard/NextRunChangeConfirmationModal.js b/src/components/VmDetails/cards/DetailsCard/NextRunChangeConfirmationModal.js index e2c4750d5..51dc6c1e0 100644 --- a/src/components/VmDetails/cards/DetailsCard/NextRunChangeConfirmationModal.js +++ b/src/components/VmDetails/cards/DetailsCard/NextRunChangeConfirmationModal.js @@ -1,39 +1,21 @@ import React, { useContext } from 'react' import PropsTypes from 'prop-types' -import { - MessageDialog, - Button, - Icon, - noop, -} from 'patternfly-react' import { MsgContext } from '_/intl' +import ConfirmationModal from '_/components/VmActions/ConfirmationModal' const NextRunChangeConfirmationModal = ({ show, onCancel, onSave, onSaveAndRestart }) => { const { msg } = useContext(MsgContext) return ( - } - primaryContent={
{msg.nextRunConfirmContent()}
} - secondaryContent={
{msg.nextRunConfirmContentDetail()}
} + body={msg.nextRunConfirmContent()} + subContent={msg.nextRunConfirmContentDetail()} - accessibleName='prompt-next-run' - accessibleDescription='next-run-configuration-change-will-be-applied-on-restart' - - primaryAction={noop} - primaryActionButtonContent='' - footer={( - <> - - - - - )} + extra={{ onClick: onSave, title: msg.nextRunConfirmActionSave() }} + confirm={{ onClick: onSaveAndRestart, title: msg.nextRunConfrimActionSaveRestart() }} /> ) } diff --git a/src/components/VmDetails/cards/SnapshotsCard/RestoreConfirmationModal.js b/src/components/VmDetails/cards/SnapshotsCard/RestoreConfirmationModal.js index 018185ced..6b7f382d7 100644 --- a/src/components/VmDetails/cards/SnapshotsCard/RestoreConfirmationModal.js +++ b/src/components/VmDetails/cards/SnapshotsCard/RestoreConfirmationModal.js @@ -3,10 +3,10 @@ import PropsTypes from 'prop-types' import { connect } from 'react-redux' import Immutable from 'immutable' -import { Icon, MessageDialog } from 'patternfly-react' import { withMsg } from '_/intl' import { getMinimizedString, escapeHtml } from '_/components/utils' import { restoreVmSnapshot } from './actions' +import ConfirmationModal from '_/components/VmActions/ConfirmationModal' const MAX_DESCRIPTION_SIZE = 150 @@ -35,38 +35,35 @@ class RestoreConfirmationModal extends React.Component { render () { const { snapshot, trigger, snapshots, id, msg } = this.props - const icon = const snapshotsThatWillBeDeleted = snapshots.filter((s) => s.get('date') > snapshot.get('date')) const minDescription = escapeHtml(getMinimizedString(snapshot.get('description'), MAX_DESCRIPTION_SIZE)) return ( <> { trigger({ onClick: this.open })} - ${minDescription}"` }), - }} - /> - )} - secondaryContent={ snapshotsThatWillBeDeleted.size > 0 && ( -
- {msg.nextSnapshotsWillBeDeleted()} - {snapshotsThatWillBeDeleted.map((s) =>
{s.get('description')}
)} -
+ body={( + <> +
${minDescription}"` }), + }} + /> + { snapshotsThatWillBeDeleted.size > 0 && ( +
+ {msg.nextSnapshotsWillBeDeleted()} + {snapshotsThatWillBeDeleted.map((s) =>
{s.get('description')}
)} +
+ )} + )} + confirm={{ onClick: this.handleRestore, title: msg.restore() }} /> ) diff --git a/src/components/VmModals/DeleteConfirmationModal.js b/src/components/VmModals/DeleteConfirmationModal.js index d76ca7437..541a4efeb 100644 --- a/src/components/VmModals/DeleteConfirmationModal.js +++ b/src/components/VmModals/DeleteConfirmationModal.js @@ -1,7 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' -import { MessageDialog, Icon } from 'patternfly-react' import { withMsg } from '_/intl' +import ConfirmationModal from '../VmActions/ConfirmationModal' class DeleteConfirmationModal extends React.Component { constructor (props) { @@ -36,30 +36,19 @@ class DeleteConfirmationModal extends React.Component { msg, } = this.props - const primary = Array.isArray(children) ? children[0] : children - const secondary = Array.isArray(children) ? children.slice(1) : undefined - - const icon = severity === 'normal' - ? - : - const primaryButtonStyle = severity === 'normal' ? 'primary' : 'danger' + const variant = severity === 'normal' ? 'warning' : 'danger' return ( <> { trigger({ onClick: this.handleTriggerClick }) } - {primary}
} - secondaryContent={secondary} + body={children} + variant={variant} + confirm={{ onClick: this.handleDelete, title: msg.delete() }} /> ) diff --git a/src/intl/messages.js b/src/intl/messages.js index 94f6bf28b..14a06b9f0 100644 --- a/src/intl/messages.js +++ b/src/intl/messages.js @@ -53,6 +53,7 @@ export const messages: { [messageId: string]: MessageType } = { areYouSureYouWantToDeleteNic: 'Are you sure you want to delete NIC {nicName}?', areYouSureYouWantToDeleteSnapshot: 'Are you sure you want to delete snapshot {snapshotName}?', areYouSureYouWantToRestoreSnapshot: 'Are you sure you want to restore snapshot {snapshotName}?', + attention: 'Attention!', authorizationExpired: 'Authorization expired. The page is going to be reloaded to re-login.', automaticPoolsNotEditable: 'The pool type of {poolName} is automatic so the details of this virtual machine are not editable.', availableVmsFromPool: 'Available VMs from this Pool', From aed5cd3a304b73cc62f077582aa18914eb711d38 Mon Sep 17 00:00:00 2001 From: Radoslaw Szwajkowski Date: Mon, 2 May 2022 18:19:28 +0200 Subject: [PATCH 3/4] PF3-independent CSS for About dialog --- branding/style.css | 3 -- src/components/{ => About}/About.js | 11 +++---- src/components/About/index.js | 1 + src/components/About/styles.css | 37 ++++++++++++++++++++++++ src/components/VmsPageHeader/UserMenu.js | 2 +- 5 files changed, 45 insertions(+), 9 deletions(-) rename src/components/{ => About}/About.js (92%) create mode 100644 src/components/About/index.js create mode 100644 src/components/About/styles.css diff --git a/branding/style.css b/branding/style.css index 64a9d8838..a2581ca5d 100644 --- a/branding/style.css +++ b/branding/style.css @@ -5,6 +5,3 @@ put anything here that should override styles from brand.css. *********************************************/ -#about-modal a, #about-modal, #about-modal button { - color: #ffffff; -} diff --git a/src/components/About.js b/src/components/About/About.js similarity index 92% rename from src/components/About.js rename to src/components/About/About.js index 025137ea5..fcf835c65 100644 --- a/src/components/About.js +++ b/src/components/About/About.js @@ -4,8 +4,9 @@ import { connect } from 'react-redux' import { withMsg } from '_/intl' import { Modal, ModalVariant } from '@patternfly/react-core' -import Product from '../version' -import { fixedStrings } from '../branding' +import Product from '../../version' +import { fixedStrings } from '../../branding' +import styles from './styles.css' const LegalInfo = () => { const idPrefix = 'about-legal' @@ -65,7 +66,7 @@ class AboutDialog extends React.Component {

{fixedStrings.BRAND_NAME} {msg.vmPortal()}

-
-
    +
    +
    • diff --git a/src/components/About/index.js b/src/components/About/index.js new file mode 100644 index 000000000..04c40b5de --- /dev/null +++ b/src/components/About/index.js @@ -0,0 +1 @@ +export { default } from './About' diff --git a/src/components/About/styles.css b/src/components/About/styles.css new file mode 100644 index 000000000..e1c3fbc9d --- /dev/null +++ b/src/components/About/styles.css @@ -0,0 +1,37 @@ +/** based on PF3 about-modal-pf **/ +.about-modal { + color: #fff; + padding-bottom: 16px; + padding-top: 16px; + padding-left: 40px; + padding-right: 40px; +} + +/** based on PF3 product-versions-pf **/ +.product-versions { + margin-bottom: 30px; + margin-top: 30px; +} + +/** based on PF3 list-unstyled **/ +.list-unstyled { + padding-left: 0; + list-style: none; +} + + +.about-modal a { + color: #ffffff; +} + +/** close button styling */ +.about-modal :global(.pf-c-button.pf-m-plain:hover) { + color:#fff; +} + +.about-modal :global(.pf-c-button.pf-m-plain) { + color:darkgrey +} + + + diff --git a/src/components/VmsPageHeader/UserMenu.js b/src/components/VmsPageHeader/UserMenu.js index 64ef75c30..c4b98823c 100644 --- a/src/components/VmsPageHeader/UserMenu.js +++ b/src/components/VmsPageHeader/UserMenu.js @@ -5,7 +5,7 @@ import { connect } from 'react-redux' import { logout } from '_/actions' import { MsgContext } from '_/intl' -import AboutDialog from '../About' +import AboutDialog from '_/components/About' import { Tooltip } from '_/components/tooltips' const UserMenu = ({ config, onLogout }) => { From e75e5448fbb8ae8a4935276480e4584d01948162 Mon Sep 17 00:00:00 2001 From: Radoslaw Szwajkowski Date: Wed, 18 May 2022 18:54:27 +0200 Subject: [PATCH 4/4] Adjust modal dialogs to PF4 guidelines Reference-Url: https://www.patternfly.org/v4/components/modal/design-guidelines/#types-of-modals --- src/components/About/About.js | 7 +++-- .../NavigationConfirmationModal/index.js | 4 +-- src/components/SessionActivityTracker.js | 2 +- src/components/VmActions/ConfirmationModal.js | 2 +- .../DetailsCard/HotPlugConfirmationModal.js | 5 ++-- .../NextRunChangeConfirmationModal.js | 3 +- .../VmDetails/cards/DisksCard/DiskListItem.js | 1 + .../VmDetails/cards/NicsCard/NicListItem.js | 2 ++ .../cards/SnapshotsCard/NewSnapshotModal.js | 2 +- .../SnapshotsCard/RestoreConfirmationModal.js | 2 +- .../cards/SnapshotsCard/SnapshotItem.js | 2 ++ .../VmModals/DeleteConfirmationModal.js | 6 ++-- src/intl/messages.js | 22 +++++++------- src/intl/translated-messages.json | 29 ------------------- 14 files changed, 32 insertions(+), 57 deletions(-) diff --git a/src/components/About/About.js b/src/components/About/About.js index fcf835c65..d96a53787 100644 --- a/src/components/About/About.js +++ b/src/components/About/About.js @@ -4,8 +4,8 @@ import { connect } from 'react-redux' import { withMsg } from '_/intl' import { Modal, ModalVariant } from '@patternfly/react-core' -import Product from '../../version' -import { fixedStrings } from '../../branding' +import Product from '_/version' +import { fixedStrings } from '_/branding' import styles from './styles.css' const LegalInfo = () => { @@ -58,10 +58,11 @@ class AboutDialog extends React.Component { link: `${msg.aboutDialogDocumentationText()}`, }) const closeModal = () => this.setState({ openModal: false }) + const openModal = () => this.setState({ openModal: true }) return ( <> - this.setState({ openModal: true })}>{msg.about()} + {msg.about()} { this.state.openModal && ( { return ( { , ]} > -

      {msg.unsavedChangesConfirmMessage()}

      +

      {msg.allUnsavedWillBeLost()}

      {additionalNote}

      ) diff --git a/src/components/SessionActivityTracker.js b/src/components/SessionActivityTracker.js index 2700f1342..0d74ed8a0 100644 --- a/src/components/SessionActivityTracker.js +++ b/src/components/SessionActivityTracker.js @@ -73,7 +73,7 @@ class SessionActivityTracker extends React.Component { 0 && this.state.counter <= TIME_TO_DISPLAY_MODAL} onClose={onLogout} - title={msg.attention()} + title={msg.continueWithSession()} body={msg.sessionExpired() } subContent={( <> diff --git a/src/components/VmActions/ConfirmationModal.js b/src/components/VmActions/ConfirmationModal.js index e523e1af9..7f5834153 100644 --- a/src/components/VmActions/ConfirmationModal.js +++ b/src/components/VmActions/ConfirmationModal.js @@ -28,7 +28,7 @@ const ConfirmationModal = ({ show, title, confirm, body, subContent, onClose, ex typeof body === 'string' ? ( <> -

      +

      { body }

      { diff --git a/src/components/VmDetails/cards/DetailsCard/HotPlugConfirmationModal.js b/src/components/VmDetails/cards/DetailsCard/HotPlugConfirmationModal.js index 7b39044d5..6654e96d6 100644 --- a/src/components/VmDetails/cards/DetailsCard/HotPlugConfirmationModal.js +++ b/src/components/VmDetails/cards/DetailsCard/HotPlugConfirmationModal.js @@ -9,10 +9,9 @@ const HotPlugChangeConfirmationModal = ({ show, onCancel, onApplyLater, onApplyN { onDelete(vm.get('id'), view.id) }} trigger={({ onClick }) => ( diff --git a/src/components/VmDetails/cards/NicsCard/NicListItem.js b/src/components/VmDetails/cards/NicsCard/NicListItem.js index 5eb01f123..d775c3a06 100644 --- a/src/components/VmDetails/cards/NicsCard/NicListItem.js +++ b/src/components/VmDetails/cards/NicsCard/NicListItem.js @@ -108,6 +108,8 @@ const NicListItem = ({ idPrefix, nic, vmStatus, vnicProfileList, isEditing, onEd { canDelete && ( { onDelete(nic.id) }} trigger={({ onClick }) => ( diff --git a/src/components/VmDetails/cards/SnapshotsCard/NewSnapshotModal.js b/src/components/VmDetails/cards/SnapshotsCard/NewSnapshotModal.js index 7de4cd659..20f9d15db 100644 --- a/src/components/VmDetails/cards/SnapshotsCard/NewSnapshotModal.js +++ b/src/components/VmDetails/cards/SnapshotsCard/NewSnapshotModal.js @@ -108,7 +108,7 @@ class NewSnapshotModal extends Component { variant='info' isInline title={msg.details()} - style={{ 'margin-bottom': '10px' }} + style={{ marginBottom: '10px' }} > {msg.snapshotInfo() } diff --git a/src/components/VmDetails/cards/SnapshotsCard/RestoreConfirmationModal.js b/src/components/VmDetails/cards/SnapshotsCard/RestoreConfirmationModal.js index 6b7f382d7..7168b0045 100644 --- a/src/components/VmDetails/cards/SnapshotsCard/RestoreConfirmationModal.js +++ b/src/components/VmDetails/cards/SnapshotsCard/RestoreConfirmationModal.js @@ -45,7 +45,7 @@ class RestoreConfirmationModal extends React.Component { id={id} show={this.state.showModal} onClose={this.close} - title={msg.confirmRestore()} + title={msg.restoreSnapshot()} body={( <>
      ( diff --git a/src/components/VmModals/DeleteConfirmationModal.js b/src/components/VmModals/DeleteConfirmationModal.js index 541a4efeb..1ccc3bf2e 100644 --- a/src/components/VmModals/DeleteConfirmationModal.js +++ b/src/components/VmModals/DeleteConfirmationModal.js @@ -33,6 +33,7 @@ class DeleteConfirmationModal extends React.Component { trigger, id, severity = 'normal', + title, msg, } = this.props @@ -45,10 +46,10 @@ class DeleteConfirmationModal extends React.Component { id={id} show={this.state.show} onClose={this.handleClose} - title={msg.confirmDelete()} + title={title || msg.confirmDelete()} body={children} variant={variant} - confirm={{ onClick: this.handleDelete, title: msg.delete() }} + confirm={{ onClick: this.handleDelete, title: msg.delete(), type: variant }} /> ) @@ -62,6 +63,7 @@ DeleteConfirmationModal.propTypes = { onDelete: PropTypes.func.isRequired, onClose: PropTypes.func, severity: PropTypes.oneOf(['normal', 'danger']), + title: PropTypes.string, msg: PropTypes.object.isRequired, } diff --git a/src/intl/messages.js b/src/intl/messages.js index 14a06b9f0..5d583fec9 100644 --- a/src/intl/messages.js +++ b/src/intl/messages.js @@ -46,6 +46,7 @@ export const messages: { [messageId: string]: MessageType } = { description: 'In sense of "human friendly name"', }, allocatedVms: 'Allocated VMs', + allUnsavedWillBeLost: 'The page contains unsaved changes. All unsaved information will be lost.', allTabs: 'This action is applied to all tabs.', apiConnectionFailed: 'oVirt API connection failed', apiVersionCheckFailed: 'oVirt API version check failed', @@ -53,7 +54,6 @@ export const messages: { [messageId: string]: MessageType } = { areYouSureYouWantToDeleteNic: 'Are you sure you want to delete NIC {nicName}?', areYouSureYouWantToDeleteSnapshot: 'Are you sure you want to delete snapshot {snapshotName}?', areYouSureYouWantToRestoreSnapshot: 'Are you sure you want to restore snapshot {snapshotName}?', - attention: 'Attention!', authorizationExpired: 'Authorization expired. The page is going to be reloaded to re-login.', automaticPoolsNotEditable: 'The pool type of {poolName} is automatic so the details of this virtual machine are not editable.', availableVmsFromPool: 'Available VMs from this Pool', @@ -96,7 +96,6 @@ export const messages: { [messageId: string]: MessageType } = { cluster: 'Cluster', clusterCanOnlyChangeWhenVmStopped: 'Cluster can only be changed when the VM is stopped.', confirmDelete: 'Confirm Delete', - confirmRestore: 'Confirm Restore', connect: { message: 'Connect', description: 'Connect button for SSO authorization modal dialog.', @@ -122,6 +121,7 @@ export const messages: { [messageId: string]: MessageType } = { message: 'Continue', description: 'Button to continue user session in SessionTimeout modal component.', }, + continueWithSession: 'Continue with your session?', coresPerSockets: 'Cores per Virtual Socket', cpus: 'Total Virtual CPUs', cpusBadTopology: 'No valid CPU topology exists for this total Virtual CPUs count.', @@ -402,11 +402,10 @@ export const messages: { [messageId: string]: MessageType } = { hostNameTooltip: 'Virtual Machine hostname.', hotPlugConfirmApplyAfterRestart: 'Apply after Restart', hotPlugConfirmApplyNow: 'Apply Changes Now', - hotPlugConfirmContent: 'Apply Changes Now with Hot Plug', + hotPlugConfirmContent: 'Apply Changes Now with Hot Plug?', hotPlugConfirmContentDetail: 'Applying the changes to CPU and/or Memory can be done right now but it requires ' + 'doing a hot plug. You can choose to apply these changes after a restart instead.', - hotPlugConfirmTitle: 'Apply Changes', htmlPleaseReferToDocumentationForMoreInformation: 'Please refer to documentation for more information.', htmlUnsupportedOvirtVersionFoundButVersionAtLeastRequired: 'Unsupported {version} {productName} version found, but at least version {requiredVersion} is required.', icon: 'Icon', @@ -467,12 +466,11 @@ export const messages: { [messageId: string]: MessageType } = { newSnapshot: 'New snapshot', nextRunConfirmActionSave: 'Save Changes', nextRunConfrimActionSaveRestart: 'Save Changes and Restart', - nextRunConfirmContent: 'Some Configuration Changes Will Be Applied on Restart', nextRunConfirmContentDetail: 'Some configuration changes will not be able to take effect until the ' + 'Virtual Machine is restarted next. A power cycle needs to take place to ' + 'pick up this new configuration.', - nextRunConfirmTitle: 'Configuration Change on Restart', + nextRunConfirmTitle: 'Restart required', nextSnapshotsWillBeDeleted: 'Restoring this snapshot will also delete newer snapshots:', nic: 'Network interfaces', nicActionCreateNew: 'Create NIC', @@ -539,6 +537,9 @@ export const messages: { [messageId: string]: MessageType } = { permissionsNoEditVm: 'You do not have the required permissions to edit a VM.', permissionsNoEditThisVm: 'You do not have permissions to edit VM {name} / {vmId}', pendingChanges: 'Pending Changes', + permanentlyDeleteDisk: 'Permanently delete Disk?', + permanentlyDeleteNic: 'Permanently delete Nic?', + permanentlyDeleteSnapshot: 'Permanently delete Snapshot?', persistenceReEnableHowTo: { message: 'To re-enable server-side persistence go to {advancedOptions}.', description: 'Instruction for the user how to re-enable server side persistence. Parameter advancedOptions is the translated label for Advanced Options section in Account Setttings', @@ -592,6 +593,7 @@ export const messages: { [messageId: string]: MessageType } = { message: 'Restore', description: 'Confirmation modal action button label for a Restore operation', }, + restoreSnapshot: 'Restore Snapshot?', results: { message: '{total} Results', description: 'Number of filtered fetched VMs (including pools)', @@ -693,12 +695,8 @@ export const messages: { [messageId: string]: MessageType } = { description: 'unknown data center', }, unsavedChangesConfirmMessage: { - message: 'Are you sure you want to drop your changes?', - description: 'Message in the modal dialog opened when a user tried to navigate off an editor page after changes have been made.', - }, - unsavedChangesTitle: { - message: 'Dialog contains unsaved changes', - description: 'Title of modal dialog opened when a user tried to navigate off an editor page after changes have been made.', + message: 'Drop your changes?', + description: 'Title of a modal dialog opened when a user tried to navigate off an editor page after changes have been made.', }, untilNextPageReload: { message: 'until next page reload', diff --git a/src/intl/translated-messages.json b/src/intl/translated-messages.json index bd70b97c8..4a0812210 100644 --- a/src/intl/translated-messages.json +++ b/src/intl/translated-messages.json @@ -213,7 +213,6 @@ "cluster": "Cluster", "clusterCanOnlyChangeWhenVmStopped": "Cluster kann nur bei angehaltener VM geändert werden.", "confirmDelete": "Löschen bestätigen", - "confirmRestore": "Wiederherstellen bestätigen", "connect": "Verbinden", "connectAutomatically": "Automatisch verbinden", "connecting": "Verbindung wird hergestellt", @@ -423,7 +422,6 @@ "hotPlugConfirmApplyNow": "Änderungen jetzt übernehmen", "hotPlugConfirmContent": "Änderungen jetzt mit Hot Plug übernehmen", "hotPlugConfirmContentDetail": "Sie können Änderungen jetzt sofort auf die CPU und/oder den Arbeitsspeicher anwenden, wobei jedoch ein Hot Plug erforderlich ist. Sie können stattdessen festlegen, dass die Änderungen nach einem Neustart übernommen werden.", - "hotPlugConfirmTitle": "Änderungen übernehmen", "htmlPleaseReferToDocumentationForMoreInformation": "Bitte beachten Sie die Dokumentation für weitere Informationen.", "htmlUnsupportedOvirtVersionFoundButVersionAtLeastRequired": "Nicht unterstützte {version} {productName}-Version gefunden, aber mindestens Version {requiredVersion} erforderlich.", "icon": "Symbol", @@ -460,7 +458,6 @@ "newNic": "Neu", "newSnapshot": "Neuer Snapshot", "nextRunConfirmActionSave": "Änderungen speichern", - "nextRunConfirmContent": "Einige Konfigurationsänderungen werden beim Neustart übernommen", "nextRunConfirmContentDetail": "Einige Konfigurationsänderungen werden erst übernommen, wenn die virtuelle Maschine das nächste Mal neu gestartet wird. Es ist ein Energiezyklus notwendig, damit diese neue Konfiguration übernommen wird.", "nextRunConfirmTitle": "Konfigurationsänderung beim Neustart", "nextRunConfrimActionSaveRestart": "Änderungen speichern und neu starten", @@ -618,7 +615,6 @@ "unknown": "unbekannt", "unknownDatacenter": "unbekannt", "unsavedChangesConfirmMessage": "Möchten Sie Ihre Änderungen wirklich verwerfen?", - "unsavedChangesTitle": "Dialog enthält nicht gespeicherte Änderungen", "untilNextPageReload": "bis zum erneuten Laden der mächsten Seite", "updateCloudInit": "Möchten Sie den Cloud-Init-Hostname auf den neuen VM-Namen aktualisieren?", "updateVm": "VM aktualisieren", @@ -757,7 +753,6 @@ "cluster": "Clúster", "clusterCanOnlyChangeWhenVmStopped": "El clúster solo se puede cambiar cuando la MV está detenida.", "confirmDelete": "Confirmar eliminación", - "confirmRestore": "Confirmar restauración", "connect": "Conectar", "connectAutomatically": "Conectar automáticamente", "connecting": "Conectando", @@ -967,7 +962,6 @@ "hotPlugConfirmApplyNow": "Aplicar cambios ahora", "hotPlugConfirmContent": "Aplicar cambios ahora con conexión caliente", "hotPlugConfirmContentDetail": "Aplicar los cambios en la CPU o memoria solo se puede realizar ahora, pero requiere una conexión caliente. De manera opcional, puede aplicar estos cambios después de un reinicio.", - "hotPlugConfirmTitle": "Aplicar cambios", "htmlPleaseReferToDocumentationForMoreInformation": "Por favor, visite la documentación para obtener más información.", "htmlUnsupportedOvirtVersionFoundButVersionAtLeastRequired": "Se encontró una versión no compatible {version} de {productName}, pero se requiere la versión {requiredVersion} como mínimo.", "icon": "Icono", @@ -1004,7 +998,6 @@ "newNic": "Nuevo", "newSnapshot": "Nueva instantánea", "nextRunConfirmActionSave": "Guardar cambios", - "nextRunConfirmContent": "Algunos cambios en la configuración se aplicarán en el reinicio", "nextRunConfirmContentDetail": "Algunos cambios en la configuración no podrán entrar en vigor hasta que se reinicie la máquina virtual. Necesita apagar y encender el equipo para recibir esta nueva configuración.", "nextRunConfirmTitle": "Cambio de configuración en el reinicio", "nextRunConfrimActionSaveRestart": "Guardar cambios y reiniciar", @@ -1162,7 +1155,6 @@ "unknown": "desconocido", "unknownDatacenter": "desconocido", "unsavedChangesConfirmMessage": "¿Está seguro de que desea perder sus cambios?", - "unsavedChangesTitle": "El cuadro de diálogo contiene cambios sin guardar", "untilNextPageReload": "hasta la próxima vez que se vuelva a cargar la página", "updateCloudInit": "¿Quiere actualizar el nombre de host de Cloud-init en el nuevo nombre de la MV?", "updateVm": "Actualizar MV", @@ -1301,7 +1293,6 @@ "cluster": "Cluster", "clusterCanOnlyChangeWhenVmStopped": "Le cluster ne peut être changé que quand la VM est arrêtée.", "confirmDelete": "Confirmer la suppression", - "confirmRestore": "Confirmer la restauration", "connect": "Connexion", "connectAutomatically": "Connexion automatique", "connecting": "Connexion en cours", @@ -1511,7 +1502,6 @@ "hotPlugConfirmApplyNow": "Appliquer les modifications maintenant", "hotPlugConfirmContent": "Appliquer les modifications maintenant via Hot Plug", "hotPlugConfirmContentDetail": "Appliquer les modifications au CPU et/ou à la Mémoire peut avoir lieu immédiatement mais cela requiert un Hot Plug. Vous pouvez aussi faire appliquer ces changements par un démarrage à nouveau à la place.", - "hotPlugConfirmTitle": "Appliquer les modifications", "htmlPleaseReferToDocumentationForMoreInformation": "Veuillez vous référer à la documentation pour plus d'informations.", "htmlUnsupportedOvirtVersionFoundButVersionAtLeastRequired": "{version} non prise en charge, version {productName} trouvée, mais vous avez besoin de la version {requiredVersion} au moins.", "icon": "Icône", @@ -1548,7 +1538,6 @@ "newNic": "Nouveau", "newSnapshot": "Nouveau cliché", "nextRunConfirmActionSave": "Sauvegarder les modifications", - "nextRunConfirmContent": "Certaines modifications de la configuration s'appliqueront au redémarrage", "nextRunConfirmContentDetail": "Certains changements de configuration ne pourront pas prendre effet tant que la machine virtuelle ne sera pas redémarrée. Un cycle d'alimentation doit avoir lieu pour prendre en charge cette nouvelle configuration.", "nextRunConfirmTitle": "Modification de configuration au Démarrage à nouveau", "nextRunConfrimActionSaveRestart": "Sauvegarder les modifications et redémarrer", @@ -1706,7 +1695,6 @@ "unknown": "inconnue", "unknownDatacenter": "inconnue", "unsavedChangesConfirmMessage": "Êtes-vous sûr(e) de vouloir annuler vos modifications ?", - "unsavedChangesTitle": "Le dialogue contient des modifications non sauvegardées", "untilNextPageReload": "jusqu'au prochain chargement de page", "updateCloudInit": "Est-ce que vous souhaitez mettre à jour le nom d'hôte Cloud-init sur un nouveau nom de VM ?", "updateVm": "Mise à jour VM", @@ -1829,7 +1817,6 @@ "fullyQualifiedDomainName": "Nome di dominio completo (FQDN) della VM. Si prega di notare che il guest agent deve essere installato all'interno della VM per ottenere questo valore. ", "groupOfHostsVmCanBeRunningOn": "Gruppo di host su cui la VM può essere eseguita.", "hotPlugConfirmApplyNow": "Applica Modifiche Ora", - "hotPlugConfirmTitle": "Applica Modifiche", "htmlPleaseReferToDocumentationForMoreInformation": "Si prega di riferirsi alla documentazione per maggiori informationi.", "mapCtrlAltDelKeyboardShortcutToCtrlAltEnd": "Mappare la scorciatoia di tastiera Ctrl + Alt + Del con Ctrl + Alt + End", "memoryIncluded": "(Stato incluso)", @@ -1933,7 +1920,6 @@ "cluster": "クラスター", "clusterCanOnlyChangeWhenVmStopped": "クラスターは仮想マシンの停止中にしか変更できません。", "confirmDelete": "削除の確認", - "confirmRestore": "復元の確認", "connect": "接続", "connectAutomatically": "自動的に接続する", "connecting": "接続中", @@ -2143,7 +2129,6 @@ "hotPlugConfirmApplyNow": "今すぐ変更を適用する", "hotPlugConfirmContent": "ホットプラグにより今すぐ変更が適用されます。", "hotPlugConfirmContentDetail": "CPU やメモリーに関する変更を直ちに適用することができますが、そのためにはホットプラグが必要です。また、これらの変更を再起動後に適用することもできます。", - "hotPlugConfirmTitle": "変更の適用", "htmlPleaseReferToDocumentationForMoreInformation": "詳しい情報は、ドキュメント を参照してください。", "htmlUnsupportedOvirtVersionFoundButVersionAtLeastRequired": "サポート対象外の {version} {productName} バージョン が見つかりましたが、バージョンは少なくとも {requiredVersion} が必要です。", "icon": "アイコン", @@ -2180,7 +2165,6 @@ "newNic": "新規作成", "newSnapshot": "新規スナップショット", "nextRunConfirmActionSave": "変更を保存する", - "nextRunConfirmContent": "一部の設定変更は再起動時に適用されます。", "nextRunConfirmContentDetail": "一部の設定変更は、次回仮想マシンを再起動するまで有効になりません。この新たな設定を適用するには電源のオン/オフが必要です。", "nextRunConfirmTitle": "再起動時に設定変更", "nextRunConfrimActionSaveRestart": "変更を保存して再起動する", @@ -2338,7 +2322,6 @@ "unknown": "不明", "unknownDatacenter": "不明", "unsavedChangesConfirmMessage": "変更を破棄してもよろしいですか?", - "unsavedChangesTitle": "保存していない変更がダイアログに含まれています。", "untilNextPageReload": "次のページが再読み込みされるまで", "updateCloudInit": "新しい仮想マシン名の Cloud-init のホスト名を更新しますか?", "updateVm": "仮想マシンの更新", @@ -2477,7 +2460,6 @@ "cluster": "클러스터", "clusterCanOnlyChangeWhenVmStopped": "가상 머신이 정지되어 있을 경우에만 클러스터를 변경할 수 있습니다. ", "confirmDelete": "삭제 확인", - "confirmRestore": "복구 확인 ", "connect": "연결", "connectAutomatically": "자동 연결", "connecting": "연결 중", @@ -2687,7 +2669,6 @@ "hotPlugConfirmApplyNow": "지금 변경 사항 적용 ", "hotPlugConfirmContent": "핫 플러그로 지금 변경 사항을 적용 ", "hotPlugConfirmContentDetail": "CPU와 메모리에 변경 사항을 즉시 적용할 수 있지만 이를 위해 핫 플러그가 필요합니다. 다른 방법으로 시스템을 다시 시작하여 이러한 변경 사항을 적용할 수 있습니다. ", - "hotPlugConfirmTitle": "변경 사항 적용", "htmlPleaseReferToDocumentationForMoreInformation": "보다 자세한 내용은 설명서를 참조하십시오.", "htmlUnsupportedOvirtVersionFoundButVersionAtLeastRequired": "지원되지 않는 {version} {productName} 버전이 발견되었지만 최소 {requiredVersion} 버전 이상이 필요합니다.", "icon": "아이콘", @@ -2724,7 +2705,6 @@ "newNic": "새로 만들기", "newSnapshot": "새 스냅샷 ", "nextRunConfirmActionSave": "변경사항 저장", - "nextRunConfirmContent": "일부 설정 변경 사항은 재시작 시 적용됩니다.", "nextRunConfirmContentDetail": "일부 설정 변경 사항은 가상 머신을 다시 시작할 때 까지 적용되지 않습니다. 새로운 설정 사항을 적용하려면 전원 켜기/끄기를 수행해야 합니다. ", "nextRunConfirmTitle": "재시작 시 설정 변경 ", "nextRunConfrimActionSaveRestart": "변경 사항 저장 후 다시 시작 ", @@ -2882,7 +2862,6 @@ "unknown": "알 수 없음 ", "unknownDatacenter": "알 수 없음 ", "unsavedChangesConfirmMessage": "변경 사항을 취소하시겠습니까?", - "unsavedChangesTitle": "저장되지 않은 변경 사항이 대화에 포함되어 있습니다.", "untilNextPageReload": "다음 페이지가 다시 로드될 때까지", "updateCloudInit": "새 가상 머신 이름에서 Cloud-init의 호스트 이름을 업데이트하시겠습니까?", "updateVm": "가상 머신 업데이트 ", @@ -3021,7 +3000,6 @@ "cluster": "Cluster", "clusterCanOnlyChangeWhenVmStopped": "O cluster só pode ser alterado quando a MV está interrompida.", "confirmDelete": "Confirmar exclusão", - "confirmRestore": "Confirmar restauração", "connect": "Conectar", "connectAutomatically": "Conectar automaticamente", "connecting": "Conectando", @@ -3231,7 +3209,6 @@ "hotPlugConfirmApplyNow": "Aplicar alterações agora", "hotPlugConfirmContent": "Aplicar alterações agora com conexão instantânea", "hotPlugConfirmContentDetail": "A aplicação das alterações à CPU e/ou memória pode ser feita agora, mas exige uma conexão instantânea. Você também pode escolher aplicar essas alterações após a reinicialização.", - "hotPlugConfirmTitle": "Aplicar alterações", "htmlPleaseReferToDocumentationForMoreInformation": "Para obter mais informações, consulte a documentação", "htmlUnsupportedOvirtVersionFoundButVersionAtLeastRequired": "Versão {version} {productName} não compatível encontrada, mas é obrigatória pelo menos a versão {requiredVersion}.", "icon": "Ícone", @@ -3268,7 +3245,6 @@ "newNic": "Novo", "newSnapshot": "Novo snapshot", "nextRunConfirmActionSave": "Salvar alterações", - "nextRunConfirmContent": "Algumas alterações de configuração serão aplicadas na reinicialização", "nextRunConfirmContentDetail": "Algumas alterações de configuração não poderão entrar em vigor até que a máquina virtual seja reiniciada novamente. Um ciclo de energia deve acontecer para pegar a nova configuração.", "nextRunConfirmTitle": "Alteração ou reinicialização da configuração", "nextRunConfrimActionSaveRestart": "Salvar alterações e reiniciar", @@ -3426,7 +3402,6 @@ "unknown": "desconhecida", "unknownDatacenter": "desconhecida", "unsavedChangesConfirmMessage": "Você tem certeza de que deseja descartar as alterações?", - "unsavedChangesTitle": "A janela de diálogo contém alterações não salvas", "untilNextPageReload": "até a próxima página ser carregada", "updateCloudInit": "Deseja atualizar o nome de host do Cloud-init no novo nome da VM?", "updateVm": "Atualizar VM", @@ -3565,7 +3540,6 @@ "cluster": "集群", "clusterCanOnlyChangeWhenVmStopped": "集群只能在虚拟机停止时改变。", "confirmDelete": "确认删除", - "confirmRestore": "确认恢复", "connect": "连接", "connectAutomatically": "自动连接", "connecting": "连接", @@ -3775,7 +3749,6 @@ "hotPlugConfirmApplyNow": "马上应用改变", "hotPlugConfirmContent": "马上应用改变热插", "hotPlugConfirmContentDetail": "对 CPU 和内存的改变可以马上生效,但这需要一个热插操作。您也可以选择这些改变在重启后生效。", - "hotPlugConfirmTitle": "应用改变", "htmlPleaseReferToDocumentationForMoreInformation": "请参阅文档来获得更多信息。", "htmlUnsupportedOvirtVersionFoundButVersionAtLeastRequired": "找到不支持的 {version} {productName} 版本,但最少需要版本 {requiredVersion}。", "icon": "图标", @@ -3812,7 +3785,6 @@ "newNic": "新建", "newSnapshot": "新快照", "nextRunConfirmActionSave": "保存更改", - "nextRunConfirmContent": "一些配置改变将在重启时生效", "nextRunConfirmContentDetail": "一些配置改变只有在虚拟机下次重启时才会生效。关机并重新开机后系统才可以使用这个新配置。", "nextRunConfirmTitle": "在重启时改变配置", "nextRunConfrimActionSaveRestart": "保存更改并重启", @@ -3970,7 +3942,6 @@ "unknown": "未知", "unknownDatacenter": "未知", "unsavedChangesConfirmMessage": "您确定要放弃改变吗?", - "unsavedChangesTitle": "对话包括未保存的改变", "untilNextPageReload": "直到下一次页面重新加载", "updateCloudInit": "您需要在新虚拟机名上更新 Cloud-init 主机名吗?", "updateVm": "更新虚拟机",