%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/js/bizproc/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/js/bizproc/user_selector.js

;if (!BX.getClass('BX.Bizproc.UserSelector')) (function(BX)
{
	'use strict';
	BX.namespace('BX.Bizproc');

	var selectors = new WeakMap();

	var UserSelector = function(container, config)
	{
		var me = this;

		if (!config)
		{
			var configString = container.getAttribute('data-config');
			config = configString ? BX.parseJSON(configString) : null;
			container.removeAttribute('data-config');
		}

		if (!BX.type.isPlainObject(config))
		{
			config = {};
		}

		this.config = config;
		this.container = container || BX.create('div');

		this.itemsNode = BX.create('span');
		this.inputBoxNode = BX.create('span', {
			attrs: {
				className: 'feed-add-destination-input-box'
			}
		});

		this.inputNode = BX.create('input', {
			props: {
				type: 'text'
			},
			attrs: {
				className: 'feed-add-destination-inp'
			}
		});

		this.inputBoxNode.appendChild(this.inputNode);

		this.tagNode = BX.create('a', {
			attrs: {
				className: 'feed-add-destination-link'
			}
		});

		this.container.appendChild(this.itemsNode);
		this.container.appendChild(this.inputBoxNode);
		this.container.appendChild(this.tagNode);

		this.data = null;
		this.dialogId = 'bp-user-selector-' + BX.util.getRandomString(7);
		this.createValueNode(config.valueInputName || '');
		this.selected = config.selected ? BX.clone(config.selected) : [];
		this.selectOne = !config.multiple;
		this.required = config.required || false;
		this.additionalFields = BX.type.isArray(config.additionalFields) ? config.additionalFields : [];

		BX.bind(this.tagNode, 'focus', function(e) {
			e.preventDefault();
			me.openDialog({bByFocusEvent: true});
		});
		BX.bind(this.container, 'click', function(e) {
			e.preventDefault();
			me.openDialog();
		});

		this.prepareRoles();

		if (config.value)
		{
			this.selected = this.parseValue(config.value);
		}

		this.addItems(this.selected);

		this.tagNode.innerHTML = (
			this.selected.length <= 0
				? BX.message('BIZPROC_JS_USER_SELECTOR_CHOOSE')
				: BX.message('BIZPROC_JS_USER_SELECTOR_EDIT')
		);
	};

	UserSelector.canUse = function()
	{
		return !!BX.SocNetLogDestination;
	};

	UserSelector.decorateNode = function(container, config)
	{
		var selector = selectors.get(container);
		if (!selector)
		{
			selector = new UserSelector(container, config);
			selectors.set(container, selector);
		}

		return selector;
	};

	UserSelector.prototype = {
		getData: function(next)
		{
			if (UserSelector.ajaxSent)
			{
				return;
			}

			UserSelector.ajaxSent = true;
			BX.ajax({
				method: 'POST',
				dataType: 'json',
				url: '/bitrix/tools/bizproc/user_selector.php',
				data: {
					ajax_action: 'get_destination_data',
					sessid: BX.bitrix_sessid(),
					site: BX.message('SITE_ID')
				},
				onsuccess: function (response)
				{
					UserSelector.data = response.data || {};
					UserSelector.ajaxSent = false;
					this.initDialog(next);
				}.bind(this)
			});
		},
		initDialog: function(next)
		{
			var i, me = this, data = UserSelector.data;

			if (!data)
			{
				me.getData(next);
				return;
			}

			var itemsSelected = {};
			for (i = 0; i < me.selected.length; ++i)
			{
				itemsSelected[me.selected[i].id] = me.selected[i].entityType
			}

			var items = {
				users : data.users || {},
				department : data.department || {},
				departmentRelation : data.departmentRelation || {},
				bpuserroles : this.roles || {}
			};
			var itemsLast =  {
				users: data.last.USERS || {}
			};

			if (!items["departmentRelation"])
			{
				items["departmentRelation"] = BX.SocNetLogDestination.buildDepartmentRelation(items["department"]);
			}

			if (!me.inited)
			{
				me.inited = true;
				var destinationInput = me.inputNode;
				destinationInput.id = me.dialogId + 'input';

				var destinationInputBox = me.inputBoxNode;
				destinationInputBox.id = me.dialogId + 'input-box';

				var tagNode = this.tagNode;
				tagNode.id = this.dialogId + 'tag';

				var itemsNode = me.itemsNode;

				BX.SocNetLogDestination.init({
					name : me.dialogId,
					searchInput : destinationInput,
					extranetUser :  false,
					bindMainPopup : {node: me.container, offsetTop: '5px', offsetLeft: '15px'},
					bindSearchPopup : {node: me.container, offsetTop : '5px', offsetLeft: '15px'},
					departmentSelectDisable: false,
					sendAjaxSearch: true,
					callback : {
						select : function(item, type)
						{
							me.addItem(item, type);
							if (me.selectOne)
								BX.SocNetLogDestination.closeDialog();
						},
						unSelect : function (item, type)
						{
							if (me.selectOne)
							{
								return;
							}
							me.unsetValue(item, type);
							BX.SocNetLogDestination.BXfpUnSelectCallback.call({
								formName: me.dialogId,
								inputContainerName: itemsNode,
								inputName: destinationInput.id,
								tagInputName: tagNode.id,
								tagLink1: BX.message('BIZPROC_JS_USER_SELECTOR_CHOOSE'),
								tagLink2: BX.message('BIZPROC_JS_USER_SELECTOR_EDIT')
							}, item)
						},
						openDialog : BX.delegate(BX.SocNetLogDestination.BXfpOpenDialogCallback, {
							inputBoxName: destinationInputBox.id,
							inputName: destinationInput.id,
							tagInputName: tagNode.id
						}),
						closeDialog : BX.delegate(BX.SocNetLogDestination.BXfpCloseDialogCallback, {
							inputBoxName: destinationInputBox.id,
							inputName: destinationInput.id,
							tagInputName: tagNode.id
						}),
						openSearch : BX.delegate(BX.SocNetLogDestination.BXfpOpenDialogCallback, {
							inputBoxName: destinationInputBox.id,
							inputName: destinationInput.id,
							tagInputName: tagNode.id
						}),
						closeSearch : BX.delegate(BX.SocNetLogDestination.BXfpCloseSearchCallback, {
							inputBoxName: destinationInputBox.id,
							inputName: destinationInput.id,
							tagInputName: tagNode.id
						})
					},
					items : items,
					itemsLast : itemsLast,
					itemsSelected : itemsSelected,
					useClientDatabase: false,
					destSort: data.DEST_SORT || {},
					allowAddUser: false
				});

				if (Object.keys(this.roles).length > 0)
				{
					BX.onCustomEvent(BX.SocNetLogDestination, "onTabsAdd", [me.dialogId, {
						id: 'bpuserrole',
						name: BX.message('BIZPROC_JS_USER_SELECTOR_ROLE_TAB'),
						itemType: 'bpuserroles',
						dialogGroup: {
							groupCode: 'bpuserroles',
							title: BX.message('BIZPROC_JS_USER_SELECTOR_ROLE_TAB')
						}
					}]);
				}

				BX.bind(destinationInput, 'keyup', BX.delegate(BX.SocNetLogDestination.BXfpSearch, {
					formName: me.dialogId,
					inputName: destinationInput.id,
					tagInputName: tagNode.id
				}));
				BX.bind(destinationInput, 'keydown', BX.delegate(BX.SocNetLogDestination.BXfpSearchBefore, {
					formName: me.dialogId,
					inputName: destinationInput.id
				}));

				BX.SocNetLogDestination.BXfpSetLinkName({
					formName: me.dialogId,
					tagInputName: tagNode.id,
					tagLink1: BX.message('BIZPROC_JS_USER_SELECTOR_CHOOSE'),
					tagLink2: BX.message('BIZPROC_JS_USER_SELECTOR_EDIT')
				});
			}
			next();
		},
		addItem: function(item, type)
		{
			var me = this;
			var destinationInput = this.inputNode;
			var tagNode = this.tagNode;
			var items = this.itemsNode;

			if (!BX.findChild(items, { attr : { 'data-id' : item.id }}, false, false))
			{
				if (me.selectOne && me.inited)
				{
					var toRemove = [];
					for (var i = 0; i < items.childNodes.length; ++i)
					{
						toRemove.push({
							itemId: items.childNodes[i].getAttribute('data-id'),
							itemType: items.childNodes[i].getAttribute('data-type')
						})
					}

					me.initDialog(function() {
						for (var i = 0; i < toRemove.length; ++i)
						{
							BX.SocNetLogDestination.deleteItem(toRemove[i].itemId, toRemove[i].itemType, me.dialogId);
						}
					});

					BX.cleanNode(items);
					me.cleanValue();
				}

				var container = this.createItemNode({
					text: item.name,
					deleteEvents: {
						click: function(e) {
							if (me.selectOne && me.required)
							{
								me.openDialog();
							}
							else
							{
								me.initDialog(function() {
									BX.SocNetLogDestination.deleteItem(item.id, type, me.dialogId);
									BX.remove(container);
									me.unsetValue(item, type);
								});
							}
							e.preventDefault();
						}
					}
				});

				this.setValue(item, type);

				container.setAttribute('data-id', item.id);
				container.setAttribute('data-type', type);

				items.appendChild(container);

				if (!item.entityType)
				{
					item.entityType = type;
				}
			}

			destinationInput.value = '';
			tagNode.innerHTML = BX.message('BIZPROC_JS_USER_SELECTOR_EDIT');
		},
		addItems: function(items)
		{
			for(var i = 0; i < items.length; ++i)
			{
				this.addItem(items[i], items[i].entityType)
			}
		},
		openDialog: function(params)
		{
			var me = this;
			this.initDialog(function()
			{
				BX.SocNetLogDestination.openDialog(me.dialogId, params);
			})
		},
		destroy: function()
		{
			if (this.inited)
			{
				if (BX.SocNetLogDestination.isOpenDialog())
				{
					BX.SocNetLogDestination.closeDialog();
				}
				BX.SocNetLogDestination.closeSearch();
			}
		},
		createItemNode: function(options)
		{
			return BX.create('span', {
				attrs: {
					className: 'bizproc-type-control-user-item'
				},
				children: [
					BX.create('span', {
						attrs: {
							className: 'bizproc-type-control-user-name'
						},
						html: options.text || ''
					}),
					BX.create('span', {
						attrs: {
							className: 'bizproc-type-control-user-delete'
						},
						events: options.deleteEvents
					})
				]
			});
		},
		createValueNode: function(valueInputName)
		{
			this.valueNode = BX.create('input', {
				props: {
					type: 'hidden',
					name: valueInputName
				}
			});

			this.container.appendChild(this.valueNode);
		},
		setValue: function(item, type)
		{
			var id = this.getValueId(item, type);
			var name = BX.util.htmlspecialcharsback(item['name']);
			name = name.replace(/,/g, '');

			var value = id;

			if (type === 'users')
			{
				value = [name, id].join(' ');
			}
			else if (type === 'department')
			{
				value = [name, id].join(' ');
			}

			if (this.selectOne)
			{
				this.valueNode.value = value;
			}
			else
			{
				var i, newVal = [], pairs = this.valueNode.value.split(',');
				for (i = 0; i < pairs.length; ++i)
				{
					if (!pairs[i] || pairs[i].indexOf(id) >= 0)
					{
						continue;
					}
					newVal.push(pairs[i]);
				}
				newVal.push(value);
				this.valueNode.value = newVal.join(',');
			}
		},
		unsetValue: function(item, type)
		{
			var id = this.getValueId(item, type);

			if (this.selectOne)
			{
				this.valueNode.value = '';
			}
			else
			{
				var i, newVal = [], pairs = this.valueNode.value.split(',');
				for (i = 0; i < pairs.length; ++i)
				{
					if (!pairs[i] || pairs[i].indexOf(id) >= 0)
					{
						continue;
					}
					newVal.push(pairs[i]);
				}
				this.valueNode.value = newVal.join(',');
			}
		},
		getValueId: function(item, type)
		{
			var id = item['id'].toString();
			if (type === 'users')
			{
				id = '['+ item.entityId +']';
			}
			else if (type === 'department' || type === 'bpuserroles' && id.indexOf('G') === 0)
			{
				id = '['+ id +']';
			}

			return id;
		},

		cleanValue: function()
		{
			this.valueNode.value = '';
		},
		parseValue: function(value)
		{
			value = this.prepareValueString(value);

			var i, name, id, entityId, entityType,
				items = [],
				pair, pairs = value.split(','),
				matches, found;

			for (i = 0; i < pairs.length; ++i)
			{
				pair = BX.util.trim(pairs[i]);

				if (matches = pair.match(/(.*)\[([A-Z]{0,2})(\d+)\]/))
				{
					name =  BX.util.trim(matches[1]);
					entityId = matches[3];
					id = matches[2] + entityId;
					entityType = (matches[2] === '') ? 'users' : 'bpuserroles';

					if (matches[2] === 'DR')
					{
						entityType = 'department';
					}

					items.push({
						id: id,
						entityId: parseInt(entityId),
						name: name,
						entityType: entityType
					});
				}
				else
				{
					found = false;

					if (this.roles[pair])
					{
						found = true;
						items.push(this.roles[pair]);
					}

					if (!found && this.config.groups)
					{
						this.config.groups.forEach(function(group)
						{
							if (pair === group['name'])
							{
								found = true;
								items.push({
									id: group['id'],
									entityId: group['id'],
									name: group['name'],
									entityType: 'bpuserroles'
								});
							}
						});
					}

					if (!found)
					{
						items.push({
							id: pair,
							entityId: pair,
							name: pair,
							entityType: 'bpuserroles'
						});
					}
				}
			}
			return items;
		},
		prepareValueString: function(value)
		{
			value = value.toString();

			if (value.indexOf('{{') >= 0) //if contains simple expressions
			{
				var fields = BX.Bizproc.FieldType.getDocumentFields();
				fields.forEach(function(field)
				{
					if (field['Type'] === 'user')
					{
						value = value.replace(field['Expression'], field['SystemExpression']);
					}
				});
			}

			return value;
		},
		prepareRoles: function()
		{
			var fields = BX.Bizproc.FieldType.getDocumentFields();
			var roles = {};

			if (this.config.groups)
			{
				this.config.groups.forEach(function(group)
				{
					roles[group['id']] = {
						id: group['id'],
						entityId: group['id'],
						name: group['name'],
						entityType: 'bpuserroles'
					};
				});
			}

			fields.forEach(function(field)
			{
				if (field['Type'] === 'user')
				{
					roles[field['SystemExpression']] = {
						id: field['SystemExpression'],
						entityId: field['SystemExpression'],
						name: field['Name'],
						entityType: 'bpuserroles'
					};
				}
			});

			this.additionalFields.forEach(function(field)
			{
				field.entityType = 'bpuserroles';
				roles[field['id']] = field;
			});

			this.roles = roles;
		}
	};

	BX.Bizproc.UserSelector = UserSelector;
})(window.BX || window.top.BX);

Zerion Mini Shell 1.0