JS Days 2025 is now live – Join 5,000+ devs for the premier virtual JavaScript event. Register Now

Top Support Tips

March 4, 2016 1585 Views
Show

Grid Watermarking

by Kevin Cassidy

The Ext JS grid is a great tool for presenting information in a handy layout. Some users may want to print this information for use in meetings or promotional materials. However, you may find yourself in a situation where you’d like to be able to watermark the grid content as copyrighted, confidential, or branded in some fashion.

This can be easily achieved in Ext JS grids by specifying a style to apply to the grid, and incorporating some simple CSS tricks.

Grid Watermarking

The key to achieving this effect is to change the styling of a grid cell, and to introduce a background to the grid that has an opacity that does not obscure the grid content.

To do this, begin by creating a new class for grid styling. For this example, we will call this style ‘watermark’, and it will be used by the ‘cls’ grid configuration:

cls: ‘watermark’

Now you can start defining the CSS responsible for creating the watermark effect.

By default, all grid cells have a background color of white. The first step in this task is to change the cells, so their background is transparent. To do this, we first define a CSS selector including the ‘watermark’ class to make grid cells transparent:

.watermark .x-grid-item {
background: transparent !important;
}

The next step is to create the watermark itself.

.watermark .x-grid-body:before {
content: ' ';
display: block;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 1;
opacity: 0.1;
background: url(http://url.to.watermark.jpg) center !important; 
background-size: cover !important;
}    

The above style inserts content before the grid body and positions it to completely cover the grid content. The content of this element is empty but a background image is applied, centered, and configured to fill the element entirely. The opacity above is set at 0.1 (10%), but this can be adjusted to suit your requirements.

Note: Depending on your client and its capabilities, the specification of the opacity and background image properties (especially for older IE versions) may need to be changed accordingly. Printing of background images may also need to be manually enabled during the printing process.


Instances on Class Definition

by Tristan Lee

Every so often, we see reports of users trying to create multiple instances of a component, but the additional instances are failing for an unknown reason. The first instance works, but why not the rest? Let’s take a look at a common scenario of a grid:

Ext.define('SimpsonGrid', {
    extend: 'Ext.grid.Panel',
    alias: 'widget.simpsongrid',

    width: 400,
    height: 400,
    store: {
        type: 'users'
    },

    columns: [{
        text: 'First Name',
        dataIndex: 'firstname'
    }, {
        text: 'Last Name',
        dataIndex: 'lastname'
    }],

    plugins: [Ext.create('Ext.grid.plugin.RowExpander', {
        rowBodyTpl: '
Row content

‘ })] });

Here, we are defining a simple grid that uses a RowExpander plugin to display content in a second row body. This is common for displaying additional details for a specific record. Let’s assume our application requires multiple instances of this grid to show the information in different views. This is where we have the potential to run into trouble.

An instance of the RowExpander class is applied to the prototype of the SimpsonGrid class. This means that all instances of the SimpsonGrid class will now reference the same plugin instance. This will certainly cause issues when trying to expand a row body on your first grid instance. You may even see that it affects the second instance instead.

To avoid this, use a config object and let the framework handle instancing:

plugins: [{
     ptype: 'rowexpander',
     rowBodyTpl: '
Row content

‘ }]

Now, each instance of the grid will have its own instance of the plugin. To view the negative effects of sharing the plugin instance, observe the behavior in this example fiddle.


Creating Builds with Sencha Cmd Compile

by Fred Moseley

With most applications, you will use sencha app build to compile your application’s JavaScript. While this is sufficient for the vast majority of scenarios, there are situations in which you need more control over your compilation and want to go beyond the standard processing.

For example, let’s say you have multiple applications within a workspace for which you want to create a single app.js file that includes the necessary files for all the applications. Alternatively, you may want to create a custom build of the framework with only the required framework classes for these multiple applications. In these scenarios, you can use sencha compile.

Compiling Application Code

The following response file will create an optimal build of your application source myapp.js and only the framework classes that it requires.

compile
    #comma delimited list of paths to the app folders of the 
    #applications you want to use to create custom framework.js
    #also include any other paths you include in your applications classpath in app.json
    -classpath=app,app.js

    #transitive/recursive union with the classes 
    #required by your application
    union
        -r
        -namespace=MyAppName

    and

    #remove development mode preprocessor directives/warnings
    -debug=false

    concat
        #Compresses the source file using the YUI
        -yui

        #Strips comments from the output file, but preserves whitespace
        -strip

        #output filename
        -out=myapp.js

You can create a response file with this command. Let’s call the file compile.cfg. The response file can be executed with the following command:

sencha @compile.cfg

The resulting myapp.js file should contain all the needed classes for the application(s).

Response files are covered in the Advanced Sencha Cmd guide.

Compiling Required Framework Classes

Using the exclude option, you can easily modify this response file to contain just your application source or just the framework.

The following will create a file called framework.js with just the necessary framework files to run your application.

compile
    -classpath=app,app.js
    union
        -r
        -namespace=MyAppName
    and

    #exclude the application namespace
    exclude
        -namespace=MyAppName

    and
    -debug=false
    concat
        -yui
        -strip
        -out=framework.js

Recommended Articles

Guide to Estimating ROI When Switching From DIY Libraries to Full Software Development Platforms Like Ext JS

Teams started with Do It Yourself, or DIY, JavaScript tools like jQuery and Bootstrap. But those fall apart as projects scale. Scattered code, user interface…

Top Frameworks Developers Are Using for Custom Software Development in 2025

We’re seeing it more every year; teams aren’t settling for plug-and-play tools anymore. In healthcare, finance, logistics, and other data-heavy industries, there’s a clear shift.…

Meet Sencha AI Coding Companion: Your AI-Powered Assistant for Faster Ext JS Development

Building modern web applications should be exciting. But too often, developers find themselves buried in documentation, endlessly Googling framework quirks, or stuck solving the same…

Ext JS 7.9 & Rapid Ext JS V1.1 Have Arrived

The Sencha team is excited to announce the latest Ext JS version 7.9 and Rapid Ext JS 1.1 release – designed to accelerate development, enhance…

Top 10 JS Grid Customization Tips for a Better UI Experience

Grids are pretty much everywhere in web apps. Working with financial sheets, product details, or users? Then you’ve probably used a JavaScript grid. It makes…

Why Ext JS Framework is the Go-To Framework for Building Scalable and Data-Intensive Web Apps

Web apps are much more advanced now. They deal with large amounts of data and need to stay fast, even with many users. If you’re…

View More

Trusted by Top Developers: Learn how to enhance your development journey — for free

Get the latest newsletter keeping thousands of developers in the loop.

Loved by developers at