我为 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 下构建这些宏。
社区有什么想法吗?