8
0
Просмотр исходного кода

Merge branch 'master' into memory-test

Maciej Gołaszewski 5 лет назад
Родитель
Сommit
b9b0e5b2bd

+ 6 - 4
docs/framework/guides/contributing/git-commit-message-convention.md

@@ -24,8 +24,8 @@ Type (another-package-name): If the change affects more than one package, it's p
 
 
 Optional description.
 Optional description.
 
 
-BREAKING CHANGE: If any breaking changes were done, they need to be listed here.
-BREAKING CHANGE: Another breaking change if needed. Closes #ZZZ.
+BREAKING CHANGE (scope): If any breaking changes were done, they need to be listed here.
+BREAKING CHANGE (scope): Another breaking change if needed. Closes #ZZZ.
 ```
 ```
 
 
 ### Commit types
 ### Commit types
@@ -50,6 +50,8 @@ If any change contains the `MAJOR BREAKING CHANGE` note, the next release will b
 
 
 For reference on how to identify minor or major breaking change see the {@link framework/guides/support/versioning-policy versioning policy guide}.
 For reference on how to identify minor or major breaking change see the {@link framework/guides/support/versioning-policy versioning policy guide}.
 
 
+Each `BREAKING CHANGE` note must be followed by the scope of changes.
+
 ### Package name
 ### Package name
 
 
 Most commits are related to one or more packages. Each affected package should be listed in parenthesis following the commit type. A package that was the most impacted by the change should be listed first.
 Most commits are related to one or more packages. Each affected package should be listed in parenthesis following the commit type. A package that was the most impacted by the change should be listed first.
@@ -95,7 +97,7 @@ Other (utils): Extracted the `utils.foo()` to a separate package. Closes #9.
 
 
 Feature (engine): Introduced the `engine.foo()` method. Closes #9.
 Feature (engine): Introduced the `engine.foo()` method. Closes #9.
 
 
-MAJOR BREAKING CHANGE: The `utils.foo()` method was moved to the `engine` package. See #9.
+MAJOR BREAKING CHANGE (utils): The `utils.foo()` method was moved to the `engine` package. See #9.
 ```
 ```
 
 
 For the commits shown above the changelog will look like this:
 For the commits shown above the changelog will look like this:
@@ -108,7 +110,7 @@ Changelog
 
 
 ### MAJOR BREAKING CHANGES [ℹ️](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/versioning-policy.html#major-and-minor-breaking-changes)
 ### MAJOR BREAKING CHANGES [ℹ️](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/versioning-policy.html#major-and-minor-breaking-changes)
 
 
-* The `utils.foo()` method was moved to the `engine` package. See #9. See [#9](https://github.com/ckeditor/ckeditor5/issue/9).
+* **[utils](http://npmjs.com/package/@ckeditor/ckeditor5-utils)**: The `utils.foo()` method was moved to the `engine` package. See [#9](https://github.com/ckeditor/ckeditor5/issue/9).
 
 
 ### Features
 ### Features
 
 

+ 15 - 2
packages/ckeditor5-theme-lark/theme/ckeditor5-widget/widgettypearound.css

@@ -22,8 +22,10 @@
 		height: var(--ck-widget-type-around-button-size);
 		height: var(--ck-widget-type-around-button-size);
 		background: var(--ck-color-widget-type-around-button);
 		background: var(--ck-color-widget-type-around-button);
 		border-radius: 100px;
 		border-radius: 100px;
-		animation: fadein linear 300ms 1 normal forwards;
-		transition: opacity 100ms linear;
+
+		pointer-events: none;
+		opacity: 0;
+		transition: opacity var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve), background var(--ck-widget-handler-animation-duration) var(--ck-widget-handler-animation-curve);
 
 
 		& svg {
 		& svg {
 			width: 10px;
 			width: 10px;
@@ -69,6 +71,17 @@
 		}
 		}
 	}
 	}
 
 
