feat: comprehensive cross-file support and performance optimization (v3.3.0)

- Implemented cross-file completion, references, and validation for .frml files.
- Optimized resource discovery using IntelliJ indexing (ReferencesSearch) to fix IDE freeze.
- Refactored shared search logic into DynFormPathUtils.
- Excluded <ROW> tags from field definition requirements.
- Updated plugin version to 3.3.0.
This commit is contained in:
2026-05-14 18:27:57 +07:00
parent b6dc46d775
commit 431e51079c
35 changed files with 4693 additions and 565 deletions

View File

@@ -0,0 +1,174 @@
<?xml version="1.0" encoding="UTF-8"?>
<FORMS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="dynf/dynf-form-def.xsd">
<DATASETS>
<DATASET ID="DS-PROJECT_BUDGET_ITEMS">
<SCHEMA>APP</SCHEMA>
<TABLENAME>PROJECT_BUDGET_ITEMS</TABLENAME>
<KEYFIELDS>PROJ_ID,BGM_CODE,PBDG_ID</KEYFIELDS>
<SQL>
<SELECT>SELECT PROJ_ID
, PBDG_ID
, BGM_CODE
, BUD.GET_BUDGET (BGM_CODE) BGM_NAME
, PBGI_QT_01
, PBGI_QT_02
, PBGI_QT_03
, PBGI_QT_04
, PBGI_QTY
, PBGI_COST
, PBGI_FREQ
, PBGI_ASSET_TYPE
, PBGI_REPLACE
, PBGI_ADDITION
, PBGI_ACQUIRE
, PBGI_TOTAL
, PBGI_REASON
</SELECT>
<FROM>FROM PROJECT_BUDGET_ITEMS</FROM>
<ORDER>ORDER BY PROJ_ID,BGM_CODE</ORDER>
</SQL>
<FIELDS>
<FIELD NAME="PROJ_ID" TYPE="TEXT" LABEL="รหัสอ้างอิงโครงการ" WIDTH="32"/>
<FIELD NAME="PBDG_ID" TYPE="TEXT" LABEL="รหัสงบประมาณโครงการ" WIDTH="32"/>
<FIELD NAME="BGM_CODE" TYPE="TEXT" LABEL="รหัสหมวดงบประมาณ" WIDTH="20"/>
<FIELD NAME="PBGI_QT_01" TYPE="NUMBER" LABEL="จำนวนไตรมาส 1" WIDTH="15"/>
<FIELD NAME="PBGI_QT_02" TYPE="NUMBER" LABEL="จำนวนไตรมาส 2" WIDTH="15"/>
<FIELD NAME="PBGI_QT_03" TYPE="NUMBER" LABEL="จำนวนไตรมาส 3" WIDTH="15"/>
<FIELD NAME="PBGI_QT_04" TYPE="NUMBER" LABEL="จำนวนไตรมาส 4" WIDTH="15"/>
<FIELD NAME="PBGI_QTY" TYPE="NUMBER" LABEL="จำนวน" WIDTH="10"/>
<FIELD NAME="PBGI_COST" TYPE="NUMBER" LABEL="ราคาต่อหน่วย" WIDTH="15"/>
<FIELD NAME="PBGI_FREQ" TYPE="NUMBER" LABEL="ความถี่/จำนวนครั้ง" WIDTH="10"/>
<FIELD NAME="PBGI_ASSET_TYPE" TYPE="TEXT" LABEL="ประเภทสินทรัพย์" WIDTH="10"/>
<FIELD NAME="PBGI_REPLACE" TYPE="NUMBER" LABEL="ทดแทนของเดิม" WIDTH="10"/>
<FIELD NAME="PBGI_ADDITION" TYPE="NUMBER" LABEL="เพิ่มเติม" WIDTH="10"/>
<FIELD NAME="PBGI_ACQUIRE" TYPE="NUMBER" LABEL="จัดหาใหม่" WIDTH="10"/>
<FIELD NAME="PBGI_TOTAL" TYPE="NUMBER" LABEL="รวมเป็นเงิน" WIDTH="15"/>
<FIELD NAME="PBGI_REASON" TYPE="TEXT" LABEL="เหตุผลความจำเป็น" WIDTH="4000"/>
</FIELDS>
</DATASET>
</DATASETS>
<DATA-GRIDS>
<DATA-GRID ID="GRID-WORK-BUDGET">
<MASTER-DATA DATASET-ID="DS-MASTER" MASTER-FIELDS="PROJ_ID,PBDG_ID" DETAIL-FIELDS="PROJ_ID,PBDG_ID"/>
<UNIQ-CHECK CHECK-FIELDS="BGM_CODE" MESSAGE="pwbg.bgm_code duplicate !"></UNIQ-CHECK>
<GRID-LIST DATAID="DS-PROJECT_BUDGET_ITEMS" EDIT="Y" DELETE="Y" CLASS="table-primary">
<KEYFIELDS>PROJ_ID,BGM_CODE</KEYFIELDS>
<TITLES>
<ROW>
<FIELD NAME="BGM_CODE" LABEL="pwbg.bgm_code" WIDTH="10em" ALIGN="center" ROWS-SPAN="2"/>
<FIELD NAME="BGM_NAME" LABEL="pwbg.bgm_name" ALIGN="left" ROWS-SPAN="2"/>
<FIELD NAME="BGM_QUOTERS" LABEL="pwbg.quoter" ALIGN="center" COLS-SPAN="4"/>
<FIELD NAME="PBGI_TOTAL" LABEL="pwbg.total" WIDTH="6em" ALIGN="right" ROWS-SPAN="2"/>
</ROW>
<ROW>
<FIELD NAME="PBGI_QT_01" LABEL="1" WIDTH="6em" ALIGN="right"/>
<FIELD NAME="PBGI_QT_02" LABEL="2" WIDTH="6em" ALIGN="right"/>
<FIELD NAME="PBGI_QT_03" LABEL="3" WIDTH="6em" ALIGN="right"/>
<FIELD NAME="PBGI_QT_04" LABEL="4" WIDTH="6em" ALIGN="right"/>
</ROW>
</TITLES>
<FIELDS>
<FIELD NAME="BGM_CODE" LABEL="pwbg.bgm_code" WIDTH="15em" ALIGN="center"/>
<FIELD NAME="BGM_NAME" LABEL="pwbg.bgm_name" ALIGN="left"/>
<FIELD NAME="PBGI_QT_01" LABEL="pwbg.quotr_01" WIDTH="5em" ALIGN="right"/>
<FIELD NAME="PBGI_QT_02" LABEL="pwbg.quotr_02" WIDTH="5em" ALIGN="right"/>
<FIELD NAME="PBGI_QT_03" LABEL="pwbg.quotr_03" WIDTH="5em" ALIGN="right"/>
<FIELD NAME="PBGI_QT_04" LABEL="pwbg.quotr_04" WIDTH="5em" ALIGN="right"/>
<FIELD NAME="PBGI_TOTAL" LABEL="pwbg.total" WIDTH="10em" ALIGN="right"/>
</FIELDS>
<FOOTER SHOW="Y"/>
<SCRIPT>
<INITIALIZE>
<![CDATA[
(ctx)=> {
ctx.sumOf = {};
console.log("init grid-budget");
const fieldFormat = (value) => {
return formatNumber(value, 0);
}
const summary = (field, data) => {
let total = 0;
for (const row of data) {
total += (+row[field])||0;
}
ctx.sumOf[field] = total;
return formatNumber(total,0);
}
const quoterFields = $$("field^pbgi_qt_",ctx.gridColumn.flat());
for (let field of quoterFields) {
field.formatter = fieldFormat;
let fieldName = field.field;
field.footerFormatter = (data)=>{
return summary(fieldName,data);
}
}
let fieldName = "pbgi_total";
$$("field=pbgi_total",ctx.gridColumn.flat()).formatter = fieldFormat;
$$("field=pbgi_total",ctx.gridColumn.flat()).footerFormatter = (data)=>{
return summary(fieldName,data);
};
}
]]>
</INITIALIZE>
</SCRIPT>
</GRID-LIST>
<GRID-EDITOR DATAID="DS-PROJECT_BUDGET_ITEMS">
<FIELDS>
<FIELD NAME="PROJ_ID" INPUTTYPE="HIDDEN"/>
<FIELD NAME="PBDG_ID" INPUTTYPE="HIDDEN"/>
<FIELD NAME="BGM_NAME" INPUTTYPE="HIDDEN"/>
<FIELD NAME="VBGM_CODE" CAPTION="pwbg.bgm_code" INPUTTYPE="TEXT" READONLY="Y"/>
<FIELD NAME="BGM_CODE" CAPTION="pwbg.bgm_name" INPUTTYPE="COMBOBOX" REQUIRE="Y" EDIT-READONLY="Y">
<AJAX-OPTION URL="/api-data.jbx" DATASET="DS-BUDGET-01" VALUE-FIELD="BGM_CODE" TEXT-FIELD="BGM_NAME">
<UPDATE-FIELDS>
<FIELD SRC="BGM_CODE" TARGET="VBGM_CODE"></FIELD>
<FIELD SRC="BGM_NAME" TARGET="BGM_NAME"></FIELD>
</UPDATE-FIELDS>
</AJAX-OPTION>
<LIST-OPTION>
<FORMATTER><![CDATA[
(data) => {
console.log("call formater with ", data);
return $(`<div><label>[${data.bgm_code}]</label> : <label>${data.bgm_name}</label></div>`);
}
]]></FORMATTER>
</LIST-OPTION>
</FIELD>
<FIELD NAME="PBGI_QT_01" CAPTION="pwbg.quotr_01" INPUTTYPE="TEXT" DATATYPE="NUMBER" DECIMAL="0"/>
<FIELD NAME="PBGI_QT_02" CAPTION="pwbg.quotr_02" INPUTTYPE="TEXT" DATATYPE="NUMBER" DECIMAL="0"/>
<FIELD NAME="PBGI_QT_03" CAPTION="pwbg.quotr_03" INPUTTYPE="TEXT" DATATYPE="NUMBER" DECIMAL="0"/>
<FIELD NAME="PBGI_QT_04" CAPTION="pwbg.quotr_04" INPUTTYPE="TEXT" DATATYPE="NUMBER" DECIMAL="0"/>
<FIELD NAME="PBGI_TOTAL" CAPTION="pwbg.total" INPUTTYPE="TEXT" DATATYPE="NUMBER" DECIMAL="0" READONLY="Y"/>
</FIELDS>
<LAYOUT CLASS="block-layout-form">
<ROW>
<FIELD NAME="VBGM_CODE" LAYOUT_WIDTH="6"/>
<FIELD NAME="BGM_CODE" LAYOUT_WIDTH="16"/>
</ROW>
<ROW>
<FIELD NAME="PBGI_QT_01" LAYOUT_WIDTH="3" OFFSET="6"/>
<FIELD NAME="PBGI_QT_02" LAYOUT_WIDTH="3"/>
<FIELD NAME="PBGI_QT_03" LAYOUT_WIDTH="3"/>
<FIELD NAME="PBGI_QT_04" LAYOUT_WIDTH="3"/>
<FIELD NAME="PBGI_TOTAL" LAYOUT_WIDTH="3"/>
</ROW>
<ROW TYPE="CONTENT">
<![CDATA[<div style="height: 350px"></div>]]>
</ROW>
</LAYOUT>
<SCRIPT>
<INITIALIZE><![CDATA[
const quoterTotal = ()=>{
$$("PBGI_TOTAL").setValue($$("^PBGI_QT_").sum());
}
$$("^PBGI_QT_").on("change",quoterTotal);
]]></INITIALIZE>
</SCRIPT>
</GRID-EDITOR>
</DATA-GRID>
</DATA-GRIDS>
</FORMS>