diff --git a/e2e/rectangle-shape.spec.ts b/e2e/rectangle-shape.spec.ts index be35ae18..3e56bf85 100644 --- a/e2e/rectangle-shape.spec.ts +++ b/e2e/rectangle-shape.spec.ts @@ -12,13 +12,13 @@ test('has rectangle component', async ({ page }) => { await page.goto(''); await page.getByText('Basic Shapes').click(); - await expect(page.getByAltText('Rectangle')).toBeVisible(); + await expect(page.getByAltText(/^Rectangle$/)).toBeVisible(); }); test('can add rectangle component to canvas', async ({ page }) => { await page.goto(''); await page.getByText('Basic Shapes').click(); - const component = page.getByAltText('Rectangle'); + const component = page.getByAltText(/^Rectangle$/); const position = await getLocatorPosition(component); await dragAndDrop(page, position, { diff --git a/public/low-wireframes/rectangleLow.svg b/public/low-wireframes/rectangleLow.svg new file mode 100644 index 00000000..bfe76d05 --- /dev/null +++ b/public/low-wireframes/rectangleLow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/common/components/mock-components/front-low-wireframes-components/index.ts b/src/common/components/mock-components/front-low-wireframes-components/index.ts index 48739579..3de0c0f5 100644 --- a/src/common/components/mock-components/front-low-wireframes-components/index.ts +++ b/src/common/components/mock-components/front-low-wireframes-components/index.ts @@ -2,4 +2,5 @@ export * from './ellipse-low-shape'; export * from './horizontal-line-low-shape'; export * from './image-placeholder-shape'; export * from './vertical-line-low-shape'; +export * from './rectangle-low-shape'; export * from './circle-low-shape'; diff --git a/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx b/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx new file mode 100644 index 00000000..80f560c8 --- /dev/null +++ b/src/common/components/mock-components/front-low-wireframes-components/rectangle-low-shape.tsx @@ -0,0 +1,66 @@ +import { ShapeSizeRestrictions, ShapeType } from '@/core/model'; +import { forwardRef } from 'react'; +import { ShapeProps } from '../shape.model'; +import { fitSizeToShapeSizeRestrictions } from '@/common/utils/shapes'; +import { Group, Rect } from 'react-konva'; +import { useGroupShapeProps } from '../mock-components.utils'; +import { useShapeProps } from '../../shapes/use-shape-props.hook'; +import { BASIC_SHAPE } from '../front-components/shape.const'; + +const rectangleLowShapeRestriction: ShapeSizeRestrictions = { + minWidth: 10, + minHeight: 10, + maxWidth: -1, + maxHeight: -1, + defaultWidth: 160, + defaultHeight: 160, +}; + +export const getRectangleLowShapeRestrictions = (): ShapeSizeRestrictions => + rectangleLowShapeRestriction; + +const shapeType: ShapeType = 'rectangleLow'; + +export const RectangleLowShape = forwardRef((props, ref) => { + const { + x, + y, + width, + height, + id, + onSelected, + text, + otherProps, + ...shapeProps + } = props; + + const restrictedSize = fitSizeToShapeSizeRestrictions( + rectangleLowShapeRestriction, + width, + height + ); + + const { width: restrictedWidth, height: restrictedHeight } = restrictedSize; + + const { stroke, strokeStyle } = useShapeProps(otherProps, BASIC_SHAPE); + + const commonGroupProps = useGroupShapeProps( + props, + restrictedSize, + shapeType, + ref + ); + + return ( + + + + ); +}); diff --git a/src/core/model/index.ts b/src/core/model/index.ts index e3cd0d79..de8ffe0f 100644 --- a/src/core/model/index.ts +++ b/src/core/model/index.ts @@ -81,6 +81,7 @@ export type ShapeType = | 'horizontalLineLow' | 'verticalLineLow' | 'ellipseLow' + | 'rectangleLow' | 'circleLow'; export const ShapeDisplayName: Record = { @@ -151,6 +152,7 @@ export const ShapeDisplayName: Record = { horizontalLineLow: 'Horizontal Divider', verticalLineLow: 'Vertical Divider', ellipseLow: 'Ellipse', + rectangleLow: 'Rectangle Placeholder', circleLow: 'Circle', }; diff --git a/src/pods/canvas/model/shape-other-props.utils.ts b/src/pods/canvas/model/shape-other-props.utils.ts index ae5e47f3..ae86143d 100644 --- a/src/pods/canvas/model/shape-other-props.utils.ts +++ b/src/pods/canvas/model/shape-other-props.utils.ts @@ -123,6 +123,7 @@ export const generateDefaultOtherProps = ( }; case 'horizontalLine': case 'horizontalLineLow': + case 'rectangleLow': case 'circleLow': case 'verticalLineLow': case 'ellipseLow': diff --git a/src/pods/canvas/model/shape-size.mapper.ts b/src/pods/canvas/model/shape-size.mapper.ts index fa029ea9..034c769e 100644 --- a/src/pods/canvas/model/shape-size.mapper.ts +++ b/src/pods/canvas/model/shape-size.mapper.ts @@ -82,6 +82,7 @@ import { getHorizontalLineLowShapeRestrictions, getImagePlaceholderShapeSizeRestrictions, getVerticalLineLowShapeRestrictions, + getRectangleLowShapeRestrictions, getEllipseLowShapeRestrictions, getCircleLowShapeSizeRestrictions, } from '@/common/components/mock-components/front-low-wireframes-components'; @@ -164,6 +165,7 @@ const shapeSizeMap: Record ShapeSizeRestrictions> = { horizontalLineLow: getHorizontalLineLowShapeRestrictions, verticalLineLow: getVerticalLineLowShapeRestrictions, ellipseLow: getEllipseLowShapeRestrictions, + rectangleLow: getRectangleLowShapeRestrictions, circleLow: getCircleLowShapeSizeRestrictions, }; diff --git a/src/pods/canvas/shape-renderer/index.tsx b/src/pods/canvas/shape-renderer/index.tsx index 7e667e91..92b85522 100644 --- a/src/pods/canvas/shape-renderer/index.tsx +++ b/src/pods/canvas/shape-renderer/index.tsx @@ -79,6 +79,7 @@ import { renderImagePlaceHolder, renderVerticalLowLine, renderEllipseLow, + renderRectangleLow, } from './simple-low-wireframes-components'; export const renderShapeComponent = ( @@ -218,6 +219,8 @@ export const renderShapeComponent = ( return renderVerticalLowLine(shape, shapeRenderedProps); case 'ellipseLow': return renderEllipseLow(shape, shapeRenderedProps); + case 'rectangleLow': + return renderRectangleLow(shape, shapeRenderedProps); case 'circleLow': return renderCircleLow(shape, shapeRenderedProps); default: diff --git a/src/pods/canvas/shape-renderer/simple-low-wireframes-components/index.ts b/src/pods/canvas/shape-renderer/simple-low-wireframes-components/index.ts index 8d2aadce..ca8ea9da 100644 --- a/src/pods/canvas/shape-renderer/simple-low-wireframes-components/index.ts +++ b/src/pods/canvas/shape-renderer/simple-low-wireframes-components/index.ts @@ -2,4 +2,5 @@ export * from './ellipse-low.renderer'; export * from './image-placeholder.renderer'; export * from './low-horizontal-line.renderer'; export * from './low-vertical-line.renderer'; +export * from './rectangle-low.renderer'; export * from './circle-low.renderer'; diff --git a/src/pods/canvas/shape-renderer/simple-low-wireframes-components/rectangle-low.renderer.tsx b/src/pods/canvas/shape-renderer/simple-low-wireframes-components/rectangle-low.renderer.tsx new file mode 100644 index 00000000..9fe27c44 --- /dev/null +++ b/src/pods/canvas/shape-renderer/simple-low-wireframes-components/rectangle-low.renderer.tsx @@ -0,0 +1,31 @@ +import { ShapeModel } from '@/core/model'; +import { ShapeRendererProps } from '../model'; +import { RectangleLowShape } from '@/common/components/mock-components/front-low-wireframes-components'; + +export const renderRectangleLow = ( + shape: ShapeModel, + shapeRenderedProps: ShapeRendererProps +) => { + const { handleSelected, shapeRefs, handleDragEnd, handleTransform } = + shapeRenderedProps; + + return ( + + ); +}; diff --git a/src/pods/galleries/low-wireframe-gallery/low-wireframe-gallery-data/index.ts b/src/pods/galleries/low-wireframe-gallery/low-wireframe-gallery-data/index.ts index 8eec8543..90bc575f 100644 --- a/src/pods/galleries/low-wireframe-gallery/low-wireframe-gallery-data/index.ts +++ b/src/pods/galleries/low-wireframe-gallery/low-wireframe-gallery-data/index.ts @@ -17,6 +17,10 @@ export const mockLowWireframeCollection: ItemInfo[] = [ thumbnailSrc: '/low-wireframes/ellipseLow.svg', type: 'ellipseLow', }, + { + thumbnailSrc: '/low-wireframes/rectangleLow.svg', + type: 'rectangleLow', + }, { thumbnailSrc: '/low-wireframes/circleLow.svg', type: 'circleLow',