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

Подскажите пжл по подробнее как добавить кнопку в ActionsDashboard?

Пробовал вставить по этому посту https://community.terrasoft.ua/questions/dobavit-polzovatelskuyu-knopku-v-instrumentalnuyu-panel-deystviy-action-dashboard но так и не разобрался.



Что конкретно нужно сделать чтобы кнопка TestButton появилась в Actions Dashboard на странице лида?

Нравится

2 комментария
Лучший ответ

Здравствуйте, Никита, 

Для создания кастомной кнопки на странице активности как описано в указанном посте, Вам необходимо создать модуль и расширить BaseDashboardItemViewConfig добавлением своей кнопки (Cancel к примеру).

Пример кода кнопки:

define("UsrDashboardItemViewConfig", ["BaseDashboardItemViewConfig"], function() {

    Ext.define("Terrasoft.configuration.UsrDashboardItemViewConfig", {

        extend: "Terrasoft.BaseDashboardItemViewConfig",

        alternateClassName: "Terrasoft.UsrDashboardItemViewConfig",

        getActionsViewConfig: function() {

            return {

                "name": "Actions",

                "itemType": Terrasoft.ViewItemType.CONTAINER,

                "classes": {wrapClassName: ["dashboard-item-actions on-hover-visible"]},

                "items": [

                    {

                        "name": "Cancel",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "style": Terrasoft.controls.ButtonEnums.style.BLUE,

                        "caption": {"bindTo": "CancelButtonCaption"},

                        "click": {"bindTo": "onCancelButtonClick"},

                        "classes": {

                            "textClass": "dashboard-item-right"

                        },

                        "visible": {"bindTo": "CancelButtonVisible"}

                    },

                    {

                        "name": "Cancel2",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "style": Terrasoft.controls.ButtonEnums.style.BLUE,

                        "caption": "TEST",

                        "click": {"bindTo": "onCancelButtonClick"},

                        "classes": {

                            "textClass": "dashboard-item-right"

                        },

                        "visible": {"bindTo": "ExecuteButtonVisible"}

                    },

                    {

                        "name": "Execute",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                        "caption": {"bindTo": "ExecuteButtonCaption"},

                        "click": {"bindTo": "onExecuteButtonClick"},

                        "classes": {

                            "textClass": "dashboard-item-right"

                        },

                        "visible": {"bindTo": "ExecuteButtonVisible"}

                    }

                ]

            };

        }

    });

});

 

После необходимо создать replacing client module для SectionActionsDashboard

define("SectionActionsDashboard", ["UsrDashboardItemViewConfig"], function() {

    return {

        

        methods: {

            initDashboardConfig: function() {

                this.callParent(arguments);

                const dashboardConfig = this.get("DashboardConfig");

                var activityItemsConfig = {

                    "Activity": {

                        viewModelClassName: "Terrasoft.ActivityDashboardItemViewModel",

                        viewConfigClassName: "Terrasoft.BaseDashboardItemViewConfig"

                    }

                };

                if (this.$entitySchemaName === "Case") {

                    activityItemsConfig.Activity.viewConfigClassName = "Terrasoft.UsrDashboardItemViewConfig";

                }

                Ext.merge(dashboardConfig, activityItemsConfig);

                this.set("DashboardConfig", dashboardConfig);

            }

        }

    };

});

 

С уважением,

Анастасия

Здравствуйте, Никита, 

Для создания кастомной кнопки на странице активности как описано в указанном посте, Вам необходимо создать модуль и расширить BaseDashboardItemViewConfig добавлением своей кнопки (Cancel к примеру).

Пример кода кнопки:

