// Configurações var config = { pastaPadrao: "C:\\Users\\Glerison Prata\\Meu Drive\\🩺 Consultório\\🗂️ Área dos Clientes\\Documentos de Consultório\\🛄 Modelos\\💼 Pasta Raiz\\Padrão", maxItensPorPagina: 15, // Mantido para evitar extrapolação (ajustável) maxCaracteresNome: 25, // Limite de caracteres para nomes no diálogo extensoesPermitidas: null // Ex.: [".pdf", ".docx"] para filtrar (null para mostrar tudo) }; function OnClick(clickData) { DOpus.Output("=== INICIANDO SCRIPT NO MENU DE CONTEXTO ==="); // Verifica se a pasta "Padrão" existe DOpus.Output("Verificando pasta: " + config.pastaPadrao); if (!DOpus.FSUtil.Exists(config.pastaPadrao)) { clickData.func.Dlg.Request("A pasta 'Padrão' não foi encontrada.", "OK"); DOpus.Output("ERRO: Pasta 'Padrão' não encontrada."); return; } // Obtém a pasta de destino (contexto do clique direito) var pastaDestino = clickData.func.sourcetab.path; DOpus.Output("Pasta de destino: " + pastaDestino); if (!DOpus.FSUtil.Exists(pastaDestino)) { clickData.func.Dlg.Request("A pasta de destino não foi encontrada.", "OK"); DOpus.Output("ERRO: Pasta de destino não encontrada."); return; } // Lista os itens da pasta "Padrão" var itens = obterItensDaPasta(config.pastaPadrao); DOpus.Output("Itens listados: " + itens.join(", ")); if (itens.length == 0) { clickData.func.Dlg.Request("Nenhum arquivo ou pasta encontrado na pasta 'Padrão'.", "OK"); DOpus.Output("ERRO: Nenhum item encontrado na pasta 'Padrão'."); return; } // Mostra um diálogo com todos os itens (paginado com menos itens por página) var selecionados = exibirListaItens(itens, clickData, config.pastaPadrao); if (!selecionados || selecionados.length == 0) { DOpus.Output("Nenhum item selecionado para copiar."); return; } // Prepara os arquivos para cópia var arquivosSelecionados = []; for (var i = 0; i < selecionados.length; i++) { var caminhoItem = config.pastaPadrao + "\\" + selecionados[i]; DOpus.Output("Processando item: " + caminhoItem); var itemInfo = DOpus.FSUtil.GetItem(caminhoItem); if (itemInfo.is_dir) { DOpus.Output("Item é uma pasta, navegando..."); arquivosSelecionados = arquivosSelecionados.concat(navegarSubpastas(caminhoItem, clickData)); } else { DOpus.Output("Item é um arquivo, adicionando..."); arquivosSelecionados.push(caminhoItem); } } // Copia os arquivos selecionados (sem mensagem de sucesso) if (arquivosSelecionados.length > 0) { DOpus.Output("Copiando " + arquivosSelecionados.length + " itens..."); copiarArquivos(arquivosSelecionados, pastaDestino, clickData); } else { DOpus.Output("Nenhum arquivo ou pasta para copiar."); } } function obterItensDaPasta(caminho) { var itens = []; try { DOpus.Output("Listando itens em: " + caminho); var folderEnum = DOpus.FSUtil.ReadDir(caminho); while (!folderEnum.complete) { var fileItem = folderEnum.Next(); var incluir = true; if (config.extensoesPermitidas && !fileItem.is_dir) { incluir = false; var nomeLower = fileItem.name.toLowerCase(); for (var j = 0; j < config.extensoesPermitidas.length; j++) { if (nomeLower.indexOf(config.extensoesPermitidas[j]) == nomeLower.length - config.extensoesPermitidas[j].length) { incluir = true; break; } } } if (incluir) { itens.push(fileItem.name); } } DOpus.Output("Itens listados com sucesso: " + itens.join(", ")); } catch (e) { DOpus.Output("Erro ao listar a pasta " + caminho + ": " + e.message); } return itens; } function navegarSubpastas(caminhoPasta, clickData) { var arquivosSelecionados = []; var itens = obterItensDaPasta(caminhoPasta); for (var i = 0; i < itens.length; i++) { var caminhoItem = caminhoPasta + "\\" + itens[i]; DOpus.Output("Processando item em subpasta: " + caminhoItem); var itemInfo = DOpus.FSUtil.GetItem(caminhoItem); if (itemInfo.is_dir) { DOpus.Output("Item é uma pasta, navegando recursivamente..."); arquivosSelecionados = arquivosSelecionados.concat(navegarSubpastas(caminhoItem, clickData)); } else { DOpus.Output("Item é um arquivo, adicionando..."); arquivosSelecionados.push(caminhoItem); } } return arquivosSelecionados; } function copiarArquivos(arquivos, pastaDestino, clickData) { try { var cmd = clickData.func.command; cmd.ClearFiles(); for (var i = 0; i < arquivos.length; i++) { var caminhoOrigem = arquivos[i]; var nomeArquivo = caminhoOrigem.split("\\").pop(); var caminhoDestino = pastaDestino + "\\" + nomeArquivo; if (DOpus.FSUtil.Exists(caminhoDestino)) { var confirmacao = clickData.func.Dlg.Confirm("O arquivo/pasta '" + nomeArquivo + "' já existe. Sobrescrever?", "Sim", "Não"); if (!confirmacao) { DOpus.Output("Cópia de '" + nomeArquivo + "' cancelada."); continue; } } cmd.AddFile(caminhoOrigem); DOpus.Output("Copiando: " + nomeArquivo); } cmd.RunCommand('Copy TO="' + pastaDestino + '"'); // Removida a mensagem de sucesso conforme solicitado } catch (e) { DOpus.Output("Erro ao copiar: " + e.message); clickData.func.Dlg.Request("Erro ao copiar:\n" + e.message, "OK"); } } function exibirListaItens(itens, clickData, caminhoPasta) { var maxItens = config.maxItensPorPagina; var paginaAtual = 0; var totalPaginas = Math.ceil(itens.length / maxItens); while (true) { var inicio = paginaAtual * maxItens; var fim = Math.min(inicio + maxItens, itens.length); var itensPagina = itens.slice(inicio, fim); // Encurtar nomes para evitar extrapolação var nomesExibidos = []; for (var i = 0; i < itensPagina.length; i++) { var nome = itensPagina[i]; if (nome.length > config.maxCaracteresNome) { nome = nome.substring(0, config.maxCaracteresNome - 3) + "..."; } nomesExibidos.push(nome); } var dlg = clickData.func.Dlg; dlg.window = clickData.func.sourcetab; dlg.message = "Selecione itens para copiar de:\n" + caminhoPasta + "\n(Pagina " + (paginaAtual + 1) + "/" + totalPaginas + ")"; dlg.title = "Copiar Itens (Rolável Simulado)"; var botoes = []; botoes = botoes.concat(nomesExibidos); botoes.push("Selecionar Todos"); // Opção para marcar todos da página // Mostrar "<<" e "Voltar" apenas a partir da página 2 if (paginaAtual > 0) { botoes.push("<<"); botoes.push("Voltar"); } // Mostrar ">>" se houver mais páginas, exceto na última if (paginaAtual < totalPaginas - 1) botoes.push(">>"); botoes.push("OK"); if (paginaAtual == 0) botoes.push("X"); // "X" só na página 1 para reduzir botões else botoes.push("X"); dlg.buttons = botoes.join("|"); dlg.icon = "question"; var resposta = dlg.Show(); DOpus.Output("Resposta do diálogo: " + resposta); var offsetAnterior = (paginaAtual > 0) ? 2 : 0; // Ajuste para contar "<<" e "Voltar" a partir da página 2 var offsetProxima = (paginaAtual < totalPaginas - 1) ? 1 : 0; var primeiroItemIdx = 1; var ultimoItemIdx = nomesExibidos.length; var indiceSelecionarTodos = ultimoItemIdx + 1; var indiceProxima = ultimoItemIdx + 2 + offsetAnterior; var indiceOK = ultimoItemIdx + (offsetAnterior ? 3 : 1) + offsetProxima; var indiceVoltar = (paginaAtual > 0) ? indiceOK + 1 : -1; // Só existe na página > 0 var indiceCancelar = indiceOK + (paginaAtual > 0 ? 2 : 1); // Ajuste para "X" if (resposta == 0 || resposta == indiceCancelar) { DOpus.Output("Cancelado pelo usuário"); return null; } else if (resposta == indiceVoltar && paginaAtual > 0) { DOpus.Output("Voltando para pasta anterior"); return "VOLTAR"; } else if (resposta == indiceProxima && offsetProxima) { DOpus.Output("Próxima página selecionada"); paginaAtual++; } else if (resposta == (offsetAnterior >= 2 ? 3 : 2) && offsetAnterior >= 2) { DOpus.Output("Página anterior selecionada"); paginaAtual--; } else if (resposta == indiceOK) { var selecionados = []; for (var i = 0; i < itensPagina.length; i++) { var itemIdx = i + 1; if (resposta == itemIdx) { selecionados.push(itensPagina[i]); } } if (selecionados.length > 0) { DOpus.Output("Itens selecionados: " + selecionados.join(", ")); return selecionados; } DOpus.Output("Nenhum item selecionado."); return null; } else if (resposta == indiceSelecionarTodos) { DOpus.Output("Selecionando todos os itens da página: " + itensPagina.join(", ")); return itensPagina; } else if (resposta >= primeiroItemIdx && resposta <= ultimoItemIdx) { var indiceItem = inicio + (resposta - primeiroItemIdx); DOpus.Output("Item selecionado: " + itens[indiceItem]); return [itens[indiceItem]]; } else { DOpus.Output("Resposta inválida: " + resposta); } } }