Configurer des graphiques par Plotly
Cet article explique comment programmer la configuration d'un graphique linéaire et l'édition d'un graphique à barres réalisés avec la librairie fournie par Plotly.
IMPORTANT : La disposition et le style d'une interface sont à la discrétion du programmeur. Aucun modèle graphique n'est imposé. Les programmes en exemple utilisent les icônes de Font Awesome.
Configuration d'un graphique linéraire
Utilisez le sélecteur pour éditer les données et les paramètres de configuration d'une ligne du graphe. La position de la ligne sélectionnée et le nombre total de lignes sont affichés à droite des boutons.
Entrez une séries de nombres séparés par des espaces pour l'axe des X et pour l'axe des Y.
Tapez le titre de la ligne dans le champ de saisie suivant.
Cliquez dans le champ de saisie d'une couleur. Choisissez une couleur. Appuyez sur Entrée ou cliquez en dehors du sélecteur pour valider la couleur choisie.
Le tracé et les marqueurs de la ligne changent de couleur.
Entrez directement une valeur, e.g. #C80
.
Cochez l'option pour cacher la ligne.
Choisissez un type de tracé avec des lines lignes, des markers marqueurs ou des lines+markers lignes avec des marqueurs.
Spécifiez la largeur des lines lignes et des markersmarqueurs.
Sélectionnez un type de ligne solid solide, solid en pointillé ou dashdot alterné.
Cliquez sur le bouton plus pour ajouter une ligne.
Cliquez sur le bouton moins pour supprimer la ligne sélectionnée.
Utilisez les flèches pour réordonner la ligne sélectionnée.
Tapez le titre du graphique dans le champ de saisie suivant.
Cochez l'option pour afficher la légende à droite du graphique.
Spécifiez le delta entre chaque marque sur l'axe des X et l'axe des Y.
Cochez les options et pour afficher les barres verticales et horizontales de la grille.
NOTE : Les graphiques par Plotly ont beaucoup d'options. Ajouter des inspecteurs pour éditer plus d'options et montrer le résultat interactivement prend quelques minutes.
Code
- <?php $title='Plotly'; ?>
- <?php $name1='Markers'; ?>
- <?php $mode1='markers'; ?>
- <?php $color1='#8C0C3C'; ?>
- <?php $x1=array(1, 2, 3, 4); ?>
- <?php $y1=array(10, 15, 13, 17); ?>
- <?php $name2='Lines'; ?>
- <?php $mode2='lines'; ?>
- <?php $color2='#F7BD00'; ?>
- <?php $x2=array(1, 2, 3, 4); ?>
- <?php $y2=array(16, 5, 11, 9); ?>
- <?php $name3='Markers • Lines'; ?>
- <?php $mode3='lines+markers'; ?>
- <?php $color3='#C10037'; ?>
- <?php $x3=array(1, 2, 3, 4); ?>
- <?php $y3=array(12, 9, 15, 12); ?>
Définit le titre du graphique, la légende, le mode, la couleur et les données des 3 lignes du graphique.
- <?php head('javascript', 'jquery.minicolors'); ?>
- <?php head('stylesheet', 'jquery.minicolors', 'screen'); ?>
Ajoute les balises <script src="/js/jquery.minicolors.js"/>
et <link rel="stylesheet" href="/css/jquery.minicolors.css" media="screen"/>
à la section <head>
du document HTML pour charger le code et la feuille de style de MiniColors en jQuery.
head
est une fonction d'iZend.
Adaptez le code à votre environnement de développement.
- <?php head('javascript', 'https://cdn.plot.ly/plotly-latest.min.js'); ?>
Charge le code de la librairie Plotly.
- <?php $id=uniqid('id'); ?>
Définit l'identifiant de la <div>
qui encadre le HTML du programme.
- i.btn_plotly {width:20px;height:16px;display:inline-block;line-height:16px;background:transparent url(/objectivejs/tests/images/plotly.png) no-repeat;vertical-align:middle;text-indent:-9999px;}
- i.btn_lines {background-position:0 0;}
- i.btn_markers {background-position:-20px 0;}
- i.btn_lines_markers {background-position:-40px 0;}
- i.btn_solid {background-position:-60px 0;}
- i.btn_dot {background-position:-80px 0;}
- i.btn_dashdot {background-position:-100px 0;}
Configure l'apparence des boutons spécialement créés pour interfacer Plotly.
- #<?php echo $id; ?>_line_width, #<?php echo $id; ?>_marker_size {
- width: 3em;
- }
- #<?php echo $id; ?>_xaxis_dtick, #<?php echo $id; ?>_yaxis_dtick {
- width: 3em;
- }
- #<?php echo $id; ?>_xaxis_dtick::-webkit-inner-spin-button,
- #<?php echo $id; ?>_xaxis_dtick::-webkit-outer-spin-button,
- #<?php echo $id; ?>_yaxis_dtick::-webkit-inner-spin-button,
- #<?php echo $id; ?>_yaxis_dtick::-webkit-outer-spin-button {
- -webkit-appearance: none;
- margin: 0;
- }
- #<?php echo $id; ?>_xaxis_dtick,
- #<?php echo $id; ?>_yaxis_dtick {
- -moz-appearance: textfield;
- }
Configure la largeur des champs de saisie de la largeur d'une ligne et de la largeur d'un marqueur, du delta entre chaque marque sur l'axe des X et l'axe des Y.
Montre comment cacher les flèches affichées par un <input type="number">
.
- <div id="<?php echo $id; ?>" class="noprint">
- <div class="test_display"></div>
- <div class="ojs">
- <div>
- <span><button id="<?php echo $id; ?>_prev" type="submit" class="tiny round"><i class="fas fa-caret-left"></i></button></span>
- <span><button id="<?php echo $id; ?>_next" type="submit" class="tiny round"><i class="fas fa-caret-right"></i></button></span>
- <span><output id="<?php echo $id; ?>_index"></output></span>
- </div>
- <div>
- <span><input id="<?php echo $id; ?>_x" type="text" size="30" spellcheck="false" title="X" placeholder="1 2 3 4 ..."/> <b class="small">X</b></span>
- </div>
- <div>
- <span><input id="<?php echo $id; ?>_y" type="text" size="30" spellcheck="false" title="Y" placeholder="-5 2.5 10 5 ..."/> <b class="small">Y</b></span>
- </div>
- <div>
- <span><input id="<?php echo $id; ?>_name" type="text" size="20" spellcheck="false"/></span>
- <span id="<?php echo $id; ?>_line_color"></span>
- <span class="nowrap"><input id="<?php echo $id; ?>_hidden" type="checkbox"/><i class="fas fa-minus-circle red"></i></span>
- </div>
- <div>
- <span id="<?php echo $id; ?>_mode">
- <span><input type="radio" id="<?php echo $id; ?>_mode_lines" name="<?php echo $id; ?>_mode" value="lines" checked><label for="<?php echo $id; ?>_mode_lines"><i class="btn_plotly btn_lines">lines</i></label></span>
- <span><input type="radio" id="<?php echo $id; ?>_mode_markers" name="<?php echo $id; ?>_mode" value="markers"><label for="<?php echo $id; ?>_mode_markers"><i class="btn_plotly btn_markers">markers</i></label></span>
- <span><input type="radio" id="<?php echo $id; ?>_mode_lines_markers" name="<?php echo $id; ?>_mode" value="lines+markers"><label for="<?php echo $id; ?>_mode_lines_markers"><i class="btn_plotly btn_lines_markers">lines+markers</i></label></span>
- </span>
- <span><input id="<?php echo $id; ?>_line_width" type="number" min="1" max="10" step="1"/> <i class="btn_plotly btn_lines">lines</i></span>
- <span><input id="<?php echo $id; ?>_marker_size" type="number" min="1" max="60" step="1"/> <i class="btn_plotly btn_markers">markers</i></span>
- </div>
- <div>
- <span id="<?php echo $id; ?>_line_dash">
- <span><input type="radio" id="<?php echo $id; ?>_line_dash_solid" name="<?php echo $id; ?>_line_dash" value="solid"><label for="<?php echo $id; ?>_line_dash_solid"><i class="btn_plotly btn_solid">solid</i></label></span>
- <span><input type="radio" id="<?php echo $id; ?>_line_dash_dot" name="<?php echo $id; ?>_line_dash" value="dot"><label for="<?php echo $id; ?>_line_dash_dot"><i class="btn_plotly btn_dot">dot</i></label></span>
- <span><input type="radio" id="<?php echo $id; ?>_line_dash_dashdot" name="<?php echo $id; ?>_line_dash" value="dashdot"><label for="<?php echo $id; ?>_line_dash_dashdot"><i class="btn_plotly btn_dashdot">dashdot</i></label></span>
- </span>
- </div>
- <div>
- <span><button id="<?php echo $id; ?>_add" type="submit" class="tiny"><i class="fas fa-sm fa-plus"></i></button></span>
- <span><button id="<?php echo $id; ?>_remove" type="submit" class="tiny"><i class="fas fa-sm fa-minus"></i></button></span>
- <span><button id="<?php echo $id; ?>_shift" type="submit" class="tiny"><i class="fas fa-sm fa-arrow-up"></i></button></span>
- <span><button id="<?php echo $id; ?>_unshift" type="submit" class="tiny"><i class="fas fa-sm fa-arrow-down"></i></button></span>
- </div>
- <div>
- <span><input id="<?php echo $id; ?>_title" type="text" size="30"/></span>
- <span class="nowrap"><input id="<?php echo $id; ?>_legend" type="checkbox"/><i class="fas fa-list fa-xs"></i></span>
- </div>
- <div>
- <span><input id="<?php echo $id; ?>_xaxis_dtick" type="number"/> <i class="fas fa-arrows-alt-h fa-xs"></i></span>
- <span><input id="<?php echo $id; ?>_yaxis_dtick" type="number"/> <i class="fas fa-arrows-alt-v fa-xs"></i></span>
- <span class="nowrap"><input id="<?php echo $id; ?>_xaxis_grid" type="checkbox"/><i class="fas fa-grip-lines-vertical fa-xs"></i></span>
- <span class="nowrap"><input id="<?php echo $id; ?>_yaxis_grid" type="checkbox"/><i class="fas fa-grip-lines fa-xs"></i></span>
- </div>
- </div>
- </div>
Crée les widgets de l'interface.
- <?php head('javascript', '/objectivejs/Objective.js'); ?>
- <?php head('javascript', '/objectivejs/Validator.js'); ?>
- <?php head('javascript', '/objectivejs/Responder.js'); ?>
- <?php head('javascript', '/objectivejs/View.js'); ?>
- <?php head('javascript', '/objectivejs/Inspector.js'); ?>
- <?php head('javascript', '/objectivejs/BooleanInspector.js'); ?>
- <?php head('javascript', '/objectivejs/StringInspector.js'); ?>
- <?php head('javascript', '/objectivejs/NumberInspector.js'); ?>
- <?php head('javascript', '/objectivejs/RangeInspector.js'); ?>
- <?php head('javascript', '/objectivejs/OptionInspector.js'); ?>
- <?php head('javascript', '/objectivejs/ColorInspector.js'); ?>
- <?php head('javascript', '/objectivejs/SequenceInspector.js'); ?>
- <?php head('javascript', '/objectivejs/SetOfInspector.js'); ?>
Inclut le code de toutes les classes nécessaires.
RAPPEL : La fonction head
de la librairie iZend ajoute une balise telle que <script src="/objectivejs/Objective.js"></script>
à la section <head>
du document HTML. Adaptez le code à votre environnement de développement.
- function Tester(display, inspector) {
- Responder.call(this);
- this._display = display;
- inspector.addNextResponder(this);
- this._inspector = inspector;
- this._plotly = null;
- }
- Tester.prototype = Object.create(Responder.prototype);
- Object.defineProperty(Tester.prototype, 'constructor', { value: Tester, enumerable: false, writable: true });
- Tester.prototype.get = function() {
- return this._inspector.get();
- }
- Tester.prototype.set = function(value) {
- if (!this._inspector.set(value))
- return false;
- this.plot(this._inspector.get());
- return true;
- }
- Tester.prototype.inspectorValueChanged = function(sender) {
- if (sender === this._inspector)
- this.plot(sender.get());
- return true;
- }
- Tester.prototype.plot = function(value) {
- const config = {
- staticPlot: true,
- responsive: true
- };
- const layout = {
- height: 360,
- margin: { l: 20, r: 20, t: 50, b: 40 },
- title: value.layout.title,
- showlegend: value.layout.legend,
- xaxis: {
- dtick: value.layout.xaxisdtick,
- showgrid: value.layout.xaxisgrid,
- zeroline: false
- },
- yaxis: {
- dtick: value.layout.yaxisdtick,
- showgrid: value.layout.yaxisgrid,
- zeroline: false
- }
- };
- const data = [];
- for (let v of value.data) {
- const trace = {};
- trace.type = 'scatter';
- trace.name = v.name;
- trace.x = v.x.match(/-?\d+(\.\d+)?/g);
- trace.y = v.y.match(/-?\d+(\.\d+)?/g);
- trace.mode = v.mode;
- trace.visible = !v.hidden;
- trace.line = {
- color: v.linecolor,
- width: v.linewidth,
- dash: v.linedash
- };
- trace.marker = {
- color: v.linecolor,
- size: v.markersize
- };
- data.push(trace);
- }
- if (this._plotly === null)
- this._plotly = Plotly.newPlot(this._display, data, layout, config);
- else
- Plotly.react(this._display, data, layout);
- return this;
- }
- const container = document.querySelector('#<?php echo $id; ?>');
- const linecolor = new ColorInspector();
- linecolor.createManagedWidget(document.getElementById('<?php echo $id; ?>_line_color'));
- const linewidth = new NumberInspector(3, { min: 1, max: 10 });
- linewidth.setManagedWidget(document.getElementById('<?php echo $id; ?>_line_width')).resetWidget();
- const markersize = new NumberInspector(3, { min: 1, max: 60 });
- markersize.setManagedWidget(document.getElementById('<?php echo $id; ?>_marker_size')).resetWidget();
- const mode = new OptionInspector('lines', { tags: ['lines', 'markers', 'lines+markers'] });
- mode.setManagedWidget(document.getElementById('<?php echo $id; ?>_mode')).resetWidget();
- const linedash = new OptionInspector('solid', { tags: ['solid', 'dot', 'dashdot'] });
- linedash.setManagedWidget(document.getElementById('<?php echo $id; ?>_line_dash')).resetWidget();
- const name = new StringInspector();
- name.setManagedWidget(document.getElementById('<?php echo $id; ?>_name')).resetWidget();
- const x = new StringInspector();
- x.setManagedWidget(document.getElementById('<?php echo $id; ?>_x')).resetWidget();
- const y = new StringInspector();
- y.setManagedWidget(document.getElementById('<?php echo $id; ?>_y')).resetWidget();
- const hidden = new BooleanInspector(false);
- hidden.setManagedWidget(document.getElementById('<?php echo $id; ?>_hidden')).resetWidget();
- const trace = new SequenceInspector({
- x: x,
- y: y,
- name: name,
- mode: mode,
- linedash: linedash,
- linecolor: linecolor,
- linewidth: linewidth,
- markersize: markersize,
- hidden: hidden
- });
- const trace0 = {
- x: '',
- y: '',
- name: '',
- mode: 'lines',
- linedash: 'solid',
- linecolor: '#333',
- linewidth: 3,
- markersize: 10,
- hidden: false
- };
- const data = new SetOfInspector(trace, { min: 1, defaultItem: trace0 });
- data.setPreviousWidget(document.getElementById('<?php echo $id; ?>_prev'));
- data.setNextWidget(document.getElementById('<?php echo $id; ?>_next'));
- data.setIndexWidget(document.getElementById('<?php echo $id; ?>_index'));
- data.setAddWidget(document.getElementById('<?php echo $id; ?>_add'));
- data.setRemoveWidget(document.getElementById('<?php echo $id; ?>_remove'));
- data.setShiftWidget(document.getElementById('<?php echo $id; ?>_shift'));
- data.setUnshiftWidget(document.getElementById('<?php echo $id; ?>_unshift'));
- const title = new StringInspector('<?php echo $title; ?>', { escapeHTML: false });
- title.setManagedWidget(document.getElementById('<?php echo $id; ?>_title')).resetWidget();
- const legend = new BooleanInspector(true);
- legend.setManagedWidget(document.getElementById('<?php echo $id; ?>_legend')).resetWidget();
- const xaxisdtick = new NumberInspector(0, { min: 0 });
- xaxisdtick.setManagedWidget(document.getElementById('<?php echo $id; ?>_xaxis_dtick')).resetWidget();
- const yaxisdtick = new NumberInspector(0, { min: 0 });
- yaxisdtick.setManagedWidget(document.getElementById('<?php echo $id; ?>_yaxis_dtick')).resetWidget();
- const xaxisgrid = new BooleanInspector(false);
- xaxisgrid.setManagedWidget(document.getElementById('<?php echo $id; ?>_xaxis_grid')).resetWidget();
- const yaxisgrid = new BooleanInspector(true);
- yaxisgrid.setManagedWidget(document.getElementById('<?php echo $id; ?>_yaxis_grid')).resetWidget();
- const layout = new SequenceInspector({
- title: title,
- legend: legend,
- xaxisdtick: xaxisdtick,
- yaxisdtick: yaxisdtick,
- xaxisgrid: xaxisgrid,
- yaxisgrid: yaxisgrid
- });
- const inspector = new SequenceInspector({ data: data, layout: layout });
- const line1 = {
- x: '<?php echo implode(' ', $x1); ?>',
- y: '<?php echo implode(' ', $y1); ?>',
- name: '<?php echo $name1; ?>',
- mode: '<?php echo $mode1; ?>',
- linedash: 'solid',
- linewidth: 3,
- markersize: 20,
- linecolor: '<?php echo $color1; ?>',
- hidden: false
- };
- const line2 = {
- x: '<?php echo implode(' ', $x2); ?>',
- y: '<?php echo implode(' ', $y2); ?>',
- name: '<?php echo $name2; ?>',
- mode: '<?php echo $mode2; ?>',
- linedash: 'solid',
- linewidth: 5,
- markersize: 10,
- linecolor: '<?php echo $color2; ?>',
- hidden: false
- };
- const line3 = {
- x: '<?php echo implode(' ', $x3); ?>',
- y: '<?php echo implode(' ', $y3); ?>',
- name: '<?php echo $name3; ?>',
- mode: '<?php echo $mode3; ?>',
- linedash: 'dashdot',
- linewidth: 3,
- markersize: 10,
- linecolor: '<?php echo $color3; ?>',
- hidden: false
- };
- const display = container.querySelector('.test_display');
- const tester = new Tester(display, inspector);
- tester.set({
- data: [line1, line2, line3],
- layout: {
- title: '<?php echo $title; ?>',
- legend: true,
- xaxisdtick: 1,
- xaxisgrid: false,
- yaxisgrid: true
- }
- });
Édition d'un graphique à barres
Changez le titre du graphique à Plotly & Objective.js
.
Remarquez que le caractère & n'est pas échappé.
Cochez l'option pour afficher la légende du graphique.
Utilisez le sélecteur pour éditer les données et la couleur d'une série de barres. Appuyez sur les flèches pour déplacer la série de barres sélectionnée vers la gauche ou vers la droite.
Essayez de défaire et de refaire une modification. Cliquez sur le bouton de remise à zéro pour réinitialiser le graphique.
Rechargez la page. Les modifications sont enregistrées.
Code
Voir Architecture d'un éditeur.
- Model
- BarChartModel
- function BarChartModel(chartname) {
- Model.call(this, chartname);
- this._value = {
- data: null, layout: { title: '', legend: false }
- };
- }
- BarChartModel.prototype = Object.create(Model.prototype);
- Object.defineProperty(BarChartModel.prototype, 'constructor', { value: BarChartModel, enumerable: false, writable: true });
- BarChartModel.prototype.validateValue = function(prop, val) {
- if (prop == 'data')
- return val === null || Array.isArray(val);
- if (prop == 'layout') {
- if (typeof val !== 'object')
- return false;
- const { title, legend } = val;
- if (typeof title !== 'string')
- return false;
- if (typeof legend !== 'boolean')
- return false;
- return true;
- }
- return true;
- };
- Responder
- View
- BarChart
- View
- function BarChart() {
- View.call(this);
- this._data = null;
- this._layout = null;
- this._plotly = null;
- }
- BarChart.prototype = Object.create(View.prototype);
- Object.defineProperty(BarChart.prototype, 'constructor', { value: BarChart, enumerable: false, writable: true });
- BarChart.prototype._draw = function() {
- const config = {
- staticPlot: true,
- responsive: true
- };
- const layout = {
- margin: { l: 30, r: 20, t: 50, b: 40 },
- title: this._layout.title,
- showlegend: this._layout.legend,
- barmode: 'group',
- xaxis: {
- dtick: 1,
- showgrid: false,
- zeroline: false
- },
- yaxis: {
- showgrid: true,
- zeroline: true
- }
- };
- const data = [];
- for (let v of this._data || []) {
- const trace = {};
- trace.type = 'bar';
- trace.name = '';
- trace.x = v.x.match(/-?\d+(\.\d+)?/g);
- trace.y = v.y.match(/-?\d+(\.\d+)?/g);
- trace.marker = {
- color: v.markercolor
- };
- data.push(trace);
- }
- if (this._plotly === null)
- this._plotly = Plotly.newPlot(this._widget, data, layout, config);
- else
- Plotly.react(this._widget, data, layout);
- return this;
- };
- BarChart.prototype.set = function(options) {
- const {data, layout} = options;
- this._data = data;
- this._layout = layout;
- if (this.interfaced())
- this.resetWidget();
- return this;
- };
- BarChart.prototype.setValue = function(prop, val) {
- if (prop == 'data')
- this.setData(val);
- else if (prop == 'layout')
- this.setLayout(val);
- return this;
- };
- BarChart.prototype.setData = function(data) {
- this._data = data;
- if (this.interfaced())
- this.resetWidget();
- return this;
- };
- BarChart.prototype.setLayout = function(layout) {
- this._layout = layout;
- if (this.interfaced())
- this.resetWidget();
- return this;
- };
- BarChart.prototype.resetWidget = function() {
- this._draw();
- return this;
- };
- BarChart.prototype.createWidget = function() {
- const graphdiv = '<div></div>';
- let template = document.createElement('template');
- template.innerHTML = graphdiv;
- let widget = template.content.children[0];
- this.setWidget(widget);
- return this;
- };
- BarChart.prototype.destroyWidget = function() {
- if (this._widget)
- Plotly.purge(this._widget);
- View.prototype.destroyWidget.call(this);
- this._plotly = null;
- return this;
- };
- <?php $debug=false; ?>
Mettre $debug
à true
permet d'accéder dans la console du navigateur à tous les composants de l'interface.
Si $debug
vaut false
, tout le code en JavaScript est protégé par une fonction de fermeture.
- <?php $title='Plotly'; ?>
- <?php
- $data=array(
- array('#8C0C3C', array(1, 4, 9, 16)),
- array('#F7BD00', array(6, -8, -4.5, 8)),
- array('#F75431', array(-15, -3, 4.5, -8)),
- array('#C10037', array(-1, 3, -3, -4))
- );
- ?>
Définit le titre, la couleur et les données de chaque barre du graphique initial. NOTE : Dans une application web, ces paramètres pourraient être extraits d'une base de données et passés à la vue par un contrôleur.
- <?php head('javascript', 'js.cookie.js'); ?>
- <?php head('javascript', 'jquery.minicolors'); ?>
- <?php head('stylesheet', 'jquery.minicolors', 'screen'); ?>
Ajoute la balise <script src="/js/js.cookie.js"/>
à la section <head>
du document HTML pour charger le module js-cookie utilisé par la classe ModelCookieDelegate.
Ajoute les balises <script src="/js/jquery.minicolors.js"/>
et <link rel="stylesheet" href="/css/jquery.minicolors.css" media="screen"/>
à la section <head>
du document HTML pour charger le code et la feuille de style de MiniColors en jQuery.
head
est une fonction d'iZend.
Adaptez le code à votre environnement de développement.
- <?php head('javascript', 'https://cdn.plot.ly/plotly-latest.min.js'); ?>
Charge le code de la librairie Plotly.
- <?php $id=uniqid('id'); ?>
Définit l'identifiant de la <div>
qui encadre l'affichage de l'éditeur et du graphique.
- <div id="<?php echo $id; ?>" class="noprint">
- <div class="ojs">
- <div>
- <div class="undo_panel" style="margin-right:20px">
- <button type="submit" class="ojs_button narrow" disabled><i class="fas fa-undo"></i></button>
- <button type="submit" class="ojs_button narrow" disabled><i class="fas fa-redo"></i></button>
- </div>
- <button id="<?php echo $id; ?>_reset" type="submit" class="ojs_button narrow"><i class="fas fa-chart-bar"></i></button>
- </div>
- <div>
- <span><input id="<?php echo $id; ?>_title" type="text" size="30"/></span>
- <span class="nowrap"><input id="<?php echo $id; ?>_legend" type="checkbox"/><i class="fas fa-list fa-xs"></i></span>
- </div>
- <div>
- <span><button id="<?php echo $id; ?>_prev" type="submit" class="ojs_button tiny round"><i class="fas fa-caret-left"></i></button></span>
- <span><button id="<?php echo $id; ?>_next" type="submit" class="ojs_button tiny round"><i class="fas fa-caret-right"></i></button></span>
- <span><output id="<?php echo $id; ?>_index"></output></span>
- </div>
- <div>
- <span><input id="<?php echo $id; ?>_x" type="text" size="20" spellcheck="false" title="X"/> <b class="small">X</b></span>
- <span><input id="<?php echo $id; ?>_y" type="text" size="20" spellcheck="false" title="Y"/> <b class="small">Y</b></span>
- <span id="<?php echo $id; ?>_marker_color"></span>
- </div>
- <div>
- <span><button id="<?php echo $id; ?>_insert" type="submit" class="ojs_button tiny"><i class="fas fa-sm fa-plus"></i></button></span>
- <span><button id="<?php echo $id; ?>_remove" type="submit" class="ojs_button tiny"><i class="fas fa-sm fa-minus"></i></button></span>
- <span><button id="<?php echo $id; ?>_shift" type="submit" class="ojs_button tiny"><i class="fas fa-sm fa-arrow-left"></i></button></span>
- <span><button id="<?php echo $id; ?>_unshift" type="submit" class="ojs_button tiny"><i class="fas fa-sm fa-arrow-right"></i></button></span>
- </div>
- </div>
- </div>
Crée les widgets de l'interface.
- <?php head('javascript', '/objectivejs/Objective.js'); ?>
- <?php head('javascript', '/objectivejs/Validator.js'); ?>
- <?php head('javascript', '/objectivejs/Responder.js'); ?>
- <?php head('javascript', '/objectivejs/View.js'); ?>
- <?php head('javascript', '/objectivejs/Inspector.js'); ?>
- <?php head('javascript', '/objectivejs/BooleanInspector.js'); ?>
- <?php head('javascript', '/objectivejs/StringInspector.js'); ?>
- <?php head('javascript', '/objectivejs/ColorInspector.js'); ?>
- <?php head('javascript', '/objectivejs/SequenceInspector.js'); ?>
- <?php head('javascript', '/objectivejs/SetOfInspector.js'); ?>
- <?php head('javascript', '/objectivejs/Model.js'); ?>
- <?php head('javascript', '/objectivejs/Undo.js'); ?>
- <?php head('javascript', '/objectivejs/Panel.js'); ?>
- <?php head('javascript', '/objectivejs/UndoPanel.js'); ?>
- <?php head('javascript', '/objectivejs/Editor.js'); ?>
- <?php head('javascript', '/objectivejs/ModelCookieDelegate.js'); ?>
- <?php head('javascript', '/objectivejs/tests/BarChartModel.js'); ?>
- <?php head('javascript', '/objectivejs/tests/BarChart.js'); ?>
Inclut le code de toutes les classes nécessaires. Inclut le code du délégué si le clip a un nom.
- <?php if (!$debug): ?>
- (function() {
- <?php endif; ?>
Isole tout le code en JavaScript dans une fonction de fermeture si $debug
vaut false
.
- const model = new BarChartModel('barchart');
Crée le modèle de données à éditer.
- const container = document.querySelector('#<?php echo $id; ?>');
Récupère la <div>
qui encadre le HTML du programme.
- const plotly = new BarChart();
- plotly.createManagedWidget(container);
Crée l'instance de BarChart qui va afficher le graphique avec Plotly.
Crée la <div>
pour Plotly.
- const panel = new UndoPanel();
- panel.setManagedWidget(container.querySelector('.undo_panel')).resetWidget();
- const x = new StringInspector();
- x.setManagedWidget(document.getElementById('<?php echo $id; ?>_x')).resetWidget();
- const y = new StringInspector();
- y.setManagedWidget(document.getElementById('<?php echo $id; ?>_y')).resetWidget();
- const markercolor = new ColorInspector();
- markercolor.createManagedWidget(document.getElementById('<?php echo $id; ?>_marker_color'));
- const trace = new SequenceInspector({
- x: x, y: y, markercolor: markercolor
- });
Crée le panneau avec les boutons pour défaire et refaire une modification. Crée les inspecteurs pour les données de l'axe des X, les données de l'axe des Y et la couleur d'une série. Crée l'instance de SequenceInspector qui gère ces 3 inspecteurs.
- const trace0 = {
- x: '1 2 3 4', y: '0', markercolor: '#333'
- };
- const dataInspector = new SetOfInspector(trace, { min: 1, max: 10, defaultItem: trace0 });
Crée l'instance de SetOfInspector qui gère la liste des séries avec un nombre d'éléments limité à 10 et une valeur initiale.
- dataInspector.setPreviousWidget(document.getElementById('<?php echo $id; ?>_prev'));
- dataInspector.setNextWidget(document.getElementById('<?php echo $id; ?>_next'));
- dataInspector.setIndexWidget(document.getElementById('<?php echo $id; ?>_index'));
- dataInspector.setInsertWidget(document.getElementById('<?php echo $id; ?>_insert'));
- dataInspector.setRemoveWidget(document.getElementById('<?php echo $id; ?>_remove'));
- dataInspector.setShiftWidget(document.getElementById('<?php echo $id; ?>_shift'));
- dataInspector.setUnshiftWidget(document.getElementById('<?php echo $id; ?>_unshift'));
Associe les boutons de contrôle avec leurs fonctions dans l'instance de SetOfInspector.
- const title = new StringInspector('<?php echo $title; ?>', { escapeHTML: false });
- title.setManagedWidget(document.getElementById('<?php echo $id; ?>_title')).resetWidget();
- const legend = new BooleanInspector(false);
- legend.setManagedWidget(document.getElementById('<?php echo $id; ?>_legend')).resetWidget();
- const layoutInspector = new SequenceInspector({ title: title, legend: legend });
Crée les inspecteurs pour le titre et l'option d'affichage de la légende du graphique. Crée l'instance de SequenceInspector qui gère ces 2 inspecteurs.
- const inspectors = {
- data: dataInspector,
- layout: layoutInspector
- };
- const editor = new Editor(model, plotly, inspectors, panel);
Crée l'instance de Editor qui va coordonner les communications entre le modèle de données, l'affichage du graphique, les inspecteurs et le panneau avec les boutons pour défaire ou refaire une action.
- model.setDelegate(new ModelCookieDelegate());
- if (model.isSaved())
- model.readIn();
- else
- _init()
- model.enableSync();
Configure l'enregistrement du modèle de données dans un cookie.
Si possible, initialise le modèle avec la dernière sauvegarde. Sinon, appelle la fonction _init
.
Enregistre automatiquement le modèle de données après qu'une de ses valeurs a été modifiée.
- function _init() {
- const data = [
- { x: '1 2 3 4', y: '<?php list($c, $y)=$data[0]; echo implode(' ', $y); ?>', markercolor: '<?php echo $c; ?>' },
- { x: '1 2 3 4', y: '<?php list($c, $y)=$data[1]; echo implode(' ', $y); ?>', markercolor: '<?php echo $c; ?>' },
- { x: '1 2 3 4', y: '<?php list($c, $y)=$data[2]; echo implode(' ', $y); ?>', markercolor: '<?php echo $c; ?>' },
- { x: '1 2 3 4', y: '<?php list($c, $y)=$data[3]; echo implode(' ', $y); ?>', markercolor: '<?php echo $c; ?>' }
- ];
- const layout = { title: '<?php echo $title; ?>', legend: false }
- model.set({ data: data, layout: layout }).sync();
- }
La fonction locale _init
initialise le modèle de données et l'enregistre.
- const reset = document.getElementById('<?php echo $id; ?>_reset');
- reset.onclick = _init;
Appelle _init
quand le bouton de remise à zéro est cliqué.
- <?php if (!$debug): ?>
- })();
- <?php endif; ?>
Ferme la fonction qui isole le code en JavaScript si $debug
vaut false
.
VOIR AUSSI
Responder, RangeInspector, ColorInspector, SequenceInspector, SetOfInspector, Model, ModelCookieDelegate, Editor, Architecture d'un éditeur
Commentaires