define("UsrDashboardItemViewConfig", ["BaseDashboardItemViewConfig"], function() {

    Ext.define("Terrasoft.configuration.UsrDashboardItemViewConfig", {

        extend: "Terrasoft.BaseDashboardItemViewConfig",

        alternateClassName: "Terrasoft.UsrDashboardItemViewConfig",

        getActionsViewConfig: function() {

            return {

                "name": "Actions",

                "itemType": Terrasoft.ViewItemType.CONTAINER,

                "classes": {wrapClassName: ["dashboard-item-actions on-hover-visible"]},

                "items": [

                    {

                        "name": "Cancel",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "style": Terrasoft.controls.ButtonEnums.style.BLUE,

                        "caption": {"bindTo": "CancelButtonCaption"},

                        "click": {"bindTo": "onCancelButtonClick"},

                        "classes": {

                            "textClass": "dashboard-item-right"

                        },

                        "visible": {"bindTo": "CancelButtonVisible"}

                    },

                    {

                        "name": "Cancel2",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "style": Terrasoft.controls.ButtonEnums.style.BLUE,

                        "caption": "TEST",

                        "click": {"bindTo": "onCancelButtonClick"},

                        "classes": {

                            "textClass": "dashboard-item-right"

                        },

                        "visible": {"bindTo": "ExecuteButtonVisible"}

                    },

                    {

                        "name": "Execute",

                        "itemType": Terrasoft.ViewItemType.BUTTON,

                        "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                        "caption": {"bindTo": "ExecuteButtonCaption"},

                        "click": {"bindTo": "onExecuteButtonClick"},

                        "classes": {

                            "textClass": "dashboard-item-right"

                        },

                        "visible": {"bindTo": "ExecuteButtonVisible"}

                    }

                ]

            };

        }

    });

});

 

После необходимо создать replacing client module для SectionActionsDashboard

define("SectionActionsDashboard", ["UsrDashboardItemViewConfig"], function() {

    return {

        

        methods: {

            initDashboardConfig: function() {

                this.callParent(arguments);

                const dashboardConfig = this.get("DashboardConfig");

                var activityItemsConfig = {

                    "Activity": {

                        viewModelClassName: "Terrasoft.ActivityDashboardItemViewModel",

                        viewConfigClassName: "Terrasoft.BaseDashboardItemViewConfig"

                    }

                };

                if (this.$entitySchemaName === "Case") {

                    activityItemsConfig.Activity.viewConfigClassName = "Terrasoft.UsrDashboardItemViewConfig";

                }

                Ext.merge(dashboardConfig, activityItemsConfig);

                this.set("DashboardConfig", dashboardConfig);

            }

        }

    };

});

 

С уважением,

Анастасия

Anastasiia Zhuravel,

 

Кнопки появились! Спасибо большое!)



Подскажите пожалуйста, как и где  переопределить метод

onAppButtonClick()?

 

{
     "name": "Cancel2",
    "itemType": Terrasoft.ViewItemType.BUTTON,
    "style": Terrasoft.controls.ButtonEnums.style.BLUE,
    "caption": "TEST",
    "click": {"bindTo": "onAppButtonClick"},
    "classes": {
        "textClass": "dashboard-item-right"
    },
    "visible": {"bindTo": "ExecuteButtonVisible"}
},

 

 

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

Посоветуйте, пожалуйста, как управлять доступностью (запрещать переходить на них) отдельных стадий ActionsDashboard в зависимости от значений полей в карточке?

Нравится

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

Если только на заполнение полей, то с этим справятся бизнес-правила типа делать поле обязательным, если стадия ="требуемое значение". Кликнуть на стадию дает, но не сохраняет без заполнения полей.

Нет, к сожалению, необходим запрет перехода на стадию в некоторых случаях. (Что-то похожее на то, как сделан запрет для некоторых ролей в коробке)

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

К сожалению, базовыми, "коробочными", средствами, такое сделать невозможно.

Можно же не коробочными. 



Есть идеи по тому, как сделать это кодом?

А если на уровне встроенного БП объекта (или событийного слоя) на событии Saving проверять новую и старую стадию и значения других полей и если нет, то отменять путём установки IsCanceled? Сохранить так дать не должно, но нужно смотреть, к чему приведёт в интерфейсе карточки с кейсом.

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

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

Как добавить пользовательскую кнопку (чтобы начать процесс для данной активности) в панель действий только для одного раздела (например, для Case)?Изображение удалено.

 

Заранее благодарю за ваши ответы.

Нравится

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

Мария, этот механизм реализован во многих схемах. Для плитки активности интерфейс описан в схеме BaseDashboardItemViewConfig, а логика — в ActivityDashboardItemViewModel и её родителях EntityDashboardItemViewModel и BaseDashboardItemViewModel. В них можно увидеть кнопку «Завершить» (Execute) и её логику заголовка, видимости и нажатия. А сами названия этих схем прописаны в схеме SectionActionsDashboard в пакете ActionsDashboard в функции:

/**
 * @inheritdoc Terrasoft.BaseActionsDashboard#initDashboardConfig
 * @override
 */
