Blame components/ListView/ListItemImages.js

Packit Service 0246ed
import React from "react";
Packit Service 0246ed
import { FormattedMessage, defineMessages, injectIntl, intlShape } from "react-intl";
Packit Service 0246ed
import PropTypes from "prop-types";
Packit Service 0246ed
import { connect } from "react-redux";
Packit Service 0246ed
import {
Packit Service 0246ed
  Button,
Packit Service 0246ed
  DataListItem,
Packit Service 0246ed
  DataListItemRow,
Packit Service 0246ed
  DataListCell,
Packit Service 0246ed
  DataListToggle,
Packit Service 0246ed
  DataListContent,
Packit Service 0246ed
  DataListItemCells,
Packit Service 0246ed
} from "@patternfly/react-core";
Packit Service 0246ed
import { BuilderImageIcon } from "@patternfly/react-icons";
Packit Service 0246ed
import { deletingCompose, cancellingCompose } from "../../core/actions/composes";
Packit Service 0246ed
import {
Packit Service 0246ed
  setModalStopBuildVisible,
Packit Service 0246ed
  setModalStopBuildState,
Packit Service 0246ed
  setModalDeleteImageVisible,
Packit Service 0246ed
  setModalDeleteImageState,
Packit Service 0246ed
} from "../../core/actions/modals";
Packit Service 0246ed
import Logs from "../Logs/Logs";
Packit Service 0246ed
import * as composer from "../../core/composer";
Packit Service 0246ed
import ImagesDataList from "./ImagesDataList";
Packit Service 0246ed
import ListItemUploads from "./ListItemUploads";
Packit Service 0246ed
Packit Service 0246ed
const messages = defineMessages({
Packit Service 0246ed
  imageType: {
Packit Service 0246ed
    defaultMessage: "Type",
Packit Service 0246ed
    description: "A label for the type of image file was created",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageCreated: {
Packit Service 0246ed
    defaultMessage: "Created",
Packit Service 0246ed
    description: "A label for the date that an image file was created",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageSize: {
Packit Service 0246ed
    defaultMessage: "Size",
Packit Service 0246ed
    description: "A label for the size of an image file",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageUploads: {
Packit Service 0246ed
    defaultMessage: "Image uploads",
Packit Service 0246ed
    description: "A label for the section that lists the upload actions initiated by the user",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageActions: {
Packit Service 0246ed
    defaultMessage: "Actions",
Packit Service 0246ed
    description: "A label for the menu that displays the actions available",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageLogs: {
Packit Service 0246ed
    defaultMessage: "Logs",
Packit Service 0246ed
    description: "Log content that gets generated as part of the image creation process",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageStatusWaiting: {
Packit Service 0246ed
    defaultMessage: "Image build pending",
Packit Service 0246ed
    description: "Image build status when process is waiting",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageStatusRunning: {
Packit Service 0246ed
    defaultMessage: "Image build in progress",
Packit Service 0246ed
    description: "Image build status when process is in progress",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageStatusFinished: {
Packit Service 0246ed
    defaultMessage: "Image build complete",
Packit Service 0246ed
    description: "Image build status when process is finished",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageStatusFailed: {
Packit Service 0246ed
    defaultMessage: "Image build failed",
Packit Service 0246ed
    description: "Image build status when process failed",
Packit Service 0246ed
  },
Packit Service 0246ed
  imageStatusStopping: {
Packit Service 0246ed
    defaultMessage: "Stopping",
Packit Service 0246ed
    description: "Image build status when user selected to end the process",
Packit Service 0246ed
  },
Packit Service 0246ed
});
Packit Service 0246ed
Packit Service 0246ed
class ListItemImages extends React.Component {
Packit Service 0246ed
  constructor() {
Packit Service 0246ed
    super();
Packit Service 0246ed
    this.state = { logsExpanded: false, uploadsExpanded: false };
Packit Service 0246ed
    this.handleDelete = this.handleDelete.bind(this);
Packit Service 0246ed
    this.handleCancel = this.handleCancel.bind(this);
Packit Service 0246ed
    this.handleShowModalStop = this.handleShowModalStop.bind(this);
Packit Service 0246ed
    this.handleShowModalDeleteImage = this.handleShowModalDeleteImage.bind(this);
Packit Service 0246ed
    this.handleLogsShow = this.handleLogsShow.bind(this);
Packit Service 0246ed
    this.handleUploadsShow = this.handleUploadsShow.bind(this);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  // maps to Remove button for FAILED
Packit Service 0246ed
  handleDelete(e) {
Packit Service 0246ed
    e.preventDefault();
Packit Service 0246ed
    e.stopPropagation();
Packit Service 0246ed
    this.props.deletingCompose(this.props.listItem.id);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  // maps to Stop button for WAITING
Packit Service 0246ed
  handleCancel(e) {
Packit Service 0246ed
    e.preventDefault();
Packit Service 0246ed
    e.stopPropagation();
Packit Service 0246ed
    this.props.cancellingCompose(this.props.listItem.id);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  // maps to Stop button for RUNNING
Packit Service 0246ed
  handleShowModalStop(e) {
Packit Service 0246ed
    e.preventDefault();
Packit Service 0246ed
    e.stopPropagation();
Packit Service 0246ed
    this.props.setModalStopBuildState(this.props.listItem.id, this.props.blueprint);
Packit Service 0246ed
    this.props.setModalStopBuildVisible(true);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  // maps to Delete button for FINISHED
Packit Service 0246ed
  handleShowModalDeleteImage(e) {
Packit Service 0246ed
    e.preventDefault();
Packit Service 0246ed
    e.stopPropagation();
Packit Service 0246ed
    this.props.setModalDeleteImageState(this.props.listItem.id, this.props.blueprint);
Packit Service 0246ed
    this.props.setModalDeleteImageVisible(true);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  handleLogsShow() {
Packit Service 0246ed
    this.setState({ uploadsExpanded: false });
Packit Service 0246ed
    this.setState((prevState) => ({ logsExpanded: !prevState.logsExpanded, fetchingLogs: !prevState.logsExpanded }));
Packit Service 0246ed
    composer.getComposeLog(this.props.listItem.id).then(
Packit Service 0246ed
      (logs) => {
Packit Service 0246ed
        this.setState({ logsContent: logs, fetchingLogs: false });
Packit Service 0246ed
      },
Packit Service 0246ed
      () => {
Packit Service 0246ed
        this.setState({
Packit Service 0246ed
          logsContent: <FormattedMessage defaultMessage="No log available" />,
Packit Service 0246ed
          fetchingLogs: false,
Packit Service 0246ed
        });
Packit Service 0246ed
      }
Packit Service 0246ed
    );
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  // consider removing
Packit Service 0246ed
  handleUploadsShow() {
Packit Service 0246ed
    this.setState({ logsExpanded: false });
Packit Service 0246ed
    this.setState((prevState) => ({ uploadsExpanded: !prevState.uploadsExpanded }));
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  render() {
Packit Service 0246ed
    const { listItem } = this.props;
Packit Service 0246ed
    const { formatMessage } = this.props.intl;
Packit Service 0246ed
    const timestamp = new Date(listItem.job_created * 1000);
Packit Service 0246ed
    const formattedTime = timestamp.toDateString();
Packit Service 0246ed
    let actions;
Packit Service 0246ed
    switch (listItem.queue_status) {
Packit Service 0246ed
      case "FINISHED":
Packit Service 0246ed
        actions = (
Packit Service 0246ed
          <>
Packit Service 0246ed
            
  • Packit Service 0246ed
                  
    Packit Service 0246ed
                    <FormattedMessage defaultMessage="Download" />
    Packit Service 0246ed
                  
    Packit Service 0246ed
                
    Packit Service 0246ed
                
  • Packit Service 0246ed
                   this.handleShowModalDeleteImage(e)} data-delete>
    Packit Service 0246ed
                    <FormattedMessage defaultMessage="Delete" />
    Packit Service 0246ed
                  
    Packit Service 0246ed
                
    Packit Service 0246ed
              
    Packit Service 0246ed
            );
    Packit Service 0246ed
            break;
    Packit Service 0246ed
          case "RUNNING":
    Packit Service 0246ed
            actions = (
    Packit Service 0246ed
              <>
    Packit Service 0246ed
                
  • Packit Service 0246ed
                   this.handleShowModalStop(e)}>
    Packit Service 0246ed
                    <FormattedMessage defaultMessage="Stop" />
    Packit Service 0246ed
                  
    Packit Service 0246ed
                
    Packit Service 0246ed
              
    Packit Service 0246ed
            );
    Packit Service 0246ed
            break;
    Packit Service 0246ed
          case "WAITING":
    Packit Service 0246ed
            actions = (
    Packit Service 0246ed
              <>
    Packit Service 0246ed
                
  • Packit Service 0246ed
                   this.handleCancel(e)}>
    Packit Service 0246ed
                    <FormattedMessage defaultMessage="Stop" />
    Packit Service 0246ed
                  
    Packit Service 0246ed
                
    Packit Service 0246ed
              
    Packit Service 0246ed
            );
    Packit Service 0246ed
            break;
    Packit Service 0246ed
          case "FAILED":
    Packit Service 0246ed
            actions = (
    Packit Service 0246ed
              <>
    Packit Service 0246ed
                
  • Packit Service 0246ed
                   this.handleDelete(e)}>
    Packit Service 0246ed
                    <FormattedMessage defaultMessage="Remove" />
    Packit Service 0246ed
                  
    Packit Service 0246ed
                
    Packit Service 0246ed
              
    Packit Service 0246ed
            );
    Packit Service 0246ed
            break;
    Packit Service 0246ed
          default:
    Packit Service 0246ed
            actions = undefined;
    Packit Service 0246ed
            break;
    Packit Service 0246ed
        }
    Packit Service 0246ed
        const logs = listItem.queue_status === "FAILED" || listItem.queue_status === "FINISHED";
    Packit Service 0246ed
        const logsButton = (
    Packit Service 0246ed
          
    Packit Service 0246ed
            
    Packit Service 0246ed
              variant={`${this.state.logsExpanded ? "primary" : "secondary"}`}
    Packit Service 0246ed
              aria-expanded={this.state.logsExpanded}
    Packit Service 0246ed
              aria-controls={`${listItem.id}-logs`}
    Packit Service 0246ed
              onClick={this.handleLogsShow}
    Packit Service 0246ed
            >
    Packit Service 0246ed
              {formatMessage(messages.imageLogs)}
    Packit Service 0246ed
            </Button>
    Packit Service 0246ed
          
    Packit Service 0246ed
        );
    Packit Service 0246ed
        const uploads = listItem.uploads !== undefined;
    Packit Service 0246ed
        const uploadsToggle = (
    Packit Service 0246ed
          
    Packit Service 0246ed
            onClick={this.handleUploadsShow}
    Packit Service 0246ed
            isExpanded={this.state.uploadsExpanded}
    Packit Service 0246ed
            id="uploads-toggle"
    Packit Service 0246ed
            aria-label={`${formatMessage(messages.imageUploads)} ${this.props.blueprint}-${listItem.version}-${
    Packit Service 0246ed
              listItem.compose_type
    Packit Service 0246ed
            }`}
    Packit Service 0246ed
            aria-controls={`${listItem.id}-uploads`}
    Packit Service 0246ed
            // ^ need to fix this attribute value
    Packit Service 0246ed
            aria-hidden={!uploads}
    Packit Service 0246ed
            className={`${!uploads ? "cc-u-not-visible" : ""}`}
    Packit Service 0246ed
          />
    Packit Service 0246ed
        );
    Packit Service 0246ed
    Packit Service 0246ed
        const composeStatus = () => {
    Packit Service 0246ed
          switch (listItem.queue_status) {
    Packit Service 0246ed
            case "WAITING":
    Packit Service 0246ed
              return (
    Packit Service 0246ed
                
    Packit Service 0246ed
                  
    Packit Service 0246ed
                    
    Packit Service 0246ed
                  
    Packit Service 0246ed
                  {formatMessage(messages.imageStatusWaiting)}
    Packit Service 0246ed
                
    Packit Service 0246ed
              );
    Packit Service 0246ed
            case "RUNNING":
    Packit Service 0246ed
              return (
    Packit Service 0246ed
                
    Packit Service 0246ed
                  
    Packit Service 0246ed
                    
    Packit Service 0246ed
                  
    Packit Service 0246ed
                  {formatMessage(messages.imageStatusRunning)}
    Packit Service 0246ed
                
    Packit Service 0246ed
              );
    Packit Service 0246ed
            case "FINISHED":
    Packit Service 0246ed
              return (
    Packit Service 0246ed
                
    Packit Service 0246ed
                  
    Packit Service 0246ed
                    
    Packit Service 0246ed
                  
    Packit Service 0246ed
                  {formatMessage(messages.imageStatusFinished)}
    Packit Service 0246ed
                
    Packit Service 0246ed
              );
    Packit Service 0246ed
            case "FAILED":
    Packit Service 0246ed
              return (
    Packit Service 0246ed
                
    Packit Service 0246ed
                  
    Packit Service 0246ed
                    
    Packit Service 0246ed
                  
    Packit Service 0246ed
                  {formatMessage(messages.imageStatusFailed)}
    Packit Service 0246ed
                
    Packit Service 0246ed
              );
    Packit Service 0246ed
            case "STOPPING":
    Packit Service 0246ed
              return (
    Packit Service 0246ed
                
    Packit Service 0246ed
                  {formatMessage(messages.imageStatusStopping)}
    Packit Service 0246ed
                
    Packit Service 0246ed
              );
    Packit Service 0246ed
            default:
    Packit Service 0246ed
              return <>;
    Packit Service 0246ed
          }
    Packit Service 0246ed
        };
    Packit Service 0246ed
        let logsSection;
    Packit Service 0246ed
        if (this.state.logsExpanded) {
    Packit Service 0246ed
          logsSection = <Logs logContent={this.state.logsContent} fetchingLog={this.state.fetchingLogs} />;
    Packit Service 0246ed
        }
    Packit Service 0246ed
        let uploadsSection;
    Packit Service 0246ed
        if (this.state.uploadsExpanded) {
    Packit Service 0246ed
          uploadsSection = (
    Packit Service 0246ed
            <ImagesDataList ariaLabel={formatMessage(messages.imageUploads)}>
    Packit Service 0246ed
              {listItem.uploads.map((upload) => (
    Packit Service 0246ed
                <ListItemUploads upload={upload} key={upload.uuid} />
    Packit Service 0246ed
              ))}
    Packit Service 0246ed
            </ImagesDataList>
    Packit Service 0246ed
          );
    Packit Service 0246ed
        }
    Packit Service 0246ed
        const gigabyte = 1024 * 1024 * 1024;
    Packit Service 0246ed
        const size = listItem.image_size / gigabyte;
    Packit Service 0246ed
    Packit Service 0246ed
        return (
    Packit Service 0246ed
          
    Packit Service 0246ed
            aria-labelledby={`${listItem.id}-compose-name`}
    Packit Service 0246ed
            isExpanded={this.state.uploadsExpanded}
    Packit Service 0246ed
            data-image={`${this.props.blueprint}-${listItem.version}-${listItem.compose_type}`}
    Packit Service 0246ed
          >
    Packit Service 0246ed
            <DataListItemRow>
    Packit Service 0246ed
              {uploadsToggle}
    Packit Service 0246ed
              
    Packit Service 0246ed
                <BuilderImageIcon />
    Packit Service 0246ed
              
    Packit Service 0246ed
              
    Packit Service 0246ed
                className="cc-m-stacked cc-m-split-on-lg"
    Packit Service 0246ed
                dataListCells={[
    Packit Service 0246ed
                  <DataListCell key="primary" className="pf-l-flex pf-m-column pf-m-space-items-xs">
    Packit Service 0246ed
                    
    Packit Service 0246ed
                      
    Packit Service 0246ed
                        {this.props.blueprint}-{listItem.version}-{listItem.compose_type}
    Packit Service 0246ed
                      
    Packit Service 0246ed
                    
    Packit Service 0246ed
                    
    Packit Service 0246ed
                      {formatMessage(messages.imageType)} 
    Packit Service 0246ed
                      {listItem.compose_type}
    Packit Service 0246ed
                    
    Packit Service 0246ed
                    
    Packit Service 0246ed
                      {formatMessage(messages.imageCreated)} {formattedTime}
    Packit Service 0246ed
                    
    Packit Service 0246ed
                    {listItem.queue_status === "FINISHED" && (
    Packit Service 0246ed
                      
    Packit Service 0246ed
                        {formatMessage(messages.imageSize)} {size} GB
    Packit Service 0246ed
                      
    Packit Service 0246ed
                    )}
    Packit Service 0246ed
                  </DataListCell>,
    Packit Service 0246ed
                  <DataListCell key="status">{composeStatus()}</DataListCell>,
    Packit Service 0246ed
                ]}
    Packit Service 0246ed
              />
    Packit Service 0246ed
              
    Packit Service 0246ed
                className={`pf-c-data-list__item-action ${actions === undefined ? "cc-u-not-visible" : ""}`}
    Packit Service 0246ed
                aria-hidden={actions === undefined}
    Packit Service 0246ed
              >
    Packit Service 0246ed
                
    Packit Service 0246ed
                  
    Packit Service 0246ed
                    aria-label={formatMessage(messages.imageActions)}
    Packit Service 0246ed
                    className="btn btn-link dropdown-toggle"
    Packit Service 0246ed
                    type="button"
    Packit Service 0246ed
                    id={`${listItem.id}-actions`}
    Packit Service 0246ed
                    data-toggle="dropdown"
    Packit Service 0246ed
                    aria-haspopup="true"
    Packit Service 0246ed
                    aria-expanded="false"
    Packit Service 0246ed
                  >
    Packit Service 0246ed
                    
    Packit Service 0246ed
                  </button>
    Packit Service 0246ed
                  
      Packit Service 0246ed
                      {actions}
      Packit Service 0246ed
                    
      Packit Service 0246ed
                  
      Packit Service 0246ed
                
      Packit Service 0246ed
                {logsButton}
      Packit Service 0246ed
              </DataListItemRow>
      Packit Service 0246ed
              
      Packit Service 0246ed
                aria-label={formatMessage(messages.imageUploads)}
      Packit Service 0246ed
                id={`${listItem.id}-uploads`}
      Packit Service 0246ed
                isHidden={!this.state.uploadsExpanded}
      Packit Service 0246ed
                noPadding
      Packit Service 0246ed
              >
      Packit Service 0246ed
                {uploadsSection}
      Packit Service 0246ed
              </DataListContent>
      Packit Service 0246ed
              
      Packit Service 0246ed
                aria-label={formatMessage(messages.imageLogs)}
      Packit Service 0246ed
                id={`${listItem.id}-logs`}
      Packit Service 0246ed
                isHidden={!this.state.logsExpanded}
      Packit Service 0246ed
                noPadding
      Packit Service 0246ed
              >
      Packit Service 0246ed
                {logsSection}
      Packit Service 0246ed
              </DataListContent>
      Packit Service 0246ed
            </DataListItem>
      Packit Service 0246ed
          );
      Packit Service 0246ed
        }
      Packit Service 0246ed
      }
      Packit Service 0246ed
      Packit Service 0246ed
      ListItemImages.propTypes = {
      Packit Service 0246ed
        listItem: PropTypes.shape({
      Packit Service 0246ed
          blueprint: PropTypes.string,
      Packit Service 0246ed
          compose_type: PropTypes.string,
      Packit Service 0246ed
          id: PropTypes.string,
      Packit Service 0246ed
          image_size: PropTypes.number,
      Packit Service 0246ed
          job_created: PropTypes.number,
      Packit Service 0246ed
          job_finished: PropTypes.number,
      Packit Service 0246ed
          job_started: PropTypes.number,
      Packit Service 0246ed
          queue_status: PropTypes.string,
      Packit Service 0246ed
          version: PropTypes.string,
      Packit Service 0246ed
          uploads: PropTypes.arrayOf(PropTypes.object),
      Packit Service 0246ed
        }),
      Packit Service 0246ed
        blueprint: PropTypes.string,
      Packit Service 0246ed
        deletingCompose: PropTypes.func,
      Packit Service 0246ed
        cancellingCompose: PropTypes.func,
      Packit Service 0246ed
        setModalStopBuildState: PropTypes.func,
      Packit Service 0246ed
        setModalStopBuildVisible: PropTypes.func,
      Packit Service 0246ed
        setModalDeleteImageState: PropTypes.func,
      Packit Service 0246ed
        setModalDeleteImageVisible: PropTypes.func,
      Packit Service 0246ed
        downloadUrl: PropTypes.string,
      Packit Service 0246ed
        intl: intlShape.isRequired,
      Packit Service 0246ed
      };
      Packit Service 0246ed
      Packit Service 0246ed
      ListItemImages.defaultProps = {
      Packit Service 0246ed
        listItem: {},
      Packit Service 0246ed
        blueprint: "",
      Packit Service 0246ed
        deletingCompose() {},
      Packit Service 0246ed
        cancellingCompose() {},
      Packit Service 0246ed
        setModalStopBuildState() {},
      Packit Service 0246ed
        setModalStopBuildVisible() {},
      Packit Service 0246ed
        setModalDeleteImageState() {},
      Packit Service 0246ed
        setModalDeleteImageVisible() {},
      Packit Service 0246ed
        downloadUrl: "",
      Packit Service 0246ed
      };
      Packit Service 0246ed
      Packit Service 0246ed
      const mapDispatchToProps = (dispatch) => ({
      Packit Service 0246ed
        deletingCompose: (compose) => {
      Packit Service 0246ed
          dispatch(deletingCompose(compose));
      Packit Service 0246ed
        },
      Packit Service 0246ed
        cancellingCompose: (compose) => {
      Packit Service 0246ed
          dispatch(cancellingCompose(compose));
      Packit Service 0246ed
        },
      Packit Service 0246ed
        setModalStopBuildState: (composeId, blueprintName) => {
      Packit Service 0246ed
          dispatch(setModalStopBuildState(composeId, blueprintName));
      Packit Service 0246ed
        },
      Packit Service 0246ed
        setModalStopBuildVisible: (visible) => {
      Packit Service 0246ed
          dispatch(setModalStopBuildVisible(visible));
      Packit Service 0246ed
        },
      Packit Service 0246ed
        setModalDeleteImageState: (composeId, blueprintName) => {
      Packit Service 0246ed
          dispatch(setModalDeleteImageState(composeId, blueprintName));
      Packit Service 0246ed
        },
      Packit Service 0246ed
        setModalDeleteImageVisible: (visible) => {
      Packit Service 0246ed
          dispatch(setModalDeleteImageVisible(visible));
      Packit Service 0246ed
        },
      Packit Service 0246ed
      });
      Packit Service 0246ed
      Packit Service 0246ed
      export default connect(null, mapDispatchToProps)(injectIntl(ListItemImages));