artabro/wire/modules/Inputfield/InputfieldPageTitle/InputfieldPageTitle.js
2024-08-27 11:35:37 +02:00

114 lines
3.7 KiB
JavaScript

/**
* Convert a title/headline to an ASCII URL name
*
* 1. Convert accented characters to the ASCII equivalent.
* 2. Convert non -_a-z0-9. to blank.
* 3. Replace multiple dashes with single dash.
*
*/
function InputfieldPageTitle($nameField) {
var $titleField = $(".InputfieldPageTitle:not(.InputfieldPageTitleCustom) input[type=text]");
$(".InputfieldPageName .LanguageSupport input[type=text]").each(function() {
// if language support enabled and any of the page names contains something
// then prevent title from populating name fields
if($(this).val().length > 0) $(this).addClass('InputfieldPageNameNoUpdate');
});
if($("#ProcessPageAdd").length > 0) {
var titleKeyup = function() {
// var val = $(this).val().substring(0, 128);
var val = $(this).val(); // @adrian
var id = $(this).attr('id').replace(/Inputfield_title_*/, 'Inputfield__pw_page_name');
$nameField = $("#" + id);
if($nameField.hasClass('InputfieldPageNameNoUpdate')) return;
if($nameField.length) $nameField.val(val).trigger('blur');
}
$titleField.on('keyup change', titleKeyup);
$('.InputfieldPageName input').on('change', function() {
// if they happen to change the name field on their own, then disable
if($(this).val() != $(this).attr('data-prev')) $(this).addClass('InputfieldPageNameNoUpdate');
}).each(function() {
$(this).attr('data-prev', $(this).val());
});
}
}
function InputfieldPageTitleCustom($titleField) {
var $nameInput = jQuery('input[name="' + $titleField.attr('data-name-field') + '"]');
if(!$nameInput.length || $nameInput.val().length) return;
var delimiter = $titleField.attr('data-name-delimiter');
var $titleInput = $titleField.find('input').eq(0);
var replacements = ProcessWire.config.InputfieldPageTitle.replacements;
function titleToName(title, strict) {
var name = '';
var lastc = '';
var r = '';
var c = '';
if(typeof strict === "undefined") strict = false;
for(var n = 0; n < title.length; n++) {
c = title.substring(n, n+1);
if(c.match(/^[a-zA-Z0-9]$/g)) {
if(delimiter.length && strict) c = c.toLowerCase();
} else if(c === delimiter) {
c = delimiter;
} else if(typeof replacements[c] !== "undefined") {
c = replacements[c];
} else if(delimiter.length && name.length) {
c = delimiter;
} else {
c = '';
}
if((c === '_' || c === '-') && c !== delimiter) c = delimiter;
if(strict && (c === delimiter && lastc === delimiter)) continue;
lastc = c;
name += c;
}
if(strict && name.length && name.substring(-1) === delimiter) {
name = name.substring(0, name.length - 1);
}
return name;
}
$titleInput.on('keyup change', function() {
if($nameInput.hasClass('InputfieldPageTitleDone')) return;
var title = $(this).val();
var name = titleToName(title, true);
$nameInput.val(name).trigger('blur');
});
$nameInput.attr('data-prev', $nameInput.val());
$nameInput.on('change', function() {
var val = jQuery(this).val();
if(val.length) val = titleToName(val, false);
if(val.length && val != jQuery(this).attr('data-prev')) {
// jQuery(this).val(val);
jQuery(this).addClass('InputfieldPageTitleDone');
}
});
$nameInput.on('keyup', function() {
var val = jQuery(this).val();
if(val.length) val = titleToName(val, false);
jQuery(this).val(val);
});
}
jQuery(document).ready(function() {
var $nameField = jQuery("#Inputfield__pw_page_name");
// check if namefield exists, because pages like homepage don't have one and
// no need to continue if it already has a value
if($nameField.length && !$nameField.val().length) {
InputfieldPageTitle($nameField);
} else {
jQuery('.InputfieldPageTitleCustom').each(function() {
InputfieldPageTitleCustom(jQuery(this));
});
}
});