Добавление кнопки "Удалить" на страницу редактирования

Здравствуйте! Необходимо добавить красную кнопку “Удалить” на страницу Лида, что-то в таком роде:
!
Делаем по документации (https://academy.terrasoft.ru/documents/technic-sdk/7-9/kak-dobavit-knopk...),
добавили код в замещающую схему LeadPageV2, кэш чистили, но кнопка все равно не отображается.

 diff: [
            {
                "operation": "insert",
                "parentName": "CombinedModeActionButtonsCardLeftContainer",
                "propertyName": "items",
                "name": "DeleteLeadButton",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "caption": {bindTo: "Resources.Strings.DeleteLeadButtonCaption"},
                    "click": {bindTo: "onDeleteLeadClick"},
                    "style": Terrasoft.controls.ButtonEnums.style.RED,
                }
            }
        ]

Подскажите, пожалуйста, в чем может быть ошибка, версия 7.9.1

Нравится

14 комментариев

Если режим совмещённый, то добавлять нужно в схему LeadSectionV2. Вы же добавили кнопку в схему страницы редактирования в, скорее всего, несуществующий там контейнер "CombinedModeActionButtonsCardLeftContainer"

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

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

Большое спасибо за помощь, после добавления кода в LeadSectionV2 кнопка появилась. :smile:
Подскажите пожалуйста, как должна выглядеть функция для удаления записи. Сперва вытягиваем id лида:

var leadId = this.get("Id");

а как в дальнейшем его можно удалить?

Мария, здравствуйте!

Наглядный пример реализации Вы можете посмотреть в обработчике кнопки "Удалить" в реестре раздела.

Спасибо, получилось реализовать удаление с помощью функции deleteRecords из GridUtilitiesV2.
Добавили таким образом кнопку в 3 раздела, всё работает, только в разделе “Контакты” кнопка не отображается :sad:. В контактах 3 вида страниц, ссылка на страницу редактирования контакта имеет вид:

ViewModule.aspx#CardModuleV2/BtcContactType1Page/edit/deafe024-a148-4ba6-a4b1-cb8fce5b8443

, может ли это как-то влиять на способ добавления кнопки?

Попробуйте этот же код добавить и в Section и на Page (если их несколько, то во все).

Мария, а что делает кнопка "Удалить"? Если правильно поняли, то она удаляет текущую запись. Тогда хотелось бы посоветовать продумать удаление более глобально, так как нужно учесть все возможные моменты. Например:

- что должно произойти после нажатия;
- что делать с деталями;
- что будет если после нажатия "Удалить", нажать на "Сохранить" и т.д;
- процессная ли карточка или нет.

Спасибо, кнопка в контактах появилась. :smile:

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

Но возникла проблема с удалением на отдельной странице, если допустим перейти с лида в контакт, или из контакта в лид, или даже просто перезагрузить страницу из раздела, то кнопка удаления не срабатывает. Подскажите, пожалуйста, как в Page можно осуществить удаление? Не можем найти пример в стандартных схемах.

Или можно как-то самому принудительно запускать совмещенный режим при переходе на другую страницу, в плане: сделать, что при нажатии на кнопку “удалить” перекидывало в карточку, но в совмещенном режиме и автоматически нажималась кнопка удалить сразу?

Для исправления - продублируйте код метода, связанного с кнопкой "удалить" в схеме карточки. Также смотрите в сторону использования Terrasoft.DeleteQuery для удаления записи по Id. Для перехода обратно в раздел - воспользуйтесь сообщением PushHistoryState.

Спасибо за помощь,
Функция удаления из раздела:

deleteRecords: function() {
        var activeRow = this.getActiveRow();
        if (activeRow && activeRow.isNew) {
            this.removeGridRecords([activeRow.get("Id")]);
        } else {
            var items = this.getSelectedItems();
            if (!items || !items.length) {
                return;
            }
            this.checkCanDelete(items, this.checkCanDeleteCallback, this);
        }
    },
 
    handleAfterDelete: function() {
        this.sandbox.unRegisterMessages(["MultiDeleteFinished"]);
        this.registerMultiDeleteMessages();
        this.reloadGridData();
        this.onDeleted({
            Success: true
        });
        this.onDataChanged();
        var requestUrl = "SectionModuleV2/UsrInterestSection";
        this.sandbox.publish("PushHistoryState", {
            hash: requestUrl
        });
    }