initDashboardConfig: function() {
	this.callParent(arguments);
	const dashboardConfig = this.get("DashboardConfig");
	const processItemsConfig = {
		"VwProcessDashboard": {
			masterColumnName: "Id",
			referenceColumnName: "EntityId",
			viewModelClassName: "Terrasoft.ProcessDashboardItemViewModel",
			viewConfigClassName: "Terrasoft.BaseDashboardItemViewConfig"
		}
	};
	const activityItemsConfig = {
		"Activity": {
			viewModelClassName: "Terrasoft.ActivityDashboardItemViewModel",
			viewConfigClassName: "Terrasoft.BaseDashboardItemViewConfig"
		}
	};
	const approvalItemsConfig = this._getApprovalItemsConfig();
	const extendedConfig = this.values.dashboardConfig || {};
	Ext.merge(dashboardConfig, processItemsConfig);
	Ext.merge(dashboardConfig, activityItemsConfig);
	Ext.merge(dashboardConfig, extendedConfig);
	Ext.merge(dashboardConfig, approvalItemsConfig);
	this.set("DashboardConfig", dashboardConfig);
},
 
/**
 * Returns approval items config.
 * @private
 * @return {Object}
 */
_getApprovalItemsConfig: function() {
	const config = {};
	const approvalSchemaName = this.get("ApprovalSchemaName");
	if (approvalSchemaName) {
		config[approvalSchemaName] = {
			masterColumnName: "Id",
			referenceColumnName: this.get("ApprovalReferenceColumnName"),
			viewModelClassName: "Terrasoft.ApprovalDashboardItemViewModel",
			viewConfigClassName: "Terrasoft.ApprovalDashboardItemViewConfig"
		};
	}
	return config;
},

Соответственно, Вам надо будет делать свои схемы-наследники этих, добавлять там кнопку и заместить SectionActionsDashboard на версию с их упоминанием. Для примера, для виз в схемах ApprovalDashboardItemViewModel и ApprovalDashboardItemViewConfig сделана своя логика с несколькими кнопками, а те схемы унаследованы от тех же EntityDashboardItemViewModel и BaseDashboardItemViewConfig.

 

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

Добрый день, сообщество!

 

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

Для этого выбран один из вариантов: отобразить ActionsDashboard продажи в активности.

Приведенный в конце (без лишних частей) код модуля ActivityPageV2 дает в консоли ошибку:


SectionActionsDashboard.js:2051 Uncaught (in promise) TypeError: Cannot read property 'name' of undefined
    at i._findVisaManagerItem (SectionActionsDashboard.js:2051)
    at i. (SectionActionsDashboard.js:501)
    at i.e (all-combined.js:7)
    at Object.callback (all-combined.js:6)
    at all-combined.js:7

 

Ошибка приводит нас к тому, что в функции _findVisaManagerItem не находится свойство this.get("EntitySchema").name.

 

Подскажите, пожалуйста, как справиться с этой ошибкой (и вообще отобразить кейс)

 

 

 

Код модуля:

define("ActivityPageV2", ["OpportunityConfigurationConstants","ServiceHelper","ProcessModuleUtilities","MaskHelper"], 
function(OpportunityConfigurationConstants, ServiceHelper,ProcessModuleUtilities,MaskHelper) {
  return {
    entitySchemaName: "Activity",
    modules: /**SCHEMA_MODULES*/{
      "ActionsDashboardModule": {
        "config": {
          "isSchemaConfigInitialized": true,
          "schemaName": "OpportunityActionsDashboard",
          "useHistoryState": false,
          "parameters": {
            "viewModelConfig": {
              "entitySchemaName": "Opportunity",
              "actionsConfig": {
                "schemaName": "OpportunityStage",
                "columnName": "Stage",
                "colorColumnName": "Color",
                "filterColumnName": "ShowInProgressBar",
                "orderColumnName": "Number",
                "innerOrderColumnName": "End",
                "decouplingConfig": {
                  "name": "OppStageDecoupling",
                  "masterColumnName": "CurrentStage",
                  "referenceColumnName": "AvailableStage"
                }
              },
            //  "useDashboard": false,
            //  "contentVisible": false,
            //  "headerVisible": true
              "dashboardConfig": {
                "Activity": {
                  "masterColumnName": "Opportunity",
                  "referenceColumnName": "Opportunity"
                }
              }
            }
          }
        }
      }
    }/**SCHEMA_MODULES*/,
    diff: /**SCHEMA_DIFF*/[
      {
        "operation": "insert",
        "name": "ActionsDashboardModule",
        "values": {
          "classes": {
            "wrapClassName": [
              "actions-dashboard-module"
            ]
          },
          "itemType": 4
        },
        "parentName": "ActionDashboardContainer",
        "propertyName": "items",
        "index": 0
      }
    ]/**SCHEMA_DIFF*/
  };
});

 

