Публикация

BPMonline. Добавляем возможность перейти из страницы напоминаний к конкретной записи на детали

Здравствуйте, дорогие читатели

Спешу поделиться радостной новостью, что теперь переход из напоминаний (Remindings) возможен не только в раздел, но и на конкретную деталь к конкретной записи. Для этого нужно совсем немножко доработать следующие объекты, страницы и действия процесса:

  1. Напоминание (Reminding)
  2. Базовая страница раздела (BaseModulePage)
  3. Terrasoft CRM (MainPage)
  4. Страница уведомлений (RemindingsPage)
  5. Инициализировать детали (InitializeDetails)

Читатель может сам попробовать поиграться с этими схемами или посмотреть далее пример, как это сделать

В Напоминание (Reminding) нужно добавить 2 поля, я их назвал так: DetailSchema и DetailRecord. DetailSchema - поле справочника, ссылается на SysModuleDetail; DetailRecord - поле типа Guid

Базовая страница раздела (BaseModulePage) требует следующих доработок:
На событии Init перед действием Инициализировать детали (InitializeDetails) с именем NewInitializeDetails (в нашем случае) нужно добавить следующий код:

var detailSchemaUId = Page.GetParameterValue("detailSchemaUId");
if (detailSchemaUId != null) {
        NewInitializeDetails.SpecialDetailId = new Guid(detailSchemaUId.ToString());
}
var detailRecordId = Page.GetParameterValue("detailRecordId");
if (detailRecordId != null) {
        NewInitializeDetails.DetailRecordId = new Guid(detailRecordId.ToString());
}

В Terrasoft CRM (MainPage) нужно внести в функцию OnMultiLeveTabsTabChange следующие изменения:
var re = /GlobalSearchValue|ActiveTabId|pcv|pdv|moduleId|action/gi;

заменить на:
var re = /GlobalSearchValue|ActiveTabId|pcv|pdv|moduleId|action|detailschemauid|detailrecordid/gi;

то есть дописать наши 2 новых параметра, а в GetRedirectUrl:
ignoreQueryItems.Add("detailSchemaUId");
ignoreQueryItems.Add("detailRecordId");

и добавить наших 2 параметра в searchText, чтобы в результате получить:
if(MoveToParameters != null) {
        var moveToParameters = MoveToParameters as Dictionarystring, object>;
        searchText += "&pcv=" + moveToParameters["Item2"].ToString();
        searchText += "&pdv=" + moveToParameters["Item3"].ToString();
        searchText += "&detailSchemaUId=" + moveToParameters["detailSchemaUId"].ToString();
        searchText += "&detailRecordId=" + moveToParameters["detailRecordId"].ToString();
}

Также нужно модифицировать обработчик кнопки Перейти (JumpButton) на Странице уведомлений (RemindingsPage) для передачи необходимых параметров в MainPage:
var detailSchemaUId = selectedItem.GetTypedColumnValueGuid>("DetailSchemaId");
var detailRecordId = selectedItem.GetTypedColumnValueGuid>("DetailRecord");
if (detailSchemaUId != Guid.Empty) {
        moveToParameters.Add("detailSchemaUId", detailSchemaUId);
}
if (detailRecordId != Guid.Empty) {
        moveToParameters.Add("detailRecordId", detailRecordId);
}

Ну и собственно нужно изменить само действие Инициализировать детали (InitializeDetails). Для начала добавить 2 параметра: SpecialDetailId и DetailRecordId (SpecialDetailId потому, что это действие и так имеет дело только с деталями и название DetailSchemaId показалось мне абсурдным в таких условиях)
Перед циклом:
foreach(var item in detailsList)

добавляем счетчик деталей, код получит вид:
int detailCounter = -1;
foreach(var item in detailsList)

Дальше в цикле его увеличиваем после получения новой закладки:
var tab = CreateDetailTab(item.Item1, item.Item2, item.Item4, detailsTabPanelCollapsed, detailsTabPanelActiveTabIndex);
FillGridView(item.Item6, tab, item.Item1, GetModulesGridView(item.Item6));
detailCounter++;

Потом самый большой и важный блок по установке быстрого фыльтра и 2 строчки по игнорированию профиля (потому что нам нужно перейти к конткретной детали, а не той, которой пользователь любовался в прошлый раз, да ещё и свернул её вообще):
if (item.Item1 == SpecialDetailId && !detailsTabPanel.Page.IsPostBack) {
        detailsTabPanel.UseProfile = false;
        detailsTabPanel.Collapsed = false;
        var activeDataSource = tab.FindPageControlByName("DataSource") as DataSource;
        var currentStructure = activeDataSource.CurrentStructure;
        var newFilter = currentStructure.CreateFilterWithParameters(activeDataSource.Schema, FilterComparisonType.Equal, activeDataSource.Schema.PrimaryColumn.Name, DetailRecordId);
        var quickFilter = currentStructure.Filters.FindByName("QuickFilter");
        if (quickFilter == null) {
                DataSourceFilterCollection filters = null;
                filters = currentStructure.CreateFiltersGroup("QuickFilter", LogicalOperationStrict.And);      
                filters.Add(newFilter);
                currentStructure.Filters.Add((IDataSourceFilterItem) filters);
        }  else {
                (quickFilter as DataSourceFilterCollection).Clear();
                (quickFilter as DataSourceFilterCollection).Add(newFilter);
        }
        ActiveTabIndex = detailCounter;
        detailsTabPanel.ActiveTabIndex = ActiveTabIndex;
}

И, конечно же, не забыть добавить код для использования профиля, когда SpecialDetailId не установлен, в результате получим:
if (SpecialDetailId == Guid.Empty) {
        detailsTabPanel.UseProfile = true;
}
DetailTabPanel = null;
return true;

А в функцию CreateDetailTab добавить маленькую, но важную проверку в условие:
if (needCreatePageContainer || needLoadViewState)

получим:
if (needCreatePageContainer || needLoadViewState || detailId == SpecialDetailId)

Вот и все. В принципе, ничего сложного, но зато сколько удобства это может принести нашему дорогому Пользователю

Нравится

Поделиться

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