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:
100
DevResources/full-examples/bdgt06/view/frm/bdgt-0601010.frml
Normal file
100
DevResources/full-examples/bdgt06/view/frm/bdgt-0601010.frml
Normal file
@@ -0,0 +1,100 @@
|
||||
<?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-MASTER">
|
||||
<SCHEMA>APP</SCHEMA>
|
||||
<TABLENAME>PROJECTS</TABLENAME>
|
||||
<KEYFIELDS>PROJ_ID</KEYFIELDS>
|
||||
<SQL>
|
||||
<SELECT>
|
||||
SELECT PROJ_YEAR
|
||||
, STM_CODE
|
||||
, STM_NAME
|
||||
, FLOW_TYPE
|
||||
, FLOW_TYPE_DESC
|
||||
, PROJ_SEQ
|
||||
, FLOW_STATE
|
||||
, JDTOTT(SYSDATE - (DBMS_RANDOM.VALUE(3, 10))) STATE_DATE
|
||||
, CAST(DBMS_RANDOM.VALUE(50, 80) AS INTEGER) PROJ_COUNT
|
||||
, CAST(DBMS_RANDOM.VALUE(20,45) AS INTEGER) PROJ_ALLOW
|
||||
</SELECT>
|
||||
<FROM>
|
||||
FROM (SELECT DISTINCT :PROJ_YEAR PROJ_YEAR
|
||||
, PROJ.STM_CODE STM_CODE
|
||||
, BUD.GET_SECTION(PROJ.STM_CODE) STM_NAME
|
||||
, FTYP.RFC_CODE FLOW_TYPE
|
||||
, FTYP.RFC_DESC FLOW_TYPE_DESC
|
||||
, FTYP.RFC_ORDER PROJ_SEQ
|
||||
, BGT.FLOW_STATE('STEP-02') FLOW_STATE
|
||||
FROM REFER_CODE FTYP
|
||||
INNER JOIN REFER_CODE PTYPE ON PTYPE.RFG_GRP = 'PROJ-TYPE' AND PTYPE.RFC_FLAG = FTYP.RFC_CODE
|
||||
INNER JOIN PROJECTS PROJ ON PROJ.PROJ_TYPE = PTYPE.RFC_CODE
|
||||
WHERE FTYP.RFG_GRP = 'FLOW-TYPE' AND FTYP.RFC_CODE = 'GENERAL' AND PROJ.PROJ_YEAR = :PROJ_YEAR
|
||||
ORDER BY STM_NAME) QR1
|
||||
</FROM>
|
||||
<ORDER>ORDER BY STM_NAME</ORDER>
|
||||
</SQL>
|
||||
</DATASET>
|
||||
</DATASETS>
|
||||
|
||||
<FORM>
|
||||
<FORM_BROWSE DATAID="DS-MASTER">
|
||||
<HEADER NAVI="N" EDIT="N" ADD="N" DELETE="N" VIEW="N"/>
|
||||
<PAGESIZE>0</PAGESIZE>
|
||||
<FIELDS>
|
||||
<FIELD NAME="$itemno" LABEL="no" ALIGN="right" WIDTH="5em"/>
|
||||
<FIELD NAME="STM_NAME" LABEL="props.stm_name" ALIGN="left" WIDTH="20em">
|
||||
<DATA-FORMATTER>
|
||||
<![CDATA[(value,row,idx)=>{return $(`<div class="col-24 text-nowrap"><div class="col offset-${+(row.node_level)-1}">${value}</div></div>`);}]]>
|
||||
</DATA-FORMATTER>
|
||||
</FIELD>
|
||||
<FIELD NAME="FLOW_TYPE_DESC" LABEL="props.type" ALIGN="left">
|
||||
<DATA-FORMATTER>
|
||||
<![CDATA[(value,row,idx)=>{return $(`<div class="col-24 row"><div class="col offset-${+(row.node_level)-1}">${value}</div></div>`);}]]>
|
||||
</DATA-FORMATTER>
|
||||
</FIELD>
|
||||
<FIELD NAME="PROJ_COUNT" LABEL="project.count" ALIGN="right" WIDTH="5em"/>
|
||||
<FIELD NAME="PROJ_ALLOW" LABEL="project.allow" ALIGN="right" WIDTH="5em"/>
|
||||
<FIELD NAME="PROJ_NOT_ALLOW" LABEL="project.not_allow" ALIGN="right" WIDTH="5em">
|
||||
<DATA-FORMATTER>
|
||||
<![CDATA[(value,row,idx)=>{return (+row.proj_count)-(+row.proj_allow); }]]>
|
||||
</DATA-FORMATTER>
|
||||
</FIELD>
|
||||
<COMMAND-BUTTONS>
|
||||
<BUTTON NAME="btnEditor" CLASS="btn btn-warning btn-editor" ICON-CLASS="fa fa-edit white">
|
||||
<EVENT ON="click"><![CDATA[
|
||||
({ev,row})=>{
|
||||
console.log(row);
|
||||
row.pageTitle = $$("h4.page-title").html();
|
||||
$PageCtx.saveSessionData("general", row);
|
||||
$PageCtx.saveStorageData("general#search", {proj_year: row.proj_year, stm_code : row.stm_code});
|
||||
$WebNavi.goto("/bdgt06/bgt0601010-general");
|
||||
}
|
||||
]]></EVENT>
|
||||
</BUTTON>
|
||||
<BUTTON NAME="btnViewer" CLASS="btn btn-primary btn-viewer" ICON-CLASS="fa fa-file-alt white">
|
||||
<EVENT ON="click"><![CDATA[({ev,row})=>{ console.log(row);}]]></EVENT>
|
||||
</BUTTON>
|
||||
</COMMAND-BUTTONS>
|
||||
</FIELDS>
|
||||
<FILTERS AUTO-APPLY="Y" ALLOW-NO-FILTER="Y">
|
||||
<FIELDS>
|
||||
<FIELD NAME="PROJ_YEAR" CAPTION="project.year" INPUTTYPE="COMBOBOX" SEARCH-ORIGIN="PROJ_YEAR=${VALUE}">
|
||||
<LIST-OPTION TABLE="VL_YEAR" TEXT="#DV_YEAR" VALUE="DV_YEAR" ORDER="DV_YEAR" FIRSTLIST="@{NONE}"/>
|
||||
</FIELD>
|
||||
<FIELD NAME="STM_CODE" CAPTION="props.stm_name" INPUTTYPE="COMBOBOX" SEARCH-ORIGIN="STM_CODE=${VALUE}">
|
||||
<LIST-OPTION TABLE="BUD.SECTION_M" TEXT="#STM_NAME" VALUE="STM_CODE" ORDER="STM_NAME" FIRSTLIST=""/>
|
||||
</FIELD>
|
||||
</FIELDS>
|
||||
<LAYOUT>
|
||||
<ROW>
|
||||
<FIELD NAME="PROJ_YEAR" VAL_WIDTH="6" CAPT_WIDTH="12" LAYOUT_WIDTH="12"/>
|
||||
</ROW>
|
||||
<ROW>
|
||||
<FIELD NAME="STM_CODE" VAL_WIDTH="12" CAPT_WIDTH="6" LAYOUT_WIDTH="24"/>
|
||||
</ROW>
|
||||
</LAYOUT>
|
||||
</FILTERS>
|
||||
</FORM_BROWSE>
|
||||
</FORM>
|
||||
</FORMS>
|
||||
Reference in New Issue
Block a user