Все блоги автора
Задача: необходимо реализовать возможность переключения реестра в разделе. То есть, находясь в разделе "Контрагенты" переключать реестры с физическими и юридическими лицами, причём у каждого реестра свои определенные колонки.
Решение состоит из 2х частей:
- Добавить кнопки переключения между представлениями
- Собственно сделать страницы представлений
Добавление кнопок переключения реестров в раздел
Подготовлены спрайты кнопок:
Размер 30*60. Смысл в том, чтобы при наведении мыши фон кнопки съезжал на 30 пикселей, и как бы подсвечивался. Создан модуль, назвать, например SmrCustomButtonsCSS и определить LESS:
.blue-button-wrapper {
width: 30px;
height: 30px;
padding: 0px;
margin: 0px 5px 0px 5px;
}
.blue-button-image {
display: inline;
background-position: 0px 0px;
width: 30px;
height: 30px;
padding: 0px;
margin: 0px;
}
.blue-button-image:hover {
display: inline;
background-position: 0px -30px;
}
.blue-button-pressed {
display: inline;
background-position: 0px -30px;
width: 30px;
height: 30px;
padding: 0px;
margin: 0px;
}
Создана замещающая страница "AccountSectionV2":
define("AccountSectionV2", ["ConfigurationConstants", "css!SmrCustomButtonsCSS"],
function(ConfigurationConstants) {
return {
entitySchemaName: "Account",
attributes: { },
methods: {
showLegalView: function(){
this.sandbox. publish( "PushHistoryState", { hash : "SectionModuleV2/LegalAccountSectionV2" });
},
showIndividualView: function(){
this.sandbox. publish( "PushHistoryState", { hash : "SectionModuleV2/IndividualAccountSectionV2" });
},
showAllView: function(){
this.sandbox. publish( "PushHistoryState", { hash : "SectionModuleV2/AccountSectionV2" });
},
isSwitchButtonsContainerVisible: function() {
var isCardVisible = this.get("IsCardVisible");
return !isCardVisible;
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "SwitchViewButtonsContainer",
"parentName": "ActionButtonsContainer",
"propertyName": "items",
"values": {
"itemType": Terrasoft.ViewItemType.CONTAINER,
"visible": {
"bindTo": "isSwitchButtonsContainerVisible"
},
"items": []
}
},
{
"operation": "insert",
"parentName": "SwitchViewButtonsContainer",
"propertyName": "items",
"name": "SwitchToAllDataView",
"values": {
"layout": {
"column": 23,
"row": 0,
"colSpan": 1,
"rowSpan": 1
},
"itemType": Terrasoft.ViewItemType.BUTTON,
"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
//"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.RIGHT,
iconAlign: Terrasoft.controls.ButtonEnums.iconAlign.TOP,
pressed: {bindTo: "LegalGridActive"},
"imageConfig": {
"source": Terrasoft.ImageSources.SOURCE_CODE_SCHEMA,
"params": {
"schemaName": "SmrCustomButtonsCSS",
"resourceItemName": "GridDataViewIconBlue"
}
},
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-pressed"
},
"click": {"bindTo": "showAllView"}
}
},
{
"operation": "insert",
"parentName": "SwitchViewButtonsContainer",
"propertyName": "items",
"name": "SwitchToPersonalDataView",
"values": {
"layout": {
"column": 23,
"row": 0,
"colSpan": 1,
"rowSpan": 1
},
"itemType": Terrasoft.ViewItemType.BUTTON,
"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
//"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.RIGHT,
iconAlign: Terrasoft.controls.ButtonEnums.iconAlign.TOP,
pressed: {bindTo: "LegalGridActive"},
"imageConfig": {
"source": Terrasoft.ImageSources.SOURCE_CODE_SCHEMA,
"params": {
"schemaName": "SmrCustomButtonsCSS",
"resourceItemName": "GridPersonalDataViewIconBlue"
}
},
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-image"
},
"click": {"bindTo": "showIndividualView"}
}
},
{
"operation": "insert",
"parentName": "SwitchViewButtonsContainer",
"propertyName": "items",
"name": "SwitchToLegalDataView",
"values": {
"layout": {
"column": 23,
"row": 0,
"colSpan": 1,
"rowSpan": 1
},
"itemType": Terrasoft.ViewItemType.BUTTON,
"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
//"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.RIGHT,
iconAlign: Terrasoft.controls.ButtonEnums.iconAlign.TOP,
pressed: {bindTo: "LegalGridActive"},
"imageConfig": {
"source": Terrasoft.ImageSources.SOURCE_CODE_SCHEMA,
"params": {
"schemaName": "SmrCustomButtonsCSS",
"resourceItemName": "GridLegalDataViewIconBlue"
}
},
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-image",
pressedClass: "blue-button-pressed"
},
"click": {"bindTo": "showLegalView"}
}
}
]/**SCHEMA_DIFF*/
};
}
);
Страницы разделов
Созданы 2 страницы разделов. Код для реестра физических лиц:
define("IndividualAccountSectionV2", ["ConfigurationConstants", "css!SmrCustomButtonsCSS"],
function(ConfigurationConstants) {
return {
entitySchemaName: "Account",
methods: {
/**
* Инициализирует фильтры экземпляра запроса
* @protected
* @overridden
* @param {Terrasoft.EntitySchemaQuery} esq Запрос, в котором будут инициированы фильтры
*/
initQueryFilters: function (esq) {
this.callParent(arguments);
esq.filters.removeByKey("ClientType");
esq.filters.add("ClientType", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "SmrClientType.Id", "80FD3F74-0AF4-4F8A-9F0B-F626E4F05147"));
},
/**
* Возвращает представления раздела по умолчанию.
* Реестр, Аналитика не создаётся
* @overridden
* @return {Object} Представления раздела по умолчанию
*/
getDefaultDataViews: function() {
var gridDataView = {
name: this.get("GridDataViewName"),
caption: this.getDefaultGridDataViewCaption(),
icon: this.getDefaultGridDataViewIcon()
};
var analyticsDataView = {
};
return {
"GridDataView": gridDataView,
"AnalyticsDataView": analyticsDataView
};
},
/**
* Получает пункты меню кнопки "Вид"
* @overridden
* @virtual
* @return {Terrasoft.BaseViewModelCollection} Возвращает пункты меню кнопки "Вид"
*/
getViewOptions: function() {
var viewOptions = this.Ext.create("Terrasoft.BaseViewModelCollection");
viewOptions.addItem(this.getButtonMenuItem({
"Caption": {"bindTo": "Resources.Strings.SortMenuCaption"},
"Items": this.get("SortColumns")
}));
viewOptions.addItem(this.getButtonMenuItem({
"Caption": {"bindTo": "Resources.Strings.OpenGridSettingsCaption"},
"Click": {"bindTo": "openGridSettings"}
}));
return viewOptions;
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "SwitchToAllDataView",
"values": {
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-image"
}
}
},
{
"operation": "merge",
"name": "SwitchToPersonalDataView",
"values": {
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-pressed"
}
}
},
{
"operation": "merge",
"name": "SwitchToLegalDataView",
"values": {
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-image"
}
}
}
]/**SCHEMA_DIFF*/
};
}
);
Код страницы для реестра юридических лиц:
define("LegalAccountSectionV2", ["RightUtilities", "ConfigurationConstants", "css!SmrCustomButtonsCSS"],
function (RightUtilities, ConfigurationConstants) {
return {
entitySchemaName: "Account",
attributes: {},
messages: {},
methods: {
/**
* Инициализирует фильтры экземпляра запроса
* @protected
* @overridden
* @param {Terrasoft.EntitySchemaQuery} esq Запрос, в котором будут инициированы фильтры
*/
initQueryFilters: function (esq) {
this.callParent(arguments);
esq.filters.removeByKey("ClientType");
esq.filters.add("ClientType", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "SmrClientType.Id", "DD4E6E34-21D3-4F09-A417-6FC4116876B5"));
},
/**
* Возвращает представления раздела по умолчанию.
* Реестр, Аналитика не создаётся
* @overridden
* @return {Object} Представления раздела по умолчанию
*/
getDefaultDataViews: function() {
var gridDataView = {
name: this.get("GridDataViewName"),
caption: this.getDefaultGridDataViewCaption(),
icon: this.getDefaultGridDataViewIcon()
};
var analyticsDataView = {
};
return {
"GridDataView": gridDataView,
"AnalyticsDataView": analyticsDataView
};
},
/**
* Получает пункты меню кнопки "Вид"
* @overridden
* @virtual
* @return {Terrasoft.BaseViewModelCollection} Возвращает пункты меню кнопки "Вид"
*/
getViewOptions: function() {
var viewOptions = this.Ext.create("Terrasoft.BaseViewModelCollection");
viewOptions.addItem(this.getButtonMenuItem({
"Caption": {"bindTo": "Resources.Strings.SortMenuCaption"},
"Items": this.get("SortColumns")
}));
viewOptions.addItem(this.getButtonMenuItem({
"Caption": {"bindTo": "Resources.Strings.OpenGridSettingsCaption"},
"Click": {"bindTo": "openGridSettings"}
}));
return viewOptions;
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "SwitchToAllDataView",
"values": {
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-image"
}
}
},
{
"operation": "merge",
"name": "SwitchToPersonalDataView",
"values": {
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-image"
}
}
},
{
"operation": "merge",
"name": "SwitchToLegalDataView",
"values": {
classes: {
wrapperClass: "blue-button-wrapper",
imageClass: "blue-button-pressed"
}
}
}
]/**SCHEMA_DIFF*/
};
});
Что нужно отметить в этих страницах:
/**
* Инициализирует фильтры экземпляра запроса
* @protected
* @overridden
* @param {Terrasoft.EntitySchemaQuery} esq Запрос, в котором будут инициированы фильтры
*/
initQueryFilters: function (esq) {
this.callParent(arguments);
esq.filters.removeByKey("ClientType");
esq.filters.add("ClientType", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "SmrClientType.Id", "DD4E6E34-21D3-4F09-A417-6FC4116876B5"));
}
Мы переопределяем метод для установки фильтрации записей (например, только физические лица).
Также, переопределяем методы getDefaultDataViews и getViewOptions, чтобы скрыть функции, которые не работают в новых реестрах (почему - не было времени разбираться).
Проблемы
В представлениях (дополнительных реестрах) не работают некоторые функции, а именно аналитика и некоторые действия из меню "Вид".
P.S.: Очень ждем возможности использовать такую возможность базовыми средствами, кейсов много - это и деление на сотрудники/контакты и физ/юр лица. В ситуациях, когда набор колонок одинаковый, конечно рекомендуется пользоваться стандартными динамическими группами.