theforeman/foreman_remote_execution

View on GitHub
webpack/JobWizard/steps/Schedule/RepeatCron.js

Summary

Maintainability
A
1 hr
Test Coverage
import URI from 'urijs';
import React, { useEffect } from 'react';
import PropTypes from 'prop-types';
import {
  List,
  ListItem,
  ListComponent,
  OrderType,
  TextInput,
  FormGroup,
  ValidatedOptions,
} from '@patternfly/react-core';
import { foremanUrl } from 'foremanReact/common/helpers';
import { useForemanVersion } from 'foremanReact/Root/Context/ForemanContext';
import { translate as __ } from 'foremanReact/common/I18n';
import { helpLabel } from '../form/FormHelpers';

const docUrl = foremanVersion => {
  const rootUrl = `https://docs.theforeman.org/${foremanVersion}/`;
  const section =
    'Managing_Hosts/index-foreman-el.html#using-extended-cron-lines_managing-hosts';

  const url = new URI({
    path: '/links/manual',
    query: { root_url: rootUrl, section },
  });
  return foremanUrl(url.href());
};

export const RepeatCron = ({ repeatData, setRepeatData, setValid }) => {
  const foremanVersion = useForemanVersion();
  const { cronline } = repeatData;
  useEffect(() => {
    if (cronline) {
      setValid(true);
    } else {
      setValid(false);
    }
    return () => setValid(true);
  }, [setValid, cronline]);
  return (
    <FormGroup
      label={__('Cron line (extended)')}
      labelIcon={helpLabel(
        <div>
          {__("Cron line format '1 2 3 4 5', where:")}
          <br />
          <List component={ListComponent.ol} type={OrderType.number}>
            <ListItem>{__('is minute (range: 0-59)')}</ListItem>
            <ListItem>{__('is hour (range: 0-23)')}</ListItem>
            <ListItem>{__('is day of month (range: 1-31)')}</ListItem>
            <ListItem>{__('is month (range: 1-12)')}</ListItem>
            <ListItem>{__('is day of week (range: 0-6)')}</ListItem>
          </List>
          <br />
          {__(
            'The cron line supports extended cron line syntax. For details please refer to the '
          )}
          <a href={docUrl(foremanVersion)} target="_blank" rel="noreferrer">
            {__('documentation')}
          </a>
          .
        </div>
      )}
      isRequired
    >
      <TextInput
        ouiaId="cronline"
        isRequired
        validated={cronline ? ValidatedOptions.noval : ValidatedOptions.error}
        aria-label="cronline"
        placeholder="* * * * *"
        type="text"
        value={cronline || ''}
        onChange={newTime => {
          setRepeatData({ cronline: newTime });
        }}
      />
    </FormGroup>
  );
};
RepeatCron.propTypes = {
  repeatData: PropTypes.object.isRequired,
  setRepeatData: PropTypes.func.isRequired,
  setValid: PropTypes.func.isRequired,
};