summaryrefslogtreecommitdiff
path: root/resources/views/edit/new-individual.phtml
diff options
context:
space:
mode:
authorGreg Roach <fisharebest@webtrees.net>2018-10-12 11:04:12 +0100
committerGreg Roach <fisharebest@webtrees.net>2018-10-12 11:15:32 +0100
commitdd6b2bfcc550270bb6d6778e11576148f71e4330 (patch)
tree9462a8eabe1103a0e79c18c521b6b4858a3fb2dc /resources/views/edit/new-individual.phtml
parentafb591d7c8a3029b0ca03e6d185cacca3c22eb5f (diff)
downloadwebtrees-dd6b2bfcc550270bb6d6778e11576148f71e4330.tar.gz
webtrees-dd6b2bfcc550270bb6d6778e11576148f71e4330.tar.bz2
webtrees-dd6b2bfcc550270bb6d6778e11576148f71e4330.zip
Use .phtml extension for template files
Diffstat (limited to 'resources/views/edit/new-individual.phtml')
-rw-r--r--resources/views/edit/new-individual.phtml523
1 files changed, 523 insertions, 0 deletions
diff --git a/resources/views/edit/new-individual.phtml b/resources/views/edit/new-individual.phtml
new file mode 100644
index 0000000000..7d256577d1
--- /dev/null
+++ b/resources/views/edit/new-individual.phtml
@@ -0,0 +1,523 @@
+<?php use Fisharebest\Webtrees\Auth; ?>
+<?php use Fisharebest\Webtrees\Config; ?>
+<?php use Fisharebest\Webtrees\Fact; ?>
+<?php use Fisharebest\Webtrees\FontAwesome; ?>
+<?php use Fisharebest\Webtrees\Functions\FunctionsEdit; ?>
+<?php use Fisharebest\Webtrees\GedcomTag; ?>
+<?php use Fisharebest\Webtrees\I18N; ?>
+<?php use Fisharebest\Webtrees\SurnameTradition; ?>
+<?php use Fisharebest\Webtrees\View; ?>
+
+<?php
+if ($individual !== null) {
+ $xref = $individual->getXref();
+ $cancel_url = $individual->url();
+} elseif ($family !== null) {
+ $xref = $family->getXref();
+ $cancel_url = $family->url();
+} else {
+ $cancel_url = route('admin-trees');
+ $xref = 'new';
+}
+
+// Different cultures do surnames differently
+$surname_tradition = SurnameTradition::create($tree->getPreference('SURNAME_TRADITION'));
+
+if ($name_fact !== null) {
+ // Editing an existing name
+ $name_fact_id = $name_fact->getFactId();
+ $namerec = $name_fact->getGedcom();
+ $name_fields = [
+ 'NAME' => $name_fact->getValue(),
+ 'TYPE' => $name_fact->getAttribute('TYPE'),
+ 'NPFX' => $name_fact->getAttribute('NPFX'),
+ 'GIVN' => $name_fact->getAttribute('GIVN'),
+ 'NICK' => $name_fact->getAttribute('NICK'),
+ 'SPFX' => $name_fact->getAttribute('SPFX'),
+ 'SURN' => $name_fact->getAttribute('SURN'),
+ 'NSFX' => $name_fact->getAttribute('NSFX'),
+ ];
+
+ // Populate any missing subfields from the NAME field
+ $npfx_accept = implode('|', Config::namePrefixes());
+ if (preg_match('/(((' . $npfx_accept . ')\.? +)*)([^\n\/"]*)("(.*)")? *\/(([a-z]{2,3} +)*)(.*)\/ *(.*)/i', $name_fields['NAME'], $name_bits)) {
+ $name_fields['NPFX'] = $name_fields['NPFX'] ?: $name_bits[1];
+ $name_fields['GIVN'] = $name_fields['GIVN'] ?: $name_bits[4];
+ $name_fields['NICK'] = $name_fields['NICK'] ?: $name_bits[6];
+ $name_fields['SPFX'] = $name_fields['SPFX'] ?: trim($name_bits[7]);
+ $name_fields['SURN'] = $name_fields['SURN'] ?: preg_replace('~/[^/]*/~', ',', $name_bits[9]);
+ $name_fields['NSFX'] = $name_fields['NSFX'] ?: $name_bits[10];
+ }
+} else {
+ // Creating a new name
+ $name_fact_id = '';
+ $namerec = '';
+ $name_fields = [
+ 'NAME' => '',
+ 'TYPE' => '',
+ 'NPFX' => '',
+ 'GIVN' => '',
+ 'NICK' => '',
+ 'SPFX' => '',
+ 'SURN' => '',
+ 'NSFX' => '',
+ ];
+
+ // Inherit surname from parents, spouse or child
+ if ($family) {
+ $father = $family->getHusband();
+ if ($father && $father->getFirstFact('NAME')) {
+ $father_name = $father->getFirstFact('NAME')->getValue();
+ } else {
+ $father_name = '';
+ }
+ $mother = $family->getWife();
+ if ($mother && $mother->getFirstFact('NAME')) {
+ $mother_name = $mother->getFirstFact('NAME')->getValue();
+ } else {
+ $mother_name = '';
+ }
+ } else {
+ $father = null;
+ $mother = null;
+ $father_name = '';
+ $mother_name = '';
+ }
+ if ($individual && $individual->getFirstFact('NAME')) {
+ $indi_name = $individual->getFirstFact('NAME')->getValue();
+ } else {
+ $indi_name = '';
+ }
+
+ switch ($nextaction) {
+ case 'add_child_to_family_action':
+ $name_fields = array_merge($name_fields, $surname_tradition->newChildNames($father_name, $mother_name, $gender));
+ break;
+ case 'add_child_to_individual_action':
+ if ($individual->getSex() === 'F') {
+ $name_fields = array_merge($name_fields, $surname_tradition->newChildNames('', $indi_name, $gender));
+ } else {
+ $name_fields = array_merge($name_fields, $surname_tradition->newChildNames($indi_name, '', $gender));
+ }
+ break;
+ case 'add_parent_to_individual_action':
+ $name_fields = array_merge($name_fields, $surname_tradition->newParentNames($indi_name, $gender));
+ break;
+ case 'add_spouse_to_family_action':
+ if ($father) {
+ $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($father_name, $gender));
+ } else {
+ $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($mother_name, $gender));
+ }
+ break;
+ case 'add_spouse_to_individual_action':
+ $name_fields = array_merge($name_fields, $surname_tradition->newSpouseNames($indi_name, $gender));
+ break;
+ case 'add_unlinked_indi_action':
+ case 'update':
+ if ($surname_tradition->hasSurnames()) {
+ $name_fields['NAME'] = '//';
+ }
+ break;
+ }
+}
+
+$bdm = ''; // used to copy '1 SOUR' to '2 SOUR' for BIRT DEAT MARR
+
+?>
+<h2 class="wt-page-title"><?= $title ?></h2>
+
+<form method="post" onsubmit="return checkform();">
+ <input type="hidden" name="ged" value="<?= e($tree->getName()) ?>">
+ <input type="hidden" name="action" value="<?= e($nextaction) ?>">
+ <input type="hidden" name="fact_id" value="<?= e($name_fact_id) ?>">
+ <input type="hidden" name="xref" value="<?= e($xref) ?>">
+ <input type="hidden" name="famtag" value="<?= e($famtag) ?>">
+ <input type="hidden" name="gender" value="<?= $gender ?>">
+ <?= csrf_field() ?>
+
+ <?php if ($nextaction === 'add_child_to_family_action' || $nextaction === 'add_child_to_individual_action') : ?>
+ <?= FunctionsEdit::addSimpleTag($tree, '0 PEDI') ?>
+ <?php endif ?>
+
+ <?php
+ // First - standard name fields
+ foreach ($name_fields as $tag => $value) {
+ if (substr_compare($tag, '_', 0, 1) !== 0) {
+ echo FunctionsEdit::addSimpleTag($tree, '0 ' . $tag . ' ' . $value, '', '', null, $individual);
+ }
+ }
+
+ // Second - advanced name fields
+ if ($surname_tradition->hasMarriedNames() || preg_match('/\n2 _MARNM /', $namerec)) {
+ $adv_name_fields = ['_MARNM' => ''];
+ } else {
+ $adv_name_fields = [];
+ }
+ if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $tree->getPreference('ADVANCED_NAME_FACTS'), $match)) {
+ foreach ($match[1] as $tag) {
+ // Ignore advanced facts that duplicate standard facts
+ if (!in_array($tag, ['TYPE', 'NPFX', 'GIVN', 'NICK', 'SPFX', 'SURN', 'NSFX'])) {
+ $adv_name_fields[$tag] = '';
+ }
+ }
+ }
+
+ foreach (array_keys($adv_name_fields) as $tag) {
+ // Edit existing tags, grouped together
+ if (preg_match_all('/2 ' . $tag . ' (.+)/', $namerec, $match)) {
+ foreach ($match[1] as $value) {
+ echo FunctionsEdit::addSimpleTag($tree, '2 ' . $tag . ' ' . $value, '', GedcomTag::getLabel('NAME:' . $tag, $individual));
+ if ($tag === '_MARNM') {
+ preg_match_all('/\/([^\/]*)\//', $value, $matches);
+ echo FunctionsEdit::addSimpleTag($tree, '2 _MARNM_SURN ' . implode(',', $matches[1]));
+ }
+ }
+ }
+ // Allow a new tag to be entered
+ if (!array_key_exists($tag, $name_fields)) {
+ echo FunctionsEdit::addSimpleTag($tree, '0 ' . $tag, '', GedcomTag::getLabel('NAME:' . $tag, $individual));
+ if ($tag === '_MARNM') {
+ echo FunctionsEdit::addSimpleTag($tree, '0 _MARNM_SURN');
+ }
+ }
+ }
+
+ // Third - new/existing custom name fields
+ foreach ($name_fields as $tag => $value) {
+ if (substr_compare($tag, '_', 0, 1) === 0) {
+ echo FunctionsEdit::addSimpleTag($tree, '0 ' . $tag . ' ' . $value);
+ if ($tag === '_MARNM') {
+ preg_match_all('/\/([^\/]*)\//', $value, $matches);
+ echo FunctionsEdit::addSimpleTag($tree, '2 _MARNM_SURN ' . implode(',', $matches[1]));
+ }
+ }
+ }
+
+ // Fourth - SOUR, NOTE, _CUSTOM, etc.
+ if ($namerec !== '') {
+ $gedlines = explode("\n", $namerec); // -- find the number of lines in the record
+ $fields = explode(' ', $gedlines[0]);
+ $glevel = $fields[0];
+ $level = $glevel;
+ $type = $fields[1];
+ $tags = [];
+ $i = 0;
+ do {
+ if ($type !== 'TYPE' && !array_key_exists($type, $name_fields) && !array_key_exists($type, $adv_name_fields)) {
+ $text = '';
+ for ($j = 2; $j < count($fields); $j++) {
+ if ($j > 2) {
+ $text .= ' ';
+ }
+ $text .= $fields[$j];
+ }
+ while (($i + 1 < count($gedlines)) && (preg_match('/' . ($level + 1) . ' CONT ?(.*)/', $gedlines[$i + 1], $cmatch) > 0)) {
+ $text .= "\n" . $cmatch[1];
+ $i++;
+ }
+ echo FunctionsEdit::addSimpleTag($tree, $level . ' ' . $type . ' ' . $text);
+ }
+ $tags[] = $type;
+ $i++;
+ if (isset($gedlines[$i])) {
+ $fields = explode(' ', $gedlines[$i]);
+ $level = $fields[0];
+ if (isset($fields[1])) {
+ $type = $fields[1];
+ }
+ }
+ } while (($level > $glevel) && ($i < count($gedlines)));
+ }
+
+ // If we are adding a new individual, add the basic details
+ if ($nextaction !== 'update') {
+ echo '</table><br><table class="table wt-facts-table">';
+ // 1 SEX
+ if ($famtag === 'HUSB' || $gender === 'M') {
+ echo FunctionsEdit::addSimpleTag($tree, '0 SEX M');
+ } elseif ($famtag === 'WIFE' || $gender === 'F') {
+ echo FunctionsEdit::addSimpleTag($tree, '0 SEX F');
+ } else {
+ echo FunctionsEdit::addSimpleTag($tree, '0 SEX U');
+ }
+ $bdm = 'BD';
+ if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $tree->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
+ foreach ($matches[1] as $match) {
+ if (!in_array($match, explode('|', WT_EVENTS_DEAT))) {
+ FunctionsEdit::addSimpleTags($tree, $match);
+ }
+ }
+ }
+ //-- if adding a spouse add the option to add a marriage fact to the new family
+ if ($nextaction === 'add_spouse_to_individual_action' || $nextaction === 'add_spouse_to_family_action') {
+ $bdm .= 'M';
+ if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $tree->getPreference('QUICK_REQUIRED_FAMFACTS'), $matches)) {
+ foreach ($matches[1] as $match) {
+ FunctionsEdit::addSimpleTags($tree, $match);
+ }
+ }
+ }
+ if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $tree->getPreference('QUICK_REQUIRED_FACTS'), $matches)) {
+ foreach ($matches[1] as $match) {
+ if (in_array($match, explode('|', WT_EVENTS_DEAT))) {
+ FunctionsEdit::addSimpleTags($tree, $match);
+ }
+ }
+ }
+ }
+
+ echo '</table>';
+ if ($nextaction === 'update') {
+ // GEDCOM 5.5.1 spec says NAME doesn’t get a OBJE
+ echo view('cards/add-source-citation', [
+ 'level' => 2,
+ 'full_citations' => $tree->getPreference('FULL_SOURCES'),
+ 'tree' => $tree,
+ ]);
+ echo view('cards/add-note', [
+ 'level' => 2,
+ 'tree' => $tree,
+ ]);
+ echo view('cards/add-shared-note', [
+ 'level' => 2,
+ 'tree' => $tree,
+ ]);
+ echo view('cards/add-restriction', [
+ 'level' => 2,
+ 'tree' => $tree,
+ ]);
+ } else {
+ echo view('cards/add-source-citation', [
+ 'bdm' => $bdm,
+ 'level' => 1,
+ 'full_citations' => $tree->getPreference('FULL_SOURCES'),
+ 'prefer_level2_sources' => $tree->getPreference('PREFER_LEVEL2_SOURCES'),
+ 'quick_required_facts' => $tree->getPreference('QUICK_REQUIRED_FACTS'),
+ 'quick_required_famfacts' => $tree->getPreference('QUICK_REQUIRED_FAMFACTS'),
+ 'tree' => $tree,
+ ]);
+ echo view('cards/add-note', [
+ 'level' => 1,
+ 'tree' => $tree,
+ ]);
+ echo view('cards/add-shared-note', [
+ 'level' => 1,
+ 'tree' => $tree,
+ ]);
+ echo view('cards/add-restriction', [
+ 'level' => 1,
+ 'tree' => $tree,
+ ]);
+ }
+
+ ?>
+ <div class="row form-group">
+ <div class="col-sm-9 offset-sm-3">
+ <button class="btn btn-primary" type="submit">
+ <?= FontAwesome::decorativeIcon('save') ?>
+ <?= /* I18N: A button label. */
+ I18N::translate('save') ?>
+ </button>
+ <?php if (preg_match('/^add_(child|spouse|parent|unlinked_indi)/', $nextaction)) : ?>
+ <button class="btn btn-primary" type="submit" name="goto" value="<?= $xref ?>">
+ <?= FontAwesome::decorativeIcon('save') ?>
+ <?= /* I18N: A button label. */
+ I18N::translate('go to new individual') ?>
+ </button>
+ <?php endif ?>
+ <a class="btn btn-secondary" href="<?= e($cancel_url) ?>">
+ <?= FontAwesome::decorativeIcon('cancel') ?>
+ <?= /* I18N: A button label. */
+ I18N::translate('cancel') ?>
+ </a>
+
+ <?php if ($name_fact instanceof Fact && (Auth::isAdmin() || $tree->getPreference('SHOW_GEDCOM_RECORD'))) : ?>
+ <a class="btn btn-link" href="<?= e(route('edit-raw-fact', ['xref' => $xref, 'fact_id' => $name_fact->getFactId(), 'ged' => $tree->getName()])) ?>">
+ <?= I18N::translate('Edit the raw GEDCOM') ?>
+ </a>
+ <?php endif ?>
+ </div>
+ </div>
+</form>
+
+<?= view('modals/on-screen-keyboard') ?>
+<?= view('modals/ajax') ?>
+<?= view('edit/initialize-calendar-popup') ?>
+
+<?php View::push('javascript') ?>
+<script>
+ var SURNAME_TRADITION = <?= json_encode($tree->getPreference('SURNAME_TRADITION')) ?>;
+ var gender = <?= json_encode($gender) ?>;
+ var famtag = <?= json_encode($famtag) ?>;
+
+ var NAME = $("[name=NAME]");
+
+ function trim(str) {
+ str = str.replace(/\s\s+/g, " ");
+ return str.replace(/(^\s+)|(\s+$)/g, "");
+ }
+
+ function lang_class(str) {
+ if (str.match(/[\u0370-\u03FF]/)) return "greek";
+ if (str.match(/[\u0400-\u04FF]/)) return "cyrillic";
+ if (str.match(/[\u0590-\u05FF]/)) return "hebrew";
+ if (str.match(/[\u0600-\u06FF]/)) return "arabic";
+ return "latin"; // No matched text implies latin :-)
+ }
+
+ // Generate a full name from the name components
+ function generate_name() {
+ var npfx = $("[name=NPFX]").val();
+ var givn = $("[name=GIVN]").val();
+ var spfx = $("[name=SPFX]").val();
+ var surn = $("[name=SURN]").val();
+ var nsfx = $("[name=NSFX]").val();
+
+ if (SURNAME_TRADITION === "polish" && (gender === "F" || famtag === "WIFE")) {
+ surn = surn.replace(/ski$/, "ska");
+ surn = surn.replace(/cki$/, "cka");
+ surn = surn.replace(/dzki$/, "dzka");
+ surn = surn.replace(/żki$/, "żka");
+ }
+
+ // Commas are used in the GIVN and SURN field to separate lists of surnames.
+ // For example, to differentiate the two Spanish surnames from an English
+ // double-barred name.
+ // Commas *may* be used in other fields, and will form part of the NAME.
+ var locale = document.documentElement.lang;
+ if (locale === "vi" || locale === "hu") {
+ // Default format: /SURN/ GIVN
+ return trim(npfx + " /" + trim(spfx + " " + surn).replace(/ *, */g, " ") + "/ " + givn.replace(/ *, */g, " ") + " " + nsfx);
+ } else if (locale === "zh-Hans" || locale === "zh-Hant") {
+ // Default format: /SURN/GIVN
+ return npfx + "/" + spfx + surn + "/" + givn + nsfx;
+ } else {
+ // Default format: GIVN /SURN/
+ return trim(npfx + " " + givn.replace(/ *, */g, " ") + " /" + trim(spfx + " " + surn).replace(/ *, */g, " ") + "/ " + nsfx);
+ }
+ }
+
+ // Update the NAME and _MARNM fields from the name components
+ // and also display the value in read-only "gedcom" format.
+ function updatewholename() {
+ // Don’t update the name if the user manually changed it
+ if (manualChange) {
+ return;
+ }
+
+ var npfx = $("[name=NPFX]").val();
+ var givn = $("[name=GIVN]").val();
+ var spfx = $("[name=SPFX]").val();
+ var surn = $("[name=SURN]").val();
+ var nsfx = $("[name=NSFX]").val();
+ var name = generate_name();
+
+ var display_id = NAME.attr('id') + "_display";
+
+ NAME.val(name);
+ $("#" + display_id).text(name);
+ // Married names inherit some NSFX values, but not these
+ nsfx = nsfx.replace(/^(I|II|III|IV|V|VI|Junior|Jr\.?|Senior|Sr\.?)$/i, "");
+ // Update _MARNM field from _MARNM_SURN field and display it
+ // Be careful of mixing latin/hebrew/etc. character sets.
+ var ip = document.getElementsByTagName("input");
+ var marnm_id = "";
+ var romn = "";
+ var heb = "";
+ for (var i = 0; i < ip.length; i++) {
+ var val = trim(ip[i].value);
+ if (ip[i].id.indexOf("_HEB") === 0)
+ heb = val;
+ if (ip[i].id.indexOf("ROMN") === 0)
+ romn = val;
+ if (ip[i].id.indexOf("_MARNM") === 0) {
+ if (ip[i].id.indexOf("_MARNM_SURN") === 0) {
+ var msurn = "";
+ if (val !== "") {
+ var lc = lang_class(document.getElementById(ip[i].id).value);
+ if (lang_class(name) === lc)
+ msurn = trim(npfx + " " + givn + " /" + val + "/ " + nsfx);
+ else if (lc === "hebrew")
+ msurn = heb.replace(/\/.*\//, "/" + val + "/");
+ else if (lang_class(romn) === lc)
+ msurn = romn.replace(/\/.*\//, "/" + val + "/");
+ }
+ document.getElementById(marnm_id).value = msurn;
+ document.getElementById(marnm_id + "_display").innerHTML = msurn;
+ } else {
+ marnm_id = ip[i].id;
+ }
+ }
+ }
+ }
+
+ // Toggle the name editor fields between
+ // <input type="hidden"> <span style="display:inline">
+ // <input type="text"> <span style="display:none">
+
+ var oldName = "";
+
+ // Calls to generate_name() trigger an update - hence need to
+ // set the manual change to true first. We are probably
+ // listening to the wrong events on the input fields...
+ var manualChange = generate_name() !== NAME.val();
+
+ function convertHidden(eid) {
+ var input1 = $("#" + eid);
+ var input2 = $("#" + eid + "_display");
+ // Note that IE does not allow us to change the type of an input, so we must create a new one.
+ if (input1.attr("type") === "hidden") {
+ input1.replaceWith(input1.clone().attr("type", "text"));
+ input2.hide();
+ } else {
+ input1.replaceWith(input1.clone().attr("type", "hidden"));
+ input2.show();
+ }
+ }
+
+ /**
+ * if the user manually changed the NAME field, then update the textual
+ * HTML representation of it
+ * If the value changed set manualChange to true so that changing
+ * the other fields doesn’t change the NAME line
+ */
+ function updateTextName(eid) {
+ var element = document.getElementById(eid);
+ if (element) {
+ if (element.value !== oldName) {
+ manualChange = true;
+ }
+ var delement = document.getElementById(eid + "_display");
+ if (delement) {
+ delement.innerHTML = element.value;
+ }
+ }
+ }
+
+ function checkform() {
+ var ip = document.getElementsByTagName("input");
+ for (var i = 0; i < ip.length; i++) {
+ // ADD slashes to _HEB and _AKA names
+ if (ip[i].id.indexOf("_AKA") === 0 || ip[i].id.indexOf("_HEB") === 0 || ip[i].id.indexOf("ROMN") === 0)
+ if (ip[i].value.indexOf("/") < 0 && ip[i].value !== "")
+ ip[i].value = ip[i].value.replace(/([^\s]+)\s*$/, "/$1/");
+ // Blank out temporary _MARNM_SURN
+ if (ip[i].id.indexOf("_MARNM_SURN") === 0)
+ ip[i].value = "";
+ // Convert "xxx yyy" and "xxx y yyy" surnames to "xxx,yyy"
+ if ((SURNAME_TRADITION === "spanish" || "SURNAME_TRADITION" === "portuguese") && ip[i].id.indexOf("SURN") === 0) {
+ ip[i].value = document.forms[0].SURN.value.replace(/^\s*([^\s,]{2,})\s+([iIyY] +)?([^\s,]{2,})\s*$/, "$1,$3");
+ }
+ }
+ return true;
+ }
+
+ // If the name isn’t initially formed from the components in a standard way,
+ // then don’t automatically update it.
+ if (NAME.val() !== generate_name() && NAME.val() !== "//") {
+ convertHidden(NAME.attr("id"));
+ }
+</script>
+<?php View::endpush() ?>
+