xref: /webtrees/resources/views/edit/edit-gedcom-fields.phtml (revision 10e0649788c8d7d4974d81c048ca2b225df8f22e)
1<?php
2
3declare(strict_types=1);
4
5use Fisharebest\Webtrees\Elements\EmptyElement;
6use Fisharebest\Webtrees\Registry;
7use Fisharebest\Webtrees\Tree;
8
9/**
10 * @var string        $gedcom
11 * @var array<string> $hierarchy
12 * @var string        $prefix
13 * @var Tree          $tree
14 */
15
16preg_match_all('/^(\d+) (\w+) ?(.*)/m', $gedcom, $matches);
17[, $levels, $tags, $values] = $matches;
18$levels   = array_map(static fn (string $x): int => (int) $x, $levels);
19$keys     = array_keys($levels);
20$elements = [];
21$ids      = [];
22$indent   = [];
23$collapse = [];
24
25foreach ($keys as $num => $key) {
26    $hierarchy[$levels[$key]] = $tags[$key];
27    $full_tag                 = implode(':', array_slice($hierarchy, 0, 1 + $levels[$key]));
28    $elements[$key]           = Registry::elementFactory()->make($full_tag);
29    $ids[$key]                = Registry::idFactory()->id() . '-' . $full_tag;
30
31    // Does this element have any children?
32    $has_subtags = ($levels[$key + 1] ?? 0) > $levels[$key];
33
34    // Do these children have values?
35    $has_subtags_with_values = false;
36    for ($n = $key + 1; $n < count($keys) && $levels[$n] > $levels[$key]; ++$n) {
37        if ($values[$n] !== '') {
38            $has_subtags_with_values = true;
39            break;
40        }
41    }
42
43    $indent[$key] = $elements[$key]->collapseChildren() && $has_subtags;
44
45    $collapse[$key] = $num > 0 && $indent[$key] && !$has_subtags_with_values;
46}
47
48?>
49<?php foreach ($keys as $key) : ?>
50    <?php if ($indent[$key - 1] ?? false) : ?>
51        <?php if ($collapse[$key - 1] ?? false) : ?>
52            <div id="collapse-<?= $key ?>" class="collapse wt-nested-edit-fields">
53        <?php else : ?>
54                <div class="wt-nested-edit-fields">
55        <?php endif ?>
56    <?php endif ?>
57
58    <?php if ($elements[$key] instanceof EmptyElement && $values[$key] === '') : ?>
59        <input type="hidden" name="<?= e($prefix) ?>levels[]" value="<?= $levels[$key] ?>">
60        <input type="hidden" name="<?= e($prefix) ?>tags[]" value="<?= e($tags[$key]) ?>">
61        <input type="hidden" name="<?= e($prefix) ?>values[]" value="">
62    <?php else : ?>
63        <div class="row mb-3">
64            <label class="col-sm-3 col-form-label" for="<?= e($ids[$key]) ?>">
65                <?= $elements[$key]->label() ?>
66                <?php if ($collapse[$key]) : ?>
67                    <button class="btn btn-link" data-bs-target="#collapse-<?= $key + 1 ?>" data-bs-toggle="collapse" aria-expanded="false" aria-controls="collapse-<?= $key + 1 ?>" type="button">
68                        <?= view('icons/expand') ?>
69                        <?= view('icons/collapse') ?>
70                    </button>
71                <?php endif ?>
72            </label>
73
74            <div class="col-sm">
75                <input type="hidden" name="<?= e($prefix) ?>levels[]" value="<?= $levels[$key] ?>">
76                <input type="hidden" name="<?= e($prefix) ?>tags[]" value="<?= e($tags[$key]) ?>">
77                <?= $elements[$key]->edit($ids[$key], $prefix . 'values[]', strtr($values[$key], ["\r" => "\n"]), $tree) ?>
78            </div>
79        </div>
80    <?php endif ?>
81
82    <?php for ($n = $key; $levels[$n] >= ($levels[$key + 1] ?? $levels[0]); $n--) : ?>
83        <?php if ($indent[$n]) : ?>
84            <?php $indent[$n] = false ?>
85            </div>
86        <?php endif ?>
87        <?php if ($levels[$n] === ($levels[$key + 1] ?? $levels[0])) : ?>
88            <?php break; ?>
89        <?php endif ?>
90    <?php endfor ?>
91<?php endforeach ?>
92