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>

一切正常,但有一个副作用是我很难找到。在前面的代码中,我用“问题”注释标记了两行。由于某种原因,JS 数组推送操作使宏图标和标题(在页面编辑对话框中)损坏。图标恢复为默认的页面外观图标,并且标题包含历史参数的内容。损坏的宏看起来像: 图像←损坏的宏图标和标题

如果我注释掉 push() 操作,图标和标题是正确的(当然,历史不会被修改)。然后宏看起来像: 图像←正确的宏

我已经介入调试器并确认宏元数据仍然完好无损。(即图标设置仍然指向正确的文件,并且标题说明了我的期望)。我确定我缺少一个步骤,或者我没有设置一个标志(“我更改了表单中的某些内容……”),但文档就是它的样子……</p>

如果重要的话,我会在 Confluence 7.4.11 下构建这些宏。

社区有什么想法吗?

4

0 回答 0