Commit 035bbee3851a9ec5ef21362cb84cab2579bd8a44

Authored by Luigi Serra
1 parent c011cd54

Datalets and controllets update with layout inputs

controllets/data-sevc-controllet/data-sevc-controllet.html
... ... @@ -47,6 +47,7 @@
47 47 <link rel="import" href="../items-slider-controllet/items-slider-controllet.html">
48 48 <link rel="import" href="../draggable-element-controllet/draggable-element-controllet.html">
49 49 <link rel="import" href="../treeview-controllet/treeview-controllet.html">
  50 +<link rel="import" href="../text-element-controllet/text-element-controllet.html">
50 51  
51 52 <!--
52 53 `data-sevc-controllet` is a controllet to generate visualization from a dataset accessible through api. A json response is required.
... ... @@ -253,6 +254,11 @@ Example:
253 254 height: 50vh;
254 255 }
255 256  
  257 + #idm_layout_main_container{
  258 + position: relative;
  259 + height: 25vh;
  260 + }
  261 +
256 262 paper-menu{
257 263 width: 100%;
258 264 }
... ... @@ -411,6 +417,13 @@ Example:
411 417 </div>
412 418 <div id="datalet_idm_fields_container" class="area_container"></div>
413 419 </div>
  420 +
  421 + <div id="idm_layout_main_container" class="area_container">
  422 + <div class="title">
  423 + <div class="medium">Layout fields</div>
  424 + </div>
  425 + <div id="idm_layout_container" class="area_container"></div>
  426 + </div>
