feat: implement advanced bidirectional field referencing and cross-module path resolution
- Core Logic Enhancements:
- Implement bidirectional field referencing between <FIELDS>, <LAYOUT>, and <TITLES> tags in .frml files, enabling seamless navigation from definitions to usages and vice versa.
- Add robust support for AJAX-OPTION field mapping:
- SRC attribute: Links to field definitions within defs/ajax.xml datasets.
- TARGET attribute: Links to local field definitions within the same form.
- Implement global grid resolution: GRID-ID now searches across the current file and all recursively included files (<INCLUDE>).
- Enhance deep recursive search for fields/sections within nested tags like <SECTION>, <ROW>, and <FIELD-LIST>.
- Path Resolution & Helpers (DynFormPathUtils):
- Added support for module-relative paths starting with # (mapping to view/frm/).
- Added support for cross-module paths starting with / (mapping to WEB-INF/app/module/{module}/view/frm/).
- Implemented auto-correction for common keyboard typos (Thai 'ิ' instead of /).
- Added specialized helpers for locating ajax.xml and included files within the framework's structure.
- Smart Completion Enhancements:
- Added context-aware completion for TARGET and SRC fields in AJAX update-fields.
- Enabled global GRID-ID completion by scanning all included resources.
- Improved dataset completion to include both local and AJAX-defined datasets.
- Test Resources:
- Added a comprehensive set of real-world examples (bdgt04, bdgt05, bdgt06) in DevResources/full-examples/ to validate complex cross-module and master-detail scenarios.
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<FORMS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/#dynf_form_def.xsd">
|
||||
<DATASETS>
|
||||
<DATASET ID="DS-PROJECT-STTGYS-ITEMS">
|
||||
<SCHEMA>APP</SCHEMA>
|
||||
<TABLENAME>PROJECT_STTGYS_ITEMS</TABLENAME>
|
||||
<KEYFIELDS>PROJ_ID,PSTG_CODE,PSTI_GROUP</KEYFIELDS>
|
||||
<SQL>
|
||||
<SELECT>
|
||||
SELECT PSTI.PROJ_ID
|
||||
, PSTI.PSTG_CODE
|
||||
, PSTI.PSTI_GROUP
|
||||
, RFGP.RFC_DESC GROUP_DESC
|
||||
, PSTI.PSTI_CODE
|
||||
, RFCI.RFC_DESC ITEM_DESC
|
||||
, PSTI_DETAIL
|
||||
</SELECT>
|
||||
<FROM>FROM PROJECT_STTGYS_ITEMS PSTI
|
||||
INNER JOIN BGT.REFER_CODE RFGP ON RFGP.RFG_GRP='STG-ITEMS' AND RFC.RFC_CODE=STTG.PSTI_CODE
|
||||
INNER JOIN BGT.REFER_CODE RFCI ON RFC.RFG_GRP=PSTI.PSTI_GROUP AND RFC.RFC_CODE=STTG.PSTI_CODE
|
||||
</FROM>
|
||||
<ORDER>ORDER BY PSTI_GROUP, PSTI_CODE</ORDER>
|
||||
</SQL>
|
||||
<FIELDS>
|
||||
<FIELD NAME="PROJ_ID" TYPE="VARCHAR" WIDTH="50" LABEL="project.id" />
|
||||
<FIELD NAME="PSTG_CODE" TYPE="VARCHAR" WIDTH="20" LABEL="pstg.code" />
|
||||
<FIELD NAME="PSTI_GROUP" TYPE="VARCHAR" WIDTH="15" LABEL="psti.group" />
|
||||
<FIELD NAME="PSTI_CODE" TYPE="VARCHAR" WIDTH="15" LABEL="psti.code" />
|
||||
<FIELD NAME="PSTI_DETAIL" TYPE="VARCHAR" WIDTH="250" LABEL="psti.detail" />
|
||||
<FIELD NAME="CREATE_BY" TYPE="VARCHAR" WIDTH="50" LABEL="sys.create_by" />
|
||||
<FIELD NAME="CREATE_TIME" TYPE="DATE" WIDTH="0" LABEL="sys.create_time" />
|
||||
<FIELD NAME="UPDATE_BY" TYPE="VARCHAR" WIDTH="50" LABEL="sys.update_by" />
|
||||
<FIELD NAME="UPDATE_TIME" TYPE="DATE" WIDTH="0" LABEL="sys.update_time" />
|
||||
</FIELDS>
|
||||
</DATASET>
|
||||
</DATASETS>
|
||||
|
||||
<DATA-GRIDS>
|
||||
<DATA-GRID ID="GRID-PROJECT-STTGYS-ITEMS">
|
||||
<MASTER-DATA DATASET-ID="DS-PROJECT-STTGYS" MASTER-FIELDS="PROJ_ID,PSTG_CODE" DETAIL-FIELDS="PROJ_ID,PSTG_CODE"/>
|
||||
<UNIQ-CHECK CHECK-FIELDS="PSTI_GROUP" MESSAGE="psti.group duplicate !"></UNIQ-CHECK>
|
||||
<GRID-LIST DATAID="DS-PROJECT-STTGYS-ITEMS" EDIT="Y" DELETE="Y" ADD="Y">
|
||||
<FIELDS>
|
||||
<FIELD NAME="$itemno" LABEL="no" ALIGN="right" WIDTH="5em"/>
|
||||
<FIELD NAME="GROUP_DESC" LABEL="psti.group" WIDTH="10em" ALIGN="left" />
|
||||
<FIELD NAME="ITEM_DESC" LABEL="psti.code" ALIGN="left" />
|
||||
</FIELDS>
|
||||
</GRID-LIST>
|
||||
<GRID-EDITOR DATAID="DS-PROJECT-STTGYS-ITEMS">
|
||||
<FIELDS>
|
||||
<FIELD NAME="PROJ_ID" INPUTTYPE="HIDDEN" />
|
||||
<FIELD NAME="PSTG_CODE" INPUTTYPE="HIDDEN" />
|
||||
<FIELD NAME="GROUP_DESC" INPUTTYPE="HIDDEN" />
|
||||
<FIELD NAME="ITEM_DESC" INPUTTYPE="HIDDEN" />
|
||||
<FIELD NAME="PSTI_GROUP" CAPTION="psti.group" INPUTTYPE="COMBOBOX" REQUIRE="Y" EDIT-READONLY="Y">
|
||||
<AJAX-OPTION URL="/api-data.jbx" DATASET="DS-STTGY-GROUP-02" VALUE-FIELD="RFC_CODE" TEXT-FIELD="RFC_DESC" PARAMETERS="RFG_GRP=PSTI_GROUP" CHILD-FIELD="PSTI_CODE" ON-EMPTY="LOAD-ALL">
|
||||
<UPDATE-FIELDS>
|
||||
<FIELD TARGET="GROUP_DESC" SRC="RFC_DESC"/>
|
||||
</UPDATE-FIELDS>
|
||||
</AJAX-OPTION>
|
||||
</FIELD>
|
||||
<FIELD NAME="PSTI_CODE" CAPTION="psti.code" INPUTTYPE="COMBOBOX" REQUIRE="Y">
|
||||
<AJAX-OPTION URL="/api-data.jbx" DATASET="DS-STTGY-ITEMS-02" VALUE-FIELD="RFC_CODE" TEXT-FIELD="RFC_DESC" PARAMETERS="RFG_GRP=PSTI_GROUP">
|
||||
<UPDATE-FIELDS>
|
||||
<FIELD TARGET="ITEM_DESC" SRC="RFC_DESC"/>
|
||||
</UPDATE-FIELDS>
|
||||
</AJAX-OPTION>
|
||||
</FIELD>
|
||||
<FIELD NAME="PSTI_DETAIL" CAPTION="psti.detail" INPUTTYPE="TEXTAREA" ROWS="3" />
|
||||
</FIELDS>
|
||||
<LAYOUT CLASS="block-layout-form">
|
||||
<ROW>
|
||||
<FIELD NAME="PSTI_GROUP" LAYOUT_WIDTH="6"/>
|
||||
<FIELD NAME="PSTI_CODE" LAYOUT_WIDTH="18" />
|
||||
</ROW>
|
||||
<ROW>
|
||||
<FIELD NAME="PSTI_DETAIL" LAYOUT_WIDTH="18" OFFSET="6" />
|
||||
</ROW>
|
||||
<ROW TYPE="CONTENT">
|
||||
<![CDATA[<div style="height: 200px"></div>]]>
|
||||
</ROW>
|
||||
</LAYOUT>
|
||||
</GRID-EDITOR>
|
||||
</DATA-GRID>
|
||||
</DATA-GRIDS>
|
||||
</FORMS>
|
||||
Reference in New Issue
Block a user