Показать сообщение отдельно
  #1 (permalink)  
Старый 27.11.2015, 16:49
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Дополнительная проверка дропзоны
Здравствуйте.

В одном из гридов у меня есть сортировка через drag'n'drop. Но хитрость там в том, что некоторые позиции для дропа запрещены. Я могу это проверить через beforedrop, выдать сообщение и все такое... Но Было бы более красиво сразу запретить дроп в запрещенную зону, при движении через нее показать красный индикатор с соответствующим текстом. Я стал копаться в исходниках и не нашел ничего полезного, кроме как переписать кое-что в Ext.view.DropZone:
Ext.define('SafetyRound.patch.view.DropZone', {
  override: 'Ext.view.DropZone',
  
  isPositionValid: function(overRecord, draggingRecords, pos){
		var 
			me = this,
			valid = !Ext.Array.contains(draggingRecords, overRecord) &&
  			( pos === 'before' && !me.containsRecordAtOffset(draggingRecords, overRecord, -1) ||
					pos === 'after' && !me.containsRecordAtOffset(draggingRecords, overRecord, 1)
				);
		// <-------- some additional validation here
		return valid;
  },
  
	positionIndicator: function(node, data, e) {
		var
			me = this,
			view = me.view,
			pos = me.getPosition(e, node),
			overRecord = view.getRecord(node),
			draggingRecords = data.records,
			indicatorY;
		
		if (me.isPositionValid(overRecord, draggingRecords, pos)) {
			me.valid = true;
			if (me.overRecord !== overRecord || me.currentPosition !== pos) {
				indicatorY = Ext.fly(node).getY() - view.el.getY() - 1;
				if (pos === 'after') {
					indicatorY += Ext.fly(node).getHeight();
				}
				// If view is scrolled using CSS translate, account for then when positioning the indicator
				if (view.touchScroll === 2) {
					indicatorY += view.getScrollY();
				}
				me.getIndicator().setWidth(Ext.fly(view.el).getWidth()).showAt(0, indicatorY);
				// Cache the overRecord and the 'before' or 'after' indicator.
				me.overRecord = overRecord;
				me.currentPosition = pos;
			}
		} else {
			me.invalidateDrop();
		}
	}
  
});

Однако сей вариант очень костыльный. Если вдруг у меня будет более одного места с драгодропом, придется постоянно лепить всякие костыли и проверки.

Есть ли более человеческий способ?
Ответить с цитированием