Нравится

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

А почему бы не пытаться пойти иным путём?

Почему нужны именно кейсы чужого раздела в Активности?

Почему не обыграть эту возможность как действие или кнопку с выпадающим списком возможных стадий, как в обращении?

Не думаю что вытянуть кейсы в раздел Активности хорошая идея.

Кисловский Михаил Андреевич,

кнопка, это, конечно, хорошая идея. Проблема в том, что у нас много кейсов в продаже, а движение по стадиям довольно ограничено.

Так что тут подошла бы кнопка "Перейти на следующую стадию". Может быть, у вас есть идеи на тему того, как достать id следующей стадии кейса, в котором находится продажа? Это бы сильно помогло.

 

Мария, согласно академии:

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

То есть единой «следующей»  стадии нет, при нормальной работе переходы возможны в любую из разрешённых. Если точно знаете, куда нужно перевести по нажатию кнопки, можно в объект добавить справочное поле, ссылающееся на нужную запись и в логике кнопки её считывать.

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

Коллеги, доброго дня!

Подскажите, как реализовать раскраску активностей в ActionsDashboard?

 

Заранее благодарю за любые подсказки.

Нравится

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

Это схема ActionsDashboardItemContainer, также см. ActionsDashboardCSS, где задаются визуальные свойства, в частности background-color:

		.dashboard-container-item {
			position: relative;
			display: inline-block;
			padding: 14px 14px 14px 14px;
			min-height: 104px;
			background-color: rgb(255, 255, 255);
			border: rgb(225, 225, 225) solid 1px;
			box-shadow: 3px 3px 3px rgba(225, 225, 225, 0.2);
			margin: 6px 3px 0 3px;
			width: calc(~'50% - 6px');
			transition: box-shadow 0.2s ease;
			&:hover {
				box-shadow: 3px 3px 3px rgba(225, 225, 225, 0.6);
			}
		}
	}
}

Я поменял в инструментах разработчика в браузере на другой цвет, все плитки задач перекрасились.

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

Зверев Александр,

Благодарю за ответ!

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

Коллеги, добрый день.

После обновления на 7.12.3.980 возникла ошибка при отправлении писем с панели "Следующий шаг".

