Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Serviços de DevOps do Azure | Azure DevOps Server | Azure DevOps Server 2022
As diálogos modais oferecem uma forma poderosa de criar experiências focadas para o usuário nas extensões do Azure DevOps. O serviço de diálogo permite-lhe apresentar um diálogo modal que bloqueia a interação do utilizador com toda a interface Azure DevOps até que o diálogo seja ignorado. Essa ação garante que os usuários concluam tarefas importantes ou forneçam as informações necessárias.
Use diálogos modais nas suas extensões para:
- Recolher dados do utilizador por meio de formulários
- Exibir mensagens de confirmação para ações críticas
- Mostrar informações detalhadas que requerem atenção do usuário
- Guie os usuários através de processos de várias etapas
Importante
Quando crias diálogos modais, bloqueiam a interação com toda a página DevOps do Azure, não apenas com a tua extensão. Essa abordagem fornece uma verdadeira experiência modal, mas você deve usá-la cuidadosamente para evitar interromper o fluxo de trabalho do usuário.
Pré-requisitos
| Categoria | Requisito | Detalhes |
|---|---|---|
| Configuração da extensão | Projeto de extensão de trabalho | Um arquivo de manifesto válido vss-extension.json |
| Registo no Marketplace | Extensão registrada no Visual Studio Marketplace para teste e implantação | |
| Conhecimento de desenvolvimento | Noções básicas de desenvolvimento da extensão Azure DevOps | |
| Ambiente de desenvolvimento | Node.js e npm | Node.js versão 14 ou posterior com npm instalado |
| Editor de código | Código do Visual Studio ou outro IDE recomendado | |
| Acesso ao Azure DevOps | Acesso a uma organização de DevOps do Azure para teste | |
| Pacotes necessários | Kit de Desenvolvimento de Extensão | Instalar: npm install azure-devops-extension-sdk |
| API de extensão | Instalar: npm install azure-devops-extension-api |
|
| Permissões de extensão | Escopos de manifesto | Inclua escopos apropriados no vss-extension.json, por exemplo: "vso.work", "vso.project" |
| Importações do SDK | Módulos necessários | Importar SDK e serviços: import * as SDK from "azure-devops-extension-sdk" |
Conteúdo da caixa de diálogo
Para começar, declare uma contribuição do tipo ms.vss-web.control em seu manifesto de extensão. Esta contribuição representa o conteúdo exibido na caixa de diálogo.
{
"id": "registration-form",
"type": "ms.vss-web.control",
"description": "The content to be displayed in the dialog",
"targets": [],
"properties": {
"uri": "registration-form.html"
}
}
A uri propriedade faz referência a uma página que é renderizada dentro da área de conteúdo da caixa de diálogo:
<!DOCTYPE html>
<html>
<head>
<script src="node_modules/azure-devops-extension-sdk/lib/SDK.js"></script>
</head>
<body>
<h2 id="header">Register now</h2>
<p>
<label>Name:</label>
<input id="inpName" />
</p>
<p>
<label>Date of birth:</label>
<input id="inpDob" />
</p>
<p>
<label>Email address:</label>
<input id="inpEmail" />
</p>
<script type="module">
import * as SDK from "azure-devops-extension-sdk";
SDK.init();
const registrationForm = (function() {
const callbacks = [];
function inputChanged() {
// Execute registered callbacks
for(let i = 0; i < callbacks.length; i++) {
callbacks[i](isValid());
}
}
function isValid() {
// Check whether form is valid or not
return !!(name.value) && !!(dateOfBirth.value) && !!(email.value);
}
function getFormData() {
// Get form values
return {
name: name.value,
dateOfBirth: dateOfBirth.value,
email: email.value
};
}
const name = document.getElementById("inpName");
const dateOfBirth = document.getElementById("inpDob");
const email = document.getElementById("inpEmail");
name.addEventListener("change", inputChanged);
dateOfBirth.addEventListener("change", inputChanged);
email.addEventListener("change", inputChanged);
return {
isFormValid: function() {
return isValid();
},
getFormData: function() {
return getFormData();
},
attachFormChanged: function(cb) {
callbacks.push(cb);
}
};
})();
// Register form object to be used across this extension
SDK.register("registration-form", registrationForm);
</script>
</body>
</html>
Mostrar a caixa de diálogo
Para mostrar o diálogo (por exemplo, quando um utilizador seleciona uma ação numa barra de ferramentas ou menu), chame a openDialog função numa instância do serviço de diálogo:
import * as SDK from "azure-devops-extension-sdk";
SDK.getService(SDK.CommonServiceIds.Dialog).then((dialogService) => {
const extensionCtx = SDK.getExtensionContext();
// Build absolute contribution ID for dialogContent
const contributionId = `${extensionCtx.publisherId}.${extensionCtx.extensionId}.registration-form`;
// Show dialog
const dialogOptions = {
title: "My Dialog",
width: 800,
height: 600
};
dialogService.openDialog(contributionId, dialogOptions);
});
Recursos avançados de caixa de diálogo
Uma função pode ser chamada quando o botão OK é selecionado. Você especifica essa função definindo getDialogResult as opções fornecidas ao mostrar a caixa de diálogo.
Se uma chamada para getDialogResult retornar um valor não nulo, esse valor será passado para a função especificada por okCallback (também nas opções) e a caixa de diálogo será fechada.
Neste exemplo, a função de retorno attachFormChanged é executada quando as entradas no formulário são alteradas. Com base na validade ou não do formulário, o botão OK está ativado ou desativado.
import * as SDK from "azure-devops-extension-sdk";
SDK.getService(SDK.CommonServiceIds.Dialog).then((dialogService) => {
let registrationForm;
const extensionCtx = SDK.getExtensionContext();
const contributionId = `${extensionCtx.publisherId}.${extensionCtx.extensionId}.registration-form`;
const dialogOptions = {
title: "Registration Form",
width: 800,
height: 600,
getDialogResult: () => {
// Get the result from registrationForm object
return registrationForm ? registrationForm.getFormData() : null;
},
okCallback: (result) => {
// Log the result to the console
console.log(JSON.stringify(result));
}
};
dialogService.openDialog(contributionId, dialogOptions).then((dialog) => {
// Get registrationForm instance which is registered in registration-form.html
dialog.getContributionInstance("registration-form").then((registrationFormInstance) => {
// Keep a reference of registration form instance (to be used previously in dialog options)
registrationForm = registrationFormInstance;
// Subscribe to form input changes and update the Ok enabled state
registrationForm.attachFormChanged((isValid) => {
dialog.updateOkButton(isValid);
});
// Set the initial ok enabled state
registrationForm.isFormValid().then((isValid) => {
dialog.updateOkButton(isValid);
});
});
});
});
Controle o botão OK
Inicialmente, o botão OK está desativado. No entanto, você pode ativar/desativar esse botão chamando o updateOkButton método na caixa de diálogo:
dialogService.openDialog(contributionId, dialogOptions).then((dialog) => {
// Set true/false to enable/disable ok button
dialog.updateOkButton(true);
});
Passar valores para a caixa de diálogo
É possível passar valores iniciais para o conteúdo da caixa de diálogo quando você o abre na caixa de diálogo do host.
{
"id": "registration-form",
"type": "ms.vss-web.control",
"description": "The content displayed in the dialog",
"targets": [],
"properties": {
"uri": "registration-form.html?id={{myId}}"
}
}
Quando a caixa de diálogo é aberta, as seguintes opções devem ser especificadas para passar myId:
const dialogOptions = {
title: "My Dialog Title",
width: 800,
height: 600,
urlReplacementObject: { myId: new Date().getTime() }
};
Personalizar botões de diálogo
Os okText atributos e cancelText podem ser usados para especificar títulos alternativos para os botões OK e Cancelar:
const dialogOptions = {
title: "My Dialog Title",
width: 800,
height: 600,
okText: "Yes",
cancelText: "No"
};
Para não mostrar nenhum botão na caixa de diálogo, você pode definir o buttons atributo como []:
const dialogOptions = {
title: "My Dialog Title",
width: 800,
height: 600,
buttons: []
};
Recursos relacionados
Se você tiver uma dúvida ou estiver procurando mais informações, considere ir para uma das seguintes áreas: