- 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.
260 lines
9.1 KiB
XML
260 lines
9.1 KiB
XML
<?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-MASTER">
|
|
<SCHEMA>APP</SCHEMA>
|
|
<TABLENAME>PROPS_PROJECTS</TABLENAME>
|
|
<KEYFIELDS>PROP_ID</KEYFIELDS>
|
|
<SQL>
|
|
<SELECT>SELECT PPROJ.PROP_ID
|
|
, PROJ.PROJ_ID
|
|
, PROJ.PROJ_TYPE
|
|
, PROJ.PROJ_YEAR
|
|
, PROJ.PJM_CODE
|
|
, PROJ.STM_CODE
|
|
, PROJ.BTM_CODE
|
|
, PROJ.ACM_CODE
|
|
, BUD.GET_ACTIVITY(PROJ.ACM_CODE) ACM_NAME
|
|
, PROJ.PLAN_TYPE
|
|
, PROJ.PROJ_DURATION
|
|
, PROJ.PROJ_START_YEAR
|
|
, PROJ.PROJ_END_YEAR
|
|
, PROJ.PROJ_FOR_STAFF
|
|
, PROJ.PROJ_FROM_YEAR
|
|
, VPSTT.PROJ_ORDER
|
|
, VPSTT.FLOW_LEVEL
|
|
, 0 BDGT_TOTAL
|
|
</SELECT>
|
|
<FROM>FROM PROPS_PROJECTS PROJ
|
|
INNER JOIN PROPOSALS_PROJECTS PPROJ ON PROJ.PROJ_ID=PPROJ.PROJ_ID
|
|
INNER JOIN V_PROJECT_STATE VPSTT ON VPSTT.PROJ_ID=PPROJ.PROJ_ID
|
|
</FROM>
|
|
<FILTER>WHERE PPROJ.PROP_ID = :PROP_ID</FILTER>
|
|
<ORDER>ORDER BY VPSTT.PROJ_ORDER</ORDER>
|
|
</SQL>
|
|
<FIELDS>
|
|
<FIELD NAME="PROJ_ID" TYPE="TEXT" LABEL="รหัสอ้างอิงโครงการ" WIDTH="32"/>
|
|
<FIELD NAME="PROJ_TYPE" TYPE="TEXT" LABEL="ประเภทโครงการ" WIDTH="25"/>
|
|
<FIELD NAME="PROJ_YEAR" TYPE="NUMBER" LABEL="ปีงบประมาณ" WIDTH="15"/>
|
|
<FIELD NAME="PJM_CODE" TYPE="TEXT" LABEL="รหัสโครงการ (BUD)" WIDTH="20"/>
|
|
<FIELD NAME="STM_CODE" TYPE="TEXT" LABEL="รหัสหน่วยงาน" WIDTH="10"/>
|
|
<FIELD NAME="BTM_CODE" TYPE="TEXT" LABEL="รหัสประเภทงบประมาณ" WIDTH="10"/>
|
|
<FIELD NAME="ACM_CODE" TYPE="TEXT" LABEL="รหัสกิจกรรม" WIDTH="20"/>
|
|
<FIELD NAME="PLAN_TYPE" TYPE="TEXT" LABEL="ประเภทแผน" WIDTH="15"/>
|
|
<FIELD NAME="PROJ_DURATION" TYPE="NUMBER" LABEL="ระยะเวลาดำเนินการ (วัน)" WIDTH="15"/>
|
|
<FIELD NAME="PROJ_START_YEAR" TYPE="NUMBER" LABEL="ปีที่เริ่มโครงการ (ก่อสร้าง)" WIDTH="15"/>
|
|
<FIELD NAME="PROJ_END_YEAR" TYPE="NUMBER" LABEL="ปีที่สิ้นสุดโครงการ (ก่อสร้าง)" WIDTH="15"/>
|
|
<FIELD NAME="PROJ_FOR_STAFF" TYPE="NUMBER" LABEL="จำนวนบุคลากรที่รองรับ" WIDTH="15"/>
|
|
|
|
<FIELD NAME="PROJ_FROM_YEAR" TYPE="NUMBER" LABEL="ต่อเนื่องจากปี" WIDTH="15"/>
|
|
</FIELDS>
|
|
<SUBDATASETS>
|
|
<SUBDATASET NAME="ACTIVITIES" DATASET-ID="DS-ACTIVITY-TREE" LINK-FIELDS="PROJ_ID"/>
|
|
</SUBDATASETS>
|
|
</DATASET>
|
|
<DATASET ID="DS-ACTIVITY-TREE">
|
|
<SCHEMA>APP</SCHEMA>
|
|
<TABLENAME>V_ACTIVITY_TREE</TABLENAME>
|
|
<SQL>
|
|
<SELECT>
|
|
SELECT PACT.PROJ_ID
|
|
, PACT.PROJ_YEAR
|
|
, PACT.PROJ_TYPE
|
|
, PACT.PROJ_GROUP
|
|
, ACTT.ACM_CODE
|
|
, ACTT.ACM_NAME
|
|
, ACTT.ACM_SEQ
|
|
, ACTT.NODE_LEVEL+1 NODE_LEVEL
|
|
, ACTT.MAIN_NODE
|
|
, ACTT.ACM_UNIT
|
|
, ACTT.ACM_START_YEAR
|
|
, ACTT.ACM_END_YEAR
|
|
, ACTT.NODE_TYPE
|
|
, PACT.BDGT_COUNT
|
|
, PACT.BDGT_TOTAL
|
|
</SELECT>
|
|
<FROM>
|
|
FROM BGT.V_ACTIVITY_TREE ACTT
|
|
INNER JOIN (SELECT DISTINCT ACM.ACM_CODE
|
|
FROM BUD.ACTIVITY_M ACM
|
|
INNER JOIN BUD.ACTIVITY_CTRL_H ACH ON ACM.ACM_CODE = ACH.ACH_CODE
|
|
START WITH ACM.ACM_CODE IN (SELECT ACM_CODE FROM V_PROJECT_ACTIVITY PACT WHERE PACT.PROJ_ID = :PROJ_ID)
|
|
CONNECT BY PRIOR ACH.ACH_CTRL_CODE = ACH.ACH_CODE) FLTR ON FLTR.ACM_CODE = ACTT.ACM_CODE
|
|
LEFT OUTER JOIN V_PROJECT_ACTIVITY PACT ON PACT.ACM_CODE = ACTT.ACM_CODE AND PACT.PROJ_ID = :PROJ_ID
|
|
</FROM>
|
|
<ORDER>
|
|
ORDER BY ACTT.ACM_SEQ
|
|
</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="ACM_CODE" LABEL="project.const_code" ALIGN="left">
|
|
<DATA-FORMATTER>
|
|
<![CDATA[(value,row,idx)=>{return $(`<div class="col-24 row text-nowrap"><div class="col offset-${+(row.node_level)-1}">${value}</div></div>`);}]]>
|
|
</DATA-FORMATTER>
|
|
</FIELD>
|
|
<FIELD NAME="ACM_NAME" LABEL="project.const_name" ALIGN="left">
|
|
<DATA-FORMATTER>
|
|
<![CDATA[(value,row,idx)=>{return $(`<div class="col-24 row text-nowrap"><div class="col offset-${+(row.node_level)-1}">${value}</div></div>`);}]]>
|
|
</DATA-FORMATTER>
|
|
</FIELD>
|
|
<FIELD NAME="BDGT_COUNT" LABEL="pbdg.acm_count" ALIGN="right" WIDTH="10em">
|
|
<DATA-FORMATTER>
|
|
<![CDATA[(value, row, idx) => {
|
|
if (row["node_type"] === "D") {
|
|
return `<div class="col-24 text-nowrap">${formatNumber(value,"#,##0")} ${row["acm_unit"]}</div>`;
|
|
} else {
|
|
return ""
|
|
}
|
|
}]]>
|
|
</DATA-FORMATTER>
|
|
</FIELD>
|
|
<FIELD NAME="BDGT_TOTAL" LABEL="project.bgt_amount" ALIGN="right" WIDTH="10em"/>
|
|
|
|
<COMMAND-BUTTONS>
|
|
<BUTTON NAME="btnTracking" CLASS="btn btn-primary btn-tracking" ICON-CLASS="bi bi-distribute-vertical white">
|
|
<FILTER><![CDATA[({$ctx,row})=>{return ["D"].includes(row["node_type"]);}]]></FILTER>
|
|
<EVENT ON="click"><![CDATA[
|
|
({ev, row}) => {
|
|
console.log(row);
|
|
$PageCtx.saveSessionData("general", row);
|
|
$PageCtx.saveStorageData("general#search", {PROP_ID: row.prop_id});
|
|
let $data = {proj_id : row.proj_id,type : row.proj_type,acm_code : row.acm_code,}
|
|
$WebNavi.goto("/bdgt05/bgt0501010-general?data="+SdkXUtils.jsonBase64($data));
|
|
}
|
|
]]></EVENT>
|
|
</BUTTON>
|
|
</COMMAND-BUTTONS>
|
|
</FIELDS>
|
|
<FILTERS AUTO-APPLY="N" ALLOW-NO-FILTER="Y">
|
|
<FIELDS>
|
|
<FIELD NAME="PROP_YEAR" CAPTION="project.year" INPUTTYPE="TEXT" READONLY="Y"/>
|
|
</FIELDS>
|
|
<LAYOUT>
|
|
<ROW>
|
|
<FIELD NAME="PROP_YEAR" LAYOUT_WIDTH="12" VAL_WIDTH="5" CAPT_WIDTH="14"/>
|
|
</ROW>
|
|
</LAYOUT>
|
|
</FILTERS>
|
|
<FOOTER SHOW="Y"/>
|
|
<BUTTONS>
|
|
<BUTTON NAME="btnRevise" CAPTION="send||send.revise" CLASS="btn btn-outline-warning" SECTION="RIGHT"/>
|
|
<BUTTON NAME="btnSend" CAPTION="" CLASS="btn btn-warning" SECTION="RIGHT"/>
|
|
</BUTTONS>
|
|
<SCRIPT>
|
|
<EVENTS>
|
|
<AFTER-LOAD>
|
|
<![CDATA[
|
|
({$ctx,data})=>{
|
|
let src = [...data]; // clone data to src
|
|
data.splice(0); // clear data element
|
|
|
|
let id = 1;
|
|
let lastItem = {};
|
|
let itemCount = 0;
|
|
let projType = "";
|
|
for (let item of src) {
|
|
item["node_type"] = "P";
|
|
item["node_level"] = "0";
|
|
if (item["node_type"] === "P") {
|
|
projType = ProjType.$(item["proj_type"]);
|
|
}
|
|
if (lastItem["node_type"] !== "P") {
|
|
id = 1;
|
|
item["$itemno"] = "";
|
|
item["acm_code"] = "";
|
|
item["acm_name"] = "";
|
|
item["projType"] = projType;
|
|
data.push(item);
|
|
}
|
|
lastItem = item;
|
|
if (isArray(item.activities)) {
|
|
for (let sitem of item.activities) {
|
|
sitem["$itemno"] = id++;
|
|
sitem["projType"] = projType;
|
|
data.push(sitem);
|
|
lastItem = sitem;
|
|
itemCount++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]]>
|
|
</AFTER-LOAD>
|
|
</EVENTS>
|
|
|
|
<INITIALIZE>
|
|
<![CDATA[
|
|
{
|
|
// console.log("init activity grid");
|
|
const fieldFormat = (value,row) => {
|
|
let projType = row.projType;
|
|
if (row["node_type"] === "P" || projType.is(ProjType.RUTN)) {
|
|
return "";
|
|
}
|
|
return formatNumber(value, 0);
|
|
}
|
|
const summary = (field, data) => {
|
|
let total = 0;
|
|
for (let id=0; id < data.length; id++) {
|
|
let row = data[id];
|
|
if (row["node_type"] === "D") {
|
|
total += (+row[field]) || 0;
|
|
}
|
|
}
|
|
if ($PageCtx.$dataGrid.load && !$PageCtx.$dataGrid.reload) {
|
|
$PageCtx.$dataGrid.reload = true;
|
|
for (let id=data.length-1; id>=0; id--) {
|
|
let row = data[id];
|
|
if (row["node_type"] === "C") {
|
|
let grpTotal = 0;
|
|
let mainNode = row["acm_code"];
|
|
let nodes = [];
|
|
nodes.push($$("main_node="+mainNode,data));
|
|
for (let node of nodes.flat()) {
|
|
grpTotal += +node[field];
|
|
}
|
|
data[id][field] = grpTotal;
|
|
}
|
|
}
|
|
$PageCtx.$dataGrid.load(data);
|
|
$PageCtx.$dataGrid.reload = false;
|
|
}
|
|
return formatNumber(total, 0);
|
|
}
|
|
|
|
const $ctx = $PageCtx;
|
|
const gridFields = [$$("field=bdgt_total", $ctx.gridColumn.flat())].flat();
|
|
for (let field of gridFields) {
|
|
field.formatter = fieldFormat;
|
|
field.footerFormatter = function (data) {
|
|
return summary(this.field, data);
|
|
}
|
|
}
|
|
|
|
$ctx.rowStyle = function (row, index) {
|
|
if (row["node_type"] === "C") {
|
|
return {classes : `group-level-${row["node_level"]}`};
|
|
}
|
|
if (row["node_type"] === "P") {
|
|
return {classes : `group-level-0`};
|
|
}
|
|
return {}; // Default style for other rows
|
|
}
|
|
}
|
|
]]>
|
|
</INITIALIZE>
|
|
</SCRIPT>
|
|
|
|
|
|
</FORM_BROWSE>
|
|
</FORM>
|
|
</FORMS>
|