Add aria-labels to odlux tables 53/123053/1
authorAijana Schumann <aijana.schumann@highstreet-technologies.com>
Tue, 3 Aug 2021 09:08:00 +0000 (11:08 +0200)
committerAijana Schumann <aijana.schumann@highstreet-technologies.com>
Tue, 3 Aug 2021 09:08:00 +0000 (11:08 +0200)
Add aria-labels to all table action buttons

Issue-ID: CCSDK-3396
Signed-off-by: Aijana Schumann <aijana.schumann@highstreet-technologies.com>
Change-Id: I1c3922c1d195727265882d3e3362607ab558d603

23 files changed:
sdnr/wt/odlux/apps/configurationApp/src/views/configurationApplication.tsx
sdnr/wt/odlux/apps/connectApp/src/components/connectionStatusLog.tsx
sdnr/wt/odlux/apps/demoApp/pom.xml
sdnr/wt/odlux/apps/eventLogApp/src/views/eventLog.tsx
sdnr/wt/odlux/apps/faultApp/src/handlers/faultAppRootHandler.ts
sdnr/wt/odlux/apps/faultApp/src/pluginFault.tsx
sdnr/wt/odlux/apps/faultApp/src/views/faultApplication.tsx
sdnr/wt/odlux/apps/inventoryApp/src/views/dashboard.tsx
sdnr/wt/odlux/apps/maintenanceApp/src/views/maintenenceView.tsx
sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorApplication.tsx
sdnr/wt/odlux/apps/mediatorApp/src/views/mediatorServerSelection.tsx
sdnr/wt/odlux/apps/performanceHistoryApp/src/components/performanceData.tsx
sdnr/wt/odlux/apps/performanceHistoryApp/src/views/performanceHistoryApplication.tsx
sdnr/wt/odlux/framework/pom.xml
sdnr/wt/odlux/framework/src/app.tsx
sdnr/wt/odlux/framework/src/components/errorDisplay.tsx
sdnr/wt/odlux/framework/src/components/material-table/index.tsx
sdnr/wt/odlux/framework/src/components/material-table/tableToolbar.tsx
sdnr/wt/odlux/framework/src/components/navigationMenu.tsx
sdnr/wt/odlux/framework/src/handlers/applicationStateHandler.ts
sdnr/wt/odlux/framework/src/models/applicationConfig.ts
sdnr/wt/odlux/framework/src/views/home.tsx
sdnr/wt/odlux/odlux.properties

