panel-form.mustache revision 84765788c559bfdead67172a79759ac60c77231b
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen<div class="intro">
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm <p>This example demonstrates how to set up and instantiate Y.Panel to take advantage of its nested modality and header/footer button support. In this example, we create a simple datatable with some basic information that is updated and removed through a modal form with some custom buttons.</p>
dcc400ef5bae04887b791ab8bb365c09db81eaf2johanengelen</div>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<div class="example">
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm <style type="text/css">
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm {{>panel-form-css-source}}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm </style>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm {{>panel-form-html-source}}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm <script type="text/javascript">
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm {{>panel-form-js-source}}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm </script>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm</div>
5209a05743e62584a7ec6afe050ffb0223f899f8johanengelen
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen<h2>Creating a modal form using Panels</h2>
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen
dda97aeba7480d08320ebceecae13b8531db1b81johanengelen<h3>Setting Up The YUI Instance</h3>
61a2c985ffaddfaac2bf15af97fe79c0d02ce4d0johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p>To create an instance of a Panel on your page, the only module you need to request is the `panel` module. The `panel` module will pull in the `widget`, `widget-stack`, `widget-position`, `widget-position-align`, `widget-position-constrain`, `widget-stdmod`, `widget-buttons`, `widget-modality` and `widget-autohide` extensions it uses.</p>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p>For this example, we also use the YUI3 Datatable, and the Drag plugin to make the panels draggable. This requires us to also request the `datatable-base` and `dd-plugin` modules in our use statement.
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm```
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmYUI({...}).use("panel", "datatable-base", "dd-plugin", function(Y) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // We'll write example code here where we have Y.Datatable, Y.Plugin.Drag and Y.Panel available
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm});
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm```
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p>Note, using the `panel` module, will also pull down the default CSS required for panel. The CSS that styles the Panel requires you to have the class `yui3-skin-sam` on a parent element, commonly the `<body>` tag.</p>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<h3>Creating a Panel From Markup</h3>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p>For this example, we'll need two panel instances. The first will be created through markup, while the second will be created through JavaScript (just to illustrate the differences). The code snippet below is the markup for our modal form. It consists of a fieldset with a couple of `<input>` boxes. The `yui3-widget-bd` class is not required, but tells the Panel that this content goes in the body of the widget.</p>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm```
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<div id="panelContent">
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm <div class="yui3-widget-bd">
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm <form>
e2c729e5eabb411c2d82911c427d6bc8df2e6ea0buliabyak <fieldset>
ca216080e46a0592cff832a87d2ab9ebd38095ebjoelholdsworth <p><label for="id">ID</label><br/>
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen <input type="text" name="id" id="productId" placeholder=""></p>
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen <p><label for="name">Name</label><br/>
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen <input type="text" name="name" id="name" value="" placeholder=""></p>
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen <p><label for="password">Price</label><br/>
e2c729e5eabb411c2d82911c427d6bc8df2e6ea0buliabyak <input type="text" name="price" id="price" value="" placeholder="$"></p>
e2c729e5eabb411c2d82911c427d6bc8df2e6ea0buliabyak </fieldset>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm </form>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm </div>
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen```
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen<p>The container DIV with id="panelContent" is specified as the contentBox for the Panel instance, and during instantiation, the panel will look for DIV's marked with the `yui3-widget-hd, yui3-widget-bd, yui3-widget-ft` classes to setup the Overlay's header, body and footer content attributes.</p>
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<h3>Instantiating the Parent Panel</h3>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p>To create a panel instance, we use the panel constructor `Y.Panel`. We can pass in some additional configuration attributes such as `modal`, `headerContent`, and `centered`. We can make the panel draggable by adding the `Y.Plugin.Drag` plugin.</p>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p>After creating the panel instance, we invoke `panel.render()` to update the DOM to reflect the current state of the panel.</p>
cd8e8082c747cc529d5bf595b4102e88224a1811Krzysztof Kosiński
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm```
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvar panel = new Y.Panel({
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm srcNode: "#panelContent",
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm width: 250,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm centered: true,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm visible: false,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm modal:true,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm headerContent: "Add A New Product",
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm plugins: [Y.Plugin.Drag]
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm});
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
ecda720053ff791e35dae3c5c1177bc225b6cdf1johanengelenpanel.render();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm```
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen<h3>Adding Footer buttons to the Panel</h3>
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen<p>The parent panel has two buttons in the footer, "Add Item" and "Remove All Items". We add these buttons through the `addButton()` method present on the Y.Panel instance. For each button, we specify an `action` function, which will be called when the button is clicked, and a `section` property that specifies whether it should get rendered in the header or the footer.</p>
f358fb039ddd7cb6716a4120d93071ac62283a00johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm```
8001ba81cb851b38d86650a2fef5817facffb763johanengelenpanel.addButton(
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould value: "Add Item",
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould action: function(e) {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould e.preventDefault();
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould addItem(); //this method adds a record to the datatable
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould },
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould section: Y.WidgetStdMod.FOOTER
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen);
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelenpanel.addButton(
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen {
d05f5e48661e499738feca18812be9462f8fa73ejohanengelen value: "Remove All Items",
d05f5e48661e499738feca18812be9462f8fa73ejohanengelen action: function(e) {
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen e.preventDefault();
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen removeAllItemsConfirm();
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen },
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen section: Y.WidgetStdMod.FOOTER
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen }
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen);
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen```
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen<h3>Creating the nested Panel through JavaScript</h3>
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen<p>In the example, clicking the "Remove all items" button renders a nested confirmation panel. Since Y.Panel implements the `Y.WidgetStack` and `Y.WidgetModality` extensions, creating nested panels are easy to do for the developer. The nested panel code is as follows:</p>
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen```
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelenvar nestedPanel = new Y.Panel({
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen bodyContent: "Are you sure you want to remove all items?",
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen zIndex: 5, //We set a z-index higher than the parent's z-index
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen centered:true,
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen width:400,
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen modal:true,
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen //We add the "Yes" and "No" buttons
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen buttons: [
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen {
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen value: "Yes",
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen action : function(e) {
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen e.preventDefault();
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen nestedPanel.hide();
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen panel.hide();
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen removeItems(); //this method removes all data from the datatable
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen },
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen section: Y.WidgetStdMod.FOOTER
afb717c6e7d29c86c404b6627855c438d6dc2c0fjohanengelen },
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen {
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen value: "No",
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen action: function(e) {
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen e.preventDefault();
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen nestedPanel.hide();
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen },
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen section: Y.WidgetStdMod.FOOTER
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen }
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen ]
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen});
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelennestedPanel.render('#nestedPanel');
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen```
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen<p>In this case, we pass in an array of buttons to the `buttons` attribute. As a result, the nested panel does not have the close button in the top-right corner.</p>
9bddaf7172a6bb788ccae3ba5a30599d63acf424johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<h3>CSS: Panel Look/Feel</h3>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p>The panel.css Sam Skin file (build/panel/assets/skins/sam/panel.css) provides the default functional CSS for the panel. In addition, an image file (build/panel/assets/skins/sam/sprite_icons.gif) provides the icons for the "close" button.</p>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm<p><strong>NOTE:</strong> As discussed on the Widget landing page, all widgets are enclosed in 2 containing elements - the boundingBox is the outer(most) element, and the contentBox is the inner element into which the widget's content is added. It is advised to apply any look/feel CSS for the widget to the content box and it's children. This leaves the bounding box without padding/borders, allowing for consistent positioning/sizing across box models.</p>
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen<h2>Complete Example Source</h2>
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen```
a69e3ca5fcc8acacf862c577620d75f472d58cecjohanengelen <style type="text/css">
a69e3ca5fcc8acacf862c577620d75f472d58cecjohanengelen {{>panel-form-css-source}}
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen </style>
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen {{>panel-form-html-source}}
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen
afb717c6e7d29c86c404b6627855c438d6dc2c0fjohanengelen <script type="text/javascript">
afb717c6e7d29c86c404b6627855c438d6dc2c0fjohanengelen {{>panel-form-js-source}}
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen </script>
dda97aeba7480d08320ebceecae13b8531db1b81johanengelen```
8bb95fe13ab4a36335f43c5633243b777d4ddbadjohanengelen