4 changed files with 209 additions and 214 deletions
@ -0,0 +1,122 @@ |
|||
/** |
|||
* @extends Modifier |
|||
* @inheritdoc |
|||
*/ |
|||
class ChainableModifier extends Modifier { |
|||
/** |
|||
* @type {Component} |
|||
*/ |
|||
_component; |
|||
|
|||
/** |
|||
* |
|||
* @param {Component} component |
|||
*/ |
|||
constructor(component) { |
|||
super(); |
|||
this._component = component; |
|||
} |
|||
|
|||
/** |
|||
* @inheritdoc |
|||
* |
|||
* In Case it is called from a ChainableModifier chain, |
|||
* the Return type would be DimensionsChainedModifier instead of DimensionsChain. |
|||
* @override |
|||
* @param {Dimensions | number | undefined} [modify=null] dimensions |
|||
* @returns {ChainableModifier | DimensionsChainedModifier} |
|||
*/ |
|||
dimensions(modify = null) { |
|||
if (modify instanceof Dimensions || Number.isInteger(modify)) { |
|||
return super.dimensions(modify); |
|||
} |
|||
return new DimensionsChainedModifier(this); |
|||
} |
|||
|
|||
/** |
|||
* @inheritdoc |
|||
* @override |
|||
* @param {Padding | number | undefined} [modify=null] modify as in modifiers |
|||
* @returns {ChainableModifier | PaddingChainedModifier} |
|||
*/ |
|||
padding(modify = null) { |
|||
if (modify instanceof Padding || Number.isInteger(modify)) { |
|||
return super.padding(modify); |
|||
} |
|||
return new PaddingChainedModifier(this); |
|||
} |
|||
|
|||
/** |
|||
* @inheritdoc |
|||
* @override |
|||
* @param {Margin | number | undefined} [modify=null] modify as in modifiers |
|||
* @returns {ChainableModifier | MarginChainedModifier} |
|||
*/ |
|||
margin(modify = null) { |
|||
if (modify instanceof Margin || Number.isInteger(modify)) { |
|||
return super.margin(modify); |
|||
} |
|||
return new MarginChainedModifier(this); |
|||
} |
|||
|
|||
/** |
|||
* @inheritdoc |
|||
* |
|||
* @override |
|||
* @param {Shape | number | undefined} [modify=null] modify |
|||
* @returns {ChainableModifier | ShapeChainedModifier} |
|||
*/ |
|||
clip(modify = null) { |
|||
if (modify instanceof Shape || Number.isInteger(modify)) { |
|||
return super.clip(modify); |
|||
} |
|||
return new ShapeChainedModifier(this); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* |
|||
* @inheritdoc |
|||
* |
|||
* @override |
|||
* @param {Border | number | undefined} [modify=null] modify |
|||
* @returns {ChainableModifier | BorderChainedModifier} |
|||
*/ |
|||
border(modify = null) { |
|||
if (modify instanceof Border || Number.isInteger(modify)) { |
|||
return super.border(modify); |
|||
} |
|||
return new BorderChainedModifier(this); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* |
|||
* @returns {Component} |
|||
*/ |
|||
toComponent() { |
|||
return this._component.modifier(this); |
|||
} |
|||
|
|||
/** |
|||
* |
|||
* @param {Component|Array<Component>} innerComponent |
|||
* @returns {Component} the parent Component |
|||
*/ |
|||
childContext(innerComponent) { |
|||
return this._component |
|||
.modifier(this) |
|||
.childContext(innerComponent); |
|||
} |
|||
|
|||
/** |
|||
* Calls chainChild() from Component (ChildbearerComponent) |
|||
* @see {ChildbearerComponent.chainChild} |
|||
* @returns {builder} |
|||
*/ |
|||
chainChild() { |
|||
return this._component |
|||
.modifier(this) |
|||
.chainChild(); |
|||
} |
|||
} |
@ -0,0 +1,87 @@ |
|||
/** |
|||
* @abstract |
|||
*/ |
|||
class ModificationSubChain { |
|||
/** |
|||
* @type {Modifier} |
|||
*/ |
|||
_modifier; |
|||
/** |
|||
* @type {string} |
|||
*/ |
|||
_modMethod; |
|||
|
|||
/** |
|||
* |
|||
* @param {Modifier} modifier |
|||
* @param {string} modMethod |
|||
*/ |
|||
constructor(modifier, modMethod) { |
|||
this._modifier = modifier; |
|||
this._modMethod = modMethod; |
|||
} |
|||
|
|||
/** |
|||
* Returns the Modifier SubChain to the Modifier |
|||
* @returns {Modifier|ChainableModifier} |
|||
*/ |
|||
toModifier() { |
|||
return this._modifier[this._modMethod](this); |
|||
} |
|||
|
|||
/** |
|||
* Returns chain to the Modifier |
|||
* @returns {Modifier|ChainableModifier} |
|||
*/ |
|||
ensureModifier() { |
|||
return this.toModifier(); |
|||
} |
|||
} |
|||
/** |
|||
* @inheritdoc |
|||
* @extends ModificationSubChain |
|||
* @abstract |
|||
*/ |
|||
class ModificationSubChainReComp extends ModificationSubChain { |
|||
/** |
|||
* |
|||
* @param {ChainableModifier} modifier |
|||
* @param {string} modMethod |
|||
*/ |
|||
constructor(modifier) { |
|||
super(); |
|||
this._modifier = modifier; |
|||
} |
|||
|
|||
/** |
|||
* Returns chain to the component that is under modification |
|||
* @returns {Component} the Component that was (supposed to be) modified by this obj. |
|||
*/ |
|||
toComponent() { |
|||
return this._modifier[this._modMethod](this) |
|||
.toComponent(); |
|||
} |
|||
|
|||
/** |
|||
* Returns chain to the component that is under modification |
|||
* and adds the given innerComponent as children to the component. |
|||
* @param {Component|Array<Component>} innerComponent |
|||
* @returns {Component} |
|||
*/ |
|||
childContext(innerComponent) { |
|||
return this._modifier[this._modMethod](this) |
|||
.toComponent() |
|||
.childContext(innerComponent); |
|||
} |
|||
|
|||
/** |
|||
* Closes modifier chain and returns builder to define the next child of the component |
|||
* @returns {Component} |
|||
*/ |
|||
chainChild() { |
|||
return this._modifier[this._modMethod](this) |
|||
.toComponent() |
|||
.chainChild(); |
|||
} |
|||
} |
|||
|
Loading…
Reference in new issue