ページを比較します。 Atlassian Confluenceのシンプルなプラグイン

Atlassian Confluenceには優れたページバージョン比較機能があります。 使用するのは便利ですが、変更の履歴を超えることはできません。 どうする? Marketplaceで完成したプラグインを検索しても結果は得られず、独自のプラグインを作成することになりました。

ツール


必要なもの:


プロジェクトを作成する


SDKをインストールし、 atlas-create-confluence-pluginスクリプトを実行します。

以下を入力してください:


SDKのmavenと依存関係を使用してビルドできますが、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> 

IDEで結果のプロジェクトを開き、デバッグモードconfluence:debug Confluenceを実行しますconfluence:debug



http:// localhost:1990 / confluence /でローカルインストールの動作を確認します。 ログイン管理者、パスワード管理者。 データベースはすでにデモスペースといくつかの記事を作成しています。

少しの機能


メニューから始めましょう。 web-itemモジュールを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> 

どこで:


diff-page.propertiesに次の行を追加します。
diff.page.menu.name=Diff page

翻訳のサポートが必要な場合は、追加のプロパティを作成します。たとえば、ロシア語のローカライズの場合、ファイルはdiff-page_ru_RU.propertiesと呼ばれます。

maven package実行しmaven package 。 プラグインは自動的にリロードされ、メニュー項目が表示されます。



モーダルウィンドウ


モーダルウィンドウを使用してページを選択すると便利です。 atlassian-plugin.xmlの編集を続けます

リソースを追加します。

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

どこで:


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> 

どこで:


新しいパッケージcom.kshch.confluence.plugins.diff.page.actionを作成し、それにDiffPagePopupActionクラスを追加します。これにより、ConfluenceActionSupportが2つのフィールドで拡張されます。

 private String spaceKey; private Long sourcePageId; 

ゲッターとセッターを生成します。 spaceKeyフィールドには現在のスペースのキーが含まれ、sourcePageIdには現在のページのIDが含まれます。

前に行きましょう。 ポップアップウィンドウを作成するには、 AUIフレームワークのdialog2要素を使用します。

ダイアログにフォーム、送信ボタン、CSSクラスのオートコンプリートスペースおよびオートコンプリートページを使用して入力を追加します。これにより、追加の作業なしでスペースとページの選択を整理できます。 結果を/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> 

ウィンドウを表示するには、リソースに/js/diff-page-popup.jsを次の内容で作成します。

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

そのタスクは、リンクをクリックするのではなく、標準のクリックイベントをオーバーライドし、ポップアップウィンドウを表示することです。

maven packageを実行し、ページとスペースを選択してください。 ツールチップは、2文字のセットの後にアクティブになります。



主な機能


基本機能の実装に進みます。 com.kshch.confluence.plugins.diff.page.actionパッケージに、ConfluenceActionSupportを拡張し、次のフィールドを持つPageAwareインターフェースを実装する別のDiffPageActionクラスを追加します。

 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; 

どこで:


IDEがデフォルトで提供するように、ゲッターとセッターを生成し、getPageを除くすべてのメソッドを実装します。 sourcePageId、spaceKey、およびdestinationPageNameの各フィールドには、dialog2内のフォームからのデータが含まれます。

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

executeメソッドを独自に再定義します。 プラグインのメインロジックが終了するのはその中です。

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

2ページのフロントエンド比較を実装するために残ります。 ポップアップよりもはるかに簡単です。

リソース/templates/diff-page.vmに作成します。 レイアウトに加えて、最も単純なエラーチェックを実装しています。

 #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 

プラグインの作成が完了しました。 もう一度、 maven package実行し、ページを選択して結果を楽しんでください。



完全なプロジェクトコードはGitHubで入手できます

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


All Articles