+	/*
+	 * Show type around buttons when the widget gets selected or being hovered.
+	 */
+	&.ck-widget_selected,
+	&:hover {
+		& > .ck-widget__type-around > .ck-widget__type-around__button {
+			pointer-events: auto;
+			opacity: 1;
+		}
+	}
+
 	/*
 	/*
 	 * Styles for the buttons when the widget is NOT selected (but the buttons are visible
 	 * Styles for the buttons when the widget is NOT selected (but the buttons are visible
 	 * and still can be hovered).
 	 * and still can be hovered).

+ 18 - 4
packages/ckeditor5-utils/src/dom/position.js

@@ -129,9 +129,15 @@ export function getOptimalPosition( { element, target, positions, limiter, fitIn
 // @param {Function} position A function returning {@link module:utils/dom/position~Position}.
 // @param {Function} position A function returning {@link module:utils/dom/position~Position}.
 // @param {utils/dom/rect~Rect} targetRect A rect of the target.
 // @param {utils/dom/rect~Rect} targetRect A rect of the target.
 // @param {utils/dom/rect~Rect} elementRect A rect of positioned element.
 // @param {utils/dom/rect~Rect} elementRect A rect of positioned element.
-// @returns {Array} An array containing position name and its Rect.
+// @returns {Array|null} An array containing position name and its Rect (or null if position should be ignored).
 function getPositionNameAndRect( position, targetRect, elementRect ) {
 function getPositionNameAndRect( position, targetRect, elementRect ) {
-	const { left, top, name } = position( targetRect, elementRect );
+	const positionData = position( targetRect, elementRect );
+
+	if ( !positionData ) {
+		return null;
+	}
+
+	const { left, top, name } = positionData;
 
 
 	return [ name, elementRect.clone().moveTo( left, top ) ];
 	return [ name, elementRect.clone().moveTo( left, top ) ];
 }
 }
@@ -205,7 +211,13 @@ function processPositionsToAreas( positions, { targetRect, elementRect, limiterR
 	const elementRectArea = elementRect.getArea();
 	const elementRectArea = elementRect.getArea();
 
 
 	for ( const position of positions ) {
 	for ( const position of positions ) {
-		const [ positionName, positionRect ] = getPositionNameAndRect( position, targetRect, elementRect );
+		const positionData = getPositionNameAndRect( position, targetRect, elementRect );
+
+		if ( !positionData ) {
+			continue;
+		}
+
+		const [ positionName, positionRect ] = positionData;
 		let limiterIntersectArea = 0;
 		let limiterIntersectArea = 0;
 		let viewportIntersectArea = 0;
 		let viewportIntersectArea = 0;
 
 
@@ -351,7 +363,7 @@ function getAbsoluteRectCoordinates( { left, top } ) {
 }
 }
 
 
 /**
 /**
- * The `getOptimalPosition` helper options.
+ * The `getOptimalPosition()` helper options.
  *
  *
  * @interface module:utils/dom/position~Options
  * @interface module:utils/dom/position~Options
  */
  */
@@ -372,6 +384,8 @@ function getAbsoluteRectCoordinates( { left, top } ) {
  * An array of functions which return {@link module:utils/dom/position~Position} relative
  * An array of functions which return {@link module:utils/dom/position~Position} relative
  * to the `target`, in the order of preference.
  * to the `target`, in the order of preference.
  *
  *
+ * **Note**: If a function returns `null`, it is ignored by the `getOptimalPosition()`.
+ *
  * @member {Array.<Function>} #positions
  * @member {Array.<Function>} #positions
  */
  */
 
 

+ 26 - 1
packages/ckeditor5-utils/tests/dom/position.js

@@ -95,6 +95,8 @@ const attachTopRight = ( targetRect, elementRect ) => ( {
 	name: 'top-right'
 	name: 'top-right'
 } );
 } );
 
 
+const attachNone = () => null;
+
 const allPositions = [
 const allPositions = [
 	attachLeftBottom,
 	attachLeftBottom,
 	attachLeftTop,
 	attachLeftTop,
@@ -103,7 +105,8 @@ const allPositions = [
 	attachBottomRight,
 	attachBottomRight,
 	attachBottomLeft,
 	attachBottomLeft,
 	attachTopLeft,
 	attachTopLeft,
-	attachTopRight
+	attachTopRight,
+	attachNone
 ];
 ];
 
 
 describe( 'getOptimalPosition()', () => {
 describe( 'getOptimalPosition()', () => {
@@ -291,6 +294,17 @@ describe( 'getOptimalPosition()', () => {
 				name: 'right-bottom'
 				name: 'right-bottom'
 			} );
 			} );
 		} );
 		} );
