xref: /webtrees/resources/views/modules/statistics-chart/custom.phtml (revision 78606cf427772fbdc5222ff607ee23f43078f94b)
1<?php
2
3declare(strict_types=1);
4
5use Fisharebest\Webtrees\Http\RequestHandlers\AutoCompleteSurname;
6use Fisharebest\Webtrees\I18N;
7use Fisharebest\Webtrees\Module\StatisticsChartModule;
8use Fisharebest\Webtrees\Tree;
9use Fisharebest\Webtrees\View;
10
11/**
12 * @var StatisticsChartModule $module
13 * @var Tree                  $tree
14 */
15
16?>
17
18<div class="container pt-3">
19    <h4 class="border-bottom p-2 mb-4">
20        <?= I18N::translate('Create your own chart') ?>
21    </h4>
22
23    <form method="post" action="<?= e(route('module', ['module' => $module->name(), 'action' => 'CustomChart', 'tree' => $tree->name()])) ?>" id="own-stats-form" class="wt-page-options wt-page-options-statistics">
24        <div class="row mb-3">
25            <div class="col-sm-2 wt-page-options-label">
26                <?= I18N::translate('Chart type') ?>
27            </div>
28
29            <div class="col-sm-4 wt-page-options-value">
30                <fieldset>
31                    <legend><?= I18N::translate('Individual') ?></legend>
32
33                    <?= view('components/radios', [
34                        'name' => 'x-as', 'selected' => $module::X_AXIS_BIRTH_MONTH, 'options' => [
35                            $module::X_AXIS_BIRTH_MONTH           => I18N::translate('Month of birth'),
36                            $module::X_AXIS_DEATH_MONTH           => I18N::translate('Month of death'),
37                            $module::X_AXIS_FIRST_CHILD_MONTH     => I18N::translate('Month of birth of first child in a relation'),
38                            $module::X_AXIS_AGE_AT_DEATH          => I18N::translate('Average age at death'),
39                            $module::X_AXIS_AGE_AT_MARRIAGE       => I18N::translate('Age in year of marriage'),
40                            $module::X_AXIS_AGE_AT_FIRST_MARRIAGE => I18N::translate('Age in year of first marriage'),
41
42                        ],
43                    ]) ?>
44                </fieldset>
45
46                <fieldset>
47                    <legend><?= I18N::translate('Family') ?></legend>
48
49                    <?= view('components/radios', [
50                        'name' => 'x-as', 'selected' => $module::X_AXIS_BIRTH_MONTH, 'options' => [
51                            $module::X_AXIS_MARRIAGE_MONTH       => I18N::translate('Month of marriage'),
52                            $module::X_AXIS_FIRST_MARRIAGE_MONTH => I18N::translate('Month of first marriage'),
53                            $module::X_AXIS_NUMBER_OF_CHILDREN   => I18N::translate('Number of children'),
54
55                        ],
56                    ]) ?>
57                </fieldset>
58
59                <fieldset>
60                    <legend><?= I18N::translate('Map') ?></legend>
61
62                    <?= view('components/radios', [
63                        'name' => 'x-as', 'selected' => $module::X_AXIS_BIRTH_MONTH, 'options' => [
64                            $module::X_AXIS_INDIVIDUAL_MAP => I18N::translate('Individuals'),
65                            $module::X_AXIS_BIRTH_MAP      => I18N::translate('Births'),
66                            $module::X_AXIS_MARRIAGE_MAP   => I18N::translate('Marriages'),
67                            $module::X_AXIS_DEATH_MAP      => I18N::translate('Deaths'),
68                        ],
69                    ]) ?>
70                </fieldset>
71            </div>
72
73            <div class="col-sm-2 wt-page-options-label">
74                <?= I18N::translate('Details') ?>
75            </div>
76
77            <div class="col-sm-4 wt-page-options-value">
78                <fieldset id="axes">
79                    <legend><?= I18N::translate('Categories') ?></legend>
80
81                    <label>
82                        <input type="radio" id="z_none" name="z-as" value="<?= $module::Z_AXIS_ALL ?>" onclick="statusDisable('z-axis-boundaries-periods');">
83                        <?= I18N::translate('none') ?>
84                    </label>
85                    <br>
86                    <label>
87                        <input type="radio" id="z_sex" name="z-as" value="<?= $module::Z_AXIS_SEX ?>" onclick="statusDisable('z-axis-boundaries-periods');">
88                        <?= I18N::translate('gender') ?>
89                    </label>
90                    <br>
91                    <label>
92                        <input type="radio" id="z_time" name="z-as" value="<?= $module::Z_AXIS_TIME ?>" checked onclick="statusEnable('z-axis-boundaries-periods');">
93                        <?= I18N::translate('date periods') ?>
94                    </label>
95                    <label for="z-axis-boundaries-periods" class="visually-hidden">
96                        <?= I18N::translate('Date range') ?>
97                    </label>
98                    <select id="z-axis-boundaries-periods" class="form-select" name="z-axis-boundaries-periods">
99                        <option value="1700,1750,1800,1850,1900,1950,2000" selected>
100                            <?= /* I18N: from 1700 interval 50 years */
101                            I18N::plural('from %1$s interval %2$s year', 'from %1$s interval %2$s years', 50, I18N::digits(1700), I18N::number(50)) ?>
102                        </option>
103                        <option value="1800,1840,1880,1920,1950,1970,2000">
104                            <?= I18N::plural('from %1$s interval %2$s year', 'from %1$s interval %2$s years', 40, I18N::digits(1800), I18N::number(40)) ?>
105                        </option>
106                        <option value="1800,1850,1900,1950,2000">
107                            <?= I18N::plural('from %1$s interval %2$s year', 'from %1$s interval %2$s years', 50, I18N::digits(1800), I18N::number(50)) ?>
108                        </option>
109                        <option value="1900,1920,1940,1960,1980,1990,2000">
110                            <?= I18N::plural('from %1$s interval %2$s year', 'from %1$s interval %2$s years', 20, I18N::digits(1900), I18N::number(20)) ?>
111                        </option>
112                        <option value="1900,1925,1950,1975,2000">
113                            <?= I18N::plural('from %1$s interval %2$s year', 'from %1$s interval %2$s years', 25, I18N::digits(1900), I18N::number(25)) ?>
114                        </option>
115                        <option value="1940,1950,1960,1970,1980,1990,2000">
116                            <?= I18N::plural('from %1$s interval %2$s year', 'from %1$s interval %2$s years', 10, I18N::digits(1940), I18N::number(10)) ?>
117                        </option>
118                    </select>
119                </fieldset>
120
121                <fieldset id="zyaxes">
122                    <legend><?= I18N::translate('Results') ?></legend>
123
124                    <label>
125                        <input type="radio" name="y-as" value="<?= $module::Y_AXIS_NUMBERS ?>" checked>
126                        <?= I18N::translate('numbers') ?>
127                    </label>
128                    <br>
129                    <label>
130                        <input type="radio" name="y-as" value="<?= $module::Y_AXIS_PERCENT ?>">
131                        <?= I18N::translate('percentage') ?>
132                    </label>
133                </fieldset>
134
135                <fieldset id="x_years" style="display:none;">
136                    <legend><?= I18N::translate('Age interval') ?></legend>
137
138                    <label for="x-axis-boundaries-ages" class="visually-hidden">
139                        <?= I18N::translate('Age interval') ?>
140                    </label>
141                    <?= view('components/select', ['name' => 'x-axis-boundaries-ages', 'selected' => '1,5,10,20,30,40,50,60,70,80,90,100', 'options' => ['1,5,10,20,30,40,50,60,70,80,90,100' => I18N::plural('%s year', '%s years', 10, I18N::number(10)), '5,20,40,60,75,80,85,90' => I18N::plural('%s year', '%s years', 20, I18N::number(20)), '10,25,50,75,100' => I18N::plural('%s year', '%s years', 25, I18N::number(25))]]) ?>
142                </fieldset>
143
144                <fieldset id="x_years_m" style="display:none;">
145                    <legend><?= I18N::translate('Age interval') ?></legend>
146
147                    <label for="x-axis-boundaries-ages_m" class="visually-hidden">
148                        <?= I18N::translate('Select the desired age interval') ?>
149                    </label>
150                    <?= view('components/select', ['name' => 'x-axis-boundaries-ages_m', 'selected' => '16,18,20,22,24,26,28,30,32,35,40,50', 'options' => ['16,18,20,22,24,26,28,30,32,35,40,50' => I18N::plural('%s year', '%s years', 2, I18N::number(2)), '20,25,30,35,40,45,50' => I18N::plural('%s year', '%s years', 5, I18N::number(5))]]) ?>
151                </fieldset>
152
153                <div id="map_opt" style="display:none;">
154                    <fieldset id="chart_type">
155                        <legend><?= I18N::translate('Chart type') ?></legend>
156
157                        <label for="chart_type" class="visually-hidden"><?= I18N::translate('Chart type') ?></label>
158                        <select name="chart_type" class="form-select" onchange="statusShowSurname(this);">
159                            <option value="indi_distribution_chart" selected>
160                                <?= I18N::translate('Individuals') ?>
161                            </option>
162                            <option value="surname_distribution_chart">
163                                <?= I18N::translate('Surnames') ?>
164                            </option>
165                        </select>
166
167                        <div id="surname_opt" class="mb-3 d-none;">
168                            <label for="SURN"><?= I18N::translate('Surname') ?></label>
169                            <input data-wt-autocomplete-url="<?= e(route(AutoCompleteSurname::class, ['tree' => $tree->name()])) ?>" autocomplete="off" class="form-control" type="text" id="SURN" name="SURN">
170                        </div>
171                    </fieldset>
172
173                    <fieldset>
174                        <legend id="label-area"><?= I18N::translate('Geographic area') ?></legend>
175
176                        <label for="chart_shows" class="visually-hidden"><?= I18N::translate('Geographic area') ?></label>
177                        <select id="chart_shows" class="form-select" name="chart_shows">
178                            <option value="world" selected>
179                                <?= I18N::translate('World') ?>
180                            </option>
181                            <option value="150">
182                                <?= I18N::translate('Europe') ?>
183                            </option>
184                            <option value="021">
185                                <?= I18N::translate('Northern America') ?>
186                            </option>
187                            <option value="005">
188                                <?= I18N::translate('South America') ?>
189                            </option>
190                            <option value="142">
191                                <?= I18N::translate('Asia') ?>
192                            </option>
193                            <option value="145">
194                                <?= I18N::translate('Middle East') ?>
195                            </option>
196                            <option value="002">
197                                <?= I18N::translate('Africa') ?>
198                            </option>
199                        </select>
200                    </fieldset>
201                </div>
202            </div>
203        </div>
204
205        <p>
206            <button type="submit" class="btn btn-primary">
207                <?= view('icons/save') ?>
208                <?= I18N::translate('show the chart') ?>
209            </button>
210        </p>
211
212        <?= csrf_field() ?>
213    </form>
214
215    <div id="custom-chart" class="wt-ajax-load">
216        <!-- Not initially empty, to disable spinner -->
217    </div>
218</div>
219
220<?php View::push('javascript') ?>
221<script>
222    function statusDisable(sel) {
223        var cbox      = document.getElementById(sel);
224        cbox.checked  = false;
225        cbox.disabled = true;
226    }
227
228    function statusEnable(sel) {
229        var cbox      = document.getElementById(sel);
230        cbox.disabled = false;
231    }
232
233    function statusHide(sel) {
234        var box           = document.getElementById(sel);
235        box.style.display = "none";
236        var box_m         = document.getElementById(sel + "_m");
237        if (box_m) {
238            box_m.style.display = "none";
239        }
240        if (sel === "map_opt") {
241            var box_axes = document.getElementById("axes");
242            if (box_axes) {
243                box_axes.style.display = "";
244            }
245            var box_zyaxes = document.getElementById("zyaxes");
246            if (box_zyaxes) {
247                box_zyaxes.style.display = "";
248            }
249        }
250    }
251
252    function statusShow(sel) {
253        var box           = document.getElementById(sel);
254        box.style.display = "";
255        var box_m         = document.getElementById(sel + "_m");
256        if (box_m) {
257            box_m.style.display = "none";
258        }
259        if (sel === "map_opt") {
260            var box_axes = document.getElementById("axes");
261            if (box_axes) {
262                box_axes.style.display = "none";
263            }
264            var box_zyaxes = document.getElementById("zyaxes");
265            if (box_zyaxes) {
266                box_zyaxes.style.display = "none";
267            }
268        }
269    }
270
271    function statusChecked(sel) {
272        var cbox     = document.getElementById(sel);
273        cbox.checked = true;
274    }
275
276    function statusShowSurname(x) {
277        if (x.value === "surname_distribution_chart") {
278            document.getElementById("surname_opt").style.display = "";
279        } else if (x.value !== "surname_distribution_chart") {
280            document.getElementById("surname_opt").style.display = "none";
281        }
282    }
283
284    function loadCustomChart() {
285        $("#custom-chart").html("");
286        var form = $("#own-stats-form");
287        jQuery.post(form.attr("action"), form.serialize())
288            .done(function (data) {
289                $("#custom-chart").html(data);
290            })
291            .fail(function (jqXHR, textStatus) {
292                // Server error?  Show something to get rid of the spinner.
293                $("#custom-chart").html(textStatus);
294            });
295        return false;
296    }
297
298    $("[name='x-as']").change(function () {
299        var x_axis = document.querySelector("[name='x-as']:checked").value;
300
301        switch (x_axis) {
302            case "<?= e($module::X_AXIS_BIRTH_MONTH) ?>":
303            case "<?= e($module::X_AXIS_DEATH_MONTH) ?>":
304            case "<?= e($module::X_AXIS_FIRST_CHILD_MONTH) ?>":
305                statusEnable("z_sex");
306                statusHide("x_years");
307                statusHide("map_opt");
308                break;
309
310            case "<?= e($module::X_AXIS_AGE_AT_DEATH) ?>":
311                statusEnable("z_sex");
312                statusShow("x_years");
313                statusHide("map_opt");
314                break;
315
316            case "<?= e($module::X_AXIS_AGE_AT_MARRIAGE) ?>":
317            case "<?= e($module::X_AXIS_AGE_AT_FIRST_MARRIAGE) ?>":
318                statusEnable("z_sex");
319                statusHide("x_years");
320                statusShow("x_years_m");
321                statusHide("map_opt");
322                break;
323
324            case "<?= e($module::X_AXIS_MARRIAGE_MONTH) ?>":
325            case "<?= e($module::X_AXIS_FIRST_MARRIAGE_MONTH) ?>":
326            case "<?= e($module::X_AXIS_NUMBER_OF_CHILDREN) ?>":
327                statusChecked("z_none");
328                statusDisable("z_sex");
329                statusHide("x_years");
330                statusHide("map_opt");
331                break;
332
333            case "<?= e($module::X_AXIS_INDIVIDUAL_MAP) ?>":
334                statusHide("x_years");
335                statusShow("map_opt");
336                statusShow("chart_type");
337                break;
338
339            case "<?= e($module::X_AXIS_BIRTH_MAP) ?>":
340            case "<?= e($module::X_AXIS_MARRIAGE_MAP) ?>":
341            case "<?= e($module::X_AXIS_DEATH_MAP) ?>":
342                statusHide("x_years");
343                statusShow("map_opt");
344                statusHide("chart_type");
345                statusHide("surname_opt");
346                break;
347        }
348    });
349
350    $("#own-stats-form").on("submit", loadCustomChart);
351    webtrees.autocomplete('#SURN');
352</script>
353<?php View::endpush() ?>
354