Comparez les pages. Plugin simple pour Atlassian Confluence

Atlassian Confluence possède une excellente fonctionnalité de comparaison de version de page. Il est pratique à utiliser, mais vous ne pourrez pas aller au-delà de l'historique des changements. Comment être? La recherche du plugin terminé sur la place de marché n'a donné aucun résultat et il a été décidé d'écrire le vôtre.

Les outils


Nous aurons besoin de:

  • Oracle JDK ou AdoptOpenJDK 1.8, fonctionnant avec OpenJDK n'est pas officiellement pris en charge;
  • SDK Atlassian - peut être téléchargé depuis le site officiel pour Windows et Linux / Mac sans SMS ni inscription;
  • Apache Maven
  • Environnement de développement préféré, j'ai IntelliJ IDEA.

Créer un projet


Installez le SDK et exécutez le script atlas-create-confluence-plugin .

Entrez:

  • identifiant de groupe: com.kshch.confluence.plugins
  • artefact-id: diff-page
  • version: 1.0.0-INSTANTANÉ
  • package: com.kshch.confluence.plugins.diff.page

Pour l'assemblage, vous pouvez utiliser maven et les dépendances à partir du SDK, mais il est plus facile de connecter des référentiels supplémentaires dans votre 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> 

Ouvrez le projet résultant dans l'EDI, exécutez Confluence en confluence en mode confluence:debug



et vérifiez le fonctionnement de l'installation locale sur http: // localhost: 1990 / confluence / . Administrateur de connexion, administrateur de mot de passe. La base de données a déjà créé un espace de démonstration et plusieurs articles.

Un peu de fonctionnalité


Commençons par le menu. Ajoutez le module d'élément Web au descripteur de plug-in 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> 

Où:

  • attribut de section - définit l'emplacement de l'élément de menu;
  • poids d'attribut - est responsable de l'ordre de tri;
  • l'attribut clé de l'étiquette d'étiquette est la clé par laquelle le nom de l'élément de menu affiché est situé dans les fichiers de ressources;
  • balise de lien - contient le lien et l'attribut linkId est son identifiant;
  • condition - définit la condition d'apparition, dans notre cas, uniquement sur les pages.

Ajoutez la ligne à diff-page.properties:
diff.page.menu.name=Diff page

Si vous avez besoin d'une prise en charge de la traduction, nous créerons des propriétés supplémentaires, par exemple, pour la localisation en russe, le fichier sera appelé diff-page_ru_RU.properties.

Exécutez le maven package . Le plugin redémarrera automatiquement et notre élément de menu apparaîtra.



Fenêtre modale


Il est pratique d'utiliser une fenêtre modale pour sélectionner une page. Continuez à modifier atlassian-plugin.xml

Ajoutez quelques ressources:

 <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> 

Où:

  • balise de dépendance - dépendance;
  • les attributs de ressource indiquent le type de ressource, le nom et l'emplacement sur le système de fichiers;
  • balise de contexte - détermine la visibilité en fonction du contexte.

Définissez les gestionnaires de nos 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> 

Où:

  • attribut name de la balise action - définit le nom du lien, et class - la classe java pour le traiter;
  • résultat de la balise - contient un lien vers le modèle, dans notre cas, la vitesse.

Créez un nouveau package com.kshch.confluence.plugins.diff.page.action et ajoutez-y la classe DiffPagePopupAction, qui étend ConfluenceActionSupport avec 2 champs.

 private String spaceKey; private Long sourcePageId; 

Nous générons des getters et setters pour eux. Le champ spaceKey contiendra la clé de l'espace actuel et le sourcePageId contiendra l'identifiant de la page actuelle.

Allons au front. Pour créer une fenêtre contextuelle , utilisez l'élément dialog2 du framework AUI .

Nous ajoutons un formulaire, un bouton de soumission et des entrées avec les classes css autocomplete-space et autocomplete-page à la boîte de dialogue, ce qui nous permet d'organiser le choix de l'espace et de la page sans efforts supplémentaires. Enregistrez le résultat dans /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> 

Pour afficher la fenêtre, créez /js/diff-page-popup.js dans les ressources avec le contenu suivant:

 (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.$); 

Sa tâche est de remplacer l'événement de clic standard et de nous montrer une fenêtre pop-up, plutôt que de parcourir le lien.

Exécutez le maven package et essayez de sélectionner la page et l'espace. L'info-bulle est activée après un ensemble de 2 caractères.



Fonctionnalité principale


Nous procédons à la mise en œuvre de la fonctionnalité de base. Ajoutez au package com.kshch.confluence.plugins.diff.page.action une autre classe DiffPageAction qui étend ConfluenceActionSupport et implémente l'interface PageAware avec les champs suivants.

 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; 

Où:

  • sourcePageId - id de la page source;
  • destinationPageId - id de la page comparée;
  • spaceKey - touche espace;
  • destinationPageName - nom de la page comparée;
  • sourcePageTitle - le titre de la page source;
  • destinationPageTitle - en-tête de la page comparée;
  • diff est le résultat de la comparaison.

Nous générons des getters et des setters, implémentons toutes les méthodes sauf getPage, comme l'EDI le propose par défaut. Les champs sourcePageId, spaceKey et destinationPageName contiendront les données provenant du formulaire dans dialog2.

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

Nous redéfinissons la méthode d'exécution à la nôtre. C'est en elle que se conclut la logique principale du plugin.

 @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(); } 

Il reste à implémenter la comparaison frontend de 2 pages. C'est beaucoup plus simple qu'une popup.

Créez dans les ressources /templates/diff-page.vm. En plus de la mise en page, nous implémentons le contrôle d'erreur le plus 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 

L'écriture du plugin est terminée. Encore une fois, exécutez le maven package , sélectionnez la page et profitez du résultat.



Le code de projet complet est disponible sur GitHub .

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


All Articles