Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
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
titleServiço de customização #2
linenumberstrue
 define([
	'index',
    'totvs-custom'
], function (index) {

    'use strict';

    function customerCustomService(customService) {

        var service;

        service = {
            // metodos para cada evento de customização
            // metodo do evento customizado no controller no metodo init.
            initEvent: function (params) {
				...


                return "OK";
            },


            // metodo do evento customizado na pagina na tag HTML com totvs-custom-element="customPage"
            customPage: function (params, element) {
				...
            },
            // metodo do evento customizado na pagina na tag HTML com totvs-custom-element="customListItem"
            customListItem : function (params, element) {
				...
            }
        };


		// Estende o serviço customization.generic.Factory
        angular.extend(service, customService);

        return service;
    }

    customerCustomService.$inject = ['customization.generic.Factory'];

	// Registra o serviço com um nome específico
	index.register.factory('custom.customization.customer.factory', customerCustomService);
});
Informações

Todo serviço de customização deve ter como dependência a biblioteca totvs-custom na definição para o requireJS.

Identificador do serviço de customização

...

Bloco de código
titleEstrutura
public
	thf
		custom
			demo
				customer.js
		demo
			html
				customer
					customer.js
					customer.factory.js
					customer.list.html
					customer.list.controller.js
					customer.detail.html
					customer.detail.controller.js
					customer.edit.html
					customer.edit.controller.js
			*.*

Exemplo

Considerando a seguinte tela, sem customização:

Image Removed

Como é uma pagina do estilo lista, e para permitir que seja customizada devemos definir o HTML da seguinte forma:

Nesse exemplo vamos customizar o programa "customer" do módulo "demo".

Image Added

Definindo pontos de customização na view

Para permitir que uma view seja customizada devemos incluir pontos de customização nessa view.

O arquivo thf\demo\html\customer\customer.list.html terá dois pontos de customização, um na diretiva totvs-page e o outro na diretiva totvs-list-item.

Na diretiva totvs-page será disparado o método customPageList do serviço de customização e na diretiva totvs-list-item será disparado o método customListItem, caso nenhum método seja especificado será disparado o método customPage.

Caso seja criado um serviço de customização com um nome definido pelo desenvolvedor, o atributo totvs-custom-service deve ser incluído nas mesma diretiva que vai receber a customização.

Bloco de código
languagexml
firstline1
titleExemplo
linenumberstrue
<totvs-page type="list" totvs-custom-element="customPageList">
    <totvs-page-navbar>
		<totvs-page-breadcrumb>
			<breadcrumb link="#/">{{ 'l-home' | i18n }}</breadcrumb>
				<breadcrumb>{{ 'l-menu-customer' | i18n }}</breadcrumb>
		</totvs-page-breadcrumb>

		<totvs-page-header>
			<totvs-page-header-title title="{{'l-customers' | i18n}}" total="{{controller.recordsCount}}"
Bloco de código
languagexml
firstline1
titleExemplo
linenumberstrue
 <totvs-page type="list" totvs-custom-element="customPage">
	<totvs-page-breadcrumb>
		<breadcrumb link="#/">Home</breadcrumb>
		<breadcrumb link="#/">Sample</breadcrumb>
		<breadcrumb>{{'l-country' | i18n}}</breadcrumb>
	</totvs-page-breadcrumb>
        
	<totvs-page-header>
		<totvs-page-header-title title="{{'l-country' | i18n}}" 
								 total="{{controller.listOfcountryCount}}"></totvs-page-header-title>
			...

Neste exemplo foi definido que quando a tela for apresentada, a customização será chamada pelo evento customPage, se apenas a diretiva for incluida no HTML sem valor, o evento chamado será customElement. 

Como tambem pode ser necessária a customização da lista, que está definida com a diretiva ng-repeat, isso implica que os elementos controlados pelo ng-repeat não existem até que os dados relativos ao ng-repeat existam, por isso para todos os ng-repeat's que precisam de customização, tambem deverão definir o ponto de customização, por exemplo:

Bloco de código
languagexml
firstline1
titleExemplo
linenumberstrue
	<totvs-page-content>
		
		<totvs-list-item id="country{{country.id}}" 
						 class="tag-2"
						 ng-repeat="country in controller.listOfcountry"
						..
		</totvs-page-header>
		...
    </totvs-page-navbar>
    <totvs-page-content>
        <totvs-list-item
            ng-repeat="customer in controller.records  | filter : controller.searchText"
            totvs-custom-element="customListItem">
		
			
            <totvs-list-item-header>
				
				<totvs...
            </totvs-list-item-title title="{{country.id}} - {{country.name}}"header>
            <totvs-list-item-content>
									   link="#/thf/html-sample/country/detail/{{ country.id }}"></totvs-list-item-title>

