woocommerce/packages/js/components/src/timeline/index.js

133 lines
3.0 KiB
JavaScript
Raw Normal View History

/**
* External dependencies
*/
import classnames from 'classnames';
import PropTypes from 'prop-types';
import { __ } from '@wordpress/i18n';
import { format } from '@wordpress/date';
Allow packages to be built in isolation. (https://github.com/woocommerce/woocommerce-admin/pull/7286) * Use yarn instead of npm. In prep for workspaces, since we're locked to npm < 7. See: https://github.com/woocommerce/woocommerce-admin/pull/7126#issue-661287749 * Initial workspace creation. * Add initial tsc build to @woocommerce/number. * Attempt to build experimental package. * Try currency package. * Define all packages as workspaces. * Use tsconfig common to packages. * Fix currency package build. * Build csv-export with tsc. * Try to build customer-effort-score with tsc. * Fix JSX pragma. * Build data package with tsc. * Build date package with tsc. * Build experimental package with tsc. * Try to build explat package with tsc. * Build navigation package with tsc. * Build notices package with tsc. * Build onboarding package with tsc. * Build components package with tsc. * Swap in package JS build into main script. * Fix experimental package build. * Try per-package css build with components. * Try to run components package tests in isolation. Broken on JSX in test files not being transformed. * Move @woocommerce/wc-admin-settings into a package. * Try to fix components package tests. Fails because we aren't setting up the jest/jest-dom globals. * Move JS test code to reusable (private) package. * Enable incremental TS builds. * Use workspaces to run JS tests. * Use new jest configs for update snapshot scripts. * Fix style builds. * Fix package version in components. * Fix client test debug and watch scripts. * Update yarn lock. * Update test-staged behavior. * Try to fix storybook. * Fix storybook. * Update more npm commands to yarn. * Add changelog. * Fix lint errors. * Update packages readme script references. * Clean up unused gitignore match. * Fix another npm command. * Fix JS builds on watch. * Fix start script. * Fix start scripts for packages. * Use tsc to build packages before tests * yarn -> npm. # Conflicts: # package-lock.json # package.json * Fix linter error. * Remove workspace definitions. * Fix missing Fragment import. * Fix package lock. * Fix missing reference. * Only build commonjs module for js-tests helper. * Remove errant dependency from components. * Remove noop scripts. * Fix package JS build before testing. * Revert noisy formatting changes. * Fix precommit and test scripts. * Fix minimum expected recommended extension count. Japan test case breaks this. * Revert babel config changes. * chore(release): publish - @woocommerce/components@7.2.0 - @woocommerce/csv-export@1.4.0 - @woocommerce/currency@3.2.0 - @woocommerce/customer-effort-score@1.1.0 - @woocommerce/data@1.4.0 - @woocommerce/date@3.1.0 - @woocommerce/dependency-extraction-webpack-plugin@1.7.0 - @woocommerce/eslint-plugin@1.3.0 - @woocommerce/experimental@1.5.0 - @woocommerce/explat@1.1.0 - @woocommerce/js-tests@1.1.0 - @woocommerce/navigation@6.1.0 - @woocommerce/notices@3.1.0 - @woocommerce/number@2.2.0 - @woocommerce/onboarding@1.1.0 - @woocommerce/tracks@1.1.0 - @woocommerce/wc-admin-settings@1.1.0 * Add script for running 'start' in a package. * Remove yarn from gitignore. * Update package changelogs, prep versions for release. * Try to fix E2E tests after main merge. * Some cleanup. * Add changelog. Co-authored-by: Paul Sealock <psealock@gmail.com>
2021-07-14 20:38:57 +00:00
import { createElement } from '@wordpress/element';
/**
* Internal dependencies
*/
import TimelineGroup from './timeline-group';
import { sortByDateUsing, groupItemsUsing } from './util';
const Timeline = ( props ) => {
const {
className,
items,
groupBy,
orderBy,
dateFormat,
clockFormat,
} = props;
const timelineClassName = classnames( 'woocommerce-timeline', className );
// Early return in case no data was passed to the component.
if ( ! items || items.length === 0 ) {
return (
<div className={ timelineClassName }>
<p className={ 'timeline_no_events' }>
{ __( 'No data to display', 'woocommerce-admin' ) }
</p>
</div>
);
}
const addGroupTitles = ( group ) => {
return {
...group,
title: format( dateFormat, group.date ),
};
};
return (
<div className={ timelineClassName }>
<ul>
{ items
.reduce( groupItemsUsing( groupBy ), [] )
.map( addGroupTitles )
.sort( sortByDateUsing( orderBy ) )
.map( ( group ) => (
<TimelineGroup
key={ group.date.getTime().toString() }
group={ group }
orderBy={ orderBy }
clockFormat={ clockFormat }
/>
) ) }
</ul>
</div>
);
};
Timeline.propTypes = {
/**
* Additional CSS classes.
*/
className: PropTypes.string,
/**
* An array of list items.
*/
items: PropTypes.arrayOf(
PropTypes.shape( {
/**
* Date for the timeline item.
*/
date: PropTypes.instanceOf( Date ).isRequired,
/**
* Icon for the Timeline item.
*/
icon: PropTypes.element.isRequired,
/**
* Headline displayed for the list item.
*/
headline: PropTypes.oneOfType( [
PropTypes.element,
PropTypes.string,
] ).isRequired,
/**
* Body displayed for the list item.
*/
body: PropTypes.arrayOf(
PropTypes.oneOfType( [ PropTypes.element, PropTypes.string ] )
),
/**
* Allows users to toggle the timestamp on or off.
*/
hideTimestamp: PropTypes.bool,
} )
).isRequired,
/**
* Defines how items should be grouped together.
*/
groupBy: PropTypes.oneOf( [ 'day', 'week', 'month' ] ),
/**
* Defines how groups should be ordered.
*/
orderBy: PropTypes.oneOf( [ 'asc', 'desc' ] ),
/**
* The PHP date format string used to format dates, see php.net/date.
*/
dateFormat: PropTypes.string,
/**
* The PHP clock format string used to format times, see php.net/date.
*/
clockFormat: PropTypes.string,
};
Timeline.defaultProps = {
className: '',
items: [],
groupBy: 'day',
orderBy: 'desc',
/* translators: PHP date format string used to display dates, see php.net/date. */
dateFormat: __( 'F j, Y', 'woocommerce-admin' ),
/* translators: PHP clock format string used to display times, see php.net/date. */
clockFormat: __( 'g:ia', 'woocommerce-admin' ),
};
export { orderByOptions, groupByOptions } from './util';
export default Timeline;