index e466dba..db426e8 100644 (file)
@@ -588,7 +588,8 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp
 
     const addNewElementAction = {
       icon: AddIcon, 
-      tooltip: 'Add', 
+      tooltip: 'Add',
+      ariaLabel:'add-element',
       onClick: () => {
         navigate("[]"); // empty key means new element
       },
@@ -597,7 +598,8 @@ class ConfigurationApplicationComponent extends React.Component<ConfigurationApp
 
     const addWithApiDocElementAction = {
       icon: PostAdd, 
-      tooltip: 'Add', 
+      tooltip: 'Add',
+      ariaLabel:'add-element-via-api-doc',
       onClick: () => {
         window.open(apiDocPathCreate, '_blank');
       },
index 94b4872..7d2f96a 100644 (file)
@@ -54,7 +54,7 @@ class ConnectionStatusLogComponent extends React.Component<ConnectionStatusLogCo
 
   render(): JSX.Element {
     const refreshConnectionStatusLogAction = {
-      icon: Refresh, tooltip: 'Refresh Connection Status Log Table', onClick: () => {
+      icon: Refresh, tooltip: 'Refresh Connection Status Log Table', ariaLabel:'refresh', onClick: () => {
         this.setState({
           refreshConnectionStatusLogEditorMode: RefreshConnectionStatusLogDialogMode.RefreshConnectionStatusLogTable
         });
index dae67b1..e3f27d5 100644 (file)
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-            </plugin>
         </plugins>
     </build>
 </project>
index 748c66e..0308828 100644 (file)
@@ -55,7 +55,7 @@ class EventLogComponent extends React.Component<EventLogComponentProps, EventLog
   render(): JSX.Element {
 
     const refreshEventLogAction = {
-      icon: Refresh, tooltip: 'Refresh Event log', onClick: () => {
+      icon: Refresh, tooltip: 'Refresh Event log', ariaLabel:'refresh', onClick: () => {
         this.setState({
           refreshEventLogEditorMode: RefreshEventLogDialogMode.RefreshEventLogTable
         });
index 46f92fb..2ab1da2 100644 (file)
@@ -30,7 +30,6 @@ import { SetPanelAction } from '../actions/panelChangeActions';
 import { IFaultStatus, faultStatusHandler } from './faultStatusHandler';
 import { stuckAlarmHandler } from './clearStuckAlarmsHandler';
 import { PanelId } from '../models/panelId';
-import { SetPartialUpdatesAction } from '../actions/partialUpdatesAction';
 
 export interface IFaultAppStoreState {
   currentProblems: ICurrentProblemsState;
@@ -38,7 +37,6 @@ export interface IFaultAppStoreState {
   alarmLogEntries: IAlarmLogEntriesState;
   currentOpenPanel: PanelId | null;
   faultStatus: IFaultStatus;
-  listenForPartialUpdates: boolean;
 }
 
 const currentOpenPanelHandler: IActionHandler<PanelId | null> = (state = null, action) => {
@@ -48,13 +46,6 @@ const currentOpenPanelHandler: IActionHandler<PanelId | null> = (state = null, a
   return state;
 }
 
-const arePartialUpdatesActiveHandler: IActionHandler<boolean> = (state = false, action) => {
-  if (action instanceof SetPartialUpdatesAction) {
-    state = action.isActive;
-  }
-  return state;
-}
-
 declare module '../../../../framework/src/store/applicationStore' {
   interface IApplicationStoreState {
     fault: IFaultAppStoreState;
@@ -67,7 +58,6 @@ const actionHandlers = {
   alarmLogEntries: alarmLogEntriesActionHandler,
   currentOpenPanel: currentOpenPanelHandler,
   faultStatus: faultStatusHandler,
-  listenForPartialUpdates: arePartialUpdatesActiveHandler
 };
 
 export const faultAppRootHandler = combineActionHandler<IFaultAppStoreState>(actionHandlers);
index 0629941..3715c62 100644 (file)
@@ -140,6 +140,7 @@ export function register() {
   applicationApi.applicationStoreInitialized.then(store => {
     store.dispatch(refreshFaultStatusAsyncAction);
   });
+  
   window.setInterval(() => {
     applicationApi.applicationStoreInitialized.then(store => {
       store.dispatch(refreshFaultStatusAsyncAction);
index 7b0c236..0fc7b39 100644 (file)
@@ -41,7 +41,6 @@ import Refresh from '@material-ui/icons/Refresh';
 import ClearStuckAlarmsDialog, { ClearStuckAlarmsDialogMode } from '../components/clearStuckAlarmsDialog';
 import RefreshAlarmLogDialog, { RefreshAlarmLogDialogMode } from '../components/refreshAlarmLogDialog';
 import RefreshCurrentProblemsDialog, { RefreshCurrentProblemsDialogMode } from '../components/refreshCurrentProblemsDialog';
-import { SetPartialUpdatesAction } from '../actions/partialUpdatesAction';
 
 const mapProps = (state: IApplicationStoreState) => ({
   panelId: state.fault.currentOpenPanel,
@@ -58,7 +57,6 @@ const mapDisp = (dispatcher: IDispatcher) => ({
   switchActivePanel: (panelId: PanelId) => {
     dispatcher.dispatch(setPanelAction(panelId));
   },
-  setPartialUpdates: (active: boolean) => dispatcher.dispatch(new SetPartialUpdatesAction(active))
 });
 
 type FaultApplicationComponentProps = RouteComponentProps & Connect<typeof mapProps, typeof mapDisp>;
@@ -138,11 +136,11 @@ class FaultApplicationComponent extends React.Component<FaultApplicationComponen
   render(): JSX.Element {
 
     const clearAlarmsAction = {
-      icon: Sync, tooltip: 'Clear stuck alarms', onClick: this.onDialogOpen
+      icon: Sync, tooltip: 'Clear stuck alarms', ariaLabel:'clear-stuck-alarms', onClick: this.onDialogOpen
     };
 
     const refreshCurrentProblemsAction = {
-      icon: Refresh, tooltip: 'Refresh Current Problems List', onClick: () => {
+      icon: Refresh, tooltip: 'Refresh Current Problems List', ariaLabel:'refresh', onClick: () => {
         this.setState({
           refreshCurrentProblemsEditorMode: RefreshCurrentProblemsDialogMode.RefreshCurrentProblemsTable
         });
@@ -150,7 +148,7 @@ class FaultApplicationComponent extends React.Component<FaultApplicationComponen
     };
 
     const refreshAlarmLogAction = {
-      icon: Refresh, tooltip: 'Refresh Alarm log table', onClick: () => {
+      icon: Refresh, tooltip: 'Refresh Alarm log table', ariaLabel:'refresh', onClick: () => {
         this.setState({
           refreshAlarmLogEditorMode: RefreshAlarmLogDialogMode.RefreshAlarmLogTable
         });
@@ -230,15 +228,12 @@ class FaultApplicationComponent extends React.Component<FaultApplicationComponen
 
   };
 
-  componentWillUnmount() {
-    this.props.setPartialUpdates(false);
-  }
-
   public componentDidMount() {
     if (this.props.panelId === null) { //set default tab if none is set
       this.onToggleTabs("CurrentProblem");
+    }else{
+      this.onToggleTabs(this.props.panelId);
     }
-    this.props.setPartialUpdates(true);
   }
 
   private renderIcon = (props: { rowData: Fault | FaultAlarmNotification }) => {
index b672dc3..0a1bea0 100644 (file)
@@ -124,7 +124,7 @@ class DashboardSelectorComponent extends React.Component<DashboardComponentProps
   render() {
 
     const refreshInventoryAction = {
-      icon: Refresh, tooltip: 'Refresh Inventory', onClick: () => {
+      icon: Refresh, tooltip: 'Refresh Inventory', ariaLabel: 'refresh', onClick: () => {
         this.setState({
           refreshInventoryEditorMode: RefreshInventoryDialogMode.RefreshInventoryTable
         });
index 6b5071d..0be28b7 100644 (file)
@@ -113,7 +113,7 @@ class MaintenenceViewComponent extends React.Component<MaintenenceViewComponentP
   render() {
     const { classes } = this.props;
     const addMaintenenceEntryAction = {
-      icon: AddIcon, tooltip: 'Add', onClick: () => {
+      icon: AddIcon, tooltip: 'Add', ariaLabel:'add-element', onClick: () => {
         const startTime = (new Date().valueOf());
         const endTime = startTime;
         this.setState({
@@ -128,7 +128,7 @@ class MaintenenceViewComponent extends React.Component<MaintenenceViewComponentP
     };
 
     const refreshMaintenanceEntriesAction = {
-      icon: Refresh, tooltip: 'Refresh Maintenance Entries', onClick: () => {
+      icon: Refresh, tooltip: 'Refresh Maintenance Entries', ariaLabel: 'refresh', onClick: () => {
         this.setState({
           refreshMaintenenceEntriesEditorMode: RefreshMaintenanceEntriesDialogMode.RefreshMaintenanceEntriesTable
         });
index f962232..fbf6d57 100644 (file)
@@ -151,7 +151,7 @@ class MediatorApplicationComponent extends React.Component<MediatorApplicationCo
       </>
     );
 
-    const addMediatorConfigAction = { icon: AddIcon, tooltip: 'Add', onClick: this.onOpenAddConfigurationDialog };
+    const addMediatorConfigAction = { icon: AddIcon, tooltip: 'Add', ariaLabel: 'add-element', onClick: this.onOpenAddConfigurationDialog };
 
     return (
       <div className={classes.root}>
index 0f4ebbe..be1ecc7 100644 (file)
@@ -90,7 +90,7 @@ class MediatorServerSelectionComponent extends React.Component<MediatorServerSel
   render() {
     const { classes } = this.props;
     const refreshMediatorAction = {
-      icon: Refresh, tooltip: 'Refresh Mediator Server Table', onClick: () => {
+      icon: Refresh, tooltip: 'Refresh Mediator Server Table', ariaLabel:'refresh', onClick: () => {
         this.setState({
           refreshMediatorEditorMode: RefreshMediatorDialogMode.RefreshMediatorTable
         });
@@ -98,7 +98,7 @@ class MediatorServerSelectionComponent extends React.Component<MediatorServerSel
     };
 
     const addMediatorServerActionButton = {
-      icon: AddIcon, tooltip: 'Add', onClick: () => {
+      icon: AddIcon, tooltip: 'Add', ariaLabel:'add-element', onClick: () => {
         this.setState({
           mediatorServerEditorMode: EditMediatorServerDialogMode.AddMediatorServer,
           mediatorServerToEdit: emptyMediatorServer,
index 6209024..6a06ea3 100644 (file)
@@ -85,7 +85,7 @@ class PerformanceDataComponent extends React.Component<PerformanceDataComponentP
       <>
         <ToggleContainer onToggleFilterButton={() => this.props.toggleFilterButton(!this.props.isFilterVisible)} existingFilter={this.props.existingFilter} onFilterChanged={this.onFilterChanged} selectedValue={this.props.currentView} showFilter={this.props.isFilterVisible} onChange={this.props.setSubView}>
           {lineChart(chartPagedData)}
-          <PerformanceDataTable stickyHeader idProperty={"_id"} tableId="perfromance-data-table" columns={performanceColumns} {...properties} {...actions} />
+          <PerformanceDataTable stickyHeader idProperty={"_id"} tableId="performance-data-table" columns={performanceColumns} {...properties} {...actions} />
         </ToggleContainer>
       </>
     );
index a0df93f..b0fd54c 100644 (file)
@@ -251,7 +251,7 @@ class PerformanceHistoryComponent extends React.Component<PerformanceHistoryComp
                   <Tab label="Transmission Power" value="TransmissionPower" aria-label="transmission-power" />
                   <Tab label="Adaptive Modulation" value="AdaptiveModulation" aria-label="adaptive-modulation" />
                   <Tab label="Temperature" value="Temperature" aria-label="temperature"  />
-                  <Tab label="Signal-to-interference-plus-noise ratio (SINR)" value="SINR" aria-label="snir" />
+                  <Tab label="Signal-to-interference-plus-noise ratio (SINR)" value="SINR" aria-label="sinr" />
                   <Tab label="Cross Polar Discrimination" value="CPD" aria-label="cross-polar-discrimination" />
                 </Tabs>
               </AppBar>
index 3e94753..0e6b3cf 100644 (file)
@@ -46,7 +46,7 @@
     <properties>
         <buildtime>${maven.build.timestamp}</buildtime>
         <distversion>ONAP Frankfurt (Neon, mdsal ${odl.mdsal.version})</distversion>
-        <buildno>110.0d5d064(21/07/05)</buildno>
+        <buildno>115.f8b3b3c(21/07/30)</buildno>
         <odlux.version>ONAP SDN-R | ONF Wireless for ${distversion} - Build: ${buildtime} ${buildno} ${project.version}</odlux.version>
     </properties>
 
index 7e162cd..ada78b9 100644 (file)
@@ -105,4 +105,3 @@ export const runApplication = () => {
   \r
 \r
 };\r
-\r
index 1060d4b..b2a1f1f 100644 (file)
@@ -82,6 +82,7 @@ class ErrorDisplayComponent extends React.Component<ErrorDisplayProps> {
   render(): JSX.Element {
     const { classes, state } = this.props;
     const errorInfo = state.framework.applicationState.errors.length && state.framework.applicationState.errors[state.framework.applicationState.errors.length - 1];
+    
     return (
       <Modal className={classes.modal}
         aria-labelledby="simple-modal-title"
index c74fd1a..9155f38 100644 (file)
@@ -159,7 +159,7 @@ type MaterialTableComponentBaseProps<TData> = WithStyles<typeof styles> & {
   enableSelection?: boolean;
   disableSorting?: boolean;
   disableFilter?: boolean;
-  customActionButtons?: { icon: React.ComponentType<SvgIconProps>, tooltip?: string, onClick: () => void, disabled?: boolean }[];
+  customActionButtons?: { icon: React.ComponentType<SvgIconProps>, tooltip?: string, ariaLabel: string, onClick: () => void, disabled?: boolean }[];
   onHandleClick?(event: React.MouseEvent<HTMLTableRowElement>, rowData: TData): void;
   createContextMenu?: (row: TData) => React.ReactElement<MenuItemProps | DividerTypeMap<{}, "hr">, React.ComponentType<MenuItemProps | DividerTypeMap<{}, "hr">>>[];
 };
@@ -253,8 +253,8 @@ class MaterialTableComponent<TData extends {} = {}> extends React.Component<Mate
               {rows // may need ordering here
                 .map((entry: TData & { [RowDisabled]?: boolean, [kex: string]: any }, index) => {
                   const entryId = getId(entry);
-                  const isSelected = this.isSelected(entryId);
                   const contextMenu = (this.props.createContextMenu && this.state.contextMenuInfo.index === index && this.props.createContextMenu(entry)) || null;
+                  const isSelected = this.isSelected(entryId) || this.state.contextMenuInfo.index === index;
                   return (
                     <TableRowExt
                       hover
index f7de0a0..4ad6422 100644 (file)
@@ -67,7 +67,7 @@ interface ITableToolbarComponentProps extends WithStyles<typeof styles> {
   numSelected: number | null;
   title?: string;
   tableId?: string;
-  customActionButtons?: { icon: React.ComponentType<SvgIconProps>, tooltip?: string, onClick: () => void, disabled?: boolean }[];
+  customActionButtons?: { icon: React.ComponentType<SvgIconProps>, tooltip?: string, ariaLabel: string, onClick: () => void, disabled?: boolean }[];
   onToggleFilter: () => void;
   onExportToCsv: () => void;
 }
@@ -91,7 +91,7 @@ class TableToolbarComponent extends React.Component<ITableToolbarComponentProps,
   render() {
     const { numSelected, classes } = this.props;
     const open = !!this.state.anchorEl;
-    const buttonPrefix = this.props.tableId !== undefined ? this.props.tableId + '-' : '';
+    const buttonPrefix = this.props.tableId !== undefined ? this.props.tableId : 'table';
     return (
       <Toolbar className={`${classes.root} ${numSelected && numSelected > 0 ? classes.highlight : ''} `} >
         <div className={classes.title}>
@@ -110,7 +110,7 @@ class TableToolbarComponent extends React.Component<ITableToolbarComponentProps,
           {this.props.customActionButtons
             ? this.props.customActionButtons.map((action, ind) => (
               <Tooltip key={`custom-action-${ind}`} title={action.tooltip || ''}>
-                <IconButton disabled={action.disabled} aria-label={buttonPrefix + `custom-action-${ind}`} onClick={() => action.onClick()}>
+                <IconButton disabled={action.disabled} aria-label={`${buttonPrefix}-${action.ariaLabel}-button`} onClick={() => action.onClick()}>
                   <action.icon />
                 </IconButton>
               </Tooltip>
@@ -118,20 +118,20 @@ class TableToolbarComponent extends React.Component<ITableToolbarComponentProps,
             : null}
           {numSelected && numSelected > 0 ? (
             <Tooltip title="Delete">
-              <IconButton aria-label={buttonPrefix + "delete"}>
+              <IconButton aria-label={`${buttonPrefix}-delete-button`}>
                 <DeleteIcon />
               </IconButton>
             </Tooltip>
           ) : (
               <Tooltip title="Filter list">
-                <IconButton aria-label={buttonPrefix + "filter-list"} onClick={() => { this.props.onToggleFilter && this.props.onToggleFilter() }}>
+                <IconButton aria-label={`${buttonPrefix}-filter-list-button`} onClick={() => { this.props.onToggleFilter && this.props.onToggleFilter() }}>
                   <FilterListIcon />
                 </IconButton>
               </Tooltip>
             )}
           <Tooltip title="Actions">
             <IconButton color="inherit"
-            aria-label={buttonPrefix +"additional-actions-button"}
+            aria-label={`${buttonPrefix}-additional-actions-button`}
               aria-owns={open ? 'menu-appbar' : undefined}
               aria-haspopup="true"
               onClick={this.handleMenu} >
index 437ba1b..b65eb29 100644 (file)
@@ -87,9 +87,10 @@ const styles = (theme: Theme) => createStyles({
 const tabletWidthBreakpoint = 768;\r
 \r
 export const NavigationMenu = withStyles(styles)(connect()(({ classes, state, dispatch }: WithStyles<typeof styles> & Connect & Connect) => {\r
-  const { user } = state.framework.authenticationState\r
-  const isOpen = state.framework.applicationState.isMenuOpen\r
-  const closedByUser = state.framework.applicationState.isMenuClosedByUser\r
+  const { user } = state.framework.authenticationState;\r
+  const isOpen = state.framework.applicationState.isMenuOpen;\r
+  const closedByUser = state.framework.applicationState.isMenuClosedByUser;\r
+  const transportUrl = state.framework.applicationState.transportpceUrl;\r
 \r
   const [responsive, setResponsive] = React.useState(false);\r
 \r
@@ -139,20 +140,25 @@ export const NavigationMenu = withStyles(styles)(connect()(({ classes, state, di
     ) || null;\r
   }) || null;\r
 \r
-  const transportPCELink = <ListItemLink\r
-    key={"transportPCE"}\r
-    to={window.localStorage.getItem(transportPCEUrl)!}\r
-    primary={"TransportPCE"}\r
-    icon={<FontAwesomeIcon icon={faProjectDiagram}/>} \r
-    external/>;\r
-\r
-  const linkFound = menuItems.find(obj=>obj.key === "linkCalculation");\r
-  if(linkFound){\r
-    const index = menuItems.indexOf(linkFound);\r
-    menuItems.splice(index+1,0,transportPCELink);\r
-  }else{\r
-    menuItems.push(transportPCELink);\r
+  if(transportUrl.length>0){\r
+\r
+    const transportPCELink = <ListItemLink\r
+      key={"transportPCE"}\r
+      to={transportUrl}\r
+      primary={"TransportPCE"}\r
+      icon={<FontAwesomeIcon icon={faProjectDiagram} />}\r
+      external />;\r
+\r
+    const linkFound = menuItems.find(obj => obj.key === "linkCalculation");\r
+    \r
+    if (linkFound) {\r
+      const index = menuItems.indexOf(linkFound);\r
+      menuItems.splice(index + 1, 0, transportPCELink);\r
+    } else {\r
+      menuItems.push(transportPCELink);\r
+    }\r
   }\r
+  \r
 \r
   return (\r
     <Drawer\r
index 6426066..61e1334 100644 (file)
@@ -50,7 +50,8 @@ export interface IApplicationState {
   isWebsocketAvailable: boolean | undefined;
   externalLoginProviders: ExternalLoginProvider[] | null;
   authentication: "basic"|"oauth",  // basic 
-  enablePolicy: boolean             // false 
+  enablePolicy: boolean,             // false 
+  transportpceUrl : string
 }
 
 const applicationStateInit: IApplicationState = {
@@ -63,11 +64,13 @@ const applicationStateInit: IApplicationState = {
   externalLoginProviders: null,
   authentication: "basic",
   enablePolicy: false,
+  transportpceUrl: ""
 };
 
 export const configureApplication = (config: ApplicationConfig) => {
   applicationStateInit.authentication = config.authentication === "oauth" ? "oauth" : "basic";
   applicationStateInit.enablePolicy = config.enablePolicy ? true : false;
+  applicationStateInit.transportpceUrl=config.transportpceUrl == undefined ? "" : config.transportpceUrl;
 }
 
 export const applicationStateHandler: IActionHandler<IApplicationState> = (state = applicationStateInit, action) => {
index 5224840..0ae9c26 100644 (file)
@@ -1,4 +1,5 @@
 export type ApplicationConfig = { 
     authentication: "basic"|"oauth",  // basic 
-    enablePolicy: false               // false 
+    enablePolicy: false,               // false 
+    transportpceUrl? : string
 };
\ No newline at end of file
index b5df052..0e1d487 100644 (file)
@@ -91,6 +91,9 @@ class Home extends React.Component<HomeComponentProps>  {
     const connectionStatusOptions = {
       responsive: true,
       maintainAspectRatio: false,
+      animation: {
+        duration: 0
+      },
       plugins: {
         legend: {
           display: true,
@@ -109,6 +112,9 @@ class Home extends React.Component<HomeComponentProps>  {
     const connectionStatusUnavailableOptions = {
       responsive: true,
       maintainAspectRatio: false,
+      animation: {
+        duration: 0
+      },
       plugins: {
         legend: {
           display: true,
@@ -178,6 +184,9 @@ class Home extends React.Component<HomeComponentProps>  {
     const alarmStatusOptions = {
       responsive: true,
       maintainAspectRatio: false,
+      animation: {
+        duration: 0
+      },
       plugins: {
         legend: {
           display: true,
@@ -196,6 +205,9 @@ class Home extends React.Component<HomeComponentProps>  {
     const alarmStatusUnavailableOptions = {
       responsive: true,
       maintainAspectRatio: false,
+      animation: {
+        duration: 0
+      },
       plugins: {
         legend: {
           display: true,
index 5e34ec0..7a69b8f 100644 (file)
@@ -1,12 +1,12 @@
 odlux.framework.buildno=110.0d5d064(21/07/05)
-odlux.apps.configurationApp.buildno=96.078ad12(21/03/25)
+odlux.apps.configurationApp.buildno=103.10d8f9a(21/05/21)
 odlux.apps.connectApp.buildno=110.0d5d064(21/07/05)
-odlux.apps.eventLogApp.buildno=96.078ad12(21/03/25)
+odlux.apps.eventLogApp.buildno=103.10d8f9a(21/05/21)
 odlux.apps.faultApp.buildno=110.0d5d064(21/07/05)
 odlux.apps.helpApp.buildno=96.078ad12(21/03/25)
 odlux.apps.inventoryApp.buildno=108.a60ec28(21/06/11)
 odlux.apps.linkCalculationApp.buildno=96.078ad12(21/03/25)
-odlux.apps.maintenanceApp.buildno=96.078ad12(21/03/25)
-odlux.apps.mediatorApp.buildno=96.078ad12(21/03/25)
+odlux.apps.maintenanceApp.buildno=103.10d8f9a(21/05/21)
+odlux.apps.mediatorApp.buildno=103.10d8f9a(21/05/21)
 odlux.apps.networkMapApp.buildno=102.acd1c0b(21/05/07)
 odlux.apps.permanceHistoryApp.buildno=81.1c38886(20/12/04)