Compara páginas. Complemento simple para Atlassian Confluence

Atlassian Confluence tiene una gran funcionalidad de comparación de versiones de página. Es conveniente de usar, pero no podrá ir más allá del historial de cambios. Como ser La búsqueda del complemento terminado en Marketplace no dio ningún resultado y se decidió escribir el suyo.

Las herramientas


Necesitaremos:

  • Oracle JDK o AdoptOpenJDK 1.8, trabajar con OpenJDK no es oficialmente compatible;
  • Atlassian SDK: se puede descargar del sitio oficial para Windows y Linux / Mac sin SMS ni registro;
  • Apache Maven
  • Entorno de desarrollo favorito, tengo IntelliJ IDEA.

Crear un proyecto


Instale el SDK y ejecute el script atlas-create-confluence-plugin .

Ingrese:

  • id-grupo: com.kshch.confluence.plugins
  • id-artefacto: página-dif.
  • versión: 1.0.0-Descripción
  • paquete: com.kshch.confluence.plugins.diff.page

Para el ensamblaje, puede usar maven y dependencias del SDK, pero es más fácil conectar repositorios adicionales en settings.xml.

 <repository> <id>atlassian-public</id> <url>https://packages.atlassian.com/maven/repository/public</url> <snapshots> <enabled>true</enabled> <updatePolicy>never</updatePolicy> <checksumPolicy>warn</checksumPolicy> </snapshots> <releases> <enabled>true</enabled> <checksumPolicy>warn</checksumPolicy> </releases> </repository> <pluginRepository> <id>atlassian-public</id> <url>https://maven.atlassian.com/repository/public</url> <releases> <enabled>true</enabled> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <updatePolicy>never</updatePolicy> <checksumPolicy>warn</checksumPolicy> </snapshots> </pluginRepository> 

Abra el proyecto resultante en el IDE, ejecute Confluence en modo de depuración confluence:debug



y verifique el funcionamiento de la instalación local en http: // localhost: 1990 / confluence / . Iniciar sesión admin, contraseña admin. La base de datos ya ha creado un espacio de demostración y varios artículos.

Un poco de funcionalidad


Comencemos con el menú. Agregue el módulo de elementos web al descriptor del complemento atlassian-plugin.xml.

 <web-item key="diff-page-menu" name="Diff Page" section="system.content.action/secondary" weight="300"> <description>Add diff item to drop-down menu</description> <label key="diff.page.menu.name"/> <link linkId="diff-page">/plugins/diffPage/diffPagePopup.action?spaceKey=${space.key}&sourcePageId=${page.id}</link> <condition class="com.atlassian.confluence.plugin.descriptor.web.conditions.HasPageCondition"/> </web-item> 

Donde:

  • atributo de sección: define la ubicación del elemento del menú;
  • peso del atributo: es responsable del orden de clasificación;
  • el atributo clave de la etiqueta de etiqueta es la clave por la cual el nombre del elemento del menú que se muestra se encuentra en los archivos de recursos;
  • etiqueta de enlace: contiene el enlace y el atributo linkId es su id;
  • condición: define la condición para la apariencia, en nuestro caso, solo en las páginas.

Agregue la línea a diff-page.properties:
diff.page.menu.name=Diff page

Si necesita soporte de traducción, crearemos propiedades adicionales, por ejemplo, para la localización en ruso, el archivo se llamará diff-page_ru_RU.properties.

Ejecute el maven package . El complemento se reiniciará automáticamente y aparecerá nuestro elemento de menú.



Ventana modal


Es conveniente usar una ventana modal para seleccionar una página. Continuar editando atlassian-plugin.xml

Agrega algunos recursos:

 <web-resource key="diff-page-popup-resources" name="diff-page Popup Web Resources"> <dependency>com.atlassian.auiplugin:ajs</dependency> <dependency>com.atlassian.auiplugin:dialog2</dependency> <resource type="download" name="diff-page-popup.js" location="/js/diff-page-popup.js"/> <context>page</context> </web-resource> 

Donde:

  • etiqueta de dependencia - dependencia;
  • los atributos de recursos indican el tipo de recurso, nombre y ubicación en el sistema de archivos;
  • etiqueta de contexto: determina la visibilidad según el contexto.

Defina los controladores para nuestras URL:

 <xwork name="Diff Page Action" key="diff-page-action"> <description>Diff page action</description> <package name="diff-page-package" extends="default" namespace="/plugins/diffPage"> <default-interceptor-ref name="defaultStack"/> <action name="diffPage" class="com.kshch.confluence.plugins.diff.page.action.DiffPageAction"> <result name="success" type="velocity">/templates/diff-page.vm</result> </action> <action name="diffPagePopup" class="com.kshch.confluence.plugins.diff.page.action.DiffPagePopupAction"> <result name="success" type="velocity">/templates/diff-page-popup.vm</result> </action> </package> </xwork> 

Donde:

  • atributo de nombre de la etiqueta de acción: define el nombre del enlace y clase: la clase java para procesarlo;
  • resultado de la etiqueta: contiene un enlace a la plantilla, en nuestro caso la velocidad.

