SlideShare una empresa de Scribd logo
1 de 55
Developing Components
and Extensions for Ext JS
2010 Mats Bryntse
About me
{
name : ”Mats Bryntse”,
extForumAlias: ’mankz’,
age : 33,
from: ”Helsingborg, Sweden”,
usingExtSince : 2007,
creatorOf: [”Ext Scheduler”, ”Ext Gantt”],
twitter : ”@extscheduler”
}
Agenda
* What is an Ext extension?
* Extension vs override vs plugin.
* Solve a simple silly problem in 3 ways
* Create a clock plugin, Ext.ux.Clock
* 10 Do’s and Dont’s when creating a
UX
What is an Ext JS
extension?
An extension is a reusable component,
normally derived from an existing Ext JS class.
Let’s look at some popular community
extensions.
Some popular community
extensions
// By Saki
Ext.ux.form.LovCombo = Ext.extend(Ext.form.ComboBox, {
});
// By MindPatterns
Ext.ux.grid.livegrid.GridPanel =
Ext.extend(Ext.grid.GridPanel, { });
// By Condor
Ext.ux.data.PagingStore = Ext.extend(Ext.data.Store, { });
Extensions don’t have to involve UI.
Terminology
* Extension : Create a new class with added
or modified behavior
* Override : Globally alter the behavior of an
existing class (useful for patching etc).
* Plugin : Augment and add behavior to an
Ext.Component instance (but not tied to a class)
Buttons that explode
when clicked are
way cool !!!
Real world scenario
Client:
Client is always right
3 ways of solving this ”real world
problem”:
* Create an extension (a new class)
* Override Ext.Button globally
* Create a plugin
Let’s create a simple
extension!
Using Ext.Button as the base class
seems reasonable.
First let’s take a look at Ext.extend
Ext.extend
Ext.extend(Function superclass, Object overrides
) : Function
* The overrides end up on the prototype of your
new class (shared between all instances).
PuffButton extension
PuffButton = Ext.extend(Ext.Button, {
constructor: function(config) {
// Remember to call base class method
PuffButton.superclass.constructor.apply(this,
arguments);
// Add listener for the button ’click’ event
this.on('click', function() { this.el.puff(); }, this);
}
});
Let’s try it out in Firebug!
PuffButton = Ext.extend(Ext.Button, {
constructor: function(config) {
// Must call base class method
PuffButton.superclass.constructor.apply(this, arguments);
// Add listener for the button ’click’ event
this.on('click', function() { this.el.puff(); }, this);
}
});
new PuffButton ({width:130, text: "Puff", renderTo :
Ext.getBody()});
Ext.extend review
We extended an existing Ext class to
create our own class encapsulating new
behaviour.
Let’s do the same with an
override
// Will affect all Buttons globally
Ext.override(Ext.Button, {
onClick :
Ext.Button.prototype.onClick.createSequence(function(){
this.el.puff();
})
});
new Ext.Button ({width : 130, text: "Override Puff", renderTo :
Ext.getBody()});
Ext.override review
* We used Ext.override to alter the
behavior of an existing class.
* Any instances created before or after
our override are affected.
Last step, let’s do the
same with a plugin
A plugin is any type of object that has
an init method.
var myPlugin = {
init : function(cmp) {
alert(’Hello world’);
}
};
Let’s do the same with a
plugin
Puffable = function() {
this.init = function(cmp) {
cmp.on("afterrender", function() {
this.el.on("click", this.el.puff, this.el);
});
};
};
// Augment a button
new Ext.Button ({text: "Plugin Puff", renderTo : Ext.getBody(),
plugins : new Puffable() });
// Augment a Panel
new Ext.Panel({ height : 300, width: 300, title : "Puff Plugin",
renderTo : Ext.getBody(), plugins : new Puffable()});
Plugin review
We used the plugin concept to add
functionality to a single instance of an
existing class.
Note: The plugin itself is not tied to a
specific class (though will only work on
an Ext.Component)
Let’s create something
useful instead
Goal: Create an analog clock extension.
We’ll use Raphael to visualize the clock
hands
Download the source from the Ext forums:
http://www.sencha.com/forum/showthread.php?115907
Step 1 – Choose a
suitable base class
* We want to be able to use the clock inside a
Panel or Window etc. => Ext.Component.
* We want the clock to be able to have any size
=> Ext.BoxComponent
* We don’t really need support for toolbars,
headers, buttons etc. => Ext.Panel.
Introduction to
Ext.BoxComponent
* Base class of most UI widgets in Ext JS
(GridPanel, TabPanel, TextField etc...)
* Base class for any Component that is to
be sized as a box, using width and height.
Ext.Component Life
Cycle & Template
Methods
* Initialization (constructor, initComponent)
- Configuration, setup etc...
* Rendering (onRender, afterRender)
- Add additional elements and styling here
* Destruction (onDestroy)
- Clean up after yourself, destroy elements etc.
Step 2 – Create folders
and a simple skeleton
Step 3 – Create a simple
skeleton with stubs
Ext.ns('Ext.ux');
Ext.ux.Clock = Ext.extend(Ext.BoxComponent, {
afterRender : function() {
// Call superclass
Ext.ux.Clock.superclass.afterRender.apply(this, arguments);
},
onDestroy : function() {
// Call superclass
Ext.ux.Clock.superclass.onDestroy.apply(this, arguments);
}
});
ext.ux.clock.js
Step 4 – Create simple
example HTML page
<html>
<head>
<!--Ext lib and UX components-->
...
<script type="text/javascript">
Ext.onReady(function(){
var clock = new Ext.ux.Clock({
height:150,
width:150
});
clock.render(Ext.getBody());
});
</script>
</head>
index.html
Step 5 – Create elements
afterRender : function() { // The component is now rendered and has an ’el’
var size = Math.min(this.getHeight(), this.getWidth());
// Background image of an empty clock with no hands
this.bgEl = this.el.createChild({
tag : 'img',
cls : 'ext-ux-clock-img',
src : this.clockBgUrl,
width : size,
height : size
});
// Initialize a Raphael canvas for drawing the hands
this.canvas = Raphael(this.el.dom, size, size);
this.drawHands();
this.on('resize', this.handleResize, this);
this.timer = setInterval(this.drawHands.createDelegate(this), 1000);
Ext.ux.Clock.superclass.afterRender.apply(this, arguments);
}
Step 6 – Draw hands
drawHands : function() {
var size = Math.min(this.getHeight(), this.getWidth())
date = new Date(),
secs = date.getSeconds(),
mins = date.getMinutes(),
hrs = date.getHours(),
canvas = this.canvas;
canvas.clear();
canvas.path(...); // Draw minute hand
canvas.path(...); // Draw hour hand
canvas.path(...); // Draw second hand
}
Let’s run it
Step 7 – Use a
background image
Step 8 – Polish with
CSS3
.ext-ux-clock-img
{
border:3px solid lightgrey;
-moz-border-radius:100%;
-webkit-border-radius: 100%;
-o-border-radius: 100%;
border-radius: 100%;
-moz-box-shadow:1px 1px 13px rgba(114, 114, 114, 0.8);
-webkit-box-shadow:1px 1px 13px rgba(114, 114, 114, 0.8);
-o-box-shadow:1px 1px 13px rgba(114, 114, 114, 0.8);
box-shadow:1px 1px 13px rgba(114, 114, 114, 0.8);
background:#222333 url(../images/glow.png) no-repeat center center;
}
Step 8 – Polished result
Step 9 – Resize Support
handleResize : function(me, newWidth, newHeight) {
var size = Math.min(newWidth, newHeight);
this.bgEl.setSize(size, size, true); // true to animate
this.canvas.setSize(size, size); // Resize Raphael canvas
this.drawHands(); // Clears canvas and redraws
}
Let’s make sure the clock is resizable.
Step 9 – Let’s try out the
resizing in an
Ext.Window
Step 10 – Don’t forget to
clean up after yourself!
onDestroy : function() {
clearInterval(this.timer);
this.canvas.clear();
Ext.destroy(this.bgImg, this.innerEl);
// Call superclass
Ext.ux.Clock.superclass.onDestroy.apply(this, arguments);
}
Bonus step: World Clock
10 Do’s and Don’ts when
creating an Ext extension
Here is a list of some things to think
about when creating your extension.
10
?Why?
! Other developers will have a better chance of
understanding (and maintaining) your code.
Additionally, the Ext JS source contains lots of
best practices.
1. Follow Ext JS coding
patterns
var w = 100;
var h = 40;
var s = 0;
if (doCalculate)
s = w * h;
var width = 100,
height = 40,
area = 0;
if (doCalculate) {
area = width *
height;
}
1. Follow Ext JS coding
patterns
2. Design classes for
configurability
?Why?
! It will allow your class to be easily configured
without the use of huge overrides. This concept is
seen throughout all of Ext JS.
MyTip = Ext.extend(Ext.Tooltip, {
onMouseLeave: function(){
this.el.fadeOut(200);
}
}
2. Design classes for
configurability
MyTip = Ext.extend(Ext.Tooltip, {
fadeDuration: 200,
onMouseLeave : function(){
this.el.fadeOut(this.fadeDuration);
}
}
3. Make key functionality
easily overridable
?Why?
! It will allow your class to be easily altered
without the use of huge overrides. This concept is
seen throughout all of Ext JS.
initComponent : function(){
this.tpl = new Ext.XTemplate(
”<div>{foo}</div>”
);
// ....
}
3. Make key functionality
easily overridable
initComponent : function(){
if (!this.tpl) {
this.tpl = new Ext.XTemplate(
'<div>{foo}</div>”
);
}
// ....
}
4. Make classes
localizable
?Why?
! Because you know your boss will ask about
localization support at some point.
MyClass = Ext.extend(Ext.Toolbar, {
constructor: function() {
this.add({
text : 'No data to display’
});
....
});
4. Make classes
localizable
MyClass = Ext.extend(Ext.Toolbar, {
noDataText : 'No data to display’,
constructor: function() {
this.add({
text : this.noDataText
});
});
});
5. Use a syntax checker
?Why?
! Helps you find global variable leaks, extra
commas etc. Use JsLint or JavaScriptLint
(beware, JsLint WILL hurt your feelings).
?Why?
! Because noone likes memory leaks. Override
the onDestroy method to clean up any additional
elements, event listeners etc...
6. Clean up after yourself
MyPanel = Ext.extend(Ext.Panel, {
constructor: function() {
this.someEl = new
Ext.Element();
},
....
});
MyPanel = Ext.extend(Ext.Panel, {
constructor: function() {
this.someEl = new Ext.Element();
},
onDestroy: function() {
this.someEl.destroy();
// Call superclass destroy method...
}
});
6. Clean up after yourself
?Why?
! Because you (or someone else) may want to
make use of the lazy instantiation mechanism
provided by Ext.
7. Define an xtype
MyPanel = Ext.extend(Ext.Panel, {
constructor: function() {
// ...
}
});
MyPanel = Ext.extend(Ext.Panel, {
constructor: function() {
// ...
}
});
Ext.reg(’mypanel’, MyPanel);
7. Define an xtype
?Why?
! Because other developers will likely read your
code. By using the JSDoc syntax you can
generate beautiful documentation looking like the
Ext online API (using Ext-Doc).
8. Document your
extension
MyClass =
Ext.extend(Ext.Panel, {
// ...
});
/**
* @class MyClass
* @extends Ext.Panel
* @constructor
* @param {Object} config The cfg
object
*/
MyClass = Ext.extend(Ext.Panel, {
// ...
});
8. Document your
extension
?Why?
!Noone likes bugs. Some examples:
* What happens if you include multiple instances
of your extension?
* What happens when it’s destroyed? Any leaked
DOM nodes etc?
9. Test edge cases
?Why?
! You might not care, but everyone that wants to
use your extension in a production environment
will (should) care.
10. Include a license
Additional resources
• Sencha Learning Center:
http://www.sencha.com/learn/Ext_2_Overview
• Saki’s Blog:
http://blog.extjs.eu/know-how/extension-or-
plugin/
Questions?
mats@ext-scheduler.com

Más contenido relacionado

Similar a Developing Components and Extensions for Ext JS

Creating Ext JS Extensions and Components
Creating Ext JS Extensions and ComponentsCreating Ext JS Extensions and Components
Creating Ext JS Extensions and ComponentsSencha
 
Developing components and extensions for ext js
Developing components and extensions for ext jsDeveloping components and extensions for ext js
Developing components and extensions for ext jsMats Bryntse
 
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...Sencha
 
Four Ways to add Features to Ext JS
Four Ways to add Features to Ext JSFour Ways to add Features to Ext JS
Four Ways to add Features to Ext JSShea Frederick
 
Tech Talk: App Functionality (Android)
Tech Talk: App Functionality (Android)Tech Talk: App Functionality (Android)
Tech Talk: App Functionality (Android)Lifeparticle
 
RIA - Entwicklung mit Ext JS
RIA - Entwicklung mit Ext JSRIA - Entwicklung mit Ext JS
RIA - Entwicklung mit Ext JSDominik Jungowski
 
SenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
SenchaCon 2016: Modernizing the Ext JS Class System - Don GriffinSenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
SenchaCon 2016: Modernizing the Ext JS Class System - Don GriffinSencha
 
Sencha Roadshow 2017: Modernizing the Ext JS Class System and Tooling
Sencha Roadshow 2017: Modernizing the Ext JS Class System and ToolingSencha Roadshow 2017: Modernizing the Ext JS Class System and Tooling
Sencha Roadshow 2017: Modernizing the Ext JS Class System and ToolingSencha
 
Gdc09 Minigames
Gdc09 MinigamesGdc09 Minigames
Gdc09 MinigamesSusan Gold
 
The java swing_tutorial
The java swing_tutorialThe java swing_tutorial
The java swing_tutorialsumitjoshi01
 

Similar a Developing Components and Extensions for Ext JS (20)

Creating Ext JS Extensions and Components
Creating Ext JS Extensions and ComponentsCreating Ext JS Extensions and Components
Creating Ext JS Extensions and Components
 
Developing components and extensions for ext js
Developing components and extensions for ext jsDeveloping components and extensions for ext js
Developing components and extensions for ext js
 
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
 
Four Ways to add Features to Ext JS
Four Ways to add Features to Ext JSFour Ways to add Features to Ext JS
Four Ways to add Features to Ext JS
 
Ext oo
Ext ooExt oo
Ext oo
 
Tech Talk: App Functionality (Android)
Tech Talk: App Functionality (Android)Tech Talk: App Functionality (Android)
Tech Talk: App Functionality (Android)
 
RIA - Entwicklung mit Ext JS
RIA - Entwicklung mit Ext JSRIA - Entwicklung mit Ext JS
RIA - Entwicklung mit Ext JS
 
SenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
SenchaCon 2016: Modernizing the Ext JS Class System - Don GriffinSenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
SenchaCon 2016: Modernizing the Ext JS Class System - Don Griffin
 
Sencha Roadshow 2017: Modernizing the Ext JS Class System and Tooling
Sencha Roadshow 2017: Modernizing the Ext JS Class System and ToolingSencha Roadshow 2017: Modernizing the Ext JS Class System and Tooling
Sencha Roadshow 2017: Modernizing the Ext JS Class System and Tooling
 
Ext JS Introduction
Ext JS IntroductionExt JS Introduction
Ext JS Introduction
 
CORE JAVA-2
CORE JAVA-2CORE JAVA-2
CORE JAVA-2
 
ExtJS framework
ExtJS frameworkExtJS framework
ExtJS framework
 
ExtJs Basic Part-1
ExtJs Basic Part-1ExtJs Basic Part-1
ExtJs Basic Part-1
 
Custom components
Custom componentsCustom components
Custom components
 
Gdc09 Minigames
Gdc09 MinigamesGdc09 Minigames
Gdc09 Minigames
 
Android Threading
Android ThreadingAndroid Threading
Android Threading
 
The java swing_tutorial
The java swing_tutorialThe java swing_tutorial
The java swing_tutorial
 
The java rogramming swing _tutorial for beinners(java programming language)
The java rogramming swing _tutorial for beinners(java programming language)The java rogramming swing _tutorial for beinners(java programming language)
The java rogramming swing _tutorial for beinners(java programming language)
 
Eclipse Tricks
Eclipse TricksEclipse Tricks
Eclipse Tricks
 
Gui
GuiGui
Gui
 

Último

DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 

Último (20)

DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 

Developing Components and Extensions for Ext JS

  • 1. Developing Components and Extensions for Ext JS 2010 Mats Bryntse
  • 2. About me { name : ”Mats Bryntse”, extForumAlias: ’mankz’, age : 33, from: ”Helsingborg, Sweden”, usingExtSince : 2007, creatorOf: [”Ext Scheduler”, ”Ext Gantt”], twitter : ”@extscheduler” }
  • 3. Agenda * What is an Ext extension? * Extension vs override vs plugin. * Solve a simple silly problem in 3 ways * Create a clock plugin, Ext.ux.Clock * 10 Do’s and Dont’s when creating a UX
  • 4. What is an Ext JS extension? An extension is a reusable component, normally derived from an existing Ext JS class. Let’s look at some popular community extensions.
  • 5. Some popular community extensions // By Saki Ext.ux.form.LovCombo = Ext.extend(Ext.form.ComboBox, { }); // By MindPatterns Ext.ux.grid.livegrid.GridPanel = Ext.extend(Ext.grid.GridPanel, { }); // By Condor Ext.ux.data.PagingStore = Ext.extend(Ext.data.Store, { }); Extensions don’t have to involve UI.
  • 6. Terminology * Extension : Create a new class with added or modified behavior * Override : Globally alter the behavior of an existing class (useful for patching etc). * Plugin : Augment and add behavior to an Ext.Component instance (but not tied to a class)
  • 7. Buttons that explode when clicked are way cool !!! Real world scenario Client:
  • 8. Client is always right 3 ways of solving this ”real world problem”: * Create an extension (a new class) * Override Ext.Button globally * Create a plugin
  • 9. Let’s create a simple extension! Using Ext.Button as the base class seems reasonable. First let’s take a look at Ext.extend
  • 10. Ext.extend Ext.extend(Function superclass, Object overrides ) : Function * The overrides end up on the prototype of your new class (shared between all instances).
  • 11. PuffButton extension PuffButton = Ext.extend(Ext.Button, { constructor: function(config) { // Remember to call base class method PuffButton.superclass.constructor.apply(this, arguments); // Add listener for the button ’click’ event this.on('click', function() { this.el.puff(); }, this); } });
  • 12. Let’s try it out in Firebug! PuffButton = Ext.extend(Ext.Button, { constructor: function(config) { // Must call base class method PuffButton.superclass.constructor.apply(this, arguments); // Add listener for the button ’click’ event this.on('click', function() { this.el.puff(); }, this); } }); new PuffButton ({width:130, text: "Puff", renderTo : Ext.getBody()});
  • 13. Ext.extend review We extended an existing Ext class to create our own class encapsulating new behaviour.
  • 14. Let’s do the same with an override // Will affect all Buttons globally Ext.override(Ext.Button, { onClick : Ext.Button.prototype.onClick.createSequence(function(){ this.el.puff(); }) }); new Ext.Button ({width : 130, text: "Override Puff", renderTo : Ext.getBody()});
  • 15. Ext.override review * We used Ext.override to alter the behavior of an existing class. * Any instances created before or after our override are affected.
  • 16. Last step, let’s do the same with a plugin A plugin is any type of object that has an init method. var myPlugin = { init : function(cmp) { alert(’Hello world’); } };
  • 17. Let’s do the same with a plugin Puffable = function() { this.init = function(cmp) { cmp.on("afterrender", function() { this.el.on("click", this.el.puff, this.el); }); }; }; // Augment a button new Ext.Button ({text: "Plugin Puff", renderTo : Ext.getBody(), plugins : new Puffable() }); // Augment a Panel new Ext.Panel({ height : 300, width: 300, title : "Puff Plugin", renderTo : Ext.getBody(), plugins : new Puffable()});
  • 18. Plugin review We used the plugin concept to add functionality to a single instance of an existing class. Note: The plugin itself is not tied to a specific class (though will only work on an Ext.Component)
  • 19. Let’s create something useful instead Goal: Create an analog clock extension. We’ll use Raphael to visualize the clock hands Download the source from the Ext forums: http://www.sencha.com/forum/showthread.php?115907
  • 20. Step 1 – Choose a suitable base class * We want to be able to use the clock inside a Panel or Window etc. => Ext.Component. * We want the clock to be able to have any size => Ext.BoxComponent * We don’t really need support for toolbars, headers, buttons etc. => Ext.Panel.
  • 21. Introduction to Ext.BoxComponent * Base class of most UI widgets in Ext JS (GridPanel, TabPanel, TextField etc...) * Base class for any Component that is to be sized as a box, using width and height.
  • 22. Ext.Component Life Cycle & Template Methods * Initialization (constructor, initComponent) - Configuration, setup etc... * Rendering (onRender, afterRender) - Add additional elements and styling here * Destruction (onDestroy) - Clean up after yourself, destroy elements etc.
  • 23. Step 2 – Create folders and a simple skeleton
  • 24. Step 3 – Create a simple skeleton with stubs Ext.ns('Ext.ux'); Ext.ux.Clock = Ext.extend(Ext.BoxComponent, { afterRender : function() { // Call superclass Ext.ux.Clock.superclass.afterRender.apply(this, arguments); }, onDestroy : function() { // Call superclass Ext.ux.Clock.superclass.onDestroy.apply(this, arguments); } }); ext.ux.clock.js
  • 25. Step 4 – Create simple example HTML page <html> <head> <!--Ext lib and UX components--> ... <script type="text/javascript"> Ext.onReady(function(){ var clock = new Ext.ux.Clock({ height:150, width:150 }); clock.render(Ext.getBody()); }); </script> </head> index.html
  • 26. Step 5 – Create elements afterRender : function() { // The component is now rendered and has an ’el’ var size = Math.min(this.getHeight(), this.getWidth()); // Background image of an empty clock with no hands this.bgEl = this.el.createChild({ tag : 'img', cls : 'ext-ux-clock-img', src : this.clockBgUrl, width : size, height : size }); // Initialize a Raphael canvas for drawing the hands this.canvas = Raphael(this.el.dom, size, size); this.drawHands(); this.on('resize', this.handleResize, this); this.timer = setInterval(this.drawHands.createDelegate(this), 1000); Ext.ux.Clock.superclass.afterRender.apply(this, arguments); }
  • 27. Step 6 – Draw hands drawHands : function() { var size = Math.min(this.getHeight(), this.getWidth()) date = new Date(), secs = date.getSeconds(), mins = date.getMinutes(), hrs = date.getHours(), canvas = this.canvas; canvas.clear(); canvas.path(...); // Draw minute hand canvas.path(...); // Draw hour hand canvas.path(...); // Draw second hand }
  • 29. Step 7 – Use a background image
  • 30. Step 8 – Polish with CSS3 .ext-ux-clock-img { border:3px solid lightgrey; -moz-border-radius:100%; -webkit-border-radius: 100%; -o-border-radius: 100%; border-radius: 100%; -moz-box-shadow:1px 1px 13px rgba(114, 114, 114, 0.8); -webkit-box-shadow:1px 1px 13px rgba(114, 114, 114, 0.8); -o-box-shadow:1px 1px 13px rgba(114, 114, 114, 0.8); box-shadow:1px 1px 13px rgba(114, 114, 114, 0.8); background:#222333 url(../images/glow.png) no-repeat center center; }
  • 31. Step 8 – Polished result
  • 32. Step 9 – Resize Support handleResize : function(me, newWidth, newHeight) { var size = Math.min(newWidth, newHeight); this.bgEl.setSize(size, size, true); // true to animate this.canvas.setSize(size, size); // Resize Raphael canvas this.drawHands(); // Clears canvas and redraws } Let’s make sure the clock is resizable.
  • 33. Step 9 – Let’s try out the resizing in an Ext.Window
  • 34. Step 10 – Don’t forget to clean up after yourself! onDestroy : function() { clearInterval(this.timer); this.canvas.clear(); Ext.destroy(this.bgImg, this.innerEl); // Call superclass Ext.ux.Clock.superclass.onDestroy.apply(this, arguments); }
  • 36. 10 Do’s and Don’ts when creating an Ext extension Here is a list of some things to think about when creating your extension. 10
  • 37. ?Why? ! Other developers will have a better chance of understanding (and maintaining) your code. Additionally, the Ext JS source contains lots of best practices. 1. Follow Ext JS coding patterns
  • 38. var w = 100; var h = 40; var s = 0; if (doCalculate) s = w * h; var width = 100, height = 40, area = 0; if (doCalculate) { area = width * height; } 1. Follow Ext JS coding patterns
  • 39. 2. Design classes for configurability ?Why? ! It will allow your class to be easily configured without the use of huge overrides. This concept is seen throughout all of Ext JS.
  • 40. MyTip = Ext.extend(Ext.Tooltip, { onMouseLeave: function(){ this.el.fadeOut(200); } } 2. Design classes for configurability MyTip = Ext.extend(Ext.Tooltip, { fadeDuration: 200, onMouseLeave : function(){ this.el.fadeOut(this.fadeDuration); } }
  • 41. 3. Make key functionality easily overridable ?Why? ! It will allow your class to be easily altered without the use of huge overrides. This concept is seen throughout all of Ext JS.
  • 42. initComponent : function(){ this.tpl = new Ext.XTemplate( ”<div>{foo}</div>” ); // .... } 3. Make key functionality easily overridable initComponent : function(){ if (!this.tpl) { this.tpl = new Ext.XTemplate( '<div>{foo}</div>” ); } // .... }
  • 43. 4. Make classes localizable ?Why? ! Because you know your boss will ask about localization support at some point.
  • 44. MyClass = Ext.extend(Ext.Toolbar, { constructor: function() { this.add({ text : 'No data to display’ }); .... }); 4. Make classes localizable MyClass = Ext.extend(Ext.Toolbar, { noDataText : 'No data to display’, constructor: function() { this.add({ text : this.noDataText }); }); });
  • 45. 5. Use a syntax checker ?Why? ! Helps you find global variable leaks, extra commas etc. Use JsLint or JavaScriptLint (beware, JsLint WILL hurt your feelings).
  • 46. ?Why? ! Because noone likes memory leaks. Override the onDestroy method to clean up any additional elements, event listeners etc... 6. Clean up after yourself
  • 47. MyPanel = Ext.extend(Ext.Panel, { constructor: function() { this.someEl = new Ext.Element(); }, .... }); MyPanel = Ext.extend(Ext.Panel, { constructor: function() { this.someEl = new Ext.Element(); }, onDestroy: function() { this.someEl.destroy(); // Call superclass destroy method... } }); 6. Clean up after yourself
  • 48. ?Why? ! Because you (or someone else) may want to make use of the lazy instantiation mechanism provided by Ext. 7. Define an xtype
  • 49. MyPanel = Ext.extend(Ext.Panel, { constructor: function() { // ... } }); MyPanel = Ext.extend(Ext.Panel, { constructor: function() { // ... } }); Ext.reg(’mypanel’, MyPanel); 7. Define an xtype
  • 50. ?Why? ! Because other developers will likely read your code. By using the JSDoc syntax you can generate beautiful documentation looking like the Ext online API (using Ext-Doc). 8. Document your extension
  • 51. MyClass = Ext.extend(Ext.Panel, { // ... }); /** * @class MyClass * @extends Ext.Panel * @constructor * @param {Object} config The cfg object */ MyClass = Ext.extend(Ext.Panel, { // ... }); 8. Document your extension
  • 52. ?Why? !Noone likes bugs. Some examples: * What happens if you include multiple instances of your extension? * What happens when it’s destroyed? Any leaked DOM nodes etc? 9. Test edge cases
  • 53. ?Why? ! You might not care, but everyone that wants to use your extension in a production environment will (should) care. 10. Include a license
  • 54. Additional resources • Sencha Learning Center: http://www.sencha.com/learn/Ext_2_Overview • Saki’s Blog: http://blog.extjs.eu/know-how/extension-or- plugin/