%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/components/bitrix/main.numerator.edit/templates/.default/ |
| Current File : //home/bitrix/www/bitrix/components/bitrix/main.numerator.edit/templates/.default/script.js |
;(function ()
{
BX.namespace('BX.Numerator');
BX.Numerator = function (options)
{
this.isSlider = options.isSlider;
this.isEdit = options.isEdit;
this.isMultipleSequences = options.isMultipleSequences;
this.defaultDelimiter = options.defaultDelimiter;
this.roles = {
templateInput: "numerator-template-input",
btnSave: "btn-save",
btnCancel: "btn-cancel",
form: "numerator-edit-form",
wordBtn: "numerator-template-word-btn",
wordText: "template-word-text",
timezoneToggle: "numerator-timezoneToggle",
showSetNextNumberToggle: "numerator-set-next-number-toggle",
timezones: "numerator-timezone",
sequenceBlock: "nextNumberForSequence-wrapper",
nameInput: "numerator-name-input",
error: 'numerator-error',
startBlockWrapper: 'start-wrapper',
periodSelect: "numerator-periodicBy-select",
timezoneSelect: "numerator-timezone-select",
wordBtnWrapper: "numerator-edit-word-btn-wrapper"
};
this.templateInput = this.selectByRoles(this.roles.templateInput);
this.helpArticleToggles = this.selectByRoles('help-article-toggle', 'all');
this.wordBtnWrapper = this.selectByRoles(this.roles.wordBtnWrapper);
this.startBlockWrapper = this.selectByRoles(this.roles.startBlockWrapper);
this.hiddenTemplateInput = this.selectByRoles('numerator-hidden-template-input');
this.periodSelect = this.selectByRoles(this.roles.periodSelect);
this.timezoneSelect = this.selectByRoles(this.roles.timezoneSelect);
this.timezoneToggle = this.selectByRoles(this.roles.timezoneToggle);
this.showSetNextNumberToggle = this.selectByRoles(this.roles.showSetNextNumberToggle);
this.timezones = this.selectByRoles(this.roles.timezones);
this.sequenceBlock = this.selectByRoles(this.roles.sequenceBlock);
this.saveButton = this.selectByRoles(this.roles.btnSave);
this.cancelButton = this.selectByRoles(this.roles.btnCancel);
this.numeratorForm = this.selectByRoles(this.roles.form);
this.nameInput = this.selectByRoles(this.roles.nameInput);
this.settingsBlock = {};
this.errors = [];
this.errorMessages = options && options.errors ? options.errors : {};
this.wordButtons = this.selectByRoles(this.roles.wordBtn, 'all');
for (var k = 0; k < this.wordButtons.length; k++)
{
var settingsBlock = this.selectByRoles('settings-type-' + this.wordButtons[k].dataset['type']);
if (settingsBlock)
{
this.settingsBlock[this.wordButtons[k].dataset['type']] = settingsBlock;
}
}
this.hideInitial();
this.addEventHandlers();
this.fillTemplate();
this.updateTemplateHiddenInput();
};
BX.Numerator.prototype = {
addEventHandlers: function ()
{
BX.bind(this.saveButton, 'click', BX.delegate(this.onSaveClick, this));
BX.bind(this.cancelButton, 'click', BX.delegate(this.onCancelClick, this));
BX.bind(this.templateInput, 'keyup', BX.delegate(this.handleKeyPress, this));
for (var i = 0; i < this.wordButtons.length; i++)
{
BX.bind(this.wordButtons[i], 'click', BX.delegate(this.onTemplateWordBtnClick, this));
}
BX.bind(this.periodSelect, 'change', BX.delegate(this.onPeriodOptionClick, this));
BX.bind(this.timezoneToggle, 'click', BX.delegate(this.onTimezoneToggleClick, this));
BX.bind(this.showSetNextNumberToggle, 'click', BX.delegate(this.onShowSetNextNumberToggleClick, this));
for (var i = 0; i < this.wordButtons.length; i++)
{
BX.bind(this.helpArticleToggles[i], 'click', BX.delegate(this.onHelpArticleToggleClick, this));
}
},
hideInitial: function ()
{
this.hideElement(this.timezones);
if (this.sequenceBlock)
{
this.hideElement(this.sequenceBlock);
}
if (!this.periodSelect.value)
{
this.hideElement(this.timezoneToggle);
}
else if (this.timezoneSelect.value)
{
this.showElement(this.timezones);
}
if (this.isEdit && !this.periodSelect.value)
{
this.hideElement(this.startBlockWrapper);
}
if (!this.showSetNextNumberToggle && !this.sequenceBlock)
{
this.showElement(this.startBlockWrapper);
}
},
onPeriodOptionClick: function (event)
{
if (this.periodSelect.value)
{
this.showElement(this.timezoneToggle);
if (this.isEdit)
{
this.showElement(this.startBlockWrapper)
}
if (this.timezoneSelect.value)
{
this.showElement(this.timezones)
}
}
else
{
this.hideElement(this.timezoneToggle);
this.hideElement(this.timezones);
if (this.isEdit)
{
this.hideElement(this.startBlockWrapper)
}
}
},
fillTemplate: function ()
{
var remainingTemplate;
var templateText = remainingTemplate = (this.templateInput.dataset['value']);
if (templateText)
{
var words = templateText.match(/{[a-z0-9_:!@#%^&\(*;\)]+?}/gi);
if (words)
{
for (var d = 0; d < words.length; d++)
{
var word = words[d];
var button = this.selectByRoles([[this.roles.wordBtn, ''], [word, '', 'word']]);
if (button)
{
this.activateButton(button);
this.changeSettingsVisibility(button.dataset['type']);
remainingTemplate = this.appendTextToTemplate(word, remainingTemplate);
this.templateInput.appendChild(this.getTemplateWordNode(button.dataset['type'], word));
}
}
}
if (remainingTemplate)
{
this.templateInput.appendChild(document.createTextNode(remainingTemplate));
}
}
else
{
var wordDefault = '{NUMBER}';
var buttonDefault = this.selectByRoles([[this.roles.wordBtn, ''], [wordDefault, '', 'word']]);
if (buttonDefault)
{
this.activateButton(buttonDefault);
this.changeSettingsVisibility(buttonDefault.dataset['type']);
this.templateInput.appendChild(this.getDefaultDelimiterNode());
this.templateInput.appendChild(this.getTemplateWordNode(buttonDefault.dataset['type'], wordDefault));
}
this.deleteFirstDelimiter();
}
},
onHelpArticleToggleClick: function (event)
{
top.BX.Helper.show("redirect=detail&code=7486453");
},
onShowSetNextNumberToggleClick: function (event)
{
var numId = this.selectByRoles('numerator-hidden-id-input');
if (numId && numId.value && this.isMultipleSequences)
{
var urlNumEdit = BX.util.add_url_param("/bitrix/components/bitrix/main.numerator.edit.sequence/slider.php", {NUMERATOR_ID: numId.value});
BX.SidePanel.Instance.open(urlNumEdit, {width: 650, cacheable: false});
}
else if (this.sequenceBlock)
{
if (this.isVisibleElement(this.sequenceBlock))
{
this.hideElement(this.sequenceBlock)
}
else
{
this.showElement(this.sequenceBlock);
}
}
},
onTimezoneToggleClick: function (event)
{
if (this.isVisibleElement(this.timezones))
{
this.hideElement(this.timezones);
}
else
{
this.showElement(this.timezones);
}
},
checkForErrors: function ()
{
if (this.nameInput && !(this.nameInput.value && this.nameInput.value.trim() !== ''))
{
this.errors.push({
field: this.nameInput,
text: this.errorMessages && this.errorMessages.emptyField ? this.errorMessages.emptyField : ''
})
}
if (!(this.templateInput.innerText && this.templateInput.innerText.trim() !== ''))
{
this.errors.push({
field: this.templateInput,
text: this.errorMessages && this.errorMessages.emptyField ? this.errorMessages.emptyField : ''
})
}
},
clearErrors: function ()
{
this.errors = [];
var errorBlocks = this.selectByRoles('numerator-error-block', 'all');
for (var i = errorBlocks.length - 1; i >= 0; i--)
{
errorBlocks[i].parentNode.removeChild(errorBlocks[i]);
}
var inputWithErrors = document.querySelectorAll('.main-numerator-edit-input-alert');
for (var j = 0; j < inputWithErrors.length; j++)
{
inputWithErrors[j].classList.remove('main-numerator-edit-input-alert');
}
},
showErrors: function ()
{
for (var t = 0; t < this.errors.length; t++)
{
var errorData = this.errors[t];
var errorBlock = BX.create('div', {
attrs:
{
class: 'main-numerator-edit-alert-text'
},
dataset: {role: 'numerator-error-block'},
text: errorData.text
});
if (!errorData.field)
{
errorData.field = this.numeratorForm;
errorData.field.parentNode.insertBefore(errorBlock, errorData.field);
}
else
{
errorData.field.parentNode.insertBefore(errorBlock, errorData.field.nextSibling);
}
if (!errorData.field.classList.contains('main-numerator-edit-input-alert'))
{
errorData.field.classList.add('main-numerator-edit-input-alert');
}
}
},
updateErrors: function ()
{
this.clearErrors();
this.checkForErrors();
this.showErrors();
},
closeSlider: function ()
{
if (this.isSlider)
{
var slider = BX.SidePanel.Instance.getTopSlider();
if (slider)
{
slider.close();
}
}
},
onCancelClick: function (event)
{
event.preventDefault();
this.closeSlider();
},
onSaveClick: function (event)
{
event.stopPropagation();
event.preventDefault();
this.updateErrors();
if (this.errors && this.errors.length)
{
return;
}
var formData = new FormData(this.numeratorForm);
BX.ajax.runAction('main.api.numerator.save', {
data: formData
}).then(
function (response)
{
BX.SidePanel.Instance.postMessageAll(window, "numerator-saved-event", {
id: response.data.id,
name: this.nameInput ? this.nameInput.value : '',
template: this.hiddenTemplateInput ? this.hiddenTemplateInput.value : '',
type: response.data.type
});
this.closeSlider();
}.bind(this),
function (response)
{
for (var j = 0; j < response.errors.length; j++)
{
this.errors.push({text: response.errors[j].message})
}
this.showErrors();
}.bind(this));
},
updateTemplateHiddenInput: function ()
{
this.hiddenTemplateInput.value = this.templateInput.innerText;
},
handleKeyPress: function (e)
{
this.updateTemplateHiddenInput();
if (e.keyCode === 8 || e.keyCode === 46)
{
for (var settingsType in this.settingsBlock)
{
this.hideSettingsBlockByType(settingsType);
}
for (var k = 0; k < this.wordButtons.length; k++)
{
this.disActivateButton(this.wordButtons[k]);
}
var wordsInsideTemplate = this.selectByRoles([this.roles.templateInput, this.roles.wordText], 'all');
for (var m = 0; m < wordsInsideTemplate.length; m++)
{
var word = wordsInsideTemplate[m];
var settingsForWord = this.settingsBlock[word.dataset['settingsType']];
this.activateButton(this.selectByRoles([[this.roles.wordBtn, ''], [word.dataset['word'], '', 'word']]));
this.showElement(settingsForWord);
}
this.deleteFirstDelimiter();
}
},
onTemplateWordBtnClick: function (event)
{
event.preventDefault();
event.stopPropagation();
var button = event.currentTarget;
if (this.isActiveBtn(button))
{
this.disActivateButton(button);
this.removeWordsFromTemplate(button.dataset['word']);
this.hideSettingsBlockByType(button.dataset['type']);
}
else
{
this.activateButton(button);
this.insertWordIntoTemplate(button.dataset['type'], button.dataset['word']);
this.changeSettingsVisibility(button.dataset['type']);
}
this.deleteFirstDelimiter();
this.updateTemplateHiddenInput();
},
deleteFirstDelimiter: function ()
{
if (this.templateInput.children
&& this.templateInput.children.length
&& this.templateInput.children[0].dataset
&& this.templateInput.children[0].dataset.role === 'default-delimiter')
{
this.templateInput.children[0].parentNode.removeChild(this.templateInput.children[0]);
}
},
hideSettingsBlockByType: function (type)
{
this.hideElement(this.settingsBlock[type]);
},
getDefaultDelimiterNode: function ()
{
return BX.create('span', {text: this.defaultDelimiter, dataset: {role: 'default-delimiter'}});
},
insertWordIntoTemplate: function (type, word)
{
var el = this.getTemplateWordNode(type, word);
var selection = window.getSelection();
if (selection.getRangeAt && selection.rangeCount)
{
var range = selection.getRangeAt(0);
if (this.elementContainsSelection(this.templateInput))
{
range.insertNode(this.getDefaultDelimiterNode());
range.collapse(false);
range.insertNode(el);
}
else
{
this.templateInput.appendChild(this.getDefaultDelimiterNode());
this.templateInput.appendChild(el);
}
range.collapse(false);
}
else
{
this.templateInput.appendChild(this.getDefaultDelimiterNode());
this.templateInput.appendChild(el);
}
},
getTemplateWordNode: function (type, word)
{
var notEditableSpan = BX.create('span', {
props:
{
className: 'main-numerator-edit-template-word'
},
dataset: {settingsType: type, word: word, role: this.roles.wordText},
text: word
});
notEditableSpan.setAttribute("contenteditable", false);
return BX.create('span', {
props:
{
className: 'main-numerator-edit-template-word-wrap'
},
events: {keyup: BX.delegate(this.handleKeyPress, this)},
children: [notEditableSpan]
});
},
changeSettingsVisibility: function (settingsType)
{
if (this.templateInput)
{
var settingsField = this.settingsBlock[settingsType];
if (settingsField && !this.isVisibleElement(settingsField))
{
this.showElement(settingsField);
var node = settingsField;
var parent = node.parentNode;
var oldChild = parent.removeChild(node);
parent.insertBefore(oldChild, parent.childNodes[0]);
}
}
},
appendTextToTemplate: function (word, templateText)
{
var beforeText = templateText.substring(0, templateText.indexOf(word));
if (beforeText)
{
this.templateInput.appendChild(document.createTextNode(beforeText));
}
return templateText.replace((beforeText + word), '');
},
removeWordsFromTemplate: function (word)
{
var wordsInsideTemplate = this.selectByRoles([[this.roles.templateInput], [this.roles.wordText, ''], [word, '', 'word']], 'all');
for (var k = 0; k < wordsInsideTemplate.length; k++)
{
var wordBlock = wordsInsideTemplate[k];
if (wordBlock.previousSibling && wordBlock.previousSibling.dataset && wordBlock.previousSibling.dataset.role === 'default-delimiter')
{
wordBlock.previousSibling.parentNode.removeChild(wordBlock.previousSibling);
}
if (wordBlock.parentNode.previousSibling && wordBlock.parentNode.previousSibling.dataset && wordBlock.parentNode.previousSibling.dataset.role === 'default-delimiter')
{
wordBlock.parentNode.previousSibling.parentNode.removeChild(wordBlock.parentNode.previousSibling);
}
var wrapper = wordBlock.parentNode;
if (wrapper)
{
wrapper.removeChild(wordBlock);
}
if (wrapper.classList.contains('main-numerator-edit-template-word-wrap') && wrapper.children.length === 0)
{
wrapper.parentNode.removeChild(wrapper);
}
}
},
isActiveBtn: function (btn)
{
if (btn)
{
return btn.classList.contains('main-numerator-edit-template-word-btn-clicked');
}
},
selectByRoles: function (roles, all)
{
var selector = '';
if (!Array.isArray(roles))
{
roles = [roles];
}
for (var c = 0; c < roles.length; c++)
{
if (Array.isArray(roles[c]))
{
selector += '[data-' + (roles[c][2] ? roles[c][2] : 'role') + '="' + roles[c][0] + '"]' + (roles[c][1] === '' ? '' : ' ');
continue;
}
selector += '[data-role="' + roles[c] + '"] ';
}
return all ? document.querySelectorAll(selector) : document.querySelector(selector);
},
isVisibleElement: function (element)
{
if (element)
{
return element.classList.contains('main-numerator-edit-hide') === false;
}
},
showElement: function (element)
{
if (element)
{
element.classList.remove('main-numerator-edit-hide');
}
},
hideElement: function (element)
{
if (element)
{
element.classList.add('main-numerator-edit-hide');
}
},
disActivateButton: function (btn)
{
if (btn)
{
btn.classList.remove('main-numerator-edit-template-word-btn-clicked');
}
},
activateButton: function (btn)
{
if (btn)
{
btn.classList.add('main-numerator-edit-template-word-btn-clicked');
}
},
isOrContains: function (node, container)
{
var limit = 10;
var count = 0;
while (node)
{
count++;
if (count > limit)
{
break;
}
if (node === container)
{
return true;
}
node = node.parentNode;
}
return false;
},
elementContainsSelection: function (el)
{
var sel;
if (window.getSelection)
{
sel = window.getSelection();
if (sel.rangeCount > 0)
{
for (var i = 0; i < sel.rangeCount; ++i)
{
if (!this.isOrContains(sel.getRangeAt(i).commonAncestorContainer, el))
{
return false;
}
}
return true;
}
}
else if ((sel = document.selection) && sel.type !== "Control")
{
return this.isOrContains(sel.createRange().parentElement(), el);
}
return false;
}
};
})();