Код функции удаления со страницы редактирования:

delete: function() {
    var recId = this.get("Id");
    var deleteQuery = Ext.create("Terrasoft.DeleteQuery", {
        rootSchemaName: "UsrInterest"
    });
    deleteQuery.filters.add("userFilter",
        deleteQuery.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", recId));
    deleteQuery.execute(function() {});
 
    var requestUrl = "SectionModuleV2/UsrInterestSection";
    this.sandbox.publish("PushHistoryState", {
        hash: requestUrl
    });
}

На странице записи удаление происходит, но не выходит выполнить каскадное удаление, подскажите пожалуйста, как проще реализовать удаление связанных записей?

Добрый день.

Удалить записи каскадно через DeleteQuery у Вас не выйдет. Возможны только следующие два варианта:

1) Перед удалением основной записи выполнять SELECT для получения Id связанных записей. Удалять их, а только затем выполнять DELETE основной.

2) На уровне объекта установить чекбокс "каскадная связь".

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

Спасибо, для пользовательского раздела с галочкой "каскадная связь" всё получилось.
Не подскажите, пожалуйста, где для лидов ставить это свойство для каскадного удаления в процессах и для контактов в лидах?

!

Данная деталь создается на основании view VwEntityInProcess. Код самой вьюхи:

ALTER VIEW [dbo].[VwEntityInProcess] (
	[Id],
	[CreatedOn],
	[CreatedById],
	[ModifiedOn],
	[ModifiedById],
	[ProcessListeners],
	[EntitySchemaName],
	[RecordId],
	[ProcessCaption],
	[ProcessDescription]
)
AS
SELECT DISTINCT
	ss.[Id],
	ss.[CreatedOn],
	ss.[CreatedById],
	ss.[ModifiedOn],
	ss.[ModifiedById],
	ss.[ProcessListeners],
	ss.[Name],
	secpe.[RecordId],
	ssProcess.[Caption],
	ssProcess.[Description]
FROM [SysEntityCommonPrcEl] secpe
	JOIN [SysSchema] ss ON ss.UId = secpe.[EntitySchemaUId]
	JOIN [SysProcessElementData] sped ON secpe.[ProcessElementId] = sped.[Id]
	JOIN [SysProcessData] spd ON spd.[Id] = sped.[SysProcessId]
	JOIN [SysProcessData] spdParent ON COALESCE(spd.ParentId, spd.Id) = spdParent.[Id]
	JOIN [SysSchema] ssProcess ON ssProcess.[Id] = spdParent.[SysSchemaId]
	JOIN [SysProcessLog] spl ON spl.[SysSchemaId] = spdParent.[SysSchemaId]
WHERE spl.[StatusId] = 'ed2ae277-b6e2-df11-971b-001d60e938c6'
GO

Спасибо за помощь. С изначальным удалением из VwEntityInProcess не получилось, появляется ошибка: "Uncaught View or function 'dbo.VwEntityInProcess' is not updatable because the modification affects multiple base tables."
А удалять "без связанных записей" с помощью DeleteQuery, или как можно выполнить sql запрос на удаление по нажатию кнопки ?

"Maria H" написал:как можно выполнить sql запрос на удаление по нажатию кнопки ?

Это можно сделать на бекенде, тоесть вам нужно сделать свой конфигурационный веб сервис:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-sozdat-svoy-…
В теле которого уже формировать произвольный sql запрос, пример:

var test = new CustomQuery(UserConnection, DBEngine.GetIndexQuerySqlText())
.WithParameter("DBSchemaName", DBEngine.CurrentSchemaName)
.WithParameter("EntitySchemaQualifierName", null, "DBObjectName")
.WithParameter("EntitySchemaName", entitySchemaName)
.WithParameter("IndexName", indexName);

Где второй параметр new CustomQuery, собственно текст самого запроса, с параметрами внутри через собаку, к пр. @param_name, если параметры конечно нужны.
Выполнить можно так:
test.Execute();
Если это запрос на чтение, то можно преобразавать его в стандартный IDataReader:
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
IDataReader datareader = test.ExecuteReader(dbExecutor);
}
После чего данный сервис по удалению можно будет вызвать из ваших схема страниц\секций следующим образом:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-programmno-v…

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