Skip to content

Commit

Permalink
[Object grid] Quantity value filter (#5211)
Browse files Browse the repository at this point in the history
* quantity value filter

* quantity value filter

* quantity value filter

* server-side filtering

* server-side filtering

* SQL fix

* code simplification

* filter input value should only show value (not unit id)

* only show valid units

* remove commented code

* remove unnecessary code

* provide unit store as config option

* filter on unit change
  • Loading branch information
BlackbitDevs authored and weisswurstkanone committed Jan 14, 2020
1 parent 47f868a commit 144ade9
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 9 deletions.
17 changes: 9 additions & 8 deletions bundles/AdminBundle/Helper/GridHelperService.php
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 @@ -642,4 +644,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
Original file line number Diff line number Diff line change
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

0 comments on commit 144ade9

Please sign in to comment.