| Current Path : /var/www/element/data/www/revenuestory.ru/bitrix/js/landing/ui/field/linkurl/dist/ |
| Current File : /var/www/element/data/www/revenuestory.ru/bitrix/js/landing/ui/field/linkurl/dist/linkurl.bundle.js |
this.BX = this.BX || {};
this.BX.Landing = this.BX.Landing || {};
this.BX.Landing.UI = this.BX.Landing.UI || {};
(function (exports,landing_ui_field_textfield,main_core,ui_entitySelector) {
'use strict';
let _ = t => t,
_t,
_t2;
class LinkUrl extends landing_ui_field_textfield.Text {
constructor(data) {
super(data);
/**
* Href value matchers
*/
this.matchers = {
catalogElement: new RegExp("^(product:)?#catalogElement([0-9]+)"),
catalogSection: new RegExp("^(product:)?#catalogSection([0-9]+)"),
catalog: new RegExp("^#Section([0-9]+)"),
element: new RegExp("^#Element([0-9]+)"),
block: new RegExp("^(block:)?#block([0-9]+)"),
page: new RegExp("^(page:)?#landing([0-9]+)"),
crmForm: new RegExp("^(form:)?#crmFormPopup([0-9]+)"),
crmPhone: new RegExp("^(tel:)?#crmPhone([0-9]+)"),
diskFile: new RegExp("^(file:)?#diskFile([0-9]+)"),
user: new RegExp("^(user:)?#user([0-9]+)"),
system: new RegExp("^#system_[a-z_-]+"),
pageOld: new RegExp("^#landing([0-9]+)")
};
this.typePostfix = {
skype: '?chat'
};
this.typeHrefs = {
page: LinkUrl.TYPE_HREF_PAGE,
block: LinkUrl.TYPE_HREF_BLOCK,
form: LinkUrl.TYPE_HREF_CRM_FORM,
product: LinkUrl.TYPE_HREF_PRODUCT,
file: LinkUrl.TYPE_HREF_FILE,
start: LinkUrl.TYPE_HREF_START,
user: LinkUrl.TYPE_HREF_USER
};
main_core.Dom.addClass(this.layout, "landing-ui-field-link-url");
this.requestOptions = data.options || {};
this.disableBlocks = main_core.Type.isBoolean(data.disableBlocks) ? data.disableBlocks : false;
this.disallowType = main_core.Type.isBoolean(data.disallowType) ? data.disallowType : false;
this.iblocks = main_core.Type.isArray(data.iblocks) ? data.iblocks : null;
this.allowedTypes = main_core.Type.isArray(data.allowedTypes) ? data.allowedTypes : [LinkUrl.TYPE_BLOCK, LinkUrl.TYPE_PAGE];
if (this.allowedTypes.length === 1) {
this.constantType = this.allowedTypes[0];
this.constantTypeData = data.typeData;
}
this.allowedCatalogEntityTypes = main_core.Type.isArray(data.allowedCatalogEntityTypes) ? data.allowedCatalogEntityTypes : null;
this.onInitHandler = main_core.Type.isFunction(data.onInit) ? data.onInit : function () {};
this.onNewPageHandler = main_core.Type.isFunction(data.onNewPage) ? data.onNewPage : function () {};
this.enableAreas = data.enableAreas;
this.customPlaceholder = data.customPlaceholder;
this.detailPageMode = data.detailPageMode === true;
this.sourceField = data.sourceField;
this.currentPageOnly = data.currentPageOnly;
this.panelTitle = data.panelTitle;
this.onListShow = this.onListShow.bind(this, this.requestOptions);
this.onTypeChange = this.onTypeChange.bind(this);
this.onListItemClick = this.onListItemClick.bind(this);
this.popup = null;
this.dynamic = null;
this.value = null;
this.hrefTypeSwithcer = this.createTypeSwitcher();
this.hrefTypeSwithcerValue = this.getHrefStringType();
this.grid = this.createGridLayout();
this.gridLeftCell = this.grid.querySelector("[class*=\"left\"]");
this.gridCenterCell = this.grid.querySelector("[class*=\"center\"]");
this.gridRightCell = this.grid.querySelector("[class*=\"right\"]");
main_core.Dom.remove(this.hrefTypeSwithcer.header);
main_core.Dom.append(this.hrefTypeSwithcer.layout, this.gridLeftCell);
if (this.getHrefStringType() === LinkUrl.TYPE_HREF_START) {
this.gridCenterCell.hidden = true;
this.gridRightCell.hidden = true;
}
main_core.Dom.append(this.input, this.gridCenterCell);
main_core.Dom.append(this.grid, this.layout);
if (data.settingMode) {
main_core.Dom.addClass(this.gridCenterCell, "setting-mode");
}
if (!main_core.Type.isUndefined(this.constantType)) {
this.rightData = this.getRightData();
if (this.rightData.button) {
const button = this.createCenterCellButton(this.rightData.button);
main_core.Dom.append(button.layout, this.gridCenterCell);
}
this.contentEditable = false;
}
this.hrefTypeSwithcer.subscribe('onChange', () => {
this.rightData = this.getRightData();
this.input.hidden = this.rightData.hideInput === true;
this.gridCenterCell.hidden = false;
this.gridRightCell.hidden = false;
let button;
if (this.rightData.button) {
button = this.createCenterCellButton(this.rightData.button);
}
this.emit('buildCenter', {
button: button
});
this.emit('selectAction', {
hrefStringType: this.getHrefStringType(),
right: this.rightData
});
if (this.hrefTypeSwithcer.getValue() === LinkUrl.DELETE_TYPE_HREF) {
this.deleteTypeHref();
} //clear input when type is changed
if (this.hrefTypeSwithcerValue !== this.hrefTypeSwithcer.getValue()) {
this.input.innerHTML = '';
this.setValue("");
this.hrefTypeSwithcerValue = this.hrefTypeSwithcer.getValue();
}
const typeData = this.getTypeData(this.hrefTypeSwithcer.getValue());
this.setEditPrevented(false);
this.contentEditable = typeData.contentEditable;
});
const type = this.getHrefStringType();
this.setHrefPlaceholderByType(type);
this.setHrefTypeSwitcherValue(type);
this.removeHrefTypeFromHrefString();
this.makeDisplayedHrefValue();
if (!main_core.Type.isUndefined(this.constantType)) {
if (this.content === '') {
this.input.innerText = '';
main_core.Dom.addClass(this.input, "landing-ui-field-input-empty");
}
}
if (this.disallowType) {
main_core.Dom.addClass(this.gridLeftCell, "grid-dissallow");
}
}
/**
* Sets iblocks list
* @param {{name: string, value: int|string}[]} iblocks
*/
setIblocks(iblocks) {
this.iblocks = main_core.Type.isArray(iblocks) ? iblocks : null;
}
createCenterCellButton(data) {
let actionClick;
if (data.hasOwnProperty('action')) {
actionClick = this.onListShow.bind(this, data.action);
} else {
actionClick = data.onclick;
}
return new BX.Landing.UI.Button.BaseButton("center_cell_button", {
className: "landing-ui-button-grid-center-cell " + data.className,
text: data.text,
onClick: actionClick
});
}
/**
* Makes displayed value placeholder
*/
makeDisplayedHrefValue() {
const hrefValue = this.getValue();
let placeholderType = this.getPlaceholderType();
if (!main_core.Type.isUndefined(this.constantType)) {
placeholderType = this.constantType;
}
let valuePromise;
switch (placeholderType) {
case LinkUrl.TYPE_BLOCK:
valuePromise = this.getBlockData(hrefValue);
break;
case LinkUrl.TYPE_PAGE:
case LinkUrl.TYPE_HREF_PAGE:
valuePromise = this.getPageData(hrefValue);
break;
case LinkUrl.TYPE_CRM_FORM:
valuePromise = this.getCrmFormData(hrefValue);
break;
case LinkUrl.TYPE_CRM_PHONE:
valuePromise = this.getCrmPhoneData(hrefValue);
break;
case LinkUrl.TYPE_CATALOG_ELEMENT:
valuePromise = this.getCatalogElementData(hrefValue);
break;
case LinkUrl.TYPE_CATALOG_SECTION:
valuePromise = this.getCatalogSectionData(hrefValue);
break;
case LinkUrl.TYPE_DISK_FILE:
valuePromise = this.getDiskFileData(hrefValue);
break;
case LinkUrl.TYPE_USER:
valuePromise = this.getUserData(hrefValue);
break;
case LinkUrl.TYPE_SYSTEM:
valuePromise = this.getSystemPage(hrefValue);
break;
case LinkUrl.TYPE_CATALOG:
valuePromise = this.getCatalog(hrefValue);
break;
}
if (valuePromise) {
valuePromise.then(BX.Landing.Utils.proxy(this.createPlaceholder, this)).then(function (data) {
this.setValue(data, true);
if (!this.inited) {
this.inited = true;
this.onInitHandler();
}
return data;
}.bind(this)).catch(function () {});
}
}
/**
* Gets placeholder data
* @param {string} [hrefValue]
* @return {Promise<Object>}
*/
getPlaceholderData(hrefValue) {
hrefValue = hrefValue || this.getValue();
const placeholderType = this.getPlaceholderType(hrefValue);
let valuePromise = Promise.resolve({});
switch (placeholderType) {
case LinkUrl.TYPE_BLOCK:
valuePromise = this.getBlockData(hrefValue);
break;
case LinkUrl.TYPE_PAGE:
valuePromise = this.getPageData(hrefValue);
break;
case LinkUrl.TYPE_CATALOG_ELEMENT:
valuePromise = this.getCatalogElementData(hrefValue);
break;
case LinkUrl.TYPE_CATALOG_SECTION:
valuePromise = this.getCatalogSectionData(hrefValue);
break;
case LinkUrl.TYPE_DISK_FILE:
valuePromise = this.getDiskFileData(hrefValue);
break;
case LinkUrl.TYPE_USER:
valuePromise = this.getUserData(hrefValue);
break;
case LinkUrl.TYPE_SYSTEM:
valuePromise = this.getSystemPage(hrefValue);
break;
}
return valuePromise;
}
/**
* Removes type prefix from href value
*/
removeHrefTypeFromHrefString() {
const clearHref = this.getValue().replace(new RegExp(this.getHrefStringType(), "g"), "");
this.setValue(clearHref, true);
}
/**
* Sets type switcher value
* @param type
*/
setHrefTypeSwitcherValue(type) {
if (type === LinkUrl.TYPE_HREF_START) {
this.gridCenterCell.hidden = true;
this.gridRightCell.hidden = true;
this.emit('deleteAction');
} else {
this.gridCenterCell.hidden = false;
this.gridRightCell.hidden = false;
}
this.hrefTypeSwithcer.setValue(type);
}
/**
* Gets selected href type (From type switcher)
* @return {string}
*/
getSelectedHrefType() {
return this.hrefTypeSwithcer.getValue();
}
getRightData() {
let type = this.hrefTypeSwithcer.getValue();
if (!main_core.Type.isUndefined(this.constantType)) {
type = this.constantType;
}
const data = this.getTypeData(type);
const title = this.getRightTitle(data);
const items = this.getRightItems(data);
const button = this.getRightButton(data);
const hideInput = this.getRightHideInput(data);
const idPopup = '';
return {
title,
items,
hideInput,
button,
idPopup
};
}
getRightTitle(data) {
return data.title;
}
getRightItems(data) {
return data.items;
}
getRightHideInput(data) {
return data.hideInput;
}
getRightButton(data) {
return data.button;
}
getTypeData(type) {
if (!main_core.Type.isUndefined(this.constantTypeData)) {
return this.constantTypeData;
}
const data = {};
switch (type) {
case LinkUrl.TYPE_HREF_PAGE:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_PAGE");
data.items = {
"_self": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_SELF"),
"_blank": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_BLANK"),
"_popup": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_POPUP")
};
data.button = {
'className': 'fa fa-chevron-right',
'text': '',
'action': LinkUrl.TYPE_PAGE
};
data.hideInput = false;
data.contentEditable = false;
break;
case LinkUrl.TYPE_HREF_BLOCK:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_BLOCK");
data.items = {
"_self": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_SELF"),
"_blank": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_BLANK"),
"_popup": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_POPUP")
};
data.button = {
'className': 'fa fa-chevron-right',
'text': '',
'action': LinkUrl.TYPE_BLOCK
};
data.hideInput = false;
data.contentEditable = false;
break;
case LinkUrl.TYPE_HREF_CRM_FORM:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_CRM_FORM");
data.button = {
'className': 'fa fa-chevron-right',
'text': '',
'action': LinkUrl.TYPE_CRM_FORM
};
data.hideInput = false;
data.contentEditable = false;
break;
case LinkUrl.TYPE_HREF_PRODUCT:
case LinkUrl.TYPE_CATALOG:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_PRODUCT");
data.button = {
'className': 'fa fa-chevron-right',
'text': '',
'action': LinkUrl.TYPE_CATALOG_SECTION
};
data.hideInput = false;
data.contentEditable = false;
break;
case LinkUrl.TYPE_HREF_TEL:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_TEL");
data.items = {
"_blank": ''
};
data.button = {
'className': 'fa fa-chevron-right',
'text': '',
'action': LinkUrl.TYPE_CRM_PHONE
};
data.contentEditable = true;
data.hideInput = false;
data.needValidate = 'phone';
break;
case LinkUrl.TYPE_HREF_SMS:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_SMS");
data.hideInput = false;
data.needValidate = 'phone';
data.contentEditable = true;
break;
case LinkUrl.TYPE_HREF_SKYPE:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_SKYPE");
data.hideInput = false;
data.needValidate = 'skype';
data.contentEditable = true;
break;
case LinkUrl.TYPE_HREF_MAILTO:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_MAILTO");
data.items = {
"_blank": ""
};
data.hideInput = false;
data.needValidate = 'mail';
data.contentEditable = true;
break;
case LinkUrl.TYPE_HREF_LINK:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_LINK");
data.items = {
"_self": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_SELF"),
"_blank": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_BLANK"),
"_popup": BX.Landing.Loc.getMessage("FIELD_LINK_TARGET_POPUP")
};
data.hideInput = false;
data.contentEditable = true;
break;
case LinkUrl.TYPE_HREF_FILE:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_FILE");
data.items = {
"_blank": ''
};
data.button = {
'text': '',
'onclick': this.onDiskFileShow.bind(this)
};
data.hideInput = false;
data.contentEditable = false;
break;
case LinkUrl.TYPE_HREF_USER:
data.title = BX.Landing.Loc.getMessage("LANDING_LINK_URL_TITLE_USER");
data.button = {
'text': '',
'onclick': this.onUserListShow.bind(this)
};
data.hideInput = false;
data.contentEditable = false;
break;
}
return data;
}
/**
* Get link type
* @return {string}
*/
getHrefStringType() {
const segment = this.getValueText();
let type = LinkUrl.TYPE_HREF_START;
if (!main_core.Type.isUndefined(this.constantType)) {
return this.constantType;
}
const foundHrefStringType = this.matchHrefStringType(segment);
if (foundHrefStringType !== null) {
return foundHrefStringType;
} //for blocks with default href="#"
if (segment === '#') {
return type;
}
const setHrefTypes = [LinkUrl.TYPE_HREF_START, LinkUrl.TYPE_HREF_PAGE, LinkUrl.TYPE_HREF_BLOCK, LinkUrl.TYPE_HREF_CRM_FORM, LinkUrl.TYPE_HREF_PRODUCT, LinkUrl.TYPE_HREF_TEL, LinkUrl.TYPE_HREF_SMS, LinkUrl.TYPE_HREF_MAILTO, LinkUrl.TYPE_HREF_SKYPE, LinkUrl.TYPE_HREF_FILE, LinkUrl.TYPE_HREF_USER];
const isFindHrefType = setHrefTypes.some(function (hrefType) {
return segment.includes(hrefType);
});
if (segment !== '' && segment !== '#' && !isFindHrefType) {
return LinkUrl.TYPE_HREF_LINK;
}
const segmentType = BX.Landing.Utils.join(segment.split(":")[0], ":");
if (segment.length !== segmentType.length) {
switch (segmentType) {
case LinkUrl.TYPE_HREF_PAGE:
type = LinkUrl.TYPE_HREF_PAGE;
break;
case LinkUrl.TYPE_HREF_BLOCK:
type = LinkUrl.TYPE_HREF_BLOCK;
break;
case LinkUrl.TYPE_HREF_CRM_FORM:
type = LinkUrl.TYPE_HREF_CRM_FORM;
break;
case LinkUrl.TYPE_HREF_PRODUCT:
type = LinkUrl.TYPE_HREF_PRODUCT;
break;
case LinkUrl.TYPE_HREF_TEL:
type = LinkUrl.TYPE_HREF_TEL;
break;
case LinkUrl.TYPE_HREF_SMS:
type = LinkUrl.TYPE_HREF_SMS;
break;
case LinkUrl.TYPE_HREF_SKYPE:
type = LinkUrl.TYPE_HREF_SKYPE;
break;
case LinkUrl.TYPE_HREF_MAILTO:
type = LinkUrl.TYPE_HREF_MAILTO;
break;
case LinkUrl.TYPE_HREF_LINK:
type = LinkUrl.TYPE_HREF_LINK;
break;
case LinkUrl.TYPE_HREF_FILE:
type = LinkUrl.TYPE_HREF_FILE;
break;
case LinkUrl.TYPE_HREF_USER:
type = LinkUrl.TYPE_HREF_USER;
break;
}
}
return type;
}
/**
* Match type href for old values
* @param {string} value
*/
matchHrefStringType(value) {
if (this.matchers.catalogElement.test(value)) {
return LinkUrl.TYPE_HREF_PRODUCT;
}
if (this.matchers.catalogSection.test(value)) {
return LinkUrl.TYPE_HREF_PRODUCT;
}
if (this.matchers.block.test(value)) {
return LinkUrl.TYPE_HREF_BLOCK;
}
if (this.matchers.pageOld.test(value)) {
return LinkUrl.TYPE_HREF_PAGE;
}
if (this.matchers.crmForm.test(value)) {
return LinkUrl.TYPE_HREF_CRM_FORM;
}
if (this.matchers.crmPhone.test(value)) {
return LinkUrl.TYPE_HREF_TEL;
}
if (this.matchers.diskFile.test(value)) {
return LinkUrl.TYPE_HREF_FILE;
}
return null;
}
/**
* Sets placeholder by href type
* @param {string} type
*/
setHrefPlaceholderByType(type) {
let placeholder = this.placeholder;
switch (type) {
case LinkUrl.TYPE_HREF_PAGE:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_BUTTON_PAGE");
break;
case LinkUrl.TYPE_HREF_BLOCK:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_BUTTON_BLOCK");
break;
case LinkUrl.TYPE_HREF_CRM_FORM:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_BUTTON_CRM");
break;
case LinkUrl.TYPE_HREF_LINK:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_PLACEHOLDER_URL");
break;
case LinkUrl.TYPE_HREF_TEL:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_PLACEHOLDER_PHONE");
break;
case LinkUrl.TYPE_HREF_SKYPE:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_PLACEHOLDER_SKYPE");
break;
case LinkUrl.TYPE_HREF_SMS:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_PLACEHOLDER_PHONE");
break;
case LinkUrl.TYPE_HREF_MAILTO:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_PLACEHOLDER_EMAIL");
break;
case LinkUrl.TYPE_HREF_FILE:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_BUTTON_FILE");
break;
case LinkUrl.TYPE_HREF_USER:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_BUTTON_USER");
break;
case LinkUrl.TYPE_HREF_PRODUCT:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_BUTTON_PRODUCT");
break;
case LinkUrl.TYPE_CATALOG:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_BUTTON_CATALOG");
break;
case LinkUrl.TYPE_PAGE:
placeholder = BX.Landing.Loc.getMessage("LANDING_LINK_URL_BUTTON_PAGE_SHORT");
break;
}
main_core.Dom.attr(this.input, "data-placeholder", placeholder);
}
/**
* Gets placeholder type
* @param {string} [hrefValue]
* @return {string}
*/
getPlaceholderType(hrefValue) {
hrefValue = hrefValue || this.getValue();
if (this.matchers.block.test(hrefValue)) {
return LinkUrl.TYPE_BLOCK;
}
if (this.matchers.page.test(hrefValue)) {
return LinkUrl.TYPE_PAGE;
}
if (this.matchers.crmForm.test(hrefValue)) {
return LinkUrl.TYPE_CRM_FORM;
}
if (this.matchers.crmPhone.test(hrefValue)) {
return LinkUrl.TYPE_CRM_PHONE;
}
if (this.matchers.catalogElement.test(hrefValue)) {
return LinkUrl.TYPE_CATALOG_ELEMENT;
}
if (this.matchers.catalogSection.test(hrefValue)) {
return LinkUrl.TYPE_CATALOG_SECTION;
}
if (this.matchers.diskFile.test(hrefValue)) {
return LinkUrl.TYPE_DISK_FILE;
}
if (this.matchers.user.test(hrefValue)) {
return LinkUrl.TYPE_USER;
}
if (this.matchers.system.test(hrefValue)) {
return LinkUrl.TYPE_SYSTEM;
}
return LinkUrl.TYPE_HREF_LINK;
}
/**
* Checks that this field contains url placeholder
* @return {boolean}
*/
containsPlaceholder() {
return this.input.innerHTML.indexOf("span") !== -1;
}
/**
* Creates field grid layout
* @return {Element}
*/
createGridLayout() {
return main_core.Tag.render(_t || (_t = _`
<div class=\"landing-ui-field-link-url-grid --landing-ui-field-link-url__scope\">
<div class=\"landing-ui-field-link-url-grid-left\"></div>
<div class=\"landing-ui-field-link-url-grid-center\"></div>
<div class=\"landing-ui-field-link-url-grid-right\"></div>
</div>
`));
}
onSelectHrefButtonClick() {
this.popupActions.show();
}
/**
* Creates type switcher dropdown
* @return {BX.Landing.UI.Field.Dropdown}
*/
createTypeSwitcher() {
//type = PAGE || STORE || KNOWLEDGE
const type = BX.Landing.Env.getInstance().getType();
const items = [{
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_SELECT"),
value: LinkUrl.TYPE_HREF_START,
hidden: true
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_PAGE"),
value: LinkUrl.TYPE_HREF_PAGE,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--b24'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_BLOCK"),
value: LinkUrl.TYPE_HREF_BLOCK,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--b24'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_CRM"),
value: LinkUrl.TYPE_HREF_CRM_FORM,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--crm'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_PRODUCT"),
value: LinkUrl.TYPE_HREF_PRODUCT,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--product',
type: 'STORE'
}, {
delimiter: true
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_PHONE"),
value: LinkUrl.TYPE_HREF_TEL,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--phone'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_SMS"),
value: LinkUrl.TYPE_HREF_SMS,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--sms'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_EMAIL"),
value: LinkUrl.TYPE_HREF_MAILTO,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--mailto'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_SKYPE"),
value: LinkUrl.TYPE_HREF_SKYPE,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--skype'
}, {
delimiter: true
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_LINK"),
value: LinkUrl.TYPE_HREF_LINK,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--link'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_FILE_MSGVER_1"),
value: LinkUrl.TYPE_HREF_FILE,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--file',
type: 'KNOWLEDGE'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_USER"),
value: LinkUrl.TYPE_HREF_USER,
className: 'landing-ui-field-link-url-select-action-item fas landing-ui-field-link-url-icon--user',
type: 'KNOWLEDGE'
}, {
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_DELETE_ACTION"),
value: LinkUrl.DELETE_TYPE_HREF,
className: 'landing-ui-field-link-url-delete-action-item fas'
}];
let setItems = [];
items.forEach(function (item) {
if (!item.hasOwnProperty('type') || item.type === type) {
setItems.push(item);
}
});
if (!main_core.Type.isUndefined(this.constantType)) {
if (this.constantType === LinkUrl.TYPE_CATALOG) {
setItems = [{
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_SELECT_CATALOG"),
value: this.constantType
}];
}
if (this.constantType === LinkUrl.TYPE_PAGE) {
setItems = [{
name: BX.Landing.Loc.getMessage("LANDING_LINK_URL_ACTION_SELECT_PAGE"),
value: this.constantType
}];
}
}
return new BX.Landing.UI.Field.Dropdown({
items: setItems,
onValueChange: this.onTypeChange,
maxHeight: 1000,
className: 'landing-ui-field-link-url-dropdown-href-type',
classForTextNode: 'landing-ui-field-input-text'
});
}
/**
* Handles link type change event
* @param {BX.Landing.UI.Field.Dropdown} field
*/
onTypeChange(field) {
const type = field.getValue();
this.setHrefPlaceholderByType(type);
}
/**
* Gets block data
* @param {string} block - (#block123)
* @return {Promise<T>}
*/
getBlockData(block) {
const blockId = block.match(/\d+/)[0];
return BX.Landing.Backend.getInstance().getBlock({
blockId: blockId
}).then(function (result) {
return result.type = "block", result;
});
}
/**
* Gets page data
* @param {string} page - (#landing123)
*/
getPageData(page) {
const match = page.match(/\d+/);
if (match !== null) {
const pageId = match[0];
return BX.Landing.Backend.getInstance().getLanding({
landingId: pageId
}).then(function (landing) {
if (!landing) {
if (BX.Text.toNumber(pageId) === 0) {
this.onNewPageHandler();
return {
type: "landing",
id: 0,
name: BX.Landing.Loc.getMessage('LANDING_LINK_PLACEHOLDER_NEW_PAGE'),
siteId: BX.Landing.Main.getInstance().options.site_id
};
} else {
return null;
}
}
return {
type: "landing",
id: landing.ID,
name: landing.TITLE,
siteId: landing.SITE_ID
};
}.bind(this));
}
}
getCrmFormData(value) {
const formId = value.match(/\d+/)[0];
return BX.Landing.Backend.getInstance().action("Form::getList").then(function (result) {
const form = result.find(function (item) {
return String(item.ID) === String(formId);
});
if (form) {
return {
type: "crmFormPopup",
id: form.ID,
name: form.NAME
};
}
return null;
}.bind(this));
}
getCrmPhoneData(value) {
return new Promise(function (resolve) {
const phoneId = value.replace('tel:', '').replace('#crmPhone', '');
const item = BX.Landing.Env.getInstance().getOptions().references.find(function (item) {
return String(item.value) === String(phoneId);
});
if (item) {
resolve({
type: "crmPhone",
id: item.value,
name: item.text
});
} else {
resolve(null);
}
}.bind(this));
}
/**
* Gets system page data
* @param {string} page - (#system_([a-z]))
*/
getSystemPage(page) {
return this.cache.remember(page, function () {
const systemCode = this.content.replace("#system_", "");
const systemPages = BX.Landing.Main.getInstance().options.syspages;
if (systemCode in systemPages) {
return Promise.resolve({
type: "system",
id: "_" + systemCode,
name: systemPages[systemCode].name
});
}
return Promise.reject();
}.bind(this));
}
/**
* Gets catalog element data
* @param {string} element
*/
getCatalogElementData(element) {
return this.cache.remember(element, function () {
let elementId = element.match(this.matchers.catalogElement)[2];
if (!main_core.Type.isString(elementId)) {
elementId = element.match(this.matchers.catalogElement)[1];
}
const requestBody = {
elementId: elementId
};
return BX.Landing.Backend.getInstance().action("Utils::getCatalogElement", requestBody);
}.bind(this));
}
/**
* Gets catalog section data
* @param {string} section
*/
getCatalogSectionData(section) {
return this.cache.remember(section, function () {
let sectionId = section.match(this.matchers.catalogSection)[2];
if (!main_core.Type.isString(sectionId)) {
sectionId = element.match(this.matchers.catalogSection)[1];
}
const requestBody = {
sectionId: sectionId
};
return BX.Landing.Backend.getInstance().action("Utils::getCatalogSection", requestBody);
}.bind(this));
}
getCatalog(section) {
if (section === '={$sectionId}' || section === 'selectActions:') {
return null;
}
return this.cache.remember(section, function () {
let matchRes;
let id;
let type;
matchRes = section.match(this.matchers.catalog);
if (matchRes === null) {
matchRes = section.match(this.matchers.element);
if (matchRes !== null) {
type = 'Element';
}
} else {
type = 'Section';
}
if (matchRes) {
id = matchRes[1];
}
let requestBody = null;
if (type === 'Section') {
requestBody = {
sectionId: id
};
}
if (type === 'Element') {
requestBody = {
elementId: id
};
}
if (requestBody === null) {
return null;
}
const action = 'Utils::getCatalog' + type;
return BX.Landing.Backend.getInstance().action(action, requestBody);
}.bind(this));
}
/**
* Gets disk file data.
* @param {string} diskFile
*/
getDiskFileData(diskFile) {
return this.cache.remember(diskFile, function () {
const fileId = diskFile.replace("file:", "").replace("#diskFile", "");
return BX.Landing.Backend.getInstance().action("Block::getFileDisk", {
fileId: fileId
}).then(function (result) {
if (result) {
return {
type: LinkUrl.TYPE_DISK_FILE,
id: result.ID,
name: result.NAME
};
}
return null;
}.bind(this));
}.bind(this));
}
/**
* Gets user data.
* @param {string} userData
*/
getUserData(userData) {
return this.cache.remember(userData, function () {
const userId = userData.replace("user:", "").replace("#user", "");
return BX.Landing.Backend.getInstance().action("Block::getUserNameById", {
userId: userId
}).then(function (result) {
if (result) {
return {
type: LinkUrl.TYPE_USER,
id: userId,
name: result.NAME
};
}
}.bind(this));
}.bind(this));
}
deleteTypeHref() {
this.gridCenterCell.hidden = true;
this.gridRightCell.hidden = true;
this.setHrefTypeSwitcherValue(LinkUrl.TYPE_HREF_START);
this.setHrefPlaceholderByType(LinkUrl.TYPE_HREF_START);
this.emit('deleteAction');
}
onSelectButtonClick() {
if (this.allowedTypes.length === 1) {
this.onListShow(this.allowedTypes[0]);
}
}
onListShow(options, type) {
if (this.popup) {
this.popup.close();
}
if (type === LinkUrl.TYPE_CATALOG_SECTION || type === LinkUrl.TYPE_CATALOG) {
let iblocks = this.iblocks;
if (!main_core.Type.isArray(iblocks)) {
iblocks = BX.Landing.Main.getInstance().options.iblocks;
}
void BX.Landing.UI.Panel.Catalog.getInstance().show(iblocks, this.allowedCatalogEntityTypes).then(this.onListItemClick);
return;
}
options.enableAreas = this.enableAreas;
options.dynamicMode = true;
options.currentPageOnly = this.currentPageOnly;
options.panelTitle = this.panelTitle;
if (this.detailPageMode) {
options.source = this.sourceField.getValue().source;
void BX.Landing.UI.Panel.DetailPage.getInstance().show(options).then(this.onListItemClick);
} else {
const panel = BX.Landing.UI.Panel.URLList.getInstance();
void panel.show(type, options).then(this.onListItemClick);
}
}
onDiskFileShow() {
if (this.popup) {
this.popup.close();
}
const urlSelect = "/bitrix/tools/disk/uf.php?action=selectFile&dialog2=Y&SITE_ID=" + BX.message("SITE_ID");
const dialogName = "LandingDiskFile";
BX.ajax.get(urlSelect, "multiselect=N&dialogName=" + dialogName, BX.delegate(function () {
setTimeout(BX.delegate(function () {
BX.DiskFileDialog.obElementBindPopup[dialogName].overlay = {
backgroundColor: "#cdcdcd",
opacity: ".1"
};
BX.DiskFileDialog.obCallback[dialogName] = {
saveButton: function (tab, path, selected) {
const selectedItem = selected[Object.keys(selected)[0]];
if (!selectedItem) {
return;
}
let fileId = selectedItem.id;
if (fileId[0] === 'n') {
fileId = fileId.substr(1);
}
this.getDiskFileData("#diskFile" + fileId).then(function (data) {
this.setValue(this.createPlaceholder(data), true);
}.bind(this));
this.setHrefTypeSwitcherValue(LinkUrl.TYPE_HREF_FILE);
}.bind(this)
};
BX.DiskFileDialog.openDialog(dialogName);
}, this), 10);
}, this));
}
onUserListShow() {
this.dialog = new ui_entitySelector.Dialog({
targetNode: this.input,
enableSearch: true,
context: 'MY_MODULE_CONTEXT',
entities: [{
id: LinkUrl.TYPE_USER
}, {
id: 'department'
}],
events: {
'Item:onSelect': this.onSelectUser.bind(this)
},
multiple: false
});
this.dialog.show();
}
onSelectUser() {
const selectedItem = this.dialog.getSelectedItems()[0];
const item = {
'name': selectedItem.title.text,
'type': LinkUrl.TYPE_USER,
'id': selectedItem.id
};
this.setValue(this.createPlaceholder(item));
BX.Landing.Utils.fireEvent(this.layout, "input");
this.setHrefTypeSwitcherValue(item.type + ':');
}
/**
* Checks that edit mode is prevented
* @return {boolean}
*/
isEditPrevented() {
if (!main_core.Type.isBoolean(this.editPrevented)) {
this.editPrevented = this.containsPlaceholder();
}
return this.editPrevented;
}
/**
* Sets edit prevented value
* @param {boolean} value
*/
setEditPrevented(value) {
this.editPrevented = value;
}
/**
* Enables edit
*/
enableEdit() {
if (!this.isEditPrevented()) {
BX.Landing.UI.Field.Text.prototype.enableEdit.apply(this);
}
}
/**
* Creates internal url placeholder
* @param {{[type]: string, [id]: string|number, name: string, [url]: string, [image]: string, [subType]: string, [chain]: string[]}} options
* @returns {Element}
*/
createPlaceholder(options) {
main_core.Dom.addClass(this.gridCenterCell, "--not-empty");
if (main_core.Type.isString(options)) {
return options;
}
const placeholder = main_core.Tag.render(_t2 || (_t2 = _`
<span class=\"landing-ui-field-url-placeholder\">
<span class=\"landing-ui-field-url-placeholder-preview\"></span>
<span class=\"landing-ui-field-url-placeholder-text\">
${0}
</span>
<span class=\"landing-ui-field-url-placeholder-delete\"></span>
</span>
`), BX.Landing.Utils.encodeDataValue(options.name));
const placeholderRemove = placeholder.querySelector("[class*=\"delete\"]");
main_core.Event.bind(placeholderRemove, "click", this.onPlaceholderRemoveClick.bind(this));
if (options.type === LinkUrl.TYPE_CATALOG) {
options.chain.push(options.name);
const title = BX.Landing.Utils.join(options.name, "\n", options.chain.join(' / '));
main_core.Dom.attr(placeholder, {
"data-dynamic": {
type: BX.Landing.Utils.join(LinkUrl.TYPE_CATALOG, BX.Landing.Utils.capitalize(options.subType)),
value: options.id
},
"data-placeholder": BX.Landing.Utils.join("#", options.type, BX.Landing.Utils.capitalize(options.subType), options.id),
"data-url": BX.Landing.Utils.join("#", options.type, BX.Landing.Utils.capitalize(options.subType), options.id)
});
placeholder.setAttribute("title", title);
return placeholder;
}
BX.Landing.Utils.attr(placeholder, {
"data-placeholder": BX.Landing.Utils.join("#", options.type, options.id),
"data-url": BX.Landing.Utils.join("#", options.type, options.id)
});
placeholder.setAttribute("title", options.name);
return placeholder;
}
/**
* Handles click event on placeholder remove button
* @param event
*/
onPlaceholderRemoveClick(event) {
main_core.Dom.removeClass(this.gridCenterCell, "--not-empty");
this.setEditPrevented(false);
this.enableEdit();
main_core.Dom.remove(event.target.parentNode);
this.setValue("");
BX.Landing.Utils.fireEvent(this.layout, "input");
this.onInputHandler(this.input.innerText);
}
/**
* Handles click event on catalog panel item
* @param {object} item
*/
onListItemClick(item) {
let resultPromise = Promise.resolve(item);
if (item.type === "block") {
resultPromise = this.getBlockData("#block" + item.id);
}
resultPromise.then(function (item) {
this.setValue(this.createPlaceholder(item));
BX.Landing.Utils.fireEvent(this.layout, "input");
this.setHrefTypeSwitcherValue(item.type + ':');
}.bind(this));
}
getNewLabel() {
if (!this.newLabel) {
this.newLabel = main_core.Dom.create({
tag: 'div',
props: {
className: 'landing-ui-field-link-new-label'
},
text: BX.Landing.Loc.getMessage('LANDING_LINK_NEW_PAGE_LABEL')
});
}
return this.newLabel;
}
showNewLabel() {
BX.Dom.style(this.gridCenterCell, {
position: 'relative',
overflow: 'visible'
});
BX.Dom.append(this.getNewLabel(), this.gridCenterCell);
}
hideNewLabel() {
BX.Dom.style(this.gridCenterCell, 'overflow', null);
BX.Dom.remove(this.getNewLabel());
}
/**
* Sets value
* @param {object|string} value
* @param {boolean} [preventEvent] - Prevents onChange event
*/
setValue(value, preventEvent) {
if (main_core.Type.isObject(value) && !main_core.Type.isNil(value)) {
this.disableEdit();
this.setEditPrevented(true);
this.input.innerHTML = "";
main_core.Dom.append(value, this.input);
const dataSet = value['dataset'];
this.value = dataSet.placeholder;
this.dynamic = dataSet.dynamic;
if (this.value === '#landing0') {
this.showNewLabel();
} else {
this.hideNewLabel();
}
if (!preventEvent) {
this.onInputHandler(this.input.innerText);
}
} else if (!main_core.Type.isNil(value)) {
this.setEditPrevented(false);
this.input.innerText = this.getInputInnerText(value);
this.value = null;
this.dynamic = null;
this.hideNewLabel();
}
if (!preventEvent) {
if (main_core.Type.isString(this.value)) {
this.getPlaceholderData(this.value).then(function (data) {
this.onValueChangeHandler(data);
}.bind(this)).catch(function () {});
return;
}
this.onValueChangeHandler(null);
}
}
/**
* Gets dynamic data
* @return {?object}
*/
getDynamic() {
return this.dynamic;
}
/**
* Gets value
* @return {string}
*/
getValue() {
let valueText = this.value ? this.value : this.input.innerText;
const selectedHrefType = this.getSelectedHrefType();
this.validateValue(valueText);
this.prepareInputField(this.hrefTypeSwithcer.getValue(), valueText);
if (valueText === '') {
if (selectedHrefType === 'catalog') {
return '';
}
return LinkUrl.TYPE_HREF_START;
}
if (selectedHrefType === LinkUrl.TYPE_HREF_SKYPE && !valueText.includes(this.typePostfix.skype)) {
valueText = valueText + this.typePostfix.skype;
}
if (valueText.startsWith(selectedHrefType)) {
return valueText;
}
if (!main_core.Type.isUndefined(this.constantType)) {
if (this.constantType === LinkUrl.TYPE_CATALOG) {
if (this.matchers.catalogElement.test(valueText) || this.matchers.catalogSection.test(valueText) || this.matchers.catalog.test(valueText) || this.matchers.element.test(valueText)) {
return valueText;
}
return '';
}
if (this.constantType === LinkUrl.TYPE_PAGE) {
return LinkUrl.TYPE_HREF_PAGE + valueText;
}
}
return selectedHrefType + valueText;
}
/**
* Gets value text
* @return {string}
*/
getValueText() {
return this.value ? this.value : this.input.innerText;
}
validateValue(value) {
if (value.indexOf(':') !== -1) {
value = value.slice(value.indexOf(':') + 1);
}
const setRegs = [];
setRegs['phoneExtended'] = /(^[\d+][\d-]{4,14}\d$)|#crmPhone\d+/;
setRegs['phone'] = /^[\d+][\d-]{4,14}\d$/;
setRegs['mail'] = /^\S+@\S+[.]\S+$/i;
setRegs['skype'] = /^[a-z\d-.:]{6,32}$/i;
const type = this.hrefTypeSwithcer.getValue();
const data = this.getTypeData(type);
let readyToSave = true;
if (data.needValidate) {
let reg;
switch (type) {
case LinkUrl.TYPE_HREF_TEL:
reg = setRegs['phoneExtended'];
break;
case LinkUrl.TYPE_HREF_SMS:
reg = setRegs['phone'];
break;
case LinkUrl.TYPE_HREF_MAILTO:
reg = setRegs['mail'];
break;
case LinkUrl.TYPE_HREF_SKYPE:
reg = setRegs['skype'];
break;
}
if (reg) {
if (value.length > 0) {
const isValid = reg.test(value);
if (isValid) {
main_core.Dom.removeClass(this.gridCenterCell, "--validate-incorrect");
main_core.Dom.addClass(this.gridCenterCell, "--validate-correct");
} else {
main_core.Dom.removeClass(this.gridCenterCell, "--validate-correct");
main_core.Dom.addClass(this.gridCenterCell, "--validate-incorrect");
readyToSave = false;
}
} else {
main_core.Dom.removeClass(this.gridCenterCell, "--validate-correct");
main_core.Dom.removeClass(this.gridCenterCell, "--validate-incorrect");
}
}
} else {
main_core.Dom.removeClass(this.gridCenterCell, "--validate-correct");
main_core.Dom.removeClass(this.gridCenterCell, "--validate-incorrect");
}
this.emit('readyToSave', {
readyToSave: readyToSave
});
}
prepareInputField(hrefType, inputValue) {
//if empty field
const allowedHrefTypes = [LinkUrl.TYPE_HREF_PAGE, LinkUrl.TYPE_HREF_BLOCK, LinkUrl.TYPE_HREF_CRM_FORM, LinkUrl.TYPE_HREF_FILE, LinkUrl.TYPE_HREF_USER, LinkUrl.TYPE_HREF_PRODUCT, LinkUrl.TYPE_CATALOG, LinkUrl.TYPE_PAGE];
if (inputValue === '' && allowedHrefTypes.includes(hrefType)) {
main_core.Dom.addClass(this.input, "landing-ui-field-input-empty");
} else {
main_core.Dom.removeClass(this.input, "landing-ui-field-input-empty");
}
}
getInputInnerText(value) {
return this.prepareInputInnerText(value.toString().trim());
}
prepareInputInnerText(value) {
if (this.getSelectedHrefType() === LinkUrl.TYPE_HREF_SKYPE && value.includes(this.typePostfix.skype)) {
value = value.replace(this.typePostfix.skype, '');
}
return value;
}
}
LinkUrl.TYPE_BLOCK = "block";
LinkUrl.TYPE_PAGE = "landing";
LinkUrl.TYPE_CRM_FORM = "crmFormPopup";
LinkUrl.TYPE_CRM_PHONE = "crmPhone";
LinkUrl.TYPE_SYSTEM = "system";
LinkUrl.TYPE_CATALOG = "catalog";
LinkUrl.TYPE_CATALOG_ELEMENT = "element";
LinkUrl.TYPE_CATALOG_SECTION = "section";
LinkUrl.TYPE_DISK_FILE = "diskFile";
LinkUrl.TYPE_USER = "user";
LinkUrl.TYPE_HREF_START = "selectActions:";
LinkUrl.TYPE_HREF_PAGE = "page:";
LinkUrl.TYPE_HREF_BLOCK = "block:";
LinkUrl.TYPE_HREF_CRM_FORM = "form:";
LinkUrl.TYPE_HREF_PRODUCT = "product:";
LinkUrl.TYPE_HREF_TEL = "tel:";
LinkUrl.TYPE_HREF_SMS = "sms:";
LinkUrl.TYPE_HREF_MAILTO = "mailto:";
LinkUrl.TYPE_HREF_SKYPE = "skype:";
LinkUrl.TYPE_HREF_LINK = "";
LinkUrl.TYPE_HREF_FILE = "file:";
LinkUrl.TYPE_HREF_USER = "user:";
LinkUrl.DELETE_TYPE_HREF = "deleteTypeHref";
exports.LinkUrl = LinkUrl;
}((this.BX.Landing.UI.Field = this.BX.Landing.UI.Field || {}),BX.Landing.UI.Field,BX,BX.UI.EntitySelector));
//# sourceMappingURL=linkurl.bundle.js.map