Adición de un control flotante personalizado a la interfaz de usuario web del acelerador de soluciones de supervisión remota
En este artículo se muestra cómo agregar un nuevo control flotante en una pagina de la interfaz de usuario web del acelerador de soluciones de supervisión remota. El artículo describe:
- Cómo preparar un entorno de desarrollo local.
- Cómo agregar un nuevo control flotante a una página de la interfaz de usuario web.
El control flotante de ejemplo de este artículo se muestra en la página con la cuadrícula que el artículo de procedimientos Adición de una cuadrícula personalizada a la interfaz de usuario web del acelerador de soluciones de supervisión remota muestra cómo agregar.
Requisitos previos
Para completar los pasos de esta guía, necesita que el software siguiente esté instalado en la máquina de desarrollo local:
Antes de comenzar
Debe completar los pasos descritos en los artículos siguientes antes de continuar:
- Adición de una página personalizada a la interfaz de usuario web del acelerador de soluciones de supervisión remota.
- Adición de un servicio personalizado a la interfaz de usuario web del acelerador de soluciones de supervisión remota
- Adición de una cuadrícula personalizada a la interfaz de usuario web del acelerador de soluciones de supervisión remota
Agregar un control flotante
Para agregar un control flotante a la interfaz de usuario web, deberá agregar los archivos de origen que definen el control flotante y modificar algunos archivos existentes para hacer que la interfaz de usuario web sea consciente del nuevo componente.
Adición de los nuevos archivos que definen el control flotante
Para comenzar, la carpeta src/walkthrough/components/pages/pageWithFlyout/flyouts/exampleFlyout contiene los archivos que definen un control flotante:
exampleFlyout.container.js
import { withNamespaces } from 'react-i18next';
import { ExampleFlyout } from './exampleFlyout';
export const ExampleFlyoutContainer = withNamespaces()(ExampleFlyout);
exampleFlyout.js
import React, { Component } from 'react';
import { ExampleService } from 'walkthrough/services';
import { svgs } from 'utilities';
import {
AjaxError,
Btn,
BtnToolbar,
Flyout,
Indicator,
SectionDesc,
SectionHeader,
SummaryBody,
SummaryCount,
SummarySection,
Svg
} from 'components/shared';
import './exampleFlyout.scss';
export class ExampleFlyout extends Component {
constructor(props) {
super(props);
this.state = {
itemCount: 3, //just a fake count; this would often be a list of items that are being acted on
isPending: false,
error: undefined,
successCount: 0,
changesApplied: false
};
}
componentWillUnmount() {
if (this.subscription) this.subscription.unsubscribe();
}
apply = (event) => {
event.preventDefault();
this.setState({ isPending: true, successCount: 0, error: null });
this.subscription = ExampleService.updateExampleItems()
.subscribe(
_ => {
this.setState({ successCount: this.state.successCount + this.state.itemCount });
// Update any global state in the redux store by calling any
// dispatch methods that were mapped in this flyout's container.
},
error => this.setState({ error, isPending: false, changesApplied: true }),
() => this.setState({ isPending: false, changesApplied: true, confirmStatus: false })
);
}
getSummaryMessage() {
const { t } = this.props;
const { isPending, changesApplied } = this.state;
if (isPending) {
return t('walkthrough.pageWithFlyout.flyouts.example.pending');
} else if (changesApplied) {
return t('walkthrough.pageWithFlyout.flyouts.example.applySuccess');
} else {
return t('walkthrough.pageWithFlyout.flyouts.example.affected');
}
}
render() {
const { t, onClose } = this.props;
const {
itemCount,
isPending,
error,
successCount,
changesApplied
} = this.state;
const summaryCount = changesApplied ? successCount : itemCount;
const completedSuccessfully = changesApplied && !error;
const summaryMessage = this.getSummaryMessage();
return (
<Flyout header={t('walkthrough.pageWithFlyout.flyouts.example.header')} t={t} onClose={onClose}>
{
/**
* Really, anything you need could go inside a flyout.
* The following is a simple empty form with buttons to do an action or close the flyout.
* */
}
<form className="example-flyout-container" onSubmit={this.apply}>
<div className="example-flyout-header">{t('walkthrough.pageWithFlyout.flyouts.example.header')}</div>
<div className="example-flyout-descr">{t('walkthrough.pageWithFlyout.flyouts.example.description')}</div>
<div className="form-placeholder">{t('walkthrough.pageWithFlyout.flyouts.example.insertFormHere')}</div>
{/** Sumarizes the action being taken; including count of items affected & status/pending indicator */}
<SummarySection>
<SectionHeader>{t('walkthrough.pageWithFlyout.flyouts.example.summaryHeader')}</SectionHeader>
<SummaryBody>
<SummaryCount>{summaryCount}</SummaryCount>
<SectionDesc>{summaryMessage}</SectionDesc>
{this.state.isPending && <Indicator />}
{completedSuccessfully && <Svg className="summary-icon" path={svgs.apply} />}
</SummaryBody>
</SummarySection>
{/** Displays an error message if one occurs while applying changes. */}
{error && <AjaxError className="example-flyout-error" t={t} error={error} />}
{
/** If changes are not yet applied, show the buttons for applying changes and closing the flyout. */
!changesApplied &&
<BtnToolbar>
<Btn svg={svgs.reconfigure} primary={true} disabled={isPending || itemCount === 0 } type="submit">{t('walkthrough.pageWithFlyout.flyouts.example.apply')}</Btn>
<Btn svg={svgs.cancelX} onClick={onClose}>{t('walkthrough.pageWithFlyout.flyouts.example.cancel')}</Btn>
</BtnToolbar>
}
{
/**
* If changes are applied, show only the close button.
* Other text or component might be included here as well.
* For example, you might provide a link to the detail page for a newly submitted job.
* */
!!changesApplied &&
<BtnToolbar>
<Btn svg={svgs.cancelX} onClick={onClose}>{t('walkthrough.pageWithFlyout.flyouts.example.close')}</Btn>
</BtnToolbar>
}
</form>
</Flyout>
);
}
}
Copie la carpeta src/walkthrough/components/pages/pageWithFlyout/flyouts a la carpeta src/components/pages/example.
Incorporación del control flotante a la página
Modifique el archivo src/components/pages/example/basicPage.js para agregar el control flotante.
Agregue Btn a las importaciones desde components/shared y agregue las importaciones para svgs y ExampleFlyoutContainer:
import {
AjaxError,
ContextMenu,
PageContent,
RefreshBar,
Btn
} from 'components/shared';
import { ExampleGrid } from './exampleGrid';
import { svgs } from 'utilities';
import { ExampleFlyoutContainer } from './flyouts/exampleFlyout';
Agregue una definición de const para closedFlyoutState y agréguelo al estado en el constructor:
const closedFlyoutState = { openFlyoutName: undefined };
export class BasicPage extends Component {
constructor(props) {
super(props);
this.state = { contextBtns: null, closedFlyoutState };
}
Agregue las siguientes funciones a la clase BasicPage:
closeFlyout = () => this.setState(closedFlyoutState);
openFlyout = (name) => () => this.setState({ openFlyoutName: name });
Agregue las siguientes definiciones const a la función render:
const { openFlyoutName } = this.state;
const isExampleFlyoutOpen = openFlyoutName === 'example';
Agregue un botón para abrir el control flotante para el menú contextual:
<ContextMenu key="context-menu">
{this.state.contextBtns}
<Btn svg={svgs.reconfigure} onClick={this.openFlyout('example')}>{t('walkthrough.pageWithFlyout.open')}</Btn>
</ContextMenu>,
Agregue texto y el contenedor del control flotante para el contenido de la página:
<PageContent className="basic-page-container" key="page-content">
{t('walkthrough.pageWithFlyout.pageBody')}
{ isExampleFlyoutOpen && <ExampleFlyoutContainer onClose={this.closeFlyout} /> }
<RefreshBar refresh={fetchData} time={lastUpdated} isPending={isPending} t={t} />
{!!error && <AjaxError t={t} error={error} />}
{!error && <ExampleGrid {...gridProps} />}
</PageContent>
Prueba del control flotante
Si la interfaz de usuario web no se está ejecutando localmente, ejecute el siguiente comando en la raíz de la copia local del repositorio:
npm start
El comando anterior ejecuta la interfaz de usuario localmente en https://localhost:3000/dashboard
. Vaya a la página ejemplo y haga clic en Open Flyout (Abrir control flotante).
Pasos siguientes
En este artículo, aprendió sobre los recursos que tiene a su disposición para ayudarle a agregar o personalizar páginas en la interfaz de usuario web del acelerador de la solución de supervisión remota.
Ya ha definido un control flotante en una página, el paso siguiente consiste en agregar un panel al panel personalizado en la interfaz de usuario web del acelerador de soluciones de supervisión remota.
Para obtener más información conceptual sobre el acelerador de soluciones de supervisión remota, consulte Arquitectura de supervisión remota.