...

Neste ponto definimos o evento da customização que sera usado como customListItem, da mesma forma, se não for informado será assumido o evento customElement.

Para eventos que serão chamados pelos controllers da tela, o controller deverá  utilizar o serviço de customização definido na biblioteca totvs-custom que deverá ser adicionada como requisito na definição para o requireJS

...
            <totvs-list-item-content>
 
        </totvs-list-item>
		...
    </totvs-page-content>
...
</totvs-page>

Definindo ponto de customização no controller

Para permitir que um controller seja customizado, é preciso adicionar pontos de customização dentro do controller.

O arquivo thf\demo\html\customer\customer.list.controller.js terá um ponto de customização logo após fazer a carga inicial dos dados, para isso é necessário primeiro injetar o serviço "customization.generic.Factory" no controller e chamar o método callEvent passando como parâmetro o nome do serviço de customização, o nome do método a ser executado, os parâmetros e o elemento que deseja customizar (caso exista).

Bloco de códigocode
languagejs
firstline1
titleExemploExecmplo
linenumberstrue
define([
    'index', 
		'components',
		'totvs-custom',
	   ], function(index...
], function (index) {

    'use strict';

	var customersListController = function ($rootScope, appViewService, customerService, customizationFactory) {

		// *************************************************************************************
		// *** FACTORIESVariables
		// *************************************************************************************
	countryFactory.$inject		var self = this;

        self.records = ['$totvsresource'];
		function countryFactory($totvsresource) {
self.recordsCount = 0;
		...

 

Na definição do controller deverá ser injetada a factory do serviço de customização 'customization.generic.Factory', conforme o exemplo abaixo:

 

Bloco de código
languagejs
firstline1
titleExecmplo
linenumberstrue
	// **
 
		// **********************************************************************************************
		// *** CONTROLLERControl - LISTInitialize
		// *************************************************************************************

		countryListControllerself.$injectinit = ['$rootScope', '$scopefunction () {

			appViewService.startView($rootScope.i18n('l-customer') + ' (Customizado)', 'totvs.app-main-view.Service',
									 'html-sample.country.Service', 'customization.generic.Factory'];
	function countryListController($rootScope, $scope, appViewService, countryService, customizationService) {
		
		var _self = this;
		

 

E no ponto onde a customização deverá ser chamada, devemos utilziar o serviço customizationService:

 

Bloco de código
languagejs
firstline1
titleExemplo
linenumberstrue
		// *********************************************************************************
		// *** 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);
		}
		

Neste exemplo, no metodo init do controller, foi colocado o ponto de customização com o evento initEvent, onde no parametro é enviado o _self (o proprio controller), o primeiro parametro é o identificador do serviço de customização que será explicado a seguir.

Customização exemplo:

Como exemplo para tela de paises, vamos utilizar o seguinte arquivo de customização comentado.

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',
        'totvs.app-main-view.Service',
		'customization.customer.factory',
		// Serviço de customização 
        'customization.generic.Factory'
    ];

    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
languagejs
firstline1
titleExemplo de Customização
linenumberstrue
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!!!";

                // na chamada do evento, a customização pode retornar um valor que chega até a chamada no controller.
                return "OK";
            },


            // método do evento customizado na pagina na tag HTML com totvs-custom-element="customPageList"
            customPageList: function (params, element) {
                // utilizamos a API do jQuery para encontrarmos os elementos que queremos customizar na pagina
                // procuramos um elemento que tem a class "page-head"
                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&eacute;m e uma customiza&ccedil;&atilde;o</a>' +
                        '</span>';


                // como o HTML tem binding para o scopo do angular, precisamos compilar o HTML
                compiledHTML = customService.compileHTML(params, html);


                
Bloco de código
languagejs
firstline1
titleExemplo de Customização
linenumberstrue
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 callEvent foi passado o proprio controller, como o controller é acessivel para a 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";
			},
		
			// metodo do evento customizado na pagina na tag HTML com totvs-custom-element="customPage" 
			customPage : 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 um elemento com 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 &eacute; customiz&aacute;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&eacute;m e uma customiza&ccedil;&atilde;o</a></span>';
				// como o HTML tem binding para o scopo do angular, precisamos compilar o HTML
				var 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);
				// 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.
		
                item.append(compiledField);
            }
        };

        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
        return service;
    }

    customerCustomService.$inject = ['customization.generic.Factory'];

    custom.register(customerCustomService);
});

 

...

Resultado da customização

...

Image Added

Image Removed