diff --git a/CHANGELOG.md b/CHANGELOG.md index 0094d0dc..a8995dc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## dev-master -- (none) +- Added Imager support ## 1.3.1 - 2019-01-29 diff --git a/seeds/schema.graphql b/seeds/schema.graphql index 9f22f019..89765ea8 100644 --- a/seeds/schema.graphql +++ b/seeds/schema.graphql @@ -50,6 +50,7 @@ type BlogPost implements EntryInterface, ElementInterface { testTableField: [TestTableFieldTable] testUrlField: String testAssetsField(filename: String, fixedOrder: Boolean, folderId: Int, height: Int, id: Int, kind: String, limit: Int, locale: String, offset: Int, order: String, search: String, size: Int, title: String, sourceId: Int, width: Int, testBlockCheckboxesField: TestBlockCheckboxesFieldEnum, testBlockPlainTextField: String, testBlockTableField: String, testCategoryField: String, testCategoryNestingField: String, testCheckboxes: TestCheckboxesEnum, testCheckboxesWithOneBadValue: TestCheckboxesWithOneBadValueEnum, testDateAndTimeField: String, testDateField: String, testDropdownField: TestDropdownFieldEnum, testEmailField: String, testLightswitchField: Boolean, testLightswitchOnField: Boolean, testMultiSelectField: TestMultiSelectFieldEnum, testNumberField: Int, testNumberFloatField: Float, testNumberMaxField: Int, testPlainText: String, testPlainTextWithCharacterLimit: String, testRadioButtonField: TestRadioButtonFieldEnum, testTableField: String, testTagField: Int, testTimeField: String, testUrlField: String): [VolumeInterface] + testAssetsFieldImager: [ImagerTransformedImages] testCategoryField: [TestCategoryGroupCategory] testCategoryFieldConnection: CategoryConnection testCategoryNestingField: [TestNestedCategoryGroupCategory] @@ -297,6 +298,172 @@ type GlobalsSet { testSecondGlobalSet: TestSecondGlobalSet } +enum ImagerBlendModeEnum { + blend + darken + lighten + modulate + multiply + overlay + screen +} + +enum ImagerChannelEnum { + red + green + blue +} + +input ImagerColorBlendEffect { + color: String + opacity: Float +} + +enum ImagerDitherEnum { + no + riemersma + floydsteinberg +} + +input ImagerEffects { + grayscale: Boolean + negative: Boolean + blur: Float + sharpen: Boolean + gamma: Float + colorize: String + colorBlend: ImagerColorBlendEffect + tint: [ImagerTintEffect] + sepia: Int + contrast: Float + modulate: [Int] + normalize: Boolean + contrastStretch: [Float] + posterize: ImagerPosterizeEffect + unsharpMask: [Float] + clut: String + quantize: [Int] + levels: ImagerLevelsEffect +} + +enum ImagerFormatEnum { + jpg + png + gif + webp +} + +enum ImagerInterlaceEnum { + none + line + plane + partition +} + +input ImagerLevelsEffect { + blackPoint: Float + gamma: Float + whitePoint: Float + channel: ImagerChannelEnum +} + +enum ImagerModeEnum { + crop + fit + stretch + croponly + letterbox +} + +input ImagerPosterizeEffect { + levels: Float + dither: ImagerDitherEnum +} + +enum ImagerResizeFilterEnum { + point + box + triangle + hermite + hanning + hamming + blackman + gaussian + quadratic + cubic + catrom + mitchell + lanczos + bessel + sinc +} + +enum ImagerSilhouetteTypeEnum { + curve +} + +input ImagerTintEffect { + color: String +} + +input ImagerTransformOptions { + format: ImagerFormatEnum + width: Int + height: Int + ratio: Float + position: String + ignoreFocalPoint: Boolean + mode: ImagerModeEnum + cropZoom: Float + frames: String + jpegQuality: Int + pngCompressionLevel: Int + webpQuality: Int + allowUpscale: Boolean + resizeFilter: ImagerResizeFilterEnum + interlace: ImagerInterlaceEnum + watermark: ImagerWatermark + effects: ImagerEffects + preEffects: ImagerEffects +} + +type ImagerTransformedImageModel { + url: String + path: String + extension: String + mimetype: String + width: String + height: String + size: String +} + +type ImagerTransformedImages { + images(transforms: [ImagerTransformOptions]!): [ImagerTransformedImageModel] + placeholder(type: ImagerTypeEnum, width: Int, height: Int, color: String, fgColor: String, size: String, silhouetteType: ImagerSilhouetteTypeEnum): String +} + +enum ImagerTypeEnum { + svg + gif + silhouette +} + +input ImagerWatermark { + image: String + width: Int + height: Int + opacity: Int + blendMode: ImagerBlendModeEnum + position: ImagerWatermarkPosition +} + +input ImagerWatermarkPosition { + left: Int + right: Int + top: Int + bottom: Int +} + type MultiOptionFieldData { selected: [OptionFieldDataOptions] options: [OptionFieldDataOptions] diff --git a/src/Builders/EnumField.php b/src/Builders/EnumField.php index 9f37483b..f5a5da81 100644 --- a/src/Builders/EnumField.php +++ b/src/Builders/EnumField.php @@ -2,11 +2,15 @@ namespace markhuot\CraftQL\Builders; +use markhuot\CraftQL\Request; + class EnumField extends Field { - function boot() { + function __construct(Request $request, string $name, string $prefix='') { + parent::__construct($request, $name); + $this->type = (new EnumObject($this->request)) - ->name(ucfirst($this->getName()).'Enum'); + ->name($prefix.ucfirst($this->getName()).'Enum'); $this->request->registerType($this->type->getName(), $this->type); } diff --git a/src/Builders/Field.php b/src/Builders/Field.php index e5cbca14..19d5d228 100644 --- a/src/Builders/Field.php +++ b/src/Builders/Field.php @@ -21,7 +21,6 @@ class Field extends BaseBuilder { function __construct(Request $request, string $name) { $this->request = $request; $this->name = $name; - $this->boot(); } protected function boot() { @@ -53,6 +52,7 @@ function createInputObjectType($name): InputSchema { } function getConfig() { + $this->boot(); $type = $this->getTypeConfig(); if ($this->isList) { diff --git a/src/Builders/HasArgumentsAttribute.php b/src/Builders/HasArgumentsAttribute.php index cf710b9c..27a9c2f9 100644 --- a/src/Builders/HasArgumentsAttribute.php +++ b/src/Builders/HasArgumentsAttribute.php @@ -74,13 +74,13 @@ function addDateArgument($name): Argument { return $this->addArgument($name)->type($this->request->getType('Timestamp')); } - function addEnumArgument($name): EnumField { + function addEnumArgument($name, $prefix=''): EnumField { if (is_a($name, CraftField::class)) { - return $this->arguments[] = (new EnumField($this->request, $name->handle)) + return $this->arguments[] = (new EnumField($this->request, $name->handle, $prefix)) ->description($name->instructions); } - return $this->arguments[] = (new EnumField($this->request, $name)); + return $this->arguments[] = (new EnumField($this->request, $name, $prefix)); } function getArguments(): array { diff --git a/src/Builders/InputSchema.php b/src/Builders/InputSchema.php index 7cfe2c67..2bb66057 100644 --- a/src/Builders/InputSchema.php +++ b/src/Builders/InputSchema.php @@ -11,7 +11,7 @@ class InputSchema extends BaseBuilder { protected static $objects; - function __construct($request, $name) { + function __construct($request, $name=null) { $this->request = $request; $this->name = $name; } @@ -40,7 +40,12 @@ function createInputObjectType($name): InputSchema { return $inputSchema; } + function boot() { + + } + function getArguments() { + $this->boot(); $this->bootBehaviors(); return $this->getArgumentConfig(); } diff --git a/src/Builders/Schema.php b/src/Builders/Schema.php index 0ecbb366..5a8029c8 100644 --- a/src/Builders/Schema.php +++ b/src/Builders/Schema.php @@ -128,13 +128,13 @@ function addFloatField($field): BaseField { return $this->addField($field)->type(Type::float()); } - function addEnumField($field): BaseField { + function addEnumField($field, $prefix=''): BaseField { if (is_a($field, CraftField::class)) { - return $this->fields[] = (new EnumField($this->request, $field->handle)) + return $this->fields[] = (new EnumField($this->request, $field->handle, $prefix)) ->description($field->instructions); } - return $this->fields[] = new EnumField($this->request, $field); + return $this->fields[] = new EnumField($this->request, $field, $prefix); } function addDateField($field): BaseField { diff --git a/src/Builders/UnionField.php b/src/Builders/UnionField.php index b0eed4a3..c35008ef 100644 --- a/src/Builders/UnionField.php +++ b/src/Builders/UnionField.php @@ -5,10 +5,13 @@ use GraphQL\Type\Definition\Type; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\UnionType; +use markhuot\CraftQL\Request; class UnionField extends Field { - function boot() { + function __construct(Request $request, string $name) { + parent::__construct($request, $name); + $this->type = (new Union($this->request)) ->name(ucfirst($this->getName()).'Union'); $this->request->registerType($this->type->getName(), $this->type); diff --git a/src/Events/GetFieldSchema.php b/src/Events/GetFieldSchema.php index 514fb1df..c065a467 100644 --- a/src/Events/GetFieldSchema.php +++ b/src/Events/GetFieldSchema.php @@ -38,4 +38,11 @@ class GetFieldSchema extends Event { */ public $mutation; + /** + * Whether the event should continue to the default field handler + * + * @var bool + */ + public $preventDefault = false; + } \ No newline at end of file diff --git a/src/Listeners/GetAssetsFieldSchema.php b/src/Listeners/GetAssetsFieldSchema.php index def9256b..e33327ca 100644 --- a/src/Listeners/GetAssetsFieldSchema.php +++ b/src/Listeners/GetAssetsFieldSchema.php @@ -20,7 +20,7 @@ class GetAssetsFieldSchema * @return void */ function handle(GetFieldSchema $event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; $schema = $event->schema; diff --git a/src/Listeners/GetCategoriesFieldSchema.php b/src/Listeners/GetCategoriesFieldSchema.php index c156b057..d86709ec 100644 --- a/src/Listeners/GetCategoriesFieldSchema.php +++ b/src/Listeners/GetCategoriesFieldSchema.php @@ -16,7 +16,7 @@ class GetCategoriesFieldSchema * @return void */ function handle(GetFieldSchema $event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; diff --git a/src/Listeners/GetColorFieldSchema.php b/src/Listeners/GetColorFieldSchema.php index ed318f0c..0e3f301a 100644 --- a/src/Listeners/GetColorFieldSchema.php +++ b/src/Listeners/GetColorFieldSchema.php @@ -15,7 +15,7 @@ class GetColorFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $color = $event->schema->createObjectType('Color'); $color->addStringField('hex')->resolve(function (ColorData $root) { return $root->getHex(); }); diff --git a/src/Listeners/GetDateFieldSchema.php b/src/Listeners/GetDateFieldSchema.php index d0fceaa8..c4d63f08 100644 --- a/src/Listeners/GetDateFieldSchema.php +++ b/src/Listeners/GetDateFieldSchema.php @@ -14,7 +14,7 @@ class GetDateFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $event->schema->addDateField($event->sender); diff --git a/src/Listeners/GetDefaultFieldSchema.php b/src/Listeners/GetDefaultFieldSchema.php index d46067c7..d640a7ef 100644 --- a/src/Listeners/GetDefaultFieldSchema.php +++ b/src/Listeners/GetDefaultFieldSchema.php @@ -12,7 +12,9 @@ class GetDefaultFieldSchema * @return void */ function handle($event) { - $event->handled = true; + if ($event->preventDefault) { + return; + } $event->schema->addStringField($event->sender); $event->query->addStringArgument($event->sender); diff --git a/src/Listeners/GetEntriesFieldSchema.php b/src/Listeners/GetEntriesFieldSchema.php index 3422e3e8..7859630f 100644 --- a/src/Listeners/GetEntriesFieldSchema.php +++ b/src/Listeners/GetEntriesFieldSchema.php @@ -15,7 +15,7 @@ class GetEntriesFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $request = $event->schema->request; $field = $event->sender; diff --git a/src/Listeners/GetImagerFieldSchema.php b/src/Listeners/GetImagerFieldSchema.php new file mode 100644 index 00000000..9c95124c --- /dev/null +++ b/src/Listeners/GetImagerFieldSchema.php @@ -0,0 +1,36 @@ +preventDefault = true; + + $craftField = $event->sender; + $schema = $event->schema; + + /** @var Field $field */ + $field = $schema->addField($craftField) + ->lists() + ->type(ImagerTransformedImages::class) + ->name("{$craftField->handle}Imager") + ->resolve(function ($root, $args, $context, $info) use ($craftField) { + return $root->{$craftField->handle}->all(); + }); + + } + +} \ No newline at end of file diff --git a/src/Listeners/GetLightswitchFieldSchema.php b/src/Listeners/GetLightswitchFieldSchema.php index c80bc60d..1781e880 100644 --- a/src/Listeners/GetLightswitchFieldSchema.php +++ b/src/Listeners/GetLightswitchFieldSchema.php @@ -14,7 +14,7 @@ class GetLightswitchFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $event->schema->addBooleanField($event->sender); $event->query->addBooleanArgument($event->sender); diff --git a/src/Listeners/GetMatrixFieldSchema.php b/src/Listeners/GetMatrixFieldSchema.php index 3dbb78a1..b6fed83b 100644 --- a/src/Listeners/GetMatrixFieldSchema.php +++ b/src/Listeners/GetMatrixFieldSchema.php @@ -17,7 +17,7 @@ class GetMatrixFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; $schema = $event->schema; diff --git a/src/Listeners/GetNumberFieldSchema.php b/src/Listeners/GetNumberFieldSchema.php index f570df67..8dbacbef 100644 --- a/src/Listeners/GetNumberFieldSchema.php +++ b/src/Listeners/GetNumberFieldSchema.php @@ -13,7 +13,7 @@ class GetNumberFieldSchema * @return void */ function handle(GetFieldSchema $event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; diff --git a/src/Listeners/GetPositionSelectFieldSchema.php b/src/Listeners/GetPositionSelectFieldSchema.php index 57704257..9440ab46 100644 --- a/src/Listeners/GetPositionSelectFieldSchema.php +++ b/src/Listeners/GetPositionSelectFieldSchema.php @@ -13,7 +13,7 @@ class GetPositionSelectFieldSchema * @return void */ function handle(GetFieldSchema $event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; $schema = $event->schema; diff --git a/src/Listeners/GetRedactorFieldSchema.php b/src/Listeners/GetRedactorFieldSchema.php index 1f298273..5b77475e 100644 --- a/src/Listeners/GetRedactorFieldSchema.php +++ b/src/Listeners/GetRedactorFieldSchema.php @@ -13,7 +13,7 @@ class GetRedactorFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $outputSchema = static::type($event->schema); diff --git a/src/Listeners/GetSelectMultipleFieldSchema.php b/src/Listeners/GetSelectMultipleFieldSchema.php index b824b9b6..fea60cc7 100644 --- a/src/Listeners/GetSelectMultipleFieldSchema.php +++ b/src/Listeners/GetSelectMultipleFieldSchema.php @@ -17,7 +17,7 @@ class GetSelectMultipleFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $craftField = $event->sender; diff --git a/src/Listeners/GetSelectOneFieldSchema.php b/src/Listeners/GetSelectOneFieldSchema.php index 12aa5bc8..3e27b4e9 100644 --- a/src/Listeners/GetSelectOneFieldSchema.php +++ b/src/Listeners/GetSelectOneFieldSchema.php @@ -16,7 +16,7 @@ class GetSelectOneFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; diff --git a/src/Listeners/GetSuperTableFieldSchema.php b/src/Listeners/GetSuperTableFieldSchema.php index b9c5b0d0..478aa5b9 100644 --- a/src/Listeners/GetSuperTableFieldSchema.php +++ b/src/Listeners/GetSuperTableFieldSchema.php @@ -13,7 +13,7 @@ class GetSuperTableFieldSchema * @return void */ function handle(GetFieldSchema $event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; diff --git a/src/Listeners/GetTableFieldSchema.php b/src/Listeners/GetTableFieldSchema.php index d2458fc8..e61fb2ff 100644 --- a/src/Listeners/GetTableFieldSchema.php +++ b/src/Listeners/GetTableFieldSchema.php @@ -14,7 +14,7 @@ class GetTableFieldSchema * @return void */ function handle(GetFieldSchema $event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; $schema = $event->schema; diff --git a/src/Listeners/GetTagsFieldSchema.php b/src/Listeners/GetTagsFieldSchema.php index d384d839..0d2388c9 100644 --- a/src/Listeners/GetTagsFieldSchema.php +++ b/src/Listeners/GetTagsFieldSchema.php @@ -15,7 +15,7 @@ class GetTagsFieldSchema * @return void */ function handle(GetFieldSchema $event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; $schema = $event->schema; diff --git a/src/Listeners/GetUsersFieldSchema.php b/src/Listeners/GetUsersFieldSchema.php index d0409a66..faa0737c 100644 --- a/src/Listeners/GetUsersFieldSchema.php +++ b/src/Listeners/GetUsersFieldSchema.php @@ -13,7 +13,7 @@ class GetUsersFieldSchema * @return void */ function handle($event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; if (!$event->query->getRequest()->token()->can('query:users')) { diff --git a/src/Listeners/GetVideosFieldSchema.php b/src/Listeners/GetVideosFieldSchema.php index 6bf8eb25..5e00e868 100644 --- a/src/Listeners/GetVideosFieldSchema.php +++ b/src/Listeners/GetVideosFieldSchema.php @@ -15,7 +15,7 @@ class GetVideosFieldSchema * @return void */ function handle(GetFieldSchema $event) { - $event->handled = true; + $event->preventDefault = true; $field = $event->sender; $schema = $event->schema; diff --git a/src/Types/ImagerColorBlendEffect.php b/src/Types/ImagerColorBlendEffect.php new file mode 100644 index 00000000..8c3d6e08 --- /dev/null +++ b/src/Types/ImagerColorBlendEffect.php @@ -0,0 +1,14 @@ +addStringArgument('color'); + $this->addFloatArgument('opacity'); + } + +} \ No newline at end of file diff --git a/src/Types/ImagerLevelsEffect.php b/src/Types/ImagerLevelsEffect.php new file mode 100644 index 00000000..66904f60 --- /dev/null +++ b/src/Types/ImagerLevelsEffect.php @@ -0,0 +1,16 @@ +addFloatArgument('blackPoint'); + $this->addFloatArgument('gamma'); + $this->addFloatArgument('whitePoint'); + $this->addEnumArgument('channel', 'Imager')->values(['red', 'green', 'blue']); + } + +} \ No newline at end of file diff --git a/src/Types/ImagerPlaceholder.php b/src/Types/ImagerPlaceholder.php new file mode 100644 index 00000000..10393f71 --- /dev/null +++ b/src/Types/ImagerPlaceholder.php @@ -0,0 +1,13 @@ +addStringField('url'); + } + +} \ No newline at end of file diff --git a/src/Types/ImagerPosterizeEffect.php b/src/Types/ImagerPosterizeEffect.php new file mode 100644 index 00000000..8bb5e401 --- /dev/null +++ b/src/Types/ImagerPosterizeEffect.php @@ -0,0 +1,14 @@ +addFloatArgument('levels'); + $this->addEnumArgument('dither', 'Imager')->values(['no', 'riemersma', 'floydsteinberg']); + } + +} \ No newline at end of file diff --git a/src/Types/ImagerTintEffect.php b/src/Types/ImagerTintEffect.php new file mode 100644 index 00000000..d9874fce --- /dev/null +++ b/src/Types/ImagerTintEffect.php @@ -0,0 +1,13 @@ +addStringArgument('color'); + } + +} \ No newline at end of file diff --git a/src/Types/ImagerTransformedImageModel.php b/src/Types/ImagerTransformedImageModel.php new file mode 100644 index 00000000..f7100524 --- /dev/null +++ b/src/Types/ImagerTransformedImageModel.php @@ -0,0 +1,19 @@ +addStringField('url'); + $this->addStringField('path'); + $this->addStringField('extension'); + $this->addStringField('mimetype'); + $this->addStringField('width'); + $this->addStringField('height'); + $this->addStringField('size'); + } + +} \ No newline at end of file diff --git a/src/Types/ImagerTransformedImages.php b/src/Types/ImagerTransformedImages.php new file mode 100644 index 00000000..73e77529 --- /dev/null +++ b/src/Types/ImagerTransformedImages.php @@ -0,0 +1,131 @@ +addField('images') + ->type(ImagerTransformedImageModel::class) + ->lists() + ->resolve(function (Asset $asset, $args, $context, $info) { + if (empty($args['transforms'])) { + throw new UserError('You must specify the `transforms:` argument with Imager'); + } + + foreach ($args['transforms'] as &$transform) { + + if (!empty($transform['effects']['colorBlend'])) { + $transform['effects']['colorBlend'] = array_values($transform['effects']['colorBlend']); + } + + if (!empty($transform['effects']['tint'])) { + foreach ($transform['effects']['tint'] as &$tint) { + $tint = @$tint['color']; + } + } + + if (!empty($transform['effects']['posterize'])) { + $transform['effects']['posterize'] = [ + @$transform['effects']['posterize']['levels'], + @$transform['effects']['posterize']['dither'] + ]; + } + + if (!empty($transform['effects']['levels'])) { + $transform['effects']['levels'] = [ + @$transform['effects']['levels']['blackPoint'], + @$transform['effects']['levels']['gamma'], + @$transform['effects']['levels']['whitePoint'], + @$transform['effects']['levels']['channel'], + ]; + } + + if (empty($transform['ignoreFocalPoint']) && $asset->hasFocalPoint) { + $transform['position'] = $asset->getFocalPoint(true); + } + + } + + return Imager::$plugin->imager->transformImage($asset, $args['transforms']); + }); + + /** @var InputSchema $transforms */ + $transforms = $this->createInputObjectType('ImagerTransformOptions'); + $imagesField->addArgument('transforms')->nonNull()->type($transforms)->lists(); + $transforms->addEnumArgument('format', 'Imager')->values(['jpg', 'png', 'gif', 'webp']); + $transforms->addIntArgument('width'); + $transforms->addIntArgument('height'); + $transforms->addFloatArgument('ratio'); + $transforms->addStringArgument('position'); + $transforms->addBooleanArgument('ignoreFocalPoint'); + $transforms->addEnumArgument('mode', 'Imager')->values(['crop', 'fit', 'stretch', 'croponly', 'letterbox']); + $transforms->addFloatArgument('cropZoom'); + $transforms->addStringArgument('frames'); + $transforms->addIntArgument('jpegQuality'); + $transforms->addIntArgument('pngCompressionLevel'); + $transforms->addIntArgument('webpQuality'); + $transforms->addBooleanArgument('allowUpscale'); + $transforms->addEnumArgument('resizeFilter', 'Imager')->values(['point', 'box', 'triangle', 'hermite', 'hanning', 'hamming', 'blackman', 'gaussian', 'quadratic', 'cubic', 'catrom', 'mitchell', 'lanczos', 'bessel', 'sinc']); + $transforms->addEnumArgument('interlace', 'Imager')->values(['none', 'line', 'plane', 'partition']); + + $watermark = $transforms->createInputObjectType('ImagerWatermark'); + $transforms->addArgument('watermark')->type($watermark); + $watermark->addStringArgument('image'); + $watermark->addIntArgument('width'); + $watermark->addIntArgument('height'); + $watermark->addIntArgument('opacity'); + $watermark->addEnumArgument('blendMode', 'Imager')->values(['blend', 'darken', 'lighten', 'modulate', 'multiply', 'overlay', 'screen']); + + $watermarkPosition = $watermark->createInputObjectType('ImagerWatermarkPosition'); + $watermark->addArgument('position')->type($watermarkPosition); + $watermarkPosition->addIntArgument('left'); + $watermarkPosition->addIntArgument('right'); + $watermarkPosition->addIntArgument('top'); + $watermarkPosition->addIntArgument('bottom'); + + $effects = $transforms->createInputObjectType('ImagerEffects'); + $transforms->addArgument('effects')->type($effects); + $transforms->addArgument('preEffects')->type($effects); + $effects->addBooleanArgument('grayscale'); + $effects->addBooleanArgument('negative'); + $effects->addFloatArgument('blur'); + $effects->addBooleanArgument('sharpen'); + $effects->addFloatArgument('gamma'); + $effects->addStringArgument('colorize'); + $effects->addArgument('colorBlend')->type(ImagerColorBlendEffect::class); + $effects->addArgument('tint')->type(ImagerTintEffect::class)->lists(); + $effects->addIntArgument('sepia'); + $effects->addFloatArgument('contrast'); + $effects->addIntArgument('modulate')->lists(); + $effects->addBooleanArgument('normalize'); + $effects->addFloatArgument('contrastStretch')->lists(); + $effects->addArgument('posterize')->type(ImagerPosterizeEffect::class); + $effects->addFloatArgument('unsharpMask')->lists(); + $effects->addStringArgument('clut'); + $effects->addIntArgument('quantize')->lists(); + $effects->addArgument('levels')->type(ImagerLevelsEffect::class); + + $placeholderField = $this->addStringField('placeholder') + ->resolve(function (Asset $asset, $args) { + $config = array_merge($args, [ + 'source' => $asset->getPath(), + ]); + return Imager::$plugin->placeholder->placeholder($config); + }); + + $placeholderField->addEnumArgument('type', 'Imager')->values(['svg', 'gif', 'silhouette']); + $placeholderField->addIntArgument('width'); + $placeholderField->addIntArgument('height'); + $placeholderField->addStringArgument('color'); + $placeholderField->addStringArgument('fgColor'); + $placeholderField->addStringArgument('size'); + $placeholderField->addEnumArgument('silhouetteType', 'Imager')->values(['curve']); + } + +} \ No newline at end of file diff --git a/src/events.php b/src/events.php index a571c010..04898aa1 100644 --- a/src/events.php +++ b/src/events.php @@ -4,6 +4,7 @@ \craft\fields\Assets::class => [ 'craftQlGetFieldSchema' => [ new \markhuot\CraftQL\Listeners\GetAssetsFieldSchema, + new \markhuot\CraftQL\Listeners\GetImagerFieldSchema, ], ], \craft\fields\Categories::class => [