[DataView]: Add Products View and Product Edit stories (#50999)
* Product Editor: add storybook * fix storybook * Add products data views list * Add navigation on the left * Update edit site package * Fix styling * Add changelog * Add wp/icons package to syncpack exception list * Delete some unused stuff and address types * Add changelog * Remove un needed css * Remove dependency on edit-site package * WIP * WIP * WIP * Fix storybook build * Ignore storybook from version pinning * add slug stories * Add products data views list * Add navigation on the left * Update edit site package * Fix styling * Add changelog * Add wp/icons package to syncpack exception list * Delete some unused stuff and address types * Add changelog * Remove un needed css * Remove dependency on edit-site package * Fix custom status filters * Make sure page size works with view config * improve storybook * rename file * Add changefile(s) from automation for the following project(s): @woocommerce/product-editor * Remove use of canvasMode and navigation context as it is not needed * Remove wordpress/dom from syncpack * Add changefile(s) from automation for the following project(s): @woocommerce/product-editor, woocommerce * add edit-site style * Add changefile(s) from automation for the following project(s): @woocommerce/product-editor * remove not necessary file * address feedback * fix webpack configuration * fix lint errors --------- Co-authored-by: Lourens Schep <lourensschep@gmail.com> Co-authored-by: Sam Seay <samueljseay@gmail.com> Co-authored-by: github-actions <github-actions@github.com>
This commit is contained in:
parent
82a00a56e5
commit
af9ca20af5
|
@ -0,0 +1,4 @@
|
||||||
|
Significance: patch
|
||||||
|
Type: tweak
|
||||||
|
Comment: [DataView]: Add Products View and Product Edit stories.
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/**
|
||||||
|
* External dependencies
|
||||||
|
*/
|
||||||
|
import { createElement, useState } from '@wordpress/element';
|
||||||
|
import { DataForm, FieldType, Form } from '@wordpress/dataviews';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal dependencies
|
||||||
|
*/
|
||||||
|
import {
|
||||||
|
PRODUCT_FIELDS,
|
||||||
|
PRODUCT_FIELDS_KEYS,
|
||||||
|
PRODUCTS_DATA,
|
||||||
|
} from './utilites/product-data-view-data';
|
||||||
|
|
||||||
|
type ProductFormProps = {
|
||||||
|
productData: ( typeof PRODUCTS_DATA )[ 0 ];
|
||||||
|
fields: {
|
||||||
|
label: string;
|
||||||
|
id: string;
|
||||||
|
type: FieldType;
|
||||||
|
options?: string[];
|
||||||
|
Edit?: () => JSX.Element;
|
||||||
|
}[];
|
||||||
|
form: Form;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ProductForm component is just a wrapper around DataViews component. Currently, it is needed to experiment with the DataViews component in isolation.
|
||||||
|
// We expect that this component will be removed in the future, instead it will be used the component used in Products App.
|
||||||
|
const ProductForm = ( { fields, form, productData }: ProductFormProps ) => {
|
||||||
|
const [ product, setProduct ] = useState( productData );
|
||||||
|
return (
|
||||||
|
<DataForm
|
||||||
|
data={ product }
|
||||||
|
fields={ fields }
|
||||||
|
form={ form }
|
||||||
|
onChange={ ( newProduct ) =>
|
||||||
|
setProduct( ( prev ) => ( {
|
||||||
|
...prev,
|
||||||
|
...newProduct,
|
||||||
|
} ) )
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
title: 'Product App/Product Form',
|
||||||
|
component: ProductForm,
|
||||||
|
};
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore - improve typing.
|
||||||
|
const Template = ( args: unknown ) => <ProductForm { ...args } />;
|
||||||
|
|
||||||
|
export const Default = Template.bind( {} );
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore - Improve typing.
|
||||||
|
Default.args = {
|
||||||
|
productData: PRODUCTS_DATA[ 0 ],
|
||||||
|
fields: PRODUCT_FIELDS,
|
||||||
|
form: {
|
||||||
|
type: 'regular',
|
||||||
|
fields: PRODUCT_FIELDS_KEYS,
|
||||||
|
},
|
||||||
|
};
|
|
@ -0,0 +1,95 @@
|
||||||
|
/**
|
||||||
|
* External dependencies
|
||||||
|
*/
|
||||||
|
import { createElement } from '@wordpress/element';
|
||||||
|
import {
|
||||||
|
DataViews,
|
||||||
|
FieldType,
|
||||||
|
SupportedLayouts,
|
||||||
|
View,
|
||||||
|
} from '@wordpress/dataviews';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal dependencies
|
||||||
|
*/
|
||||||
|
import {
|
||||||
|
PRODUCT_FIELDS,
|
||||||
|
PRODUCT_FIELDS_KEYS,
|
||||||
|
PRODUCTS_DATA,
|
||||||
|
} from './utilites/product-data-view-data';
|
||||||
|
|
||||||
|
type ProductsViewProps = {
|
||||||
|
productsData: typeof PRODUCTS_DATA;
|
||||||
|
fields: {
|
||||||
|
label: string;
|
||||||
|
id: string;
|
||||||
|
type: FieldType;
|
||||||
|
options?: string[];
|
||||||
|
}[];
|
||||||
|
view: View;
|
||||||
|
onChangeView: ( newView: View ) => void;
|
||||||
|
paginationInfo: {
|
||||||
|
totalPages: number;
|
||||||
|
totalItems: number;
|
||||||
|
};
|
||||||
|
defaultLayouts: SupportedLayouts;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ProductView component is just a wrapper around DataViews component. Currently, it is needed to experiment with the DataViews component in isolation.
|
||||||
|
// We expect that this component will be removed in the future, instead it will be used the component used in Products App.
|
||||||
|
const ProductsView = ( {
|
||||||
|
fields,
|
||||||
|
view,
|
||||||
|
productsData,
|
||||||
|
paginationInfo,
|
||||||
|
defaultLayouts,
|
||||||
|
onChangeView,
|
||||||
|
}: ProductsViewProps ) => {
|
||||||
|
return (
|
||||||
|
<DataViews
|
||||||
|
data={ productsData }
|
||||||
|
fields={ fields }
|
||||||
|
view={ view }
|
||||||
|
onChangeView={ onChangeView }
|
||||||
|
paginationInfo={ paginationInfo }
|
||||||
|
defaultLayouts={ defaultLayouts }
|
||||||
|
getItemId={ ( item: ( typeof PRODUCTS_DATA )[ 0 ] ) => item.name }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
title: 'Product App/Products View',
|
||||||
|
component: ProductsView,
|
||||||
|
};
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore - Improve typing.
|
||||||
|
const Template = ( args: unknown ) => <ProductsView { ...args } />;
|
||||||
|
|
||||||
|
export const Default = Template.bind( {} );
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore - Improve typing.
|
||||||
|
Default.args = {
|
||||||
|
productsData: PRODUCTS_DATA,
|
||||||
|
fields: PRODUCT_FIELDS,
|
||||||
|
view: {
|
||||||
|
type: 'list',
|
||||||
|
fields: PRODUCT_FIELDS_KEYS.filter(
|
||||||
|
( field ) =>
|
||||||
|
field !== 'downloads' &&
|
||||||
|
field !== 'categories' &&
|
||||||
|
field !== 'images'
|
||||||
|
),
|
||||||
|
},
|
||||||
|
defaultLayouts: {
|
||||||
|
list: {
|
||||||
|
type: 'list',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
paginationInfo: {
|
||||||
|
totalPages: 1,
|
||||||
|
totalItems: 10,
|
||||||
|
},
|
||||||
|
onChangeView: () => {},
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
|
@ -57964,7 +57964,7 @@ snapshots:
|
||||||
|
|
||||||
react-inspector@5.1.1(react@18.3.1):
|
react-inspector@5.1.1(react@18.3.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.24.7
|
'@babel/runtime': 7.25.0
|
||||||
is-dom: 1.1.0
|
is-dom: 1.1.0
|
||||||
prop-types: 15.8.1
|
prop-types: 15.8.1
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
@ -58360,7 +58360,7 @@ snapshots:
|
||||||
|
|
||||||
react-select@3.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
react-select@3.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.24.7
|
'@babel/runtime': 7.25.0
|
||||||
'@emotion/cache': 10.0.29
|
'@emotion/cache': 10.0.29
|
||||||
'@emotion/core': 10.3.1(react@18.3.1)
|
'@emotion/core': 10.3.1(react@18.3.1)
|
||||||
'@emotion/css': 10.0.27
|
'@emotion/css': 10.0.27
|
||||||
|
|
|
@ -11,7 +11,7 @@ module.exports = {
|
||||||
'../../../packages/js/experimental/src/**/stories/*.@(js|tsx)',
|
'../../../packages/js/experimental/src/**/stories/*.@(js|tsx)',
|
||||||
// WooCommerce Admin / @woocommerce/onboarding components
|
// WooCommerce Admin / @woocommerce/onboarding components
|
||||||
'../../../packages/js/onboarding/src/**/stories/*.@(js|tsx)',
|
'../../../packages/js/onboarding/src/**/stories/*.@(js|tsx)',
|
||||||
'../../../packages/js/product-editor/src/**/stories/*.@(js|tsx)',
|
'../../../packages/js/product-editor/src/**/*.stories.@(js|tsx)',
|
||||||
'../../../plugins/woocommerce-admin/client/**/stories/*.@(js|tsx)',
|
'../../../plugins/woocommerce-admin/client/**/stories/*.@(js|tsx)',
|
||||||
],
|
],
|
||||||
addons: [
|
addons: [
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
<link
|
<link href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined&ver=1601945340" rel="stylesheet" />
|
||||||
href="https://fonts.googleapis.com/icon?family=Material+Icons+Outlined&ver=1601945340"
|
|
||||||
rel="stylesheet"
|
|
||||||
/>
|
|
||||||
<link href="wordpress/css/common.min.css" rel="stylesheet" />
|
<link href="wordpress/css/common.min.css" rel="stylesheet" />
|
||||||
<link href="wordpress/css/forms.min.css" rel="stylesheet" />
|
<link href="wordpress/css/forms.min.css" rel="stylesheet" />
|
||||||
<link href="wordpress/css/admin-menu.min.css" rel="stylesheet" />
|
<link href="wordpress/css/admin-menu.min.css" rel="stylesheet" />
|
||||||
|
@ -18,3 +15,4 @@
|
||||||
<link href="wordpress/css/l10n.min.css" rel="stylesheet" />
|
<link href="wordpress/css/l10n.min.css" rel="stylesheet" />
|
||||||
<link href="wordpress/css/site-health.min.css" rel="stylesheet" />
|
<link href="wordpress/css/site-health.min.css" rel="stylesheet" />
|
||||||
<link href="wordpress/css/components.css" rel="stylesheet" />
|
<link href="wordpress/css/components.css" rel="stylesheet" />
|
||||||
|
<link href="wordpress/css/edit-site.css" rel="stylesheet" />
|
|
@ -5,16 +5,19 @@ STORY_BOOK_CSS_PATH="$DIR/../storybook/wordpress/css";
|
||||||
TMP_DIR="$DIR/../storybook/wordpress/tmp";
|
TMP_DIR="$DIR/../storybook/wordpress/tmp";
|
||||||
ARCHIVE_CSS_PATH="wordpress/wp-admin/css";
|
ARCHIVE_CSS_PATH="wordpress/wp-admin/css";
|
||||||
ARCHIVE_IMG_PATH="wordpress/wp-admin/images";
|
ARCHIVE_IMG_PATH="wordpress/wp-admin/images";
|
||||||
|
ARCHIVE_EDIT_SITE_PATH="wordpress/wp-includes/css/dist/edit-site/style.css";
|
||||||
|
|
||||||
mkdir -p "$STORY_BOOK_CSS_PATH";
|
mkdir -p "$STORY_BOOK_CSS_PATH";
|
||||||
mkdir -p "$TMP_DIR";
|
mkdir -p "$TMP_DIR";
|
||||||
|
|
||||||
function download_and_extract_css {
|
function download_and_extract_css {
|
||||||
curl -o "$STORYBOOK_WORDPRESS_DIR/wordpress-latest.zip" https://wordpress.org/nightly-builds/wordpress-latest.zip;
|
curl -o "$STORYBOOK_WORDPRESS_DIR/wordpress-latest.zip" https://wordpress.org/nightly-builds/wordpress-latest.zip;
|
||||||
unzip -qq "$STORYBOOK_WORDPRESS_DIR/wordpress-latest.zip" "$ARCHIVE_CSS_PATH/*" "$ARCHIVE_IMG_PATH/*" -d "$TMP_DIR";
|
unzip -qq "$STORYBOOK_WORDPRESS_DIR/wordpress-latest.zip" "$ARCHIVE_CSS_PATH/*" "$ARCHIVE_IMG_PATH/*" "$ARCHIVE_EDIT_SITE_PATH" -d "$TMP_DIR";
|
||||||
rsync -a "$TMP_DIR/$ARCHIVE_CSS_PATH" "$STORYBOOK_WORDPRESS_DIR";
|
rsync -a "$TMP_DIR/$ARCHIVE_CSS_PATH" "$STORYBOOK_WORDPRESS_DIR";
|
||||||
rsync -a "$TMP_DIR/$ARCHIVE_IMG_PATH" "$STORYBOOK_WORDPRESS_DIR";
|
rsync -a "$TMP_DIR/$ARCHIVE_IMG_PATH" "$STORYBOOK_WORDPRESS_DIR";
|
||||||
|
rsync -a "$TMP_DIR/$ARCHIVE_EDIT_SITE_PATH" "$STORYBOOK_WORDPRESS_DIR/css/edit-site.css";
|
||||||
rm -r "$TMP_DIR";
|
rm -r "$TMP_DIR";
|
||||||
|
rm -r "$STORYBOOK_WORDPRESS_DIR/wordpress-latest.zip";
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ -z "$(find "$STORY_BOOK_CSS_PATH" -iname '*.css')" ] || [ "$1" == "-f" ]
|
if [ -z "$(find "$STORY_BOOK_CSS_PATH" -iname '*.css')" ] || [ "$1" == "-f" ]
|
||||||
|
|
|
@ -40,9 +40,6 @@ module.exports = ( storybookConfig ) => {
|
||||||
'./setting.mock.js'
|
'./setting.mock.js'
|
||||||
);
|
);
|
||||||
|
|
||||||
storybookConfig.resolve.alias[ 'react/jsx-runtime' ] =
|
|
||||||
require.resolve( 'react/jsx-runtime' );
|
|
||||||
|
|
||||||
// We need to use react 18 for the storybook since some dependencies are not compatible with react 17
|
// We need to use react 18 for the storybook since some dependencies are not compatible with react 17
|
||||||
// Once we upgrade react to 18 in repo, we can remove this alias
|
// Once we upgrade react to 18 in repo, we can remove this alias
|
||||||
storybookConfig.resolve.alias.react = path.resolve(
|
storybookConfig.resolve.alias.react = path.resolve(
|
||||||
|
|
Loading…
Reference in New Issue