+
+		it( 'should allow position function to return null to be ignored', () => {
+			assertPosition( {
+				element, target,
+				positions: [ attachRightBottom, attachNone ]
+			}, {
+				top: 100,
+				left: 110,
+				name: 'right-bottom'
+			} );
+		} );
 	} );
 	} );
 
 
 	describe( 'with a limiter', () => {
 	describe( 'with a limiter', () => {
@@ -392,6 +406,17 @@ describe( 'getOptimalPosition()', () => {
 
 
 			element.remove();
 			element.remove();
 		} );
 		} );
+
+		it( 'should allow position function to return null to be ignored', () => {
+			assertPosition( {
+				element, target, limiter,
+				positions: [ attachLeftBottom, attachNone ]
+			}, {
+				top: 100,
+				left: -20,
+				name: 'left-bottom'
+			} );
+		} );
 	} );
 	} );
 
 
 	describe( 'with fitInViewport on', () => {
 	describe( 'with fitInViewport on', () => {

+ 8 - 1
packages/ckeditor5-widget/src/utils.js

@@ -374,12 +374,19 @@ export function viewToModelPositionOutsideModelElement( model, viewElementMatche
  *
  *
  * @param {module:utils/dom/rect~Rect} widgetRect A rect of the widget.
  * @param {module:utils/dom/rect~Rect} widgetRect A rect of the widget.
  * @param {module:utils/dom/rect~Rect} balloonRect A rect of the balloon.
  * @param {module:utils/dom/rect~Rect} balloonRect A rect of the balloon.
- * @returns {module:utils/dom/position~Position}
+ * @returns {module:utils/dom/position~Position|null}
  */
  */
 export function centeredBalloonPositionForLongWidgets( widgetRect, balloonRect ) {
 export function centeredBalloonPositionForLongWidgets( widgetRect, balloonRect ) {
 	const viewportRect = new Rect( global.window );
 	const viewportRect = new Rect( global.window );
 	const viewportWidgetInsersectionRect = viewportRect.getIntersection( widgetRect );
 	const viewportWidgetInsersectionRect = viewportRect.getIntersection( widgetRect );
 
 
+	const balloonTotalHeight = balloonRect.height + BalloonPanelView.arrowVerticalOffset;
+
+	// If there is enough space above or below the widget then this position should not be used.
+	if ( widgetRect.top - balloonTotalHeight > viewportRect.top || widgetRect.bottom + balloonTotalHeight < viewportRect.bottom ) {
+		return null;
+	}
+
 	// Because this is a last resort positioning, to keep things simple we're not playing with positions of the arrow
 	// Because this is a last resort positioning, to keep things simple we're not playing with positions of the arrow
 	// like, for instance, "south west" or whatever. Just try to keep the balloon in the middle of the visible area of
 	// like, for instance, "south west" or whatever. Just try to keep the balloon in the middle of the visible area of
 	// the widget for as long as it is possible. If the widgets becomes invisible (because cropped by the viewport),
 	// the widget for as long as it is possible. If the widgets becomes invisible (because cropped by the viewport),

+ 38 - 6
packages/ckeditor5-widget/tests/utils.js

@@ -512,7 +512,7 @@ describe( 'widget utils', () => {
 			testUtils.sinon.stub( global.window, 'innerHeight' ).value( 100 );
 			testUtils.sinon.stub( global.window, 'innerHeight' ).value( 100 );
 		} );
 		} );
 
 
-		it( 'should position the balloon inside a widget – at the top + in the middle', () => {
+		it( 'should return null if there is enough space above the widget', () => {
 			// Widget is a 50x150 rect, translated (25,25) from viewport's beginning (0,0).
 			// Widget is a 50x150 rect, translated (25,25) from viewport's beginning (0,0).
 			const widgetRect = new Rect( {
 			const widgetRect = new Rect( {
 				top: 25,
 				top: 25,
@@ -525,8 +525,40 @@ describe( 'widget utils', () => {
 
 
 			const position = centeredBalloonPositionForLongWidgets( widgetRect, balloonRect );
 			const position = centeredBalloonPositionForLongWidgets( widgetRect, balloonRect );
 
 
+			expect( position ).to.equal( null );
+		} );
+
+		it( 'should return null if there is enough space below the widget', () => {
+			// Widget is a 50x150 rect, translated (25,-125) from viewport's beginning (0,0).
+			const widgetRect = new Rect( {
+				top: -125,
+				left: 25,
+				right: 75,
+				bottom: 25,
+				width: 50,
+				height: 150
+			} );
+
+			const position = centeredBalloonPositionForLongWidgets( widgetRect, balloonRect );
+
+			expect( position ).to.equal( null );
+		} );
+
+		it( 'should position the balloon inside a widget – at the top + in the middle', () => {
+			// Widget is a 50x150 rect, translated (25,5) from viewport's beginning (0,0).
+			const widgetRect = new Rect( {
+				top: 5,
+				left: 25,
+				right: 75,
+				bottom: 155,
+				width: 50,
+				height: 150
+			} );
+
+			const position = centeredBalloonPositionForLongWidgets( widgetRect, balloonRect );
+
 			expect( position ).to.deep.equal( {
 			expect( position ).to.deep.equal( {
-				top: 25 + arrowVerticalOffset,
+				top: 5 + arrowVerticalOffset,
 				left: 45,
 				left: 45,
 				name: 'arrow_n'
 				name: 'arrow_n'
 			} );
 			} );
@@ -553,12 +585,12 @@ describe( 'widget utils', () => {
 		} );
 		} );
 
 
 		it( 'should horizontally center the balloon in the visible area when the widget is cropped by the viewport', () => {
 		it( 'should horizontally center the balloon in the visible area when the widget is cropped by the viewport', () => {
-			// Widget is a 50x150 rect, translated (25,-25) from viewport's beginning (0,0).
+			// Widget is a 50x150 rect, translated (-25,5) from viewport's beginning (0,0).
 			const widgetRect = new Rect( {
 			const widgetRect = new Rect( {
-				top: 25,
+				top: 5,
 				left: -25,
 				left: -25,
 				right: 25,
 				right: 25,
-				bottom: 175,
+				bottom: 155,
 				width: 50,
 				width: 50,
 				height: 150
 				height: 150
 			} );
 			} );
@@ -566,7 +598,7 @@ describe( 'widget utils', () => {
 			const position = centeredBalloonPositionForLongWidgets( widgetRect, balloonRect );
 			const position = centeredBalloonPositionForLongWidgets( widgetRect, balloonRect );
 
 
 			expect( position ).to.deep.equal( {
 			expect( position ).to.deep.equal( {
-				top: 25 + arrowVerticalOffset,
+				top: 5 + arrowVerticalOffset,
 				left: 7.5,
 				left: 7.5,
 				name: 'arrow_n'
 				name: 'arrow_n'
 			} );
 			} );

+ 1 - 11
packages/ckeditor5-widget/theme/widgettypearound.css

@@ -8,7 +8,7 @@
 	 * Styles of the type around buttons
 	 * Styles of the type around buttons
 	 */
 	 */
 	& .ck-widget__type-around__button {
 	& .ck-widget__type-around__button {
-		display: none;
+		display: block;
 		position: absolute;
 		position: absolute;
 		overflow: hidden;
 		overflow: hidden;
 		z-index: var(--ck-z-default);
 		z-index: var(--ck-z-default);
@@ -37,16 +37,6 @@
 		}
 		}
 	}
 	}
 
 
-	/*
-	 * Show type around buttons when the widget gets selected or being hovered.
-	 */
-	&.ck-widget_selected,
-	&:hover {
-		& > .ck-widget__type-around > .ck-widget__type-around__button {
-			display: block;
-		}
-	}
-
 	/*
 	/*
 	 * Hide the type around buttons depending on which directions the widget supports.
 	 * Hide the type around buttons depending on which directions the widget supports.
 	 */
 	 */

+ 22 - 19
scripts/release/changelog.js

@@ -9,28 +9,31 @@
 
 
 'use strict';
 'use strict';
 
 
-// In order to use the same version for all packages (including builds and ckeditor5 itself), you can call:
-// yarn run changelog [newVersion]
-
 const devEnv = require( '@ckeditor/ckeditor5-dev-env' );
 const devEnv = require( '@ckeditor/ckeditor5-dev-env' );
-const commonOptions = {
-	cwd: process.cwd(),
-	packages: 'packages'
-};
-const editorBuildsGlob = '@ckeditor/ckeditor5-build-*';
-
-const optionsForDependencies = Object.assign( {}, commonOptions, {
-	skipPackages: editorBuildsGlob,
-	skipMainRepository: true
-} );
-
-const optionsForBuilds = Object.assign( {}, commonOptions, {
-	scope: editorBuildsGlob
-} );
 
 
 Promise.resolve()
 Promise.resolve()
-	.then( () => devEnv.generateChangelogForSubRepositories( optionsForDependencies ) )
-	.then( response => devEnv.generateSummaryChangelog( Object.assign( optionsForBuilds, response ) ) )
+	.then( () => devEnv.generateChangelogForMonoRepository( {
+		cwd: process.cwd(),
+		packages: 'packages',
+		highlightsPlaceholder: true,
+		collaborationFeatures: true,
+		from: '87c56114028c00b1e45b6ecba3bead575c6c1afe', // TODO: Remove the line after the nearest release.
+		transformScope: name => {
+			if ( name === 'ckeditor5' ) {
+				return 'https://www.npmjs.com/package/ckeditor5';
+			}
+
+			if ( name === 'build-*' ) {
+				return 'https://www.npmjs.com/search?q=keywords%3Ackeditor5-build%20maintainer%3Ackeditor';
+			}
+
+			if ( name === 'cloud-services-core' ) {
+				return 'https://www.npmjs.com/package/@ckeditor/ckeditor-cloud-services-core';
+			}
+
+			return 'https://www.npmjs.com/package/@ckeditor/ckeditor5-' + name;
+		}
+	} ) )
 	.then( () => {
 	.then( () => {
 		console.log( 'Done!' );
 		console.log( 'Done!' );
 	} )
 	} )