2018-12-31 06:42:46 +00:00
|
|
|
/**
|
|
|
|
* External dependencies
|
|
|
|
*/
|
|
|
|
import { __ } from '@wordpress/i18n';
|
2021-01-07 23:57:09 +00:00
|
|
|
import { Card, CardBody, CardHeader } from '@wordpress/components';
|
2018-12-31 06:42:46 +00:00
|
|
|
import { Component } from '@wordpress/element';
|
|
|
|
import { compose } from '@wordpress/compose';
|
2024-08-21 18:12:13 +00:00
|
|
|
import { EmptyTable, AnalyticsError, TableCard } from '@woocommerce/components';
|
2020-08-20 23:37:41 +00:00
|
|
|
import { withSelect } from '@wordpress/data';
|
2018-12-31 06:42:46 +00:00
|
|
|
import PropTypes from 'prop-types';
|
2019-04-11 02:53:05 +00:00
|
|
|
import { getPersistedQuery } from '@woocommerce/navigation';
|
2020-08-20 23:37:41 +00:00
|
|
|
import {
|
|
|
|
getFilterQuery,
|
|
|
|
getLeaderboard,
|
|
|
|
SETTINGS_STORE_NAME,
|
|
|
|
} from '@woocommerce/data';
|
2024-07-08 03:15:12 +00:00
|
|
|
import { CurrencyContext } from '@woocommerce/currency';
|
|
|
|
import { formatValue } from '@woocommerce/number';
|
2021-01-07 23:57:09 +00:00
|
|
|
import { Text } from '@woocommerce/experimental';
|
2018-12-31 06:42:46 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
2020-08-13 02:05:22 +00:00
|
|
|
import sanitizeHTML from '../../../lib/sanitize-html';
|
2018-12-31 06:42:46 +00:00
|
|
|
import './style.scss';
|
|
|
|
|
2024-07-08 03:15:12 +00:00
|
|
|
const formattable = new Set( [ 'currency', 'number' ] );
|
|
|
|
|
2018-12-31 06:42:46 +00:00
|
|
|
export class Leaderboard extends Component {
|
2024-07-08 03:15:12 +00:00
|
|
|
getFormattedColumn = ( column ) => {
|
|
|
|
const { format } = column;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The format property is used for numeric columns and is optional.
|
|
|
|
* The `value` property type is specified as string in the API schema
|
|
|
|
* and it's extensible from other extensions. Therefore, even if the
|
|
|
|
* actual type of numeric columns returned by WooCoomerce's own API is
|
|
|
|
* number, there is no guarantee the value will be a number.
|
|
|
|
*/
|
|
|
|
if ( formattable.has( column.format ) && isFinite( column.value ) ) {
|
|
|
|
const value = parseFloat( column.value );
|
|
|
|
|
|
|
|
if ( ! Number.isNaN( value ) ) {
|
|
|
|
const { formatAmount, getCurrencyConfig } = this.context;
|
|
|
|
const display =
|
|
|
|
format === 'currency'
|
|
|
|
? formatAmount( value )
|
|
|
|
: formatValue( getCurrencyConfig(), format, value );
|
|
|
|
|
|
|
|
return {
|
|
|
|
display,
|
|
|
|
value,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
display: (
|
|
|
|
<div
|
|
|
|
dangerouslySetInnerHTML={ sanitizeHTML( column.display ) }
|
|
|
|
/>
|
|
|
|
),
|
|
|
|
value: column.value,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2019-04-11 02:53:05 +00:00
|
|
|
getFormattedHeaders() {
|
|
|
|
return this.props.headers.map( ( header, i ) => {
|
|
|
|
return {
|
2020-02-14 02:23:21 +00:00
|
|
|
isLeftAligned: i === 0,
|
2019-04-11 02:53:05 +00:00
|
|
|
hiddenByDefault: false,
|
|
|
|
isSortable: false,
|
|
|
|
key: header.label,
|
|
|
|
label: header.label,
|
|
|
|
};
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
|
|
|
getFormattedRows() {
|
2020-02-14 02:23:21 +00:00
|
|
|
return this.props.rows.map( ( row ) => {
|
2024-07-08 03:15:12 +00:00
|
|
|
return row.map( this.getFormattedColumn );
|
2019-04-11 02:53:05 +00:00
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
2018-12-31 06:42:46 +00:00
|
|
|
render() {
|
2019-04-11 02:53:05 +00:00
|
|
|
const { isRequesting, isError, totalRows, title } = this.props;
|
Merge final `version/1.0` branch with `master` (https://github.com/woocommerce/woocommerce-admin/pull/3848)
* Try: Moving Customers to main Woo Menu (https://github.com/woocommerce/woocommerce-admin/pull/3632)
* Only add onboarding settings on wc-admin pages when task list should be shown. (https://github.com/woocommerce/woocommerce-admin/pull/3722)
* Use cron for unsnoozing admin notes (https://github.com/woocommerce/woocommerce-admin/pull/3662)
* Use wp-cron for admin note snoozing.
* Remove "unsnooze" scheduled action.
* Use correct version.
* Avoid using deprecated method for unscheduling actions.
* Onboarding: Fix toggle tracking events (https://github.com/woocommerce/woocommerce-admin/pull/3645)
* Fix errant wcadmin prefix on event name
* Track the onboarding toggle on the option in case enable_onboarding isn't used
* Move toggle actions to separate function
* Move onboarding actions
* Move onboarding filters
* Move help tab updates to add_toggle_actions
* Only run onboarding actions when enabled
* Onboarding: Add tracks events when profiler steps are completed (https://github.com/woocommerce/woocommerce-admin/pull/3726)
* Add tracks for store profiler step completion
* Record event when profiler is completed
* Ensure continue setup loads the onboarding profiler (https://github.com/woocommerce/woocommerce-admin/pull/3646)
* 'All that include' option removed when input field is empty (https://github.com/woocommerce/woocommerce-admin/pull/3700)
* 'All that include' option removed when input field is empty
Added a control to check that when the input field 'Search by customer name' is empty, the 'All that include' option is not appearing.
* Const name improved
The constant name hasValues was changed to optionsHaveValues (more descriptive)
* Fix select text alignment (https://github.com/woocommerce/woocommerce-admin/pull/3723)
* Stock panel indicator - cache and use lookup tables. (https://github.com/woocommerce/woocommerce-admin/pull/3729)
* Stock panel indicator - cache and use lookup tables.
* Revise query, clear transient on product update.
* Fix error, ht Josh.
* Checklist: Remove sideloaded images to reduce build size, take 2 (https://github.com/woocommerce/woocommerce-admin/pull/3731)
* Remove homepage template images.
* Use other-small on all industries, adjust text color.
* Remove background dim and opacity set to 0
* Fix/3631 (https://github.com/woocommerce/woocommerce-admin/pull/3730)
* Added CBD as an industry type
CBD was added as an industry type in API
* Industries options modified
Modified the industries options. Now we are able to choose if we will use an input or not in the option.
* API control changed for industries.
API control changed for industries. Now it accepts the data type we need.
* Added input in Industries list for the option "Other"
Added an input for the option "Other" in the industries list
* Added suggested changes in review comments.
* Added data preparation for recordEvent
* Changed variable to snake_case
The variable "industriesWithDetail" was changed to "industries_with_detail" (snake_case)
* Onboarding: Create homepage without redirect (https://github.com/woocommerce/woocommerce-admin/pull/3727)
* Add link to edit homepage instead of redirect
* Add busy state to homepage creation button
* Publish homepage on create via API
* Update homepage notice to show on first post update
* Update homepage creation notice per design
* Record event on customize homepage
* Set homepage to frontpage on creation
* Add deactivation note for feature plugin (https://github.com/woocommerce/woocommerce-admin/pull/3687)
* Add version deactivation note
* Add the note to deactivate if the version is older than the current WC version
* Deactivate wc admin feature plugin on action click
* Add notes version hooks
* change the Package class namespace to exclude from standalone autoloader
* add use statement for FeaturePlugin
* add note explaining namespace
* use wc-admin-deactivate-plugin note name
* Rename file and class to WC_Admin_Notes_Deactivate_Plugin
Co-authored-by: Ron Rennick <ron@ronandandrea.com>
Co-authored-by: Paul Sealock <psealock@gmail.com>
* Add Travis tests on GH for release branch (https://github.com/woocommerce/woocommerce-admin/pull/3751)
* Add Travis tests on GH for release branch
* fix linter errors
* ActivityPanels.php -> use public static functions
* Remove free text Search option when no query exists (https://github.com/woocommerce/woocommerce-admin/pull/3755)
* Revert changes in woocommerce/woocommerce-admin#3700
* Don't add free text search if no query exists
* Add tests for Search without query
* Add test for showing free text search option
* Fix image sideloading for store industries. (https://github.com/woocommerce/woocommerce-admin/pull/3743)
* Fix image sideloading for store industries.
Data format changed in https://github.com/woocommerce/woocommerce-admin/pull/3730
* Fix industry image sideload in cases where the count is less than requested.
* Be backwards compatible with the old industry data format.
* Added event props to identify stores with WCS and Jetpack installed (https://github.com/woocommerce/woocommerce-admin/pull/3750)
* Added event props to identify stores with WCS and Jetpack installed
Also, added Jeckpack connected status
* Improved variable name
* Simplified method
Simplified method. "intersection" check was removed
* Tests errors repeared
The method "clear_low_out_of_stock_count_transient" now is static.
* OBW: fix sideloading image test error (https://github.com/woocommerce/woocommerce-admin/pull/3762)
* Release 0.26.0 changes (https://github.com/woocommerce/woocommerce-admin/pull/3753)
* add deactivation hook to Package.php (https://github.com/woocommerce/woocommerce-admin/pull/3770)
* Add active version functions (https://github.com/woocommerce/woocommerce-admin/pull/3772)
* add active version functions to Package.php
Co-authored-by: Joshua T Flowers <joshuatf@gmail.com>
* 0.26.1 changes (https://github.com/woocommerce/woocommerce-admin/pull/3773)
* Customers Report: fix missing report param in search (https://github.com/woocommerce/woocommerce-admin/pull/3778)
* Product titles include encoded entities (https://github.com/woocommerce/woocommerce-admin/pull/3765)
* Stripped HTML from product titles and decoded before displaying them
Stripped html from product titles and entities are decoded before displaying them
* Stripped HTML from product titles and decoded in Stock report
Stripped html from product titles and entities are decoded before displaying them. Now in Stock report
* Added support for HTML tags and encoded entities on product titles
Added support for HTML tags and encoded entities on filtered product list, dropdown menus and tag names.
Also, strip_tags() function was replaced with wp_strip_all_tags() instead.
* strip_tags() function was replaced with wp_strip_all_tags() instead.
* Added control for a variable
Added control for "item->data" before applying wp_strip_all_tags method.
* pre-commit changes
* Test text corrected
* Enable taxes on automatic tax setup (https://github.com/woocommerce/woocommerce-admin/pull/3795)
* Update Country Labeling to Match Core (https://github.com/woocommerce/woocommerce-admin/pull/3790)
* Updated country labeling
Country labeling on Customer Report was updated
* Updated country labeling in other files
* remove .jitm-card notice padding (https://github.com/woocommerce/woocommerce-admin/pull/3814)
* OBW Connect: Fix requesting state (https://github.com/woocommerce/woocommerce-admin/pull/3786)
* OBW Connect: Fix requesting state
* pass down setIsPending
* setIspending propType
* defaultProps
* test
* Revert "test"
This reverts commit e921092b19401931cc1aec8ee84fa53c53b67f36.
* better comparison for redirect
* Fixes Taxes Report search bug and adds initial documentation. (https://github.com/woocommerce/woocommerce-admin/pull/3816)
* Initial Taxes Report documentation.
* Fix taxes endpoint search parameter.
* OBW: Fix retry plugin install button disappearing (https://github.com/woocommerce/woocommerce-admin/pull/3787)
* OBW: Fix retry plugin install btn disappearing
* try suggestion
* Revert "try suggestion"
This reverts commit 5b9386957a501ac3e729e5f16b0ee71c9d792859.
* Fix special character escaping in search. (https://github.com/woocommerce/woocommerce-admin/pull/3826)
* Properly prepare/escape special characters in Product search.
* Properly prepare/escape special characters in Coupon search.
* Properly prepare/escape special characters in Tax code search.
* Fix tracking on migrated options (https://github.com/woocommerce/woocommerce-admin/pull/3828)
* Don't track onboarding toggle if migrating options
* Prevent WC_Tracks from recording event post types not yet registered
* Activity Panels: Remove W Panel (https://github.com/woocommerce/woocommerce-admin/pull/3827)
* Remove W Notif Panel.
* Add back in trapping logic, and hide on non-embed pages.
* add npm run test:zip command (https://github.com/woocommerce/woocommerce-admin/pull/3823)
* add npm run test:zip command
* 1.0.0 release changes🎉 (https://github.com/woocommerce/woocommerce-admin/pull/3831)
* 1.0.0 release changes🎉
* changelog
* 0.26.1 changelog
* Add Report Extension Example: Add default props to ReportFilters (https://github.com/woocommerce/woocommerce-admin/pull/3830)
* ReportFilters component: Add sane defaults
* styles
* add required column
* add left join to sku ordering (https://github.com/woocommerce/woocommerce-admin/pull/3845)
* Deal with lint errors, and improperly merged files
* regenerate package-lock.json
* attempting to resolve package lock conflict.
Co-authored-by: Jeff Stieler <jeff.m.stieler@gmail.com>
Co-authored-by: Joshua T Flowers <joshuatf@gmail.com>
Co-authored-by: Ron Rennick <ron@ronandandrea.com>
Co-authored-by: Fernando <ultimoround@gmail.com>
Co-authored-by: edmundcwm <edmundcwm@gmail.com>
Co-authored-by: Paul Sealock <psealock@gmail.com>
2020-03-10 02:47:39 +00:00
|
|
|
const classes = 'woocommerce-leaderboard';
|
2018-12-31 06:42:46 +00:00
|
|
|
|
|
|
|
if ( isError ) {
|
2024-08-21 18:12:13 +00:00
|
|
|
return <AnalyticsError className={ classes } />;
|
2018-12-31 06:42:46 +00:00
|
|
|
}
|
|
|
|
|
2020-02-14 02:23:21 +00:00
|
|
|
const rows = this.getFormattedRows();
|
|
|
|
|
2018-12-31 06:42:46 +00:00
|
|
|
if ( ! isRequesting && rows.length === 0 ) {
|
|
|
|
return (
|
2020-12-21 19:06:41 +00:00
|
|
|
<Card className={ classes }>
|
|
|
|
<CardHeader>
|
2021-06-28 01:14:59 +00:00
|
|
|
<Text
|
2021-08-13 19:06:32 +00:00
|
|
|
size={ 16 }
|
|
|
|
weight={ 600 }
|
2021-06-28 01:14:59 +00:00
|
|
|
as="h3"
|
2021-08-13 19:06:32 +00:00
|
|
|
color="#23282d"
|
2021-06-28 01:14:59 +00:00
|
|
|
>
|
2020-12-21 19:06:41 +00:00
|
|
|
{ title }
|
|
|
|
</Text>
|
|
|
|
</CardHeader>
|
|
|
|
<CardBody size={ null }>
|
|
|
|
<EmptyTable>
|
|
|
|
{ __(
|
|
|
|
'No data recorded for the selected time period.',
|
2022-03-30 09:00:04 +00:00
|
|
|
'woocommerce'
|
2020-12-21 19:06:41 +00:00
|
|
|
) }
|
|
|
|
</EmptyTable>
|
|
|
|
</CardBody>
|
2018-12-31 06:42:46 +00:00
|
|
|
</Card>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<TableCard
|
2019-11-21 12:10:37 +00:00
|
|
|
className={ classes }
|
2019-04-11 02:53:05 +00:00
|
|
|
headers={ this.getFormattedHeaders() }
|
2018-12-31 06:42:46 +00:00
|
|
|
isLoading={ isRequesting }
|
|
|
|
rows={ rows }
|
2019-01-08 07:20:01 +00:00
|
|
|
rowsPerPage={ totalRows }
|
2019-01-15 02:13:15 +00:00
|
|
|
showMenu={ false }
|
2018-12-31 06:42:46 +00:00
|
|
|
title={ title }
|
2019-01-08 07:20:01 +00:00
|
|
|
totalRows={ totalRows }
|
2018-12-31 06:42:46 +00:00
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Leaderboard.propTypes = {
|
|
|
|
/**
|
2019-04-11 02:53:05 +00:00
|
|
|
* An array of column headers.
|
2018-12-31 06:42:46 +00:00
|
|
|
*/
|
2019-04-11 02:53:05 +00:00
|
|
|
headers: PropTypes.arrayOf(
|
|
|
|
PropTypes.shape( {
|
|
|
|
label: PropTypes.string,
|
|
|
|
} )
|
|
|
|
),
|
2018-12-31 06:42:46 +00:00
|
|
|
/**
|
2019-04-11 02:53:05 +00:00
|
|
|
* String of leaderboard ID to display.
|
2018-12-31 06:42:46 +00:00
|
|
|
*/
|
2019-04-11 02:53:05 +00:00
|
|
|
id: PropTypes.string.isRequired,
|
2018-12-31 06:42:46 +00:00
|
|
|
/**
|
|
|
|
* Query args added to the report table endpoint request.
|
|
|
|
*/
|
|
|
|
query: PropTypes.object,
|
|
|
|
/**
|
2022-04-08 08:21:53 +00:00
|
|
|
* An array of arrays of display/value object pairs (see `Table` props).
|
2018-12-31 06:42:46 +00:00
|
|
|
*/
|
2019-04-11 02:53:05 +00:00
|
|
|
rows: PropTypes.arrayOf(
|
|
|
|
PropTypes.arrayOf(
|
|
|
|
PropTypes.shape( {
|
|
|
|
display: PropTypes.node,
|
2020-02-14 02:23:21 +00:00
|
|
|
value: PropTypes.oneOfType( [
|
|
|
|
PropTypes.string,
|
|
|
|
PropTypes.number,
|
|
|
|
PropTypes.bool,
|
|
|
|
] ),
|
2019-04-11 02:53:05 +00:00
|
|
|
} )
|
|
|
|
)
|
|
|
|
).isRequired,
|
2018-12-31 06:42:46 +00:00
|
|
|
/**
|
|
|
|
* String to display as the title of the table.
|
|
|
|
*/
|
|
|
|
title: PropTypes.string.isRequired,
|
2019-04-11 02:53:05 +00:00
|
|
|
/**
|
|
|
|
* Number of table rows.
|
|
|
|
*/
|
|
|
|
totalRows: PropTypes.number.isRequired,
|
|
|
|
};
|
|
|
|
|
|
|
|
Leaderboard.defaultProps = {
|
|
|
|
rows: [],
|
|
|
|
isError: false,
|
|
|
|
isRequesting: false,
|
2018-12-31 06:42:46 +00:00
|
|
|
};
|
|
|
|
|
2024-07-08 03:15:12 +00:00
|
|
|
Leaderboard.contextType = CurrencyContext;
|
|
|
|
|
2018-12-31 06:42:46 +00:00
|
|
|
export default compose(
|
|
|
|
withSelect( ( select, props ) => {
|
2020-07-20 22:17:28 +00:00
|
|
|
const { id, query, totalRows, filters } = props;
|
2020-03-25 03:20:17 +00:00
|
|
|
const { woocommerce_default_date_range: defaultDateRange } = select(
|
|
|
|
SETTINGS_STORE_NAME
|
|
|
|
).getSetting( 'wc_admin', 'wcAdminSettings' );
|
2020-07-20 22:17:28 +00:00
|
|
|
const filterQuery = getFilterQuery( { filters, query } );
|
2020-03-25 03:20:17 +00:00
|
|
|
|
2019-04-11 02:53:05 +00:00
|
|
|
const leaderboardQuery = {
|
|
|
|
id,
|
|
|
|
per_page: totalRows,
|
|
|
|
persisted_query: getPersistedQuery( query ),
|
2019-03-21 03:25:05 +00:00
|
|
|
query,
|
|
|
|
select,
|
2020-03-25 03:20:17 +00:00
|
|
|
defaultDateRange,
|
2020-07-20 22:17:28 +00:00
|
|
|
filterQuery,
|
2019-04-11 02:53:05 +00:00
|
|
|
};
|
|
|
|
const leaderboardData = getLeaderboard( leaderboardQuery );
|
2018-12-31 06:42:46 +00:00
|
|
|
|
2019-04-11 02:53:05 +00:00
|
|
|
return leaderboardData;
|
2018-12-31 06:42:46 +00:00
|
|
|
} )
|
|
|
|
)( Leaderboard );
|