Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Object grid] Quantity value filter #5211

Merged
17 changes: 9 additions & 8 deletions bundles/AdminBundle/Helper/GridHelperService.php
Expand Up @@ -145,6 +145,7 @@ public function getFilterCondition($filterJson, ClassDefinition $class): string
if ($filterJson) {
$db = \Pimcore\Db::get();
$filters = json_decode($filterJson, true);

foreach ($filters as $filter) {
$operator = '=';

Expand All @@ -153,14 +154,6 @@ public function getFilterCondition($filterJson, ClassDefinition $class): string

if ($filter['type'] == 'string') {
$operator = 'LIKE';
} elseif ($filter['type'] == 'numeric') {
if ($filterOperator == 'lt') {
$operator = '<';
} elseif ($filterOperator == 'gt') {
$operator = '>';
} elseif ($filterOperator == 'eq') {
$operator = '=';
}
} elseif ($filter['type'] == 'date') {
if ($filterOperator == 'lt') {
$operator = '<';
Expand All @@ -175,6 +168,14 @@ public function getFilterCondition($filterJson, ClassDefinition $class): string
} elseif ($filter['type'] == 'boolean') {
$operator = '=';
$filter['value'] = (int)$filter['value'];
} else {
if ($filterOperator == 'lt') {
$operator = '<';
} elseif ($filterOperator == 'gt') {
$operator = '>';
} elseif ($filterOperator == 'eq') {
$operator = '=';
}
}

$field = $class->getFieldDefinition($filterField);
Expand Down
Expand Up @@ -173,6 +173,107 @@ pimcore.object.tags.quantityValue = Class.create(pimcore.object.tags.abstract, {
};
},

getGridColumnFilter: function (field) {
if(typeof Ext.grid.filters.filter.QuantityValue === 'undefined') {
Ext.define('Ext.grid.filters.filter.QuantityValue', {
extend: 'Ext.grid.filters.filter.Number',
alias: 'grid.filter.quantityValue',
type: 'quantityValue',
constructor: function(config) {
var me = this;
me.callParent([
config
]);

this.store = config.store;
this.defaultUnit = config.defaultUnit;
},
createMenu: function () {
var me = this;
me.callParent();

var cfg = {
xtype: 'combo',
name: 'unit',
labelClsExtra: Ext.baseCSSPrefix + 'grid-filters-icon pimcore_nav_icon_quantityValue',
queryMode: 'local',
editable: false,
forceSelection: true,
hideEmptyLabel: false,
store: this.store,
value: this.defaultUnit,
valueField: 'id',
displayField: 'abbreviation',
margin: 0,
listeners: {
change: function (field) {
var me = this;

me.onValueChange(field, {
RETURN: 1,
getKey: function () {
return null;
}
});

var value = {};
if(me.filter) {
for(var i in me.filter) {
if (this.filter[i].getValue() !== null) {
value[i] = me.filter[i].getValue()[0][0];
}
}
}

me.setValue(value);
}.bind(this)
}
};
if (me.getItemDefaults()) {
cfg = Ext.merge({}, me.getItemDefaults(), cfg);
}

me.menu.insert(0, '-');
me.fields.unit = me.menu.insert(0, cfg);
},
setValue: function (value) {
var me = this;
var unitId = me.fields.unit.getValue();

for (var i in value) {
value[i] = [[value[i], unitId]];
}

me.callParent([value]);
},
showMenu: function (menuItem) {
this.callParent([menuItem]);

for (var i in this.filter) {
if (this.filter[i].getValue() !== null) {
this.fields[i].setValue(this.filter[i].getValue()[0][0]);
}
}
}
});
}

var store = new Ext.data.JsonStore({
autoDestroy: true,
root: 'data',
fields: ['id', 'abbreviation']
});
pimcore.helpers.quantityValue.initUnitStore(function(data) {
store.loadData(data.data);
}, field.layout.validUnits);

return {
type: 'quantityValue',
dataIndex: field.key,
store: store,
defaultUnit: field.layout.defaultUnit
};
},

getLayoutShow: function () {
this.getLayoutEdit();
Expand Down
Expand Up @@ -115,7 +115,7 @@ Ext.define('pimcore.filters', {
var type = column.filter.type;
var theFilter = column.filter.filter;

if (type == "date" || type == "numeric") {
if (column.filter instanceof Ext.grid.filters.filter.TriFilter) {
theFilter.lt.config.type = type;
theFilter.gt.config.type = type;
theFilter.eq.config.type = type;
Expand Down
43 changes: 43 additions & 0 deletions models/DataObject/ClassDefinition/Data/QuantityValue.php
Expand Up @@ -18,9 +18,11 @@

use Pimcore\Cache;
use Pimcore\Cache\Runtime;
use Pimcore\Db;
use Pimcore\Logger;
use Pimcore\Model;
use Pimcore\Model\DataObject\ClassDefinition\Data;
use Pimcore\Model\DataObject\QuantityValue\UnitConversionService;

class QuantityValue extends Data implements ResourcePersistenceAwareInterface, QueryResourcePersistenceAwareInterface
{
Expand Down Expand Up @@ -640,4 +642,45 @@ public static function __set_state($data)

return $obj;
}

public function getFilterCondition($value, $operator, $params = [])
{
/** @var UnitConversionService $converter */
$converter = \Pimcore::getContainer()->get(UnitConversionService::class);

$filterValue = $value[0];
$filterUnit = Model\DataObject\QuantityValue\Unit::getById($value[1]);

if(!$filterUnit instanceof Model\DataObject\QuantityValue\Unit) {
return '0';
}

$filterQuantityValue = new Model\DataObject\Data\QuantityValue($filterValue, $filterUnit->getId());

$baseUnit = $filterUnit->getBaseunit() ?? $filterUnit;

$unitListing = new Model\DataObject\QuantityValue\Unit\Listing();
$unitListing->setCondition('baseunit='.Db::get()->quote($baseUnit->getId()).' OR id='.Db::get()->quote($filterUnit->getId()));

$conditions = [];
foreach($unitListing->load() as $unit) {
$convertedQuantityValue = $converter->convert($filterQuantityValue, $unit);

$conditions[] = '('.
$this->getFilterConditionExt(
$convertedQuantityValue->getValue(),
$operator,
['name' => $this->getName().'__value']
).
' AND '.
$this->getFilterConditionExt(
$convertedQuantityValue->getUnitId(),
'=',
['name' => $this->getName().'__unit']
).
')';
}

return implode(' OR ', $conditions);
}
}
12 changes: 12 additions & 0 deletions models/DataObject/QuantityValue/DefaultConverter.php
Expand Up @@ -17,15 +17,27 @@ public function convert(QuantityValue $quantityValue, Unit $toUnit): QuantityVal
if ($fromBaseUnit === null) {
$fromUnit = clone $fromUnit;
$fromBaseUnit = $fromUnit;
}

if($fromUnit->getFactor() === null) {
$fromUnit->setFactor(1);
}

if($fromUnit->getConversionOffset() === null) {
$fromUnit->setConversionOffset(0);
}

$toBaseUnit = $toUnit->getBaseunit();
if ($toBaseUnit === null) {
$toUnit = clone $toUnit;
$toBaseUnit = $toUnit;
}

if($toUnit->getFactor() === null) {
$toUnit->setFactor(1);
}

if($toUnit->getConversionOffset() === null) {
$toUnit->setConversionOffset(0);
}

Expand Down