Здравствуйте, дорогие читатели
Спешу поделиться радостной новостью, что теперь переход из напоминаний (Remindings) возможен не только в раздел, но и на конкретную деталь к конкретной записи. Для этого нужно совсем немножко доработать следующие объекты, страницы и действия процесса:
- Напоминание (Reminding)
- Базовая страница раздела (BaseModulePage)
- Terrasoft CRM (MainPage)
- Страница уведомлений (RemindingsPage)
- Инициализировать детали (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)
Вот и все. В принципе, ничего сложного, но зато сколько удобства это может принести нашему дорогому Пользователю