Histórico da Página
Aviso |
---|
A documentação se refere a versões do THF (até o release 12.1.11) ou produtos TOTVS que utilizam o RequireJS. Procure a Fábrica de Software da TOTVS para suporte a customizações. |
O TOTVS HTML Framework permite que as telas desenvolvidas sejam customizadas para atender a necessidade de cada cliente em específico.
...
A view deve ter elementos que serviram como pontos de customização definidos pela diretiva totvs-custom-element diretiva Totvs Custom Element que iram disparar um método do serviço responsável pela customização, para esse método é passado o escopo e o elemento da diretiva.
É possível configurar o evento que será chamado pela customização, caso não seja definido um método será chamado o evento padrão "customElement", também é possível definir o nome do serviço através do atributo "totvs-custom-service", caso não seja definido o serviço, será gerado um nome baseado no contexto do programa.
...
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
define([ 'index', ... ], function (index) { 'use strict'; var customersListController = function ($rootScope, appViewService, customerService, customizationFactory) { // ********************************************************************************* // *** Variables // ********************************************************************************* var self = this; self.records = []; self.recordsCount = 0; ... // ********************************************************************************* // *** Control Initialize // ********************************************************************************* self.init = function () { appViewService.startView($rootScope.i18n('l-customer') + ' (Customizado)', 'demo.customer.list.controller', self); self.loadRecords(false); // Dispara o método 'initEvent' do serviço de customização do 'thf.demo.customer' passando o controller como parâmetro customizationService.callEvent('thf.demo.customer', 'initEvent', self); }; ... }; customersListController.$inject = [ '$rootScope', '$scopetotvs.app-main-view.Service', 'customization.customer.factory', // Serviço de '$state',customização '$modalcustomization.generic.Factory', ]; 'dateFilter', 'totvs.app-main-view.Service', 'customization.customer.factory', // factory com acesso ao servidor rest 'customization.generic.Factory' ]; index.register.controller('demo.customer.list.controller', customersListController); }); |
E no ponto onde a customização deverá ser chamada, devemos utilziar o serviço customizationService:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
// *********************************************************************************
// *** Control Initialize
// *********************************************************************************
this.init = function() {
if (appViewService.startView('l-country', 'framework.country-list.Control', _self)) {
}
this.search(false);
customizationService.callEvent('html-sample.country', 'initEvent', _self);
}
|
Customização exemplo:
Como exemplo para tela de paises, vamos utilizar o seguinte arquivo de customização comentado.
index.register.controller('demo.customer.list.controller', customersListController);
}); |
Criando serviço de customização
É necessário criar um arquivo js para definir o serviço de customização dentro do módulo custom (thf/custom/demo/customer.js).
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
define([
'totvs-custom'
], function (custom) {
'use strict';
function customerCustomService(customService) {
var service;
service = {
// métodos para cada evento de customização
// método do evento customizado no controller
initEvent: function (params) {
// na chamada do callEvent foi passado o próprio controller, como o controller é acessível para a tela
// a tela pode fazer binding para o novo atributo criado abaixo.
params.customInitValue = "Este valor foi definido no serviço de customização e injetado no controller desta tela!!!";
| ||||||||
Bloco de código | ||||||||
| ||||||||
define(['index', 'totvs-custom'], function(index) { countryCustomService.$inject = ['customization.generic.Factory']; function countryCustomService(customService) { service = { // metodos para cada evento de customização // metodo do evento customizado no controller no metodo init. initEvent : function (params) { // na chamada do callEventevento, foia passadocustomização opode proprioretornar controller,um comovalor oque controllerchega éaté acessivela parachamada ano tela // a tela pode fazer binding para o novo atributo criado abaixo. params.epcValue = "Este valor foi definido na epc e injetado no controler desta tela!!!"; // na chamada do evento, a customização pode retornar um valor que chega até a chamada no controller. return "OK"; }, // metodocontroller. return "OK"; }, // método do evento customizado na pagina na tag HTML com totvs-custom-element="customPagecustomPageList" customPage : function (params, customPageList: function (params, element) { // utilizamos a API do jQuery para encontrarmos os elementos que queremos customizar na pagina // procuramos uma elmento que tem a class "title" filho de // procuramos um elemento comque tem a class "page-head" var title = element.find(".page-head .title"); // utilizando a API do jQuery podemos adicionar HTML estatico a um elemento title.append('<div style="background-color: red; font-style: italic; font-size: 24px; color: yellow;">' + 'Esta tela é customizável</div>'); // ou podemos adicionar HTML dinamico com bindings do angular, utilizando o scope da pagina // com acesso ao controller, inclusive aos atributos que foram incluidos por customização. // tambem é possivel associar eventos que chamam o controller var html = '<div style="background-color: black; font-size: 24px; color: green;">' + 'E posso compilar com os bindings do angular, ' + 'a lista tem {{controller.listOfcountry.length}} itens' + '<div style="background-color : brown; color: white;">{{controller.epcValue}}</div></div>' // o metodo compileHTML do customService permite que o HTML seja compilado contra o scope da tela var compiledHTML = customService.compileHTML(params, html); // e este HTML compilado pode ser adicionado ao elemento utilizando a API do jQuery title.append(compiledHTML); }, // metodo do evento customizado na pagina na tag HTML com totvs-custom-element="customListItem" // como aquele elemento é controlado por um ng-repeat, // esta customização é chamada para cada item que é renderizado na lista customListItem : function (params, element) { // primeiro encontramos o elemento que queremos customizar var title = element.find('div[title]:first'); // definimos a customização que será adicionada ao elemento. var html = '<span style="background-color: yellow"> - <a target="_blank" href="http://pt.wikipedia.org/wiki/{{country.name}}">Este link para Wikipedia também e uma customização</a></span>'; // como o HTML tem binding para o scopo do angular, precisamos compilar o HTML var compiledHTML = customService.compileHTML(params, html); // e este HTML compilado pode ser adicionado ao elemento utilizando a API do jQuery title.append(compiledHTML); } }; // todas as customizações devem estender o customService para as chamadas ocorrerem de forma correta. angular.extend(service, customService); return service; } // conforme definido, o nome da factory é "custom." mais o contexto e nome da tela. index.register.factory('custom.html-sample.country', countryCustomService); }); |
O resultado da customização é o seguinte:
var title,
html,
compiledHTML;
title = element.find(".page-head");
// utilizando a API do jQuery podemos adicionar HTML estático a um elemento
title.append('<div style="background-color: red; font-style: italic; font-size: 24px; color: yellow;">' +
'Esta tela é <a href="http://tdn.totvs.com/pages/viewpage.action?pageId=185738044" target="_blank">customizável</a>' +
'</div>');
// ou podemos adicionar HTML dinâmico com bindings do angular, utilizando o scope da pagina
// com acesso ao controller, inclusive aos atributos que foram incluídos por customização.
// também é possível associar eventos que chamam o controller
html = '<div style="background-color: black; font-size: 24px; color: green;">' +
'E posso compilar com os bindings do angular, a lista tem {{controller.recordsCount}} itens' +
'<div style="background-color : brown; color: white;">{{controller.customInitValue}}</div></div>';
// o método compileHTML do customService permite que o HTML seja compilado contra o scope da tela
compiledHTML = customService.compileHTML(params, html);
// e este HTML compilado pode ser adicionado ao elemento utilizando a API do jQuery
title.append(compiledHTML);
},
// método do evento customizado na pagina na tag HTML com totvs-custom-element="customListItem"
// como aquele elemento é controlado por um ng-repeat,
// esta customização é chamada para cada item que é renderizado na lista
customListItem : function (params, element) {
// primeiro encontramos o elemento que queremos customizar
var title,
item,
html,
compiledHTML,
compiledField;
title = element.find('div[title]:first');
// definimos a customização que será adicionada ao elemento.
html = '<span style="background-color: yellow">' +
' - <a target="_blank" href="http://tdn.totvs.com/display/tec/TOTVS+%7C++HTML+Framework">' +
'Este link para TDN também e uma customização</a>' +
'</span>';
// como o HTML tem binding para o scopo do angular, precisamos compilar o HTML
compiledHTML = customService.compileHTML(params, html);
// e este HTML compilado pode ser adicionado ao elemento utilizando a API do jQuery
title.append(compiledHTML);
item = element.find('.item-info .row');
// definimos a customização que será adicionada ao elemento, nesse caso incluímos 2 novos campos para exibição
html = '<totvs-list-item-info title="Campo customizado #1" value="Valor customizado #1"></totvs-list-item-info>' +
'<totvs-list-item-info title="Campo customizado #2" value="Valor customizado #2"></totvs-list-item-info>';
compiledField = customService.compileHTML(params, html);
item.append(compiledField);
}
};
angular.extend(service, customService);
return service;
}
customerCustomService.$inject = ['customization.generic.Factory'];
custom.register(customerCustomService);
}); |
Resultado da customização
define([ 'index', 'directive-base', 'directive-crud', 'directive-editable'], function (index) {
'use strict';
// ************************************************************************************* // *** Type: CONTROLLER - LIST // *** // *** Description: Controller responsável pela listagem dos dados // *** // *************************************************************************************
var customersListController = function ($rootScope, $scope, $state, $modal, dateFilter, appViewService, customerService, customizationService) {
// ********************************************************************************* // *** Variables // *********************************************************************************
var self = this;
self.records = []; self.recordsCount = 0; self.disclaimers = []; self.advancedSearch = {};