{lang: 'hu'}

Adódott ma a feladat, hogy a gridemben a jobb helykihasználtság érdekében át kéne alakítani a sorok megjelenítését. A korábbi megjelenés egy klasszikus grid sor megjelenése volt, egy sor, több oszloppal. Azonban van egy oszlopom, amelyben egy tömb elemeit kell megjeleníteni, jellemzően 4-5 elemmel (legalább) a tömbben. Arra gondoltam, hogy az adat megérkezésekor az egyes elemeket több sorra bontom fel, azaz:


this.F4GridStore = Ext.create('Ext.data.Store', {
    pageSize: 100,
    fields: [
        { name: 'documentId' },
        { name: 'workNumber' },
        { name: 'dispositionNumbers', convert: function(v) { return v.join('<br />'); } },
        { name: 'orderNumber' },
        { name: 'plannedTimeOfStoringFrom', type: 'date', dateFormat: __('DATABASE_DATE_FORMAT') },
        { name: 'plannedTimeOfStoringTo', type: 'date', dateFormat: __('DATABASE_DATE_FORMAT')   },
        { name: 'partnerName' },
        { name: 'nameOfGoods' },
        { name: 'quantity', type: 'float' },
        { name: 'percentage', type: 'float' },
        { name: 'status', type: 'int' },
        { name: 'version' }
    ]
    // ...

Sajnos ezzel a megoldással több probléma is van (legalábbis ExtJS 4.0.7 alatt):

  • 8-10 elem esetén nagyon magas sorok keletkeznek, ez nem túl szép látványilag. Illetve a sorok egységes magassága is ki van lőve ezzel a megoldással. Mondjuk ez már csak szőrszálhasogatás!
  • Valami bug van a gépezetben, ugyanis ha elrejtem a sok soros oszlopot a teljes sor magassága változatlan marad. Ez azt jelenti, hogy hiába van az összes többi oszlopban 1 sornyi magas szöveg, a teljes sor akár 8-10 sor magas is lehet, a dispositionNumbers mező számosságától függően.

Másodjára azt az ötletemet próbáltam ki, ami eredetileg elsőre jutott az eszembe. Ennek a megvalósítása kicsit bonyolultabb és én nagyon lusta vagyok, ezért maradt meg ez másodiknak. 😀 Arra gondoltam, hogy egy sor legyen valójában több sor. A dispositionNumbers oszlopot kiszedem az oszlopok közül és beteszem az eredeti sor után egy újabb sorba (sortörés helyett vesszővel összefűzve az elemeket). Szerencsére az ExtJS-nek van erre beépített megoldása (bár nincs agyonreklámozva), így nem kellett hackelni. A megoldást az Ext.grid.feature.RowBody feature nyújtja. A kód a következőképp néz ki:

this.F4GridStore = Ext.create('Ext.data.Store', {
    pageSize: 100,
    fields: [
        { name: 'documentId' },
        { name: 'workNumber' },
        { name: 'dispositionNumbers' },
        { name: 'orderNumber' },
        { name: 'plannedTimeOfStoringFrom', type: 'date', dateFormat: __('DATABASE_DATE_FORMAT') },
        { name: 'plannedTimeOfStoringTo', type: 'date', dateFormat: __('DATABASE_DATE_FORMAT')   },
        { name: 'partnerName' },
        { name: 'nameOfGoods' },
        { name: 'quantity', type: 'float' },
        { name: 'percentage', type: 'float' },
        { name: 'status', type: 'int' },
        { name: 'version' }
    ],
    proxy: {
        type: 'ajax',
        url : __('SERVICES_BASE_URL') + '/transportToStore/list',
        reader: {
            type: 'json',
            root: 'data',
            totalProperty: 'totalCount'
        }
    }
});

this.F4GridFeatures = [{
    ftype: 'rowbody',
    getAdditionalData: function(data, idx, record, orig) {
        var headerCt = this.view.headerCt,
            colspan  = headerCt.getColumnCount();
        
        // Mindenképp egy ilyen objektummal kell visszatérni, különben az ext nem veszi figyelembe a visszatérési értéket
        return {
            rowBody: __('DASHBOARD-031') + ': ' + record.get('dispositionNumbers').join(', '),
            rowBodyCls: this.rowBodyCls,
            rowBodyColspan: colspan
        };
    }
}];

// ...

this.F4Grid = Ext.create('Ext.grid.Panel', {
    // ...
    store: this.F4GridStore,
    columns: this.F4GridColumns,
    features: this.F4GridFeatures,
    // ...
});