Выяснилось, что наряду с  полем Recepient  появилось новое поле Recipient (https://yadi.sk/i/P3g6M4wf3aeEfg). 

И именно заполнение этого поля требуется при отправке письма.



Зачем добавлено это поле? 

Как быть с обращениями клиентов об ошибках при отправке, если схема EmailMessagePublisherPage дорабатывалась на основе поля Recepient?

Нравится

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

Правильно пишется «Recipient», лучше привязываться к нему. Видимо, не сразу заметили и исправили. А в объекте оставили старое, чтобы не сломать связь с полем в таблице базы.

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

Добрый день!

Помогите справиться с такой задачей:

Имеется справочник QualifyStatus, он выведен на страницу LeadPageV2 через ActionsDashboard, в разделе attributes страницы указаны дополнительные колонки кроме id и value:

"QualifyStatus":     

            { lookupListConfig:         

                    { columns: ["Name", "StageNumber", "UsrIsTaken", "UsrIsOpportunity", "UsrIsDisqualified"] } 

            }

Но они не доступны в коде страницы работы через this.get("QualifyStatus").

Если же добавить на страницу Lookup с QualifyStatus и работать со справочником через него то данные поля становятся доступны

Нравится

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

Владимир, здравствуйте!

"выведен на страницу LeadPageV2 через ActionsDashboard,"

Уточните, пожалуйста, как именно выведен через ActionsDashboard? где физически отображается поле?

Дмитрий, добрый день  

Я описал то, как actions dashboard реализован в стандартном функционале лидов 

Просто, необходимо реализовать некоторые бизнес правила в зависимости от параметров стадии Лида  а не привязываться к id стадии.

И с этим как раз возникают проблемы, описанные в вопросе

Владимир, попробуйте реализовать данную проверку при сохранении карточки, в методе save(). С помощью ESQ проверяйте нужные данные у стадии лида, а потом, в зависимости от полученого ответа, Вы сможете выполнить сохранение через базовый метод, или Ваш функционал (сообщение о нарушении валидации и.т.д).

Мотков Илья,

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

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

Добрый день!



Подскажите, пожалуйста, как при смене статуса вручную на ActionsDashboard запустить валидацию на заполненность определенных полей?

И в случае, если всё заполнено, то сохранить карточку продажи с новым статусом, а если не заполнено, то сделать поля обязательными и не давать сохранить, пока они не заполенны?

Нравится

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

Владимир, добрый день.

Для примера рассмотрим реалзиацию для объекта Обращения.

Одним из возможных вариантов реализации будет следующий:

1.На странице [Обращения], открыть мастер раздела и во вкладке [Решение и закрытие], добавить новое текстовое поле типа "Строка"

Например с названием "Причина перехода на следующую стадию" http://prntscr.com/i97vb7

2.Перейдя в мастере раздела на [Бизнес правила], создадим новое БП  http://prntscr.com/i97viu

Это правило говорит, что при изменении состояния обращения с "Новое" на "В работе",

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

Обращаем Ваше внимание, что при создании БП в графе [Какое поле делать обязательным] следует указать название требуемой к заполнению строки из БД http://prntscr.com/i97vvk

3.После выполнения этих операций, мы видим, что при попытке пользователя перевести обращение к следующему состоянию,

он будет получать уведомление о том, что не заполнено обязательное поле указания причины http://prntscr.com/i97w4x 

При переходе по actiondashboard'у выполняется сохранение записи и валидация заполненных полей.

Спасибо, Андрей!



При реализации возникла проблема в связи с различиями в поведении ActionsDashboard и lookup-поля:



Имеется справочник QualifyStatus, он выведен на страницу LeadPageV2 через ActionDashboard, в разделе attributes страницы указаны дополнительные колонки кроме id и value:

"QualifyStatus": {

    lookupListConfig: {

        columns: ["Name", "StageNumber", "UsrIsTaken", "UsrIsOpportunity", "UsrIsDisqualified"]

    }

}

Но они не доступны в коде страницы работы через this.get("QualifyStatus"). Если же добавить на страницу Lookup с QualifyStatus и работать со справочником через него то данные поля становятся доступны

Кроме того, при неудачной валидации статус на ActionsDashboard перескакивает обратно, что не совсем логично

Добрый вечер.

Т.е. this.get("QualifyStatus") возвращает объект в котором нет указанных колонок?

Именно 

Добрый вечер.

Мне не удалось воспроизвести ваш кейс все корректно отрабатывает. Так что проблема не в коробке. Рекомендую проанализировать состояние объекта сразу после инициализации схемы и в момент вашего вызова, может «по пути» затираются его свойства.

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

Подскажите каким образом можно создать case для пользовательского раздела, чтобы редактировать его в дизайнере кейсов. Нужна возможность не только отображать состояние в панели, но и менять его, а так же выбирать финальную стадию из нескольких вариантов, как сделано в продаже. Или как это можно сделать не создавая модуль кейса.

Нравится

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

Здравствуйте, Олег!

В версии 7.10 в системе будет возможность настраивать DCM для всех разделов в системе.

Это, конечно, здорово. Но ответ на вопрос хотелось бы получить. С переходом между стадиями разобрался (создал объект и наполнил его доступными переходами, по примеру раздела "Продажи"). Как сделать две финальных стадии на выбор? (Как в тех же продажах)

UPD: Разобрался. выгружаем md файл. Меняем в нем UId схемы, UId колонки стадии, имя самой схемы, загружаем обратно, открываем через мастер, делаем что душе угодно.

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

Добрый день!

Можно ли создать ActionsDashboard без полосы действий? Так как бизнес-процессов по записи много и отобразить всего один статус будет не корректно, но хочется оставить Панель действий для оперативной работы с активностями, письмами и лентой?

Нравится

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

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

ActionsDashboard состоит из двух блоков: полоса стадий, которая расположена в HeaderContainer и панель действий — в ContentContainer.
В статье https://academy.terrasoft.ru/documents/technic-sdk/7-9/instrumentalnaya… об этом рассказывается.

Можно сделать "headerVisible": false в config вашего ActionsDashboardModule.

Пример создания своего ActionsDashboard - https://academy.terrasoft.ru/documents/technic-sdk/7-9/dobavlenie-instr…

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