Добрый день коллеги!
Как можно доработать wnd_SchedulerArea что бы иметь возможность создания задач в Terrasoft 3.4.1 по аналогии с Outlook.
Выделяем время в Рассписании -> Пишем название задачи -> Задача создается в определенном промежутке времени

Нравится

3 комментария

Добрый день!
Посмотрите сюда, пожалуйста, правильно ли я Вас понял?

Здравствуйте, АльфаКрыса!

Для реализации подобной функциональности необходимо отредактировать скрипт scr_SchedulerArea следующим образом:

1. В конец функции function Initialize(Window) добавить строки:

	ScheduleControl.AllowInplaceEditing = true;
	SetObjectEventDispatcher(Self, ScheduleControl, ScheduleControl.UID, 
	    'OnAfterInplaceInsertEvent', 'ScheduleControlOnAfterInplaceInsertEvent');  
	SetObjectEventDispatcher(Self, ScheduleControl, ScheduleControl.UID, 
	    'OnAfterInplaceEditEvent', 'ScheduleControlOnAfterInplaceEditEvent');

2. Добавить в блок функций следующие функции:

function CreateContactsInTask(TaskID, WorkflowItemID, OwnerID, ContactInTaskIDs,
	IsNotShowMessage) {
	var ContactInTaskDataset = GetContactInTaskDataset();
	if (Assigned(ContactInTaskIDs)) {
		if ((ContactInTaskIDs.length == 1) && (ContactInTaskIDs[0] == OwnerID) &&
			(IsEmptyValue(WorkflowItemID))) {
			return;
		}
		if ((IsEmptyValue(WorkflowItemID)) && (!IsNotShowMessage)) {
			var mResult = 
				ShowConfirmationDialog("Добавить контакты, указаные в фильтре, на деталь 'Контакты'?");
			if (mResult != wmrYes) {
				return;
			}
		}
		for (var i = 0; i < ContactInTaskIDs.length; i++) {
			if (OwnerID != ContactInTaskIDs[i]) {
				AddContactInTask(ContactInTaskDataset, TaskID,
					ContactInTaskIDs[i], false);
			}
		}
	}
	ContactInTaskDataset.Close();
}                    
 
function GetActualTaskStatusID(StartDate, DueDate) {
	var Now = new Date(System.Now());
	var StatusID =  '{FB10FCB1-DE0E-446D-81E8-A0C456E2C3AB}';		
	if (GetDateDiff(StartDate, DueDate, 'Minute') < 1440) {	
		if ((StartDate < Now) && (Now < DueDate))  {
			StatusID = '{9E289E42-9A0E-4A9C-A57F-049754310D95}';		
		} else
		if (DueDate < Now) {        
			StatusID = '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}';		
		}
	}
	return StatusID;
}

3. Добавить в конец скрипта функцию обработчика события:

function ScheduleControlOnAfterInplaceInsertEvent(ScheduleControl, Caption) {
	if (!Caption) {
		return;
	}
	var RecordID = ''
	try {
		RecordID = Connector.GenGUID();
		var TaskDataset = GetSingleItemByCode('ds_Task', 'InplaceInsert');
		TaskDataset.Append();
		TaskDataset('ID') = RecordID;
		TaskDataset('Title') = Caption;
		TaskDataset('StartDate') = ScheduleControl.SelectionStart;
		TaskDataset('DueDate') = ScheduleControl.SelectionFinish;
		TaskDataset('StatusID') = GetActualTaskStatusID(
			ScheduleControl.SelectionStart, ScheduleControl.SelectionFinish);
		var Minutes = Math.round((ScheduleControl.SelectionFinish - 
			ScheduleControl.SelectionStart)/1000/60);
		TaskDataset('Duration') = Minutes;
		TaskDataset('ShowInScheduler') = true;
		var OwnerID = GetAttribute(Self, 'OwnerID');
		TaskDataset('OwnerID') = OwnerID;
		TaskDataset.Post();
		var MainWindow = Self.Attributes('MainWindow');
		if (MainWindow) {
			var ContactInTaskIDs = MainWindow.Attributes('ContactsFilterArray');
			if (ContactInTaskIDs) {
				CreateContactsInTask(RecordID, null, OwnerID, ContactInTaskIDs, false);
			}
		}
	} finally {
		if (RecordID) {
			SchedulerArea.EventsDataset.RefreshRecord(RecordID, true);
		}
	}
}

Обратите внимание, обработчик в окне при этом привязывать не нужно, иначе событие будет отрабатывать дважды.

После выделения области в расписании следует нажать Enter для того. чтобы приступить к редактированию задачи.

Анна спасибо за божественный код! Все работает Usability x 2

Показать все комментарии

Здравствуйте!

Есть задача : реализовать копирование задач на ScheduleControl. Cамо копирование реализовал, не могу получить даты начала / конца Event'a после его перетаскивания.
В по событию OnAfterDragEvent Event не меняется, даты остаются прежними; событие OnChangeEvent тоже не срабатывает в этот момент.

Подскажите, в каком направлении копать?

PS Terrasoft 3.3.2.267

Нравится

2 комментария

Андрей, используйте событие OnChangeEvent компонента ScheduleControl. В базовой версии обработчик события определен (обратите внимания на function ScheduleControlOnChangeEvent(ScheduleControl, Event) сервиса scr_SchedulerArea). В блоке

try {
UpdateDatasetRecordByEvent(SchedulerArea.EventsDataset, Event);
}

можно получить обновленные значения по задаче.
Проверила, при перетягивании задачи событие отрабатывает.

Спасибо, Наталия, буду разбираться :)

Показать все комментарии

Реализовать запрет на изменение просроченных задач несложно - достаточно программно отключать кнопку Ok в окне редактирования задачи, если задача просрочена. Однако как можно препятствовать перетягиванию задач в расписании?

Для этого следует отлавливать события

1) OnBeforeDragEvent
2) OnAfterDragEvent
3) OnBeforeSizingEvent
4) OnAfterSizingEvent

Они появились начиная со сборки 227 версии 3.3.2.

Откройте Terrasoft Administrator и найдите wnd_SchedulerArea
Для реализации запрета перетаскивания задач необходимо создать событие ScheduleControlOnAfterDragEvent:

В визуальных компонентах выберите ScheduleControl, перейдите на вкладку События и создайте событие двойным кликом в соответствующем поле:
111

В результате откроется скрипт. Необходимо вставить следующий программный код вместо //TODO

                var Dataset = SchedulerArea.EventsDataset;
                Dataset.Locate('ID', Event.ID);
                if (GetDateDiff(new Date().getVarDate(), Event.Finish, 'Minute')0){
                               DoAccept.Value = false;
                               //MessageBox("Нельзя перетаскивать просроченные задачи!");
                }

111

Сохранить скрипт scr_SchedulerArea. Сохранить карточку wnd_SchedulerArea.

В результате перетаскивание визуально будет происходить, однако сроки меняться не будут, а задача после перетаскивания будет возвращаться на прежнее место. Можно добавить дополнительное сообщение-уведомление, раскомментировав строку (уберите двойной слеш //).

Для предотвращения изменения просроченных событий менеджерами необходимо также добавить аналогичный функционал на событие OnAfterSizingEvent

В результате если одна из перетаскиваемых задач не может быть перемещена, то все задачи останутся на прежних местах. Таким же образом если расширять задачу, нужно использовать обработчик OnBeforeSizingEvent или OnAfterSizingEvent

Нравится

Поделиться

1 комментарий

Ой какая хорошая реализация!!!

Показать все комментарии