Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Os diálogos modais fornecem uma maneira poderosa de criar experiências de usuário focadas em extensões do Azure DevOps. O serviço de diálogo permite apresentar uma caixa de diálogo modal que bloqueia a interação do usuário com a interface inteira do Azure DevOps até que a caixa de diálogo seja descartada. Essa ação garante que os usuários preencham tarefas importantes ou forneçam informações necessárias.
Use caixas de diálogo modais em suas extensões para:
- Coletar dados do usuário através de formulários
- Exibir mensagens de confirmação para ações críticas
- Mostrar informações detalhadas que exigem atenção do usuário
- Orientar os usuários por meio de processos de várias etapas
Importante
Quando você cria diálogos modais, eles bloqueiam a interação com toda a página do Azure DevOps, não apenas com a 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 vss-extension.json válido |
| Registro do Marketplace | Extensão registrada no Visual Studio Marketplace para teste e implantação | |
| Conhecimento de desenvolvimento | Noções básicas sobre o desenvolvimento de extensão do Azure DevOps | |
| ambiente de desenvolvimento | Node.js e npm | Node.js versão 14 ou posterior com o npm instalado |
| Editor de código | Visual Studio Code ou outro IDE recomendado | |
| Acesso ao Azure DevOps | Acesso a uma organização do Azure DevOps para teste | |
| Pacotes necessários | SDK da 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 em 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 no manifesto da extensão. Essa 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 na á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 a caixa de diálogo (por exemplo, quando um usuário seleciona uma ação em uma barra de ferramentas ou menu), chame a openDialog função em uma 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 de caixa de diálogo avançados
Uma função pode ser chamada quando o botão OK é selecionado. Especifique essa função definindo getDialogResult nas opções fornecidas ao mostrar a caixa de diálogo.
Se uma chamada para getDialogResult retornar um valor não nulo, esse valor será então passado para a função especificada por okCallback (também nas opções) e a caixa de diálogo será fechada.
Neste exemplo, o attachFormChanged retorno de chamada é chamado quando as entradas no formulário mudam. Com base em se o formulário é válido ou não, o botão OK está habilitado ou desabilitado.
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);
});
});
});
});
Controlar o botão OK
Inicialmente, o botão OK está desabilitado. No entanto, você pode habilitar/desabilitar 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 ao abri-lo 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 for aberta, o usuário deve especificar as seguintes opções para passar myId:
const dialogOptions = {
title: "My Dialog Title",
width: 800,
height: 600,
urlReplacementObject: { myId: new Date().getTime() }
};
Personalizar botões de caixa 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 pergunta ou estiver procurando mais informações, considere ir para uma das seguintes áreas: