0

Confluence Server 用のカスタム マクロを作成しました。これには、マクロの他のパラメーターの履歴を保持する隠しパラメーター フィールドが含まれています。「manipulateMarkup」フックで AJS.MacroBrowser.setMacroJsOverride を使用してこれを実現します。フック コードでは、マクロの編集時に、非表示の履歴パラメーターを新しい設定で修正します。コード スニペット (mymacro.js から):

AJS.MacroBrowser.setMacroJsOverride('my-macro', {
    fields: {
        string: {
            "history": function (params, options) {
                return AJS.MacroBrowser.ParameterFields["_hidden"](params, options);
            }
        }
    },

    // This gets called AFTER the user clicks "Save", but BEFORE new values are retrieved from the form.
    manipulateMarkup: 
        function (metadata) {
            // Original values (from "selectedMacro" settings)
            let oparms, oimpact, oprobability;
            let today = new Date().toISOString().slice(0, 10);
            
            // New values (from the form)
            let impact = AJS.$('#macro-param-impact')[0].value;         
            let probability = AJS.$('#macro-param-probability')[0].value;
            let hist = AJS.$('#macro-param-history');
            
            let record = {"date": today, "impact": impact, "probability": probability};
            
            // Check if we're editing an existing macro, or adding a new one
            if (typeof AJS.MacroBrowser.settings.selectedMacro != 'undefined') {
                // Editing an existing macro. Check to see if probability or impact changed.
                oparms = AJS.MacroBrowser.settings.selectedMacro.params;
                oimpact = oparms["impact"];
                oprobability = oparms["probability"];
                
                if ((oimpact != impact) || (oprobability != probability)) {
                    try {
                        let jobj = JSON.parse(hist[0].value);
                        jobj.push(record);    // <--- PROBLEM: Corrupts macro icon and title text in page edit
                        hist.val( JSON.stringify(jobj) );
                    } catch (e) {
                        console.error(e.name);
                    }
                }
            } else {
                // Creating a new one
                let jobj = JSON.parse("[]");
                jobj.push(record);    // <--- PROBLEM: Corrupts macro icon and title text in page edit
                hist.val( JSON.stringify(jobj) );
            }
    }
});

atlassian-plugin.xml の関連セクション:

    <xhtml-macro key="my-macro" name="my-macro"
        class= ...
        icon="/download/resources/${atlassian.plugin.key}/images/SysEngGroup_Logo.png">
        <category name="content" />
        <parameters>
            <parameter name="identifier" type="string" required="true" >
                <option key="showValueInPlaceholder" value="true" />
            </parameter>
            <parameter name="type" type="enum" required="true" > ... </parameter>
            <parameter name="probability" type="enum" required="true" > ... </parameter>
            <parameter name="impact" type="enum" required="true" > ... </parameter>
            <parameter name="status" type="enum" required="true" > ... </parameter>
            <parameter name="history" type="string" />
        </parameters>
    </xhtml-macro>

すべてが機能しますが、探し出すのに苦労しているという副作用があります。前のコードでは、「問題」コメントで 2 行にラベルを付けました。何らかの理由で、JS 配列のプッシュ操作により、マクロ アイコンとタイトル (ページ編集ダイアログ内) が破損したままになります。アイコンはデフォルトのページのようなアイコンに戻り、タイトルには history パラメータの内容が含まれます。破損したマクロは次のようになります: 画像← 破損したマクロのアイコンとタイトル

push() 操作をコメント アウトすると、アイコンとタイトルは正しくなります (もちろん、履歴は修正されません)。マクロは次のようになります: image ← 正しい見た目のマクロ

デバッガーを使用して、マクロ メタデータがそのままであることを確認しました。(つまり、アイコン設定はまだ正しいファイルを指しており、タイトルは私が期待するものを示しています)。抜けているステップ、または設定していないフラグ (「フォームの何かを変更しました...」) があると確信していますが、ドキュメントはそれが何であるかです...</p>

問題があれば、Confluence 7.4.11 でこれらのマクロを作成しています。

コミュニティから何か考えはありますか?

4

0 に答える 0