Cree un nuevo paquete com.kshch.confluence.plugins.diff.page.action y agregue la clase DiffPagePopupAction, que extiende ConfluenceActionSupport con 2 campos.

 private String spaceKey; private Long sourcePageId; 

Generamos getters y setters para ellos. El campo spaceKey contendrá la clave del espacio actual, y sourcePageId contendrá la identificación de la página actual.

Vamos al frente. Para crear una ventana emergente, use el elemento dialog2 del marco AUI .

Agregue un formulario, un botón de envío y entradas con las clases css autocomplete-space y autocomplete-page al diálogo, lo que le permitirá organizar la elección del espacio y la página sin esfuerzo adicional. Guarde el resultado en /templates/diff-page-popup.vm.

 <section role="dialog" id="diff-page-popup" class="aui-layer aui-dialog2 aui-dialog2-medium" aria-hidden="true" data-aui-remove-on-hide="true"> <form action="$action.getBootstrapManager().getWebAppContextPath()/plugins/diffPage/diffPage.action" method="get" class="aui"> ... <input type="hidden" name="sourcePageId" value="$action.getSourcePageId()"> <input class="text autocomplete-space" type="text" id="diff-page-space" name="spaceKey" data-max="10" data-none-message="$action.getText("diff.page.popup.no.result")" placeholder="$action.getText("diff.page.popup.select.space")" value="$action.getSpaceKey()" data-template="{key}"> <input type="text" class="text autocomplete-page" name="destinationPageName" data-max="10" placeholder="$action.getText("diff.page.popup.select.page")" data-none-message="$action.getText("diff.page.popup.no.result")"> <button id="dialog-diff-button" class="aui-button aui-button-primary">$action.getText("diff.page.popup.diff")</button> ... </form> </section> 

Para mostrar la ventana, cree /js/diff-page-popup.js en los recursos con los siguientes contenidos:

 (function ($) { $(function () { AJS.$('#diff-page').unbind('click'); AJS.$('#diff-page').bind("click", function (e) { e.preventDefault(); var link = AJS.$(this); AJS.$.get(link.attr('href'), function (response) { AJS.$('.aui-page-panel').after(response); AJS.dialog2("#diff-page-popup").show(); Confluence.Binder.autocompletePage(AJS.$("#diff-page-popup-binder")); }); return false; }); }); })(AJS.$); 

Su tarea es anular el evento de clic estándar y mostrarnos una ventana emergente, en lugar de navegar a través del enlace.

Ejecute el maven package e intente seleccionar la página y el espacio. La información sobre herramientas se activa después de un conjunto de 2 caracteres.



Funcionalidad principal


Procedemos a la implementación de la funcionalidad básica. Agregue al paquete com.kshch.confluence.plugins.diff.page.action otra clase DiffPageAction que extienda ConfluenceActionSupport e implemente la interfaz PageAware con los siguientes campos.

 private Long sourcePageId; private Long destinationPageId; private String spaceKey; private String destinationPageName; private String sourcePageTitle; private String destinationPageTitle; private String diff; private Page sourcePage; private Differ differ; private final PageManager pageManager; 

Donde:

  • sourcePageId: id de la página de origen;
  • destinationPageId: identificación de la página que se está comparando;
  • spaceKey - tecla de espacio;
  • destinationPageName: nombre de la página que se compara;
  • sourcePageTitle: el título de la página de origen;
  • destinationPageTitle: encabezado de la página comparada;
  • diff es el resultado de la comparación.

Generamos getters y setters, implementamos todos los métodos excepto getPage, ya que el IDE ofrece por defecto. Los campos sourcePageId, spaceKey y destinationPageName contendrán los datos que provienen del formulario dentro de dialog2.

 @Override public AbstractPage getPage() { return this.sourcePage; } 

Redefinimos el método de ejecución al nuestro. Es en él que se concluye la lógica principal del complemento.

 @Override public String execute() throws Exception { if (this.sourcePageId != null && this.spaceKey != null && this.destinationPageName != null) { this.sourcePage = this.pageManager.getPage(this.sourcePageId); Page destinationPage = this.pageManager.getPage(this.spaceKey, this.destinationPageName); if (this.sourcePage != null && destinationPage != null) { this.destinationPageId = destinationPage.getId(); this.sourcePageTitle = this.sourcePage.getTitle(); this.destinationPageTitle = destinationPage.getTitle(); this.diff = this.differ.diff(this.sourcePage, destinationPage); } } return super.execute(); } 

Queda por implementar la comparación frontend de 2 páginas. Es mucho más simple que una ventana emergente.

Cree en los recursos /templates/diff-page.vm. En él, además del diseño, implementamos la verificación de errores más simple.

 #if ($action.getDiff()) #diffBody() #else <div class="aui-message aui-message-error"> <p class="title"> <strong>$action.getText("diff.page.error")</strong> </p> <p>$action.getText("diff.page.error.message")</p> </div> #end 

La escritura del complemento se ha completado. Una vez más, ejecute el maven package , seleccione la página y disfrute el resultado.



El código completo del proyecto está disponible en GitHub .

Source: https://habr.com/ru/post/es433466/


All Articles