Eu tenho uma função de enviar e-mail que gostaria de reaproveitar em todos os meus projetos, sem ter que ficar criando-o novamente, é possível?
Faça ela como um Dataset. Aí você pode chamar esse dataset em qualquer outro lugar.
Pode me dar um exemplo? Perdão, novato ainda nesse ambiente…
Se me lembro bem o truque é deixar a função reutilizável dentro de um dos registros do dataset. Aí você chama ele e dá um .eval() no registro. Correto @Bruno_Gasparetto ?
Desse jeito ainda não fiz, @daniel.cabral . Eu simplesmente faço o Dataset executar mesmo, sem o eval.
Cria um dataset e os parâmetros da “função” são as contraints que você envia na hora de consultar o Dataset.
Olha só esse exemplo de um dataset que envia e-mail com anexos:
Eu já fiz um dataset baseado nesse do link, pra enviar e-mails com anexo.
Outro exemplo. Em alguns processos eu preciso saber se foi enviado algum anexo em determinada Atividade. Tive essa necessidade em uns 3 processos. Aí resolvi fazer um dataset que recebe, por constraint, o ID da Solicitação e o Número da Atividade. Aí ele simplesmente retorna informando se teve anexo ali.
Vou deixar aqui um exemplo, acho que o mais simples.
É um dataset que cria uma nova pasta no GED do Fluig. Dei o nome de ds_fluig_create_folder
a ele.
/**
* Cria uma pasta
*
* Deve-se passar as constraints:
* - parentId: ID da pasta pai;
* - folderName: Nome da pasta a ser criada;
*
* O Dataset retorna o ID da pasta criada.
*
* @param {string[]} fields Campos Solicitados
* @param {Constraint[]} constraints Filtros
* @param {string[]} sorts Campos da Ordenação
* @returns {Dataset}
*/
function createDataset(fields, constraints, sorts) {
var dataset = DatasetBuilder.newDataset();
dataset.addColumn("success");
dataset.addColumn("message");
dataset.addColumn("folderId");
var parentId = parseInt(getConstraintValue(constraints, "parentId"));
var folderName = getConstraintValue(constraints, "folderName");
if (!parentId || folderName == "") {
dataset.addRow([
"0",
"Obrigatório informar as constraints parentId e folderName",
""
]);
return dataset;
}
try {
var fluigCredentials = getFluigWebServiceUser();
var serviceHelper = ServiceManager.getService("ECMFolderService").getBean();
var service = serviceHelper
.instantiate("com.totvs.technology.ecm.dm.ws.ECMFolderServiceService")
.getFolderServicePort();
var result = service.createSimpleFolder(
fluigCredentials.username,
fluigCredentials.password,
getValue("WKCompany"),
parentId,
"admin",
folderName
);
var folderId = result.getItem().get(0).getDocumentId().toString();
if (folderId == "0") {
var message = result.getItem().get(0).getWebServiceMessage();
throw message ? message : "Não foi possível criar a pasta. Verifique se o parentId informado é válido.";
}
dataset.addRow([
"1",
"Pasta Criada",
folderId
]);
return dataset;
} catch (err) {
dataset.addRow([
"0",
err,
""
]);
return dataset;
}
}
/**
* Pega o valor inicial de uma constraint
*
* @param {Constraint[]} constraints
* @param {string} field
* @returns {string}
*/
function getConstraintValue(constraints, field) {
for (var i = 0; i < constraints.length; ++i) {
if (constraints[i].fieldName == field) {
return constraints[i].initialValue;
}
}
return "";
}
/**
* Retorna as credenciais do WS do Fluig
*
* @returns {{username: string, password: string}}
*/
function getFluigWebServiceUser() {
var ds = DatasetFactory.getDataset(
"ds_WebServiceUsers",
null,
[DatasetFactory.createConstraint('service', 'Fluig', 'Fluig', ConstraintType.MUST)],
null
);
if (!ds.rowsCount) {
throw "Fluig Webservice: Usuário não encontrado!";
}
return {
username: ds.getValue(0, "wsUsername"),
password: ds.getValue(0, "wsPassword")
};
}
Aí, em qualquer lugar, eu posso invocar esse dataset pra ele criar a pasta:
var dsFolder = DatasetFactory.getDataset(
"ds_fluig_create_folder",
null,
[
DatasetFactory.createConstraint("parentId", 10, 10, ConstraintType.MUST),
DatasetFactory.createConstraint("folderName", "Teste 001", "Teste 001", ConstraintType.MUST),
],
null
);
if (dsFolder.getValue(0, "success") == 0) {
throw dsFolder.getValue(0, "message");
}
var folderId = dsFolder.getValue(0, "folderId");
Muito booooooooom Bruno! Show demais, ajudou muito.
AAhhh tá! Meu raciocínio foi diferente - sua solução é mais elegante encapsulando funções executáveis pelo backend.
O que sugeri seria para uma abordagem mais no frontend sem depender de colocar arquivos dentro das pastas do fluig - mas penso que, apesar do trabalho manual, a manutenção ainda é relativamente fácil - colocar os .js na pasta /resources do fluig e importar a partir de lá. Antes da TOTVS integrar o Moment por exemplo, fazia isso.
@GabrielDouglas , não é uma ótima explicação, mas dá uma olhada nesse vídeo que fala um pouco sobre isso de compartilhar código dentro do Fluig.