414 427 </div>
415 428 </div>
416 429  
... ... @@ -470,6 +483,12 @@ Example:
470 483 */
471 484  
472 485 /**
  486 + * Received when the user change text value of the selected datalet layout inputs
  487 + *
  488 + * @event text-element-controllet_content-changed
  489 + */
  490 +
  491 + /**
473 492 * Fired when the user press to finish button. At this event are attached all information about the visualization currently created
474 493 *
475 494 * @event data-sevc-controllet.dataletCreated
... ... @@ -478,7 +497,8 @@ Example:
478 497 listeners : {
479 498 'items-slider-controllet_item-selected' : '_dataletSelected',
480 499 'draggable-element-controllet_content-dragged' : '_fieldsMapped',
481   - 'treeview-controllet-fileds-selected' : '_fieldsSelected'
  500 + 'treeview-controllet_fileds-selected' : '_fieldsSelected',
  501 + 'text-element-controllet_content-changed' : '_textElementChanged'
482 502 },
483 503  
484 504 properties : {
... ... @@ -555,6 +575,17 @@ Example:
555 575 value : []
556 576 },
557 577 /**
  578 + * It's used to store the params to give to datalet. This kind of params will not processed by selection step
  579 + *
  580 + * @attribute params_fields
  581 + * @type Object
  582 + * @default empty
  583 + */
  584 + params_fields:{
  585 + type: Object,
  586 + value: {}
  587 + },
  588 + /**
558 589 * It's used to store the tab index in the first pass
559 590 *
560 591 * @attribute DatasourceTabSelected
... ... @@ -577,7 +608,6 @@ Example:
577 608 type : Array,
578 609 value : []
579 610 }
580   -
581 611 },
582 612 /**
583 613 * It is called after the element’s template has been stamped and all elements inside the element’s local DOM have been configured (with values bound from parents, deserialized attributes, or else default values) and had their ready method called.
... ... @@ -593,6 +623,7 @@ Example:
593 623 $(this.$.fields_placeholder).perfectScrollbar();
594 624 $(this.$.selected_fields_main_container).perfectScrollbar();
595 625 $(this.$.idm_fields_main_container).perfectScrollbar();
  626 + $(this.$.idm_layout_main_container).perfectScrollbar();
596 627 $(this.$.table_fields_container).perfectScrollbar();
597 628  
598 629 },
... ... @@ -642,6 +673,7 @@ Example:
642 673  
643 674 var response = e.detail.response;
644 675 this.$.datalet_idm_fields_container.innerHTML = "";
  676 + this.$.idm_layout_container.innerHTML = "";
645 677  
646 678 if(response.idm.inputs.input.constructor == Object) {
647 679 var input = response.idm.inputs.input;
... ... @@ -658,6 +690,58 @@ Example:
658 690 }
659 691 }
660 692  
  693 + if(response.idm.inputs.layouts.input.constructor == Object) {
  694 + var input = response.idm.inputs.layouts.input;
  695 + this.$.idm_layout_container.innerHTML += '<text-element-controllet heading="' + input.name + '" description="' + input.description + '" number="1"></text-element-controllet>';
  696 + }else{
  697 + for(var i =0; i < response.idm.inputs.layouts.input.length; i++){
  698 + var input = response.idm.inputs.layouts.input[i];
  699 + this.$.idm_layout_container.innerHTML += '<text-element-controllet heading="' + input.name + '" ' +
  700 + 'description="' + input.description + '" ' +
  701 + 'number="' + (i+1) + '">' +
  702 + '</text-element-controllet>';
  703 + }
  704 +
  705 + }
  706 +
  707 + },
  708 + /**
  709 + * Generate the datalet preview when user mapped fields. it even retrieves the value of layout inputs values.
  710 + *
  711 + * @method generateDataletPreview
  712 + */
  713 + generateDataletPreview : function(){
  714 +
  715 + var input_mapped_fields = Polymer.dom(this.$.datalet_idm_fields_container).querySelectorAll('draggable-element-controllet[is-target=true]');
  716 + this.selected_fields = Array();
  717 +
  718 + for (var i = 0; i < input_mapped_fields.length; i++) {
  719 + if (input_mapped_fields[i].value != "") {
  720 + this.selected_fields.push(input_mapped_fields[i].value);
  721 + }
  722 + }
  723 +
  724 + var input_layouts_fields = Polymer.dom(this.$.idm_layout_container).querySelectorAll('text-element-controllet');
  725 + this.params_fields = {'data-url' : this.dataUrl};
  726 +
  727 + for (var i = 0; i < input_layouts_fields.length; i++) {
  728 + if (input_layouts_fields[i].value != "") {
  729 + this.params_fields[input_layouts_fields[i].heading] = input_layouts_fields[i].value;
  730 + }
  731 + }
  732 +
  733 +
  734 + var datalet_params ={
  735 + component : this.selected_datalet,
  736 + params : this.params_fields,
  737 + fields : this.selected_fields,
  738 + placeHolder : this.$.datalet_placeholder
  739 + };
  740 +
  741 +
  742 + ComponentService.deep_url = this.deepUrl;
  743 + ComponentService.getComponent(datalet_params);
  744 +
661 745 },
662 746 /**
663 747 * Validate the current pass in order to access to next one.
... ... @@ -804,30 +888,20 @@ Example:
804 888 */
805 889 _fieldsMapped : function(e){
806 890  
807   - var input_mapped_fields = Polymer.dom(this.$.datalet_idm_fields_container).querySelectorAll('draggable-element-controllet[is-target=true]');
808   - this.selected_fields = Array();
809   -
810   - for (var i = 0; i < input_mapped_fields.length; i++) {
811   - if (input_mapped_fields[i].value != "") {
812   - this.selected_fields.push(input_mapped_fields[i].value);
813   - }
814   - }
815   -
816   - var datalet_params ={
817   - component : this.selected_datalet,
818   - params :{
819   - 'data-url' : this.dataUrl
820   - },
821   - fields : this.selected_fields,
822   - placeHolder : this.$.datalet_placeholder
823   - };
824   -
825   -
826   - ComponentService.deep_url = this.deepUrl;
827   - ComponentService.getComponent(datalet_params);
  891 + this.generateDataletPreview();
828 892  
829 893 },
830 894 /**
  895 + * Callback related to event 'text-element-controllet_content-changed' fired by text-element-controllet when the user change the value of text
  896 + *
  897 + * @method _textElementChanged
  898 + *
  899 + * @param {Event} e
  900 + */
  901 + _textElementChanged : function(e){
  902 + this.generateDataletPreview();
  903 + },
  904 + /**
831 905 * Callback related to the drag operation in the dataUrl input area. It's used to delete previous value.
832 906 *
833 907 * @method _handleDatasourceDragOver
... ... @@ -846,7 +920,7 @@ Example:
846 920 */
847 921 _onFinish : function(e){
848 922  
849   - if(this.selected_fields.length == 0 || this.selected_datalet == ""){
  923 + if((this.selected_fields.length == 0) || this.selected_datalet == ""){
850 924 this.$.message.text = "You have to map the selected fields with datalets fields(by dragging) and select a datalet to export a new visualization.";
851 925 this.$.message.show();
852 926 return;
... ... @@ -854,7 +928,8 @@ Example:
854 928  
855 929 var data = {
856 930 dataUrl : this.dataUrl,
857   - fields : this.selected_fields,
  931 + params : this.params_fields,
  932 + fields : this.selected_fields,
858 933 datalet : this.selected_datalet
859 934 }
860 935  
... ...
controllets/datalet-selection-controllet/datalet-selection-controllet.html deleted
1   -<!--
2   -@group ROUTETOPA Polymer Core Elements
3   -
4   -The `select-visualization-form-controllet` is a slider container of elements.
5   -Pass to this component an array of components, a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll show a
6   -slider with all components initialized with data and query attributes
7   -
8   -### Code
9   -
10   -Example
11   -
12   -@class select-visualization-form-controllet
13   -
14   --->
15   -<link rel="import" href="../../bower_components/polymer/polymer.html">
16   -<link rel="import" href="../../bower_components/paper-input/paper-input.html">
17   -<link rel="import" href="../../bower_components/paper-button/paper-button.html">
18   -<link rel="import" href="../../bower_components/paper-dialog/paper-dialog.html">
19   -<link rel="import" href="../../bower_components/iron-ajax/iron-ajax.html">
20   -<link rel="import" href="../../bower_components/paper-toast/paper-toast.html">
21   -
22   -<dom-module id="datalet-selection-controllet">
23   - <template>
24   - <link rel="stylesheet" href="../shared_js/bootstrap-3.3.4-dist/css/bootstrap.paper.style.min.css">
25   - <link rel="stylesheet" href="../shared_js/bootstrap-toggle-master/css/bootstrap-toggle.min.css">
26   - <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
27   - <style is="custom-style">
28   - body {
29   - font-family: RobotoDraft, 'Helvetica Neue', Helvetica, Arial;
30   - font-size: 14px;
31   - margin: 0;
32   - padding: 24px;
33   - -webkit-tap-highlight-color: rgba(0,0,0,0);
34   - -webkit-touch-callout: none;
35   - }
36   -
37   - paper-input {
38   - width: 80%;
39   - }
40   -
41   - /*paper-dialog {
42   - position: fixed;
43   - top: 16px;
44   - right: 16px;
45   - width: 400px;
46   - height: 400px;
47   - }*/
48   -
49   - html /deep/ paper-dialog { /*::shadow #datalet_dialog_content*/
50   - /*position: fixed;
51   - top: 25%;
52   - left: 25%;
53   - bottom: 25%;
54   - right: 25%;
55   - margin: 0px;*/
56   - width: 90%;
57   - height: 95%;
58   - }
59   -
60   - /*Toggle style*/
61   - input.toggle {
62   - max-height: 0;
63   - max-width: 0;
64   - opacity: 0;
65   - }
66   - input.toggle + label {
67   - display: block;
68   - position: relative;
69   - box-shadow: inset 0 0 0px 1px #d5d5d5;
70   - text-indent: -5000px;
71   - height: 30px;
72   - width: 50px;
73   - border-radius: 15px;
74   - }
75   -
76   - input.toggle + label:before {
77   - content: "";
78   - position: absolute;
79   - display: block;
80   - height: 30px;
81   - width: 30px;
82   - top: 0;
83   - left: 0;
84   - border-radius: 15px;
85   - background: rgba(19, 191, 17, 0);
86   - -moz-transition: .25s ease-in-out;
87   - -webkit-transition: .25s ease-in-out;
88   - transition: .25s ease-in-out;
89   - }
90   -
91   - input.toggle + label:after {
92   - content: "";
93   - position: absolute;
94   - display: block;
95   - height: 30px;
96   - width: 30px;
97   - top: 0;
98   - left: 0px;
99   - border-radius: 15px;
100   - background: white;
101   - box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .2), 0 2px 4px rgba(0, 0, 0, .2);
102   - -moz-transition: .25s ease-in-out;
103   - -webkit-transition: .25s ease-in-out;
104   - transition: .25s ease-in-out;
105   - }
106   - input.toggle:checked + label:before {
107   - width: 50px;
108   - background: rgba(19, 191, 17, 1);
109   - }
110   -
111   - input.toggle:checked + label:after {
112   - left: 20px;
113   - box-shadow: inset 0 0 0 1px rgba(19, 191, 17, 1), 0 2px 4px rgba(0, 0, 0, .2);
114   - }
115   -
116   - /deep/ #fields_order_placeholder { list-style-type: none; margin: 0; padding: 0; width: 60%; }
117   - /deep/ #fields_order_placeholder li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; height: 1.5em; }
118   - /deep/ html>body #fields_order_placeholder li { height: 1.5em; line-height: 1.2em; }
119   - /deep/ .ui-state-highlight { height: 1.5em; line-height: 1.2em; }
120   -
121   - </style>
122   -
123   - <iron-ajax
124   - auto
125   - id="data_request"
126   - url={{dataUrl}}
127   - handle-as="json"
128   - verbose="true"
129   - on-response="handleResponseData"
130   - debounce-duration="300">
131   - </iron-ajax>
132   -
133   - <iron-ajax
134   - id="datales_list_request"
135   - auto
136   - url={{dataletsListUrl}}
137   - handle-as="json"
138   - on-response="handleResponseDatalets"
139   - debounce-duration="300">
140   - </iron-ajax>
141   -
142   - <div id="modals">
143   - </div>
144   -
145   - <paper-dialog id="datalet_dialog" modal="true" transition="core-transition-center" closeAttribute="close">
146   - <h2>Datalets preview</h2>
147   - <paper-dialog-scrollable id="datalet_dialog_content">
148   - </paper-dialog-scrollable>
149   - <div class="buttons">
150   - <paper-button dialog-dismiss>Close</paper-button>
151   - </div>
152   - </paper-dialog>
153   -
154   - <div class="panel panel-default">
155   - <div class="panel-heading">
156   - <h3 class="panel-title">Data source</h3>
157   - </div>
158   - <div class="panel-body">
159   - <section>
160   - <paper-input id="data_url" label="CKAN api data url" floatingLabel value="{{dataUrl}}"></paper-input>
161   - </section>
162   - </div>
163   - </div>
164   -
165   - <div class="panel panel-default">
166   - <div class="panel-heading">
167   - <h3 class="panel-title">Selection data fileds to visualize</h3>
168   - </div>
169   - <div class="panel-body">
170   - <section>
171   - <div class="horizontal center-justified layout">
172   - <div id="fields_placeholder" class="horizontal-section">
173   - </div>
174   - </div>
175   - </section>
176   - </div>
177   - </div>
178   -
179   - <div class="panel panel-default">
180   - <div class="panel-heading">
181   - <h3 class="panel-title">Selection fileds order</h3>
182   - </div>
183   - <div class="panel-body">
184   - <section>
185   - <div class="horizontal center-justified layout">
186   - <ul id="fields_order_placeholder">
187   - </ul>
188   - </div>
189   - </section>
190   - </div>
191   - </div>
192   -
193   - <div class="panel panel-default">
194   - <div class="panel-heading">
195   - <h3 class="panel-title">Visualization tools selection</h3>
196   - </div>
197   - <div class="panel-body">
198   - <div id="datalets_menu" class="layout">
199   - <label for="datalets_selector">Available Datalets list:</label>
200   - <select class="form-control" id="datalets_selector">
201   - </select>
202   - </div>
203   - </div>
204   - </div>
205   -
206   - <section>
207   - <paper-button on-click="goto" raised>Go to visualization</paper-button>
208   - </section>
209   - <paper-toast id="message" text=""></paper-toast>
210   - <content></content>
211   - </template>
212   -
213   - <script src="../shared_js/bootstrap-3.3.4-dist/js/bootstrap.min.js"></script>
214   - <script src="../shared_js/bootstrap-toggle-master/js/bootstrap-toggle.min.js"></script>
215   - <script src="../shared_js/jquery-ui-1.11.4.custom/jquery-ui.min.js"></script>
216   -
217   - <script src="../../../DEEPCLIENT/js/deepClient.js"></script>
218   -
219   - <script>
220   -
221   - DataletSelectionControllet = Polymer({
222   - is: 'datalet-selection-controllet',
223   - listeners: {
224   - 'tap' : 'clickHandler'
225   - },
226   - hostAttributes: {
227   - dataUrl: "http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50",
228   - deepUrl: "http://service.routetopa.eu/WebComponentsDEV/DEEP/",
229   - dataletsListUrl: "http://service.routetopa.eu/WebComponentsDEV/DEEP/datalets-list"
230   - },
231   - properties: {
232   - /**
233   - * It represent the data url from CKAN api
234   - *
235   - * @attribute dataUrl
236   - * @type string
237   - * @default 'null'
238   - */
239   - dataUrl: {
240   - type: String,
241   - value: "http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50",
242   - observer: '_dataUrlChanged'
243   - },
244   - /**
245   - * It represent the DEEP url to get information about the datalets
246   - *
247   - * @attribute deepUrl
248   - * @type string
249   - * @default 'null'
250   - */
251   - deepUrl: {
252   - type: String,
253   - value: "http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50"
254   - },
255   - /**
256   - * It stores all tools available in WebComponent server
257   - *
258   - * @attribute tools
259   - * @type array
260   - * @default 'null'
261   - */
262   - tools:{
263   - type: Array,
264   - value: []
265   - },
266   - /**
267   - * It stores all fields related to data retrieved from CKAN api url
268   - *
269   - * @attribute fields
270   - * @type array
271   - * @default 'null'
272   - */
273   - fields_order:{
274   - type: String,
275   - value: []
276   - },
277   - fieldsMap: {
278   - type: Map,
279   - value: null
280   - },
281   - datalet_query:{
282   - type: String,
283   - value: ""
284   - }
285   - },
286   - /**
287   - * data-url member changed watcher. It's called when dataUrl changes its value
288   - *
289   - * @method dataUrlChanged
290   - */
291   - _dataUrlChanged: function(newValue, oldValue){
292   - this.$.data_request.generateRequest();
293   - },
294   - createFieldsContainer: function(id, heading){
295   - var panelDefault = document.createElement('div');
296   - panelDefault.className = 'panel panel-default';
297   - var panelHeading = document. createElement('div');
298   - panelHeading.className = 'panel-heading';
299   - panelHeading.innerHTML = heading;
300   - var panelBody = document. createElement('div');
301   - panelBody.className = 'panel-body';
302   - panelBody.id = id;
303   - var fieldPanel = document.createElement('div');
304   - fieldPanel.className = 'panel-body';
305   -
306   - panelBody.appendChild(fieldPanel);
307   - panelDefault.appendChild(panelHeading);
308   - panelDefault.appendChild(panelBody);
309   -
310   - return panelDefault;
311   - },
312   - createCustomStyledToggle: function(id, label){
313   - return '<div class="wrapper">'
314   - + '<input id="'+ id +'" type="checkbox" class="toggle">'
315   - + '<label for="'+ id +'">'+ label +'</label>'
316   - + label
317   - + '</div>';
318   -
319   - },
320   - /**
321   - * Callback to parse the data requested when dataUrl change its value
322   - *
323   - * @method handleResponseData
324   - */
325   - handleResponseData: function(e){
326   - //crete root node and insert it in to shadow dom
327   - var mainPanel = this.createFieldsContainer("root", "Data fields");
328   - this.$.fields_placeholder.innerHTML = "";
329   - this.$.fields_placeholder.appendChild(mainPanel);
330   - this.fieldsMap = new Map;
331   - this.fieldsMap["root"] = mainPanel;
332   - //call recursive analyze function for current json to get all fields user can select
333   - this.analyzeObject(new Array("root"), null, e.detail.response);
334   - },
335   - analyzeObject: function(parent_list, curr_field, object) {
336   - if(curr_field != null){
337   - if(object == null) object = "";
338   -
339   - if(object.constructor == Array){//Deal with flat array case
340   - if(object[0].constructor != Object){
341   - this.fieldsMap[parent_list[parent_list.length - 2]].childNodes[1].childNodes[0].innerHTML += this.createCustomStyledToggle(parent_list.toString(), curr_field);
342   - return;
343   - }
344   - }
345   - if(object.constructor == Array || object.constructor == Object){
346   - var panel = this.createFieldsContainer(curr_field, parent_list[parent_list.length - 1]);
347   - this.fieldsMap[curr_field] = panel;
348   - this.fieldsMap[parent_list[parent_list.length - 2]].childNodes[1].appendChild(this.fieldsMap[curr_field]);
349   - }else{
350   - //CUSTOM STYLED TOGGLE
351   - this.fieldsMap[parent_list[parent_list.length - 2]].childNodes[1].childNodes[0].innerHTML += this.createCustomStyledToggle(parent_list.toString(), curr_field);
352   - }
353   - }
354   - if(object.constructor == Array || object.constructor == Object) {
355   - var obj = (object.constructor == Array) ? object[0] : object;
356   - if(Object.prototype.toString.call(obj) === '[object String]') return;//Deal with flat array case
357   - for (var field in obj) {
358   - var parents = new Array();
359   - parent_list.every(function (element, index, array) {
360   - parents.push(element);
361   - return true;
362   - });
363   - parents.push(field);
364   - this.analyzeObject(parents, field, obj[field]);
365   - }
366   - }
367   - },
368   - /**
369   - * Callback to parse the components response object
370   - *
371   - * @method handleResponseComponents
372   - */
373   - handleResponseDatalets: function(e){
374   - html = "";
375   - for(var i=0;i < e.detail.response.length;i++){
376   - html += '<option value="' + e.detail.response[i] + '"' + ((i==0) ? ' selected>' : '>') + e.detail.response[i] + '</option>';
377   - }
378   - $(this.$.datalets_selector).append(html);
379   - },
380   - /**
381   - * Callback called when "Go to visualization" button is pressed
382   - *
383   - * @method handleResponseComponents
384   - */
385   - goto: function(){
386   - var fields = Polymer.dom(this.$.fields_order_placeholder).querySelectorAll('li');
387   - this.fields_order = "";
388   - for(var i=0;i<fields.length;i++){
389   - this.fields_order += fields[i].id + ",";
390   - }
391   - this.fields_order = this.fields_order.substring(0, this.fields_order.length - 1);
392   -
393   -
394   - var cbs = Polymer.dom(this.$.fields_placeholder).querySelectorAll('input[type=checkbox]:checked');
395   - this.datalet_query = "";
396   -
397   - if(cbs.length == 0){
398   - this.$.message.text = "No fields selected.";
399   - this.$.message.show();
400   - return;
401   - }
402   -
403   - var fields = Array();
404   - for(var i=0;i<cbs.length;i++){
405   - fields.push(cbs[i].id.replace("root,", ""));
406   - }
407   -
408   - var datalet_params ={
409   - component : this.$.datalets_selector.options[this.$.datalets_selector.selectedIndex].text,
410   - params :{
411   - 'data-url' : this.dataUrl,
412   - 'fields-order' : this.fields_order
413   - },
414   - fields : fields,
415   - placeHolder : this.$.datalet_dialog_content
416   - };
417   - ComponentService.deep_url = this.deepUrl;
418   - ComponentService.getComponent(datalet_params);
419   -
420   - document.getElementById("datalet_dialog").open();
421   - },
422   - clickHandler : function(e){
423   - if(!e.target.control) {
424   - if (e.target.className == 'toggle') {
425   - (this.$.fields_order_placeholder).innerHTML = "";
426   - var cbs = Polymer.dom(this.$.fields_placeholder).querySelectorAll('input[type=checkbox]:checked');
427   - for(var i=0;i<cbs.length;i++) {
428   - var fields = cbs[i].id.split(',');
429   - var ele = document.createElement('li');
430   - ele.className = "ui-state-default";
431   - ele.id = i;
432   - ele.innerHTML = fields[fields.length -1];
433   - (this.$.fields_order_placeholder).appendChild(ele);
434   - }
435   - }
436   - }
437   - },
438   - ready: function(){
439   - $(this.$.fields_order_placeholder).sortable({
440   - placeholder: "ui-state-highlight"
441   - });
442   - $(this.$.fields_order_placeholder).disableSelection();
443   - }
444   - });
445   - </script>
446   -</dom-module>
447 0 \ No newline at end of file
controllets/datalet-selection-controllet/datalet-selection-controllet_.html deleted
1   -<!--
2   -@group ROUTETOPA Polymer Core Elements
3   -
4   -The `select-visualization-form-controllet` is a slider container of elements.
5   -Pass to this component an array of components, a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll show a
6   -slider with all components initialized with data and query attributes
7   -
8   -### Code
9   -
10   -Example
11   -
12   -@class select-visualization-form-controllet
13   -
14   --->
15   -<link rel="import" href="../../bower_components/polymer/polymer.html">
16   -<link rel="import" href="../../bower_components/paper-input/paper-input.html">
17   -<link rel="import" href="../../bower_components/paper-button/paper-button.html">
18   -<!--<link rel="import" href="../../bower_components/iron-ajax/iron-request.html">
19   -<link rel="import" href="../../bower_components/iron-ajax/iron-ajax.html">-->
20   -
21   -<dom-module id="datalet-selection-controllet">
22   - <template>
23   - <link rel="stylesheet" href="../shared_js/bootstrap-3.3.4-dist/css/bootstrap.paper.style.min.css">
24   - <link rel="stylesheet" href="../shared_js/bootstrap-toggle-master/css/bootstrap-toggle.min.css">
25   - <style is="custom-style">
26   - body {
27   - font-family: RobotoDraft, 'Helvetica Neue', Helvetica, Arial;
28   - font-size: 14px;
29   - margin: 0;
30   - padding: 24px;
31   - -webkit-tap-highlight-color: rgba(0,0,0,0);
32   - -webkit-touch-callout: none;
33   - }
34   -
35   - paper-input {
36   - width: 80%;
37   - }
38   -
39   - paper-checkbox {
40   - display: block;
41   - margin-bottom: 40px;
42   - }
43   -
44   - </style>
45   -
46   - <!--<iron-ajax
47   - auto
48   - id="data_request"
49   - url={{data_url}}
50   - handle-as="json"
51   - verbose="true"
52   - on-response="this.handleResponseData"
53   - debounce-duration="300">
54   - </iron-ajax>
55   -
56   - <iron-ajax
57   - auto
58   - url="http://service.routetopa.eu/WebComponentsDEV/DEEP/datalets-list"
59   - handle-as="json"
60   - on-response="handleResponseDatalets"
61   - debounce-duration="300">
62   - </iron-ajax>
63   -
64   - <iron-request id="xhr"></iron-request>-->
65   -
66   - <div class="panel panel-default">
67   - <div class="panel-heading">
68   - <h3 class="panel-title">Data source</h3>
69   - </div>
70   - <div class="panel-body">
71   - <section>
72   - <paper-input id="data_url" label="CKAN api data url" floatingLabel value="{{data_url}}"></paper-input>
73   - </section>
74   - </div>
75   - </div>
76   -
77   - <div class="panel panel-default">
78   - <div class="panel-heading">
79   - <h3 class="panel-title">Selection data fileds to visualize</h3>
80   - </div>
81   - <div class="panel-body">
82   - <section>
83   - <div class="horizontal center-justified layout">
84   - <div id="fields_placeholder" class="horizontal-section">
85   - <!-- <template is="dom-repeat" items="{{fields}}">
86   - <paper-checkbox>{{item}}</paper-checkbox>
87   - </template>-->
88   - </div>
89   - </div>
90   - </section>
91   - </div>
92   - </div>
93   -
94   - <div class="panel panel-default">
95   - <div class="panel-heading">
96   - <h3 class="panel-title">Visualization tools selection</h3>
97   - </div>
98   - <div class="panel-body">
99   - <div id="datalets_menu" class="layout"></div>
100   - </div>
101   - </div>
102   -
103   - <section>
104   - <!--<paper-button on-click="goto" raised>Go to visualization</paper-button>-->
105   - <button id="goto" type="button" class="btn btn-primary">Go to visualization</button>
106   - </section>
107   - <content></content>
108   - </template>
109   -
110   - <script src="../shared_js/bootstrap-3.3.4-dist/js/bootstrap.min.js"></script>
111   - <script src="../shared_js/bootstrap-toggle-master/js/bootstrap-toggle.min.js"></script>
112   -
113   - <script>
114   -
115   - DataletSelectionControllet = Polymer({
116   - is: 'datalet-selection-controllet',
117   - properties: {
118   - /**
119   - * It represent the data url from CKAN api
120   - *
121   - * @attribute data_url
122   - * @type string
123   - * @default 'null'
124   - */
125   - data_url: {
126   - type: String,
127   - value: "http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50",
128   - observer: '_data_urlChanged'
129   - },
130   - /**
131   - * It stores all tools available in WebComponent server
132   - *
133   - * @attribute tools
134   - * @type array
135   - * @default 'null'
136   - */
137   - tools:{
138   - type: Array,
139   - value: []
140   - },
141   - /**
142   - * It stores all fields related to data retrieved from CKAN api url
143   - *
144   - * @attribute fields
145   - * @type array
146   - * @default 'null'
147   - */
148   - fields:{
149   - type: Array,
150   - value: []
151   - },
152   - fieldsMap: {
153   - type: Map,
154   - value: null
155   - }
156   - },
157   - /**
158   - * data-url member changed watcher. It's called when data_url changes its value
159   - *
160   - * @method data_urlChanged
161   - */
162   - _data_urlChanged: function(newValue, oldValue){
163   - //this.$.xhr.send({url: newValue, body: {}}).then(function (e){this.handleResponseData(e)});
164   - //get the data fields
165   - var comp = this;
166   - $.ajax({
167   - url: newValue,
168   - dataType: "json",
169   - success: function(e){comp.handleResponseData(e)}
170   - });
171   - //get datalets list
172   - $.ajax({
173   - url: "http://service.routetopa.eu/WebComponentsDEV/DEEP/datalets-list",
174   - dataType: "json",
175   - success: function(e){comp.handleResponseDatalets(e)}
176   - });
177   - },
178   - createFieldsContainer: function(id, heading){
179   - var panelDefault = document.createElement('div');
180   - panelDefault.className = 'panel panel-default';
181   - var panelHeading = document. createElement('div');
182   - panelHeading.className = 'panel-heading';
183   - panelHeading.innerHTML = heading;
184   - var panelBody = document. createElement('div');
185   - panelBody.className = 'panel-body';
186   - panelBody.id = id;
187   - var fieldPanel = document.createElement('div');
188   - fieldPanel.className = 'panel-body';
189   -
190   - panelBody.appendChild(fieldPanel);
191   - panelDefault.appendChild(panelHeading);
192   - panelDefault.appendChild(panelBody);
193   -
194   - return panelDefault;
195   -
196   - },
197   - cretePaperCheckbox: function (id, label ) {
198   - var html = '<paper-checkbox id="' + id + '" role="checkbox" tabindex="0" toggles="" aria-pressed="false" aria-disabled="false" aria-checked="false" aria-label="' + label + '" class="x-scope paper-checkbox-0">'
199   - + '<div id="checkboxContainer" class="style-scope paper-checkbox">'
200   - + '<paper-ripple id="ink" class="circle style-scope paper-checkbox" center="">'
201   - + '<div id="background" class="style-scope paper-ripple"></div>'
202   - + '<div id="waves" class="style-scope paper-ripple"></div>'
203   - + '</paper-ripple>'
204   - + '<div id="checkbox" class="style-scope paper-checkbox">'
205   - + '<div id="checkmark" class="hidden style-scope paper-checkbox"></div>'
206   - + '</div>'
207   - + '</div>'
208   - + '<div id="checkboxLabel" aria-hidden="true" class="style-scope paper-checkbox">' + label + '</div>'
209   - + '</paper-checkbox>';
210   -
211   - return html;
212   - },
213   - createBootstrapCheckbox: function(id, label) {
214   - return '<div class="checkbox checkbox-primary">'
215   - + '<label class="checkbox-inline">'
216   - + '<input type="checkbox" data-label="'+ label +'" id="'+ id +'"/>' + label
217   - + '</label>'
218   - + '</div>';
219   -
220   - },
221   - createBootstrapToggle: function(id, label) {
222   - return '<div class="checkbox">'
223   - + '<label style="padding-left: 3px; text-decoration: double;">'
224   - + '<input type="checkbox" data-label="'+ label +'" id="'+ id +'" data-toggle="toggle" /> ' + label
225   - + '</label>'
226   - + '</div>';
227   -
228   - },
229   - /**
230   - * Callback to parse the data requested when data_url change its value
231   - *
232   - * @method handleResponseData
233   - */
234   - handleResponseData: function(e){
235   - //crete root node and insert it in to shadow dom
236   - var mainPanel = this.createFieldsContainer("root", "Data fields");
237   - this.$.fields_placeholder.appendChild(mainPanel);
238   - this.fieldsMap = new Map;
239   - this.fieldsMap["root"] = mainPanel;
240   - //call recursive analyze function for current json to get all fields user can select
241   - this.analyzeObject("root", null, e);
242   - },
243   - analyzeObject: function(parent, curr_field, object) {
244   - if(curr_field != null){
245   - var parent_list = parent.split('.');
246   - var ele = null;
247   - if(object.constructor == Array || object.constructor == Object){
248   - var panel = this.createFieldsContainer(curr_field, parent_list[parent_list.length - 1]);
249   - this.fieldsMap[curr_field] = panel;
250   - this.fieldsMap[parent_list[parent_list.length - 2]].childNodes[1].appendChild(this.fieldsMap[curr_field]);
251   -
252   - }else{
253   - /*var checkbox = document.createElement('paper-checkbox');
254   - checkbox.innerHTML = "<b>" + curr_field + '</b><br>';
255   - checkbox.id = parent;
256   - this.fieldsMap[parent_list[parent_list.length - 2]].childNodes[1].childNodes[0].appendChild(checkbox);*/
257   - //Polymer.dom.flush();
258   - //this.fieldsMap[parent_list[parent_list.length - 2]].childNodes[1].childNodes[0].innerHTML += this.cretePaperCheckbox(parent, curr_field);
259   - this.fieldsMap[parent_list[parent_list.length - 2]].childNodes[1].childNodes[0].innerHTML += this.createBootstrapToggle(parent, curr_field);
260   -
261   - }
262   - }
263   - if(object.constructor == Array || object.constructor == Object) {
264   - var obj = (object.constructor == Array) ? object[0] : object;
265   - for (var field in obj) {
266   - if (obj[field] != null) {
267   - parent_list = parent.split('.');
268   - this.analyzeObject(parent + '.' + field, field, obj[field]);
269   - }
270   - }
271   - }
272   - },
273   - /**
274   - * Callback to parse the components response object
275   - *
276   - * @method handleResponseComponents
277   - */
278   - handleResponseDatalets: function(e){
279   - this.tools = e;
280   - /*html = '<paper-menu>';
281   - for(i=0;i < e.length;i++){
282   - html += '<paper-item>' + e[i] + '</paper-item>';
283   - }
284   - html += '</paper-menu>';*/
285   - html = '<label for="datalets_selector">Available Datalets list:</label>'
286   - + '<select class="form-control" id="datalets_selector">';
287   - for(i=0;i < e.length;i++){
288   - html += '<option>' + e[i] + '</option>';
289   - }
290   - html += '</select>';
291   - $(this.$.datalets_menu).append(html);
292   - },
293   - /**
294   - * Callback called when "Go to visualization" button is pressed
295   - *
296   - * @method handleResponseComponents
297   - */
298   - goto: function(){
299   - var url = "http://service.routetopa.eu/oxwall/webcomp";
300   - var query = "$result$records[";
301   - var cbs = this.shadowRoot.querySelectorAll("paper-checkbox");
302   - for(i=0;i<cbs.length;i++){
303   - if(cbs[i].checked){
304   - query += cbs[i].id + ",";
305   - }
306   - }
307   - query = query.slice(0,-1);
308   - query += "]";
309   -
310   - var cmp = this.$.toolsmenu.selectedItemLabel;
311   -
312   - url += "/" + cmp + "/" + btoa(this.data_url) + "/" + query + "/0";
313   -
314   - window.location = url;
315   - },
316   - ready: function(){
317   -
318   - /*this.fields = [
319   - {parent:"root", name :"No fields available"}
320   - ];*/
321   -
322   - this.tools = [
323   - 'No tools available'
324   - ];
325   -
326   - //this.$.data_request.addEventListener('response', this.handleResponseData);
327   -
328   - /* var comp = this;
329   - $.ajax({
330   - url: "http://service.routetopa.eu/WebComponentsDEV/DEEP/datalets-list",
331   - dataType: "json",
332   - success: comp.handleResponseDatalets
333   -
334   - });*/
335   - $(this.$.goto).click(this.goto());
336   - }
337   - });
338   - </script>
339   -</dom-module>
340 0 \ No newline at end of file
controllets/datalet-selection-controllet/datalet-selection-controllet_2.html deleted
1   -<!--
2   -@group ROUTETOPA Polymer Core Elements
3   -
4   -The `select-visualization-form-controllet` is a slider container of elements.
5   -Pass to this component an array of components, a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll show a
6   -slider with all components initialized with data and query attributes
7   -
8   -### Code
9   -
10   -Example
11   -
12   -@class select-visualization-form-controllet
13   -
14   --->
15   -<link rel="import" href="../../bower_components/polymer/polymer.html">
16   -<!--<link rel="import" href="../../bower_components/iron-ajax/iron-request.html">
17   -<link rel="import" href="../../bower_components/iron-ajax/iron-ajax.html">-->
18   -
19   -<dom-module id="datalet-selection-controllet">
20   - <template>
21   - <!--<link rel="stylesheet" href="../shared_js/bootstrap-3.3.4-dist/css/bootstrap.paper.style.min.css">
22   - <link rel="stylesheet" href="../shared_js/bootstrap-toggle-master/css/bootstrap-toggle.min.css">-->
23   - <style>
24   - body {
25   - font-family: RobotoDraft, 'Helvetica Neue', Helvetica, Arial;
26   - font-size: 14px;
27   - margin: 0;
28   - padding: 24px;
29   - -webkit-tap-highlight-color: rgba(0,0,0,0);
30   - -webkit-touch-callout: none;
31   - }
32   -
33   - paper-input {
34   - width: 80%;
35   - }
36   -
37   - paper-checkbox {
38   - display: block;
39   - margin-bottom: 40px;
40   - }
41   -
42   - </style>
43   -
44   - <!--<iron-ajax
45   - auto
46   - id="data_request"
47   - url={{dataUrl}}
48   - handle-as="json"
49   - verbose="true"
50   - on-response="this.handleResponseData"
51   - debounce-duration="300">
52   - </iron-ajax>
53   -
54   - <iron-ajax
55   - auto
56   - url="http://service.routetopa.eu/WebComponentsDEV/DEEP/datalets-list"
57   - handle-as="json"
58   - on-response="handleResponseDatalets"
59   - debounce-duration="300">
60   - </iron-ajax>
61   -
62   - <iron-request id="xhr"></iron-request>-->
63   - </template>
64   -
65   - <script>
66   -
67   - DataletSelectionControllet = Polymer({
68   - is: 'datalet-selection-controllet',
69   - properties: {
70   - /**
71   - * It represent the data url from CKAN api
72   - *
73   - * @attribute dataUrl
74   - * @type string
75   - * @default 'null'
76   - */
77   - dataUrl: {
78   - type: String,
79   - value: "http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50",
80   - observer: '_data_urlChanged'
81   - },
82   - /**
83   - * It stores all tools available in WebComponent server
84   - *
85   - * @attribute tools
86   - * @type array
87   - * @default 'null'
88   - */
89   - tools:{
90   - type: Array,
91   - value: []
92   - },
93   - /**
94   - * It stores all fields related to data retrieved from CKAN api url
95   - *
96   - * @attribute fields
97   - * @type array
98   - * @default 'null'
99   - */
100   - fields:{
101   - type: Array,
102   - value: []
103   - },
104   - fieldsMap: {
105   - type: Map,
106   - value: null
107   - }
108   - }
109   - });
110   - </script>
111   -</dom-module>
112 0 \ No newline at end of file
controllets/draggable-element-controllet/draggable-element-controllet.html
... ... @@ -197,7 +197,7 @@ Example:
197 197 */
198 198 number: {
199 199 type: String,
200   - value : "0"
  200 + value : "1"
201 201 },
202 202 /**
203 203 * It's the name of the target field
... ...
controllets/text-element-controllet/text-element-controllet.html 0 → 100644
  1 +<!--
  2 +@license
  3 + The MIT License (MIT)
  4 +
  5 + Copyright (c) 2015 Dipartimento di Informatica - Università di Salerno - Italy
  6 +
  7 + Permission is hereby granted, free of charge, to any person obtaining a copy
  8 + of this software and associated documentation files (the "Software"), to deal
  9 + in the Software without restriction, including without limitation the rights
  10 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 + copies of the Software, and to permit persons to whom the Software is
  12 + furnished to do so, subject to the following conditions:
  13 +
  14 + The above copyright notice and this permission notice shall be included in
  15 + all copies or substantial portions of the Software.
  16 +
  17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23 + THE SOFTWARE.
  24 +-->
  25 +
  26 +<link rel="import" href="../../bower_components/polymer/polymer.html">
  27 +<link rel="import" href="../../bower_components/paper-styles/color.html">
  28 +
  29 +<!--
  30 +`text-element-controllet` is a text area with heading. It fires an event when the text value is modified. This event can be useful when you have to monitor many af this elements.
  31 +
  32 +
  33 +Example:
  34 +
  35 + <text-element-controllet heading="myField"
  36 + description="myFieldDescription"
  37 + number="1">
  38 + </text-element-controllet>
  39 +
  40 +
  41 +@element text-element-controllet
  42 +@status beta
  43 +@homepage
  44 +@group controllets
  45 +-->
  46 +
  47 +
  48 +<dom-module id="text-element-controllet">
  49 + <template>
  50 +
  51 + <style is="custom-style">
  52 +
  53 + .avatar {
  54 + display: inline-block;
  55 + position: relative;
  56 + float: left;
  57 + height: 1.7em;
  58 + width: 1.7em;
  59 + border-radius: 50%;
  60 + background: var(--paper-blue-500);
  61 + color: white;
  62 + line-height: 2em;
  63 + font-size: 0.74em;
  64 + text-align: center;
  65 + }
  66 +
  67 + .heading{
  68 + /*width: 12.5em;*/
  69 + }
  70 +
  71 + .big {
  72 + display: inline-block;
  73 + position: relative;
  74 + float: left;
  75 + font-size: 1em;
  76 + padding: 0.5em 0.25em 0.5em;
  77 + color: var(--google-grey-500);
  78 + }
  79 +
  80 + .medium {
  81 + position: relative;
  82 + float: left;
  83 + font-size: 0.8125em;
  84 + padding-bottom: 0px;
  85 + display: inline-block;
  86 + width: 32.5em;
  87 + padding-left: 10px;
  88 + }
  89 +
  90 +
  91 + </style>
  92 +
  93 + <div>
  94 + <div>
  95 + <div class="heading">
  96 + <div class="avatar">{{number}}</div>
  97 + <div class="medium">{{description}}</div>
  98 + </div>
  99 + </div><br>
  100 + <paper-textarea id="text" label="{{heading}}" floatingLabel value="{{value}}"></paper-textarea>
  101 + </div>
  102 +
  103 + </template>
  104 +
  105 + <script>
  106 +
  107 + Polymer({
  108 +
  109 + is: 'text-element-controllet',
  110 +
  111 + /**
  112 + * Fired when the user change the text value
  113 + *
  114 + * @event text-element-controllet_content-changed
  115 + */
  116 +
  117 + targets : null,
  118 +
  119 + properties: {
  120 + /**
  121 + * It's the name of the elelent
  122 + *
  123 + * @attribute heading
  124 + * @type Strig
  125 + * @default 'Heading'
  126 + */
  127 + heading : {
  128 + type : String,
  129 + value : "Heading"
  130 + },
  131 + /**
  132 + * It's the description of the elelent
  133 + *
  134 + * @attribute description
  135 + * @type Strig
  136 + * @default 'Description'
  137 + */
  138 + description: {
  139 + type: String,
  140 + value: "Description"
  141 + },
  142 + /**
  143 + * It's a string value the represent the current number of elelent. It will be use in the label section.
  144 + *
  145 + * @attribute number
  146 + * @type Strig
  147 + * @default '0'
  148 + */
  149 + number: {
  150 + type: String,
  151 + value : "0"
  152 + },
  153 + value :{
  154 + type: String,
  155 + value: "",
  156 + observer : '_valueChanged'
  157 + }
  158 + },
  159 + /**
  160 + * Callback related to text change
  161 + *
  162 + * @method _valueChanged
  163 + *
  164 + * @param {Event} e
  165 + */
  166 + _valueChanged : function(oldvalue, newValue){
  167 + this.fire('text-element-controllet_content-changed', {newValue: newValue});
  168 + },
  169 + /**
  170 + * It returns the value in text area
  171 + *
  172 + * @method getValue
  173 + */
  174 + getValue : function(){
  175 + return this.$.text.value;
  176 + }
  177 + });
  178 +
  179 + </script>
  180 +
  181 +</dom-module>
0 182 \ No newline at end of file
... ...
controllets/treeview-controllet/treeview-controllet.html
... ... @@ -220,6 +220,12 @@ Example:
220 220  
221 221 is : 'treeview-controllet',
222 222  
  223 + /**
  224 + * Fired when the user check a checkbox
  225 + *
  226 + * @event treeview-controllet_fileds-selected
  227 + * */
  228 +
223 229 listeners : {
224 230 'tap' : '_clickHandler'
225 231 },
... ... @@ -353,7 +359,7 @@ Example:
353 359 fields.push(cbs[i].id.replace("root,",""));
354 360 }
355 361  
356   - this.fire('treeview-controllet-fileds-selected', {fields : fields});
  362 + this.fire('treeview-controllet_fileds-selected', {fields : fields});
357 363 },
358 364  
359 365 _clickHandler : function(e){
... ...
datalets/barchart-datalet/barchart-datalet.html
... ... @@ -47,6 +47,7 @@ Example:
47 47 <highcharts-datalet id="charts" data-url="{{dataUrl}}" fields="{{fields}}"></highcharts-datalet>
48 48 </template>
49 49 <script>
  50 +
50 51 var BarchartBehavior = {
51 52  
52 53  
... ... @@ -63,18 +64,18 @@ Example:
63 64 zoomType: 'xy'
64 65 },
65 66 title: {
66   - text: 'Bar chart'
  67 + text: this._component.title
67 68 },
68 69 xAxis: {
69 70 categories: this.properties.categories.value,
70 71 title: {
71   - text: null
  72 + text: this._component.xAxisLabel
72 73 }
73 74 },
74 75 yAxis: {
75 76 min: 0,
76 77 title: {
77   - text: 'Foreclosure (units)',
  78 + text: this._component.yAxisLabel,
78 79 align: 'high'
79 80 },
80 81 labels: {
... ... @@ -82,7 +83,7 @@ Example:
82 83 }
83 84 },
84 85 tooltip: {
85   - valueSuffix: ' units'
  86 + valueSuffix: ' ' + this._component.suffix
86 87 },
87 88 plotOptions: {
88 89 bar: {
... ... @@ -110,9 +111,57 @@ Example:
110 111 }
111 112 };
112 113  
  114 +
113 115 BarchartDatalet = Polymer({
114 116 is: 'barchart-datalet',
115 117  
  118 + properties: {
  119 + /**
  120 + * It's the label for X axis
  121 + *
  122 + * @attribute xAxisLabel
  123 + * @type String
  124 + * @default ''
  125 + */
  126 + xAxisLabel: {
  127 + type: String,
  128 + value: ""
  129 + },
  130 + /**
  131 + * It's the label for Y axis
  132 + *
  133 + * @attribute yAxisLabel
  134 + * @type String
  135 + * @default ''
  136 + */
  137 + yAxisLabel: {
  138 + type: String,
  139 + value: ""
  140 + },
  141 + /**
  142 + * It's the title of the chart
  143 + *
  144 + * @attribute title
  145 + * @type Strig
  146 + * @default ''
  147 + */
  148 + title: {
  149 + type: String,
  150 + value: "Heading"
  151 + },
  152 + /**
  153 + * It's the values suffix
  154 + *
  155 + * @attribute suffix
  156 + * @type Strig
  157 + * @default 'units'
  158 + */
  159 + suffix : {
  160 + type : String,
  161 + value : "units"
  162 + }
  163 + },
  164 +
116 165 /**
117 166 * 'ready' callback extend the BarchartComponentBehavior with HighchartsComponentBehavior and BarchartBehavior
118 167 * and run the Datalet workcycle.
... ...
datalets/base-datalet/base-datalet.html
... ... @@ -84,6 +84,13 @@ Example :
84 84 */
85 85 ready: function(){
86 86 this.$.domain.textContent = this.dataUrl.split("/")[0] + "//" + this.dataUrl.split("/")[2];
  87 + },
  88 + /**
  89 + * Set the domain url to show in the footer
  90 + */
  91 + setDomain: function(url){
  92 + this.$.domain.textContent = url;
  93 +
87 94 }
88 95 });
89 96 </script>
... ...
datalets/column3Dchart-datalet/column3Dchart-datalet.html
... ... @@ -57,8 +57,8 @@ Example:
57 57 </template>
58 58  
59 59 <script>
60   - var chart = null;
61 60  
  61 + var chart = null;
62 62  
63 63 var column3DchartBehavior = {
64 64  
... ... @@ -68,42 +68,45 @@ Example:
68 68 * @method transformData
69 69 */
70 70 presentData: function(){
71   - chart = new Highcharts.Chart({
72   - chart: {
73   - renderTo: this._component.$.charts.$.container,
74   - borderColor: '#EBBA95',
75   - borderWidth: 2,
76   - zoomType : 'xy',
77   - type: 'line',
78   - type: 'column',
79   - margin: 75,
80   - options3d: {
81   - enabled: true,
82   - alpha: 15,
83   - beta: 15,
84   - depth: 50,
85   - viewDistance: 25
86   - }
87   - },
88   - xAxis: {
89   - categories: this.properties.categories.value,
90   - title: {
91   - text: null
92   - }
93   - },
94   - title: {
95   - text: this.properties.title
96   - },
97   - subtitle: {
98   - text: '3D CHART demo by dragging the sliders below'
99   - },
100   - plotOptions: {
101   - column: {
102   - depth: 25
103   - }
104   - },
105   -
106   - series: this.properties.series.value
  71 + chart = new Highcharts.Chart({
  72 + chart: {
  73 + renderTo: this._component.$.charts.$.container,
  74 + borderColor: '#EBBA95',
  75 + borderWidth: 2,
  76 + zoomType : 'xy',
  77 + type: 'line',
  78 + type: 'column',
  79 + margin: 75,
  80 + options3d: {
  81 + enabled: true,
  82 + alpha: 15,
  83 + beta: 15,
  84 + depth: 50,
  85 + viewDistance: 25
  86 + }
  87 + },
  88 + title: {
  89 + text: this._component.title
  90 + },
  91 + xAxis: {
  92 + categories: this.properties.categories.value,
  93 + title: {
  94 + text: this._component.xAxislabel
  95 + }
  96 + },
  97 + title: {
  98 + text: this.properties.title
  99 + },
  100 + subtitle: {
  101 + text: this._component.title
  102 + },
  103 + plotOptions: {
  104 + column: {
  105 + depth: 25
  106 + }
  107 + },
  108 +
  109 + series: this.properties.series.value
107 110 });
108 111  
109 112 // Activate the sliders
... ... @@ -123,6 +126,42 @@ Example:
123 126 column3DchartDatalet = Polymer({
124 127 is: 'column3Dchart-datalet',
125 128  
  129 + properties: {
  130 + /**
  131 + * It's the label for X axis
  132 + *
  133 + * @attribute xAxisLabel
  134 + * @type String
  135 + * @default ''
  136 + */
  137 + xAxisLabel: {
  138 + type: String,
  139 + value: ""
  140 + },
  141 + /**
  142 + * It's the label for Y axis
  143 + *
  144 + * @attribute yAxisLabel
  145 + * @type String
  146 + * @default ''
  147 + */
  148 + yAxisLabel: {
  149 + type: String,
  150 + value: ""
  151 + },
  152 + /**
  153 + * It's the title of the chart
  154 + *
  155 + * @attribute title
  156 + * @type Strig
  157 + * @default ''
  158 + */
  159 + title: {
  160 + type: String,
  161 + value: "Heading"
  162 + }
  163 + },
  164 +
126 165 /**
127 166 * 'ready' callback extend the column3DchartComponentBehavior with HighchartsComponentBehavior and column3DchartBehavior
128 167 * and run the Datalet workcycle.
... ... @@ -130,6 +169,7 @@ Example:
130 169 * @method ready
131 170 */
132 171 ready: function(){
  172 +
133 173 var column3DchartComponentBehavior = $.extend(true, {}, HighchartsComponentBehavior, column3DchartBehavior);
134 174 column3DchartComponentBehavior.init(this);
135 175 }
... ...
datalets/columnchart-datalet/columnchart-datalet.html
... ... @@ -47,6 +47,7 @@ Example:
47 47 <highcharts-datalet id="charts" data-url="{{dataUrl}}" fields="{{fields}}"></highcharts-datalet>
48 48 </template>
49 49 <script>
  50 +
50 51 var ColumnchartBehavior = {
51 52  
52 53  
... ... @@ -62,18 +63,18 @@ Example:
62 63 zoomType: 'xy'
63 64 },
64 65 title: {
65   - text: 'Column chart'
  66 + text: this._component.title
66 67 },
67 68 xAxis: {
68 69 categories: this.properties.categories.value,//this._component.categories,
69 70 title: {
70   - text: null
  71 + text: this._component.xAxisLabel
71 72 }
72 73 },
73 74 yAxis: {
74 75 min: 0,
75 76 title: {
76   - text: 'Units',
  77 + text: this._component.yAxisLabel,
77 78 align: 'high'
78 79 },
79 80 labels: {
... ... @@ -81,7 +82,7 @@ Example:
81 82 }
82 83 },
83 84 tooltip: {
84   - valueSuffix: ' units'
  85 + valueSuffix: ' ' + this._component.suffix
85 86 },
86 87 plotOptions: {
87 88 bar: {
... ... @@ -109,9 +110,57 @@ Example:
109 110 }
110 111 };
111 112  
  113 +
112 114 LinechartDatalet = Polymer({
113 115 is: 'columnchart-datalet',
114 116  
  117 + properties: {
  118 + /**
  119 + * It's the label for X axis
  120 + *
  121 + * @attribute xAxisLabel
  122 + * @type String
  123 + * @default ''
  124 + */
  125 + xAxisLabel: {
  126 + type: String,
  127 + value: ""
  128 + },
  129 + /**
  130 + * It's the label for Y axis
  131 + *
  132 + * @attribute yAxisLabel
  133 + * @type String
  134 + * @default ''
  135 + */
  136 + yAxisLabel: {
  137 + type: String,
  138 + value: ""
  139 + },
  140 + /**
  141 + * It's the title of the chart
  142 + *
  143 + * @attribute title
  144 + * @type Strig
  145 + * @default ''
  146 + */
  147 + title: {
  148 + type: String,
  149 + value: "Heading"
  150 + },
  151 + /**
  152 + * It's the values suffix
  153 + *
  154 + * @attribute suffix
  155 + * @type Strig
  156 + * @default 'units'
  157 + */
  158 + suffix : {
  159 + type : String,
  160 + value : "units"
  161 + }
  162 + },
  163 +
115 164 /**
116 165 * 'ready' callback extend the ColumnchartComponentBehavior with HighchartsComponentBehavior and ColumnchartBehavior
117 166 * and run the Datalet workcycle.
... ...
datalets/linechart-datalet/linechart-datalet.html
... ... @@ -59,20 +59,20 @@ Example:
59 59  
60 60 $(this._component.$.charts.$.container).highcharts({
61 61 title: {
62   - text: 'Line chart'
  62 + text: "" + this._component.title
63 63 },
64 64 chart: {
65   - zoomType: 'xy'
66   - },
  65 + zoomType: 'xy'
  66 + },
67 67 xAxis: {
68 68 categories: this.properties.categories.value,//this._component.categories,
69 69 title: {
70   - text: null
  70 + text: this._component.xAxisLabel
71 71 }
72 72 },
73 73 yAxis: {
74 74 title: {
75   - text: 'Units'
  75 + text: this._component.yAxisLabel
76 76 },
77 77 plotLines: [{
78 78 value: 0,
... ... @@ -81,7 +81,7 @@ Example:
81 81 }]
82 82 },
83 83 tooltip: {
84   - valueSuffix: ' units'
  84 + valueSuffix: ' ' + this._component.suffix
85 85 },
86 86 legend: {
87 87 layout: 'vertical',
... ... @@ -102,9 +102,57 @@ Example:
102 102 }
103 103 };
104 104  
  105 +
105 106