2024年9月5日 星期四

V80202F: [列印]鈕 - 子畫面欄位設為必填

目的: V80202F: 子畫面欄位設為必填

處理說明: 1>  setFieldsCls('mySubFormF',
                                            ['sub_PROJID'],  //required
                            );
                   2>setFieldsCls , 必需在 win.show 之後才有作用, 
                       --> 即 field 已 render - .inputEI 已存在 -
                          -  inputEI:  The input Element for this Field. Only available after the field has been rendered.


1>*.js
    //子畫面.id: mySubFormF
    var win = getMyWindow("撿料完成", J_formFields_V80202F, Btns_V80202F,"F");
    //win.onshow = Sub1_onShow(np1);
    win.width = 600;
    win.height =300;    
    //Ext.getCmp("sub_ARPSTS").columns = 3;
    //Ext.getCmp("sub_ARPSTS").vertical = true;
    //Ext.getCmp("sub_AMMSTS").columns = 3;
    //Ext.getCmp("sub_AMMSTS").vertical = true;
    //console.log(" Ext.getCmp(sub_ARPSTS): ", Ext.getCmp("sub_ARPSTS"));    
    win.show();
    //設定必填欄位 , 必需在 win.show 之後, setFieldsCls 才會有作用
    setFieldsCls('mySubFormF',
        ['sub_PROJID'],  //required
    );

2024年9月3日 星期二

V80202 – 設定按鈕 icon

 目的: V80202 – 設定按鈕 icon

處理說明: 1>設定按鈕 icon:
         {
                xtype: 'button', text: '整機抽換紀錄匯出', id: 'Call_V80202I_Btn',
                iconCls: 'icon-excel',
                listeners: {
                    click: function () {
                        Call_V80202I();
                    }
                }
            },         
           {
                    iconCls: 'icon-edit',
                    text: '修改',
                    id: 'btn_edit' + unique,
                    disabled: false,
            }

            },       
          {
            xtype: 'button', text: '刪除', id: 'btn_del1', iconCls: 'icon-delete',
            listeners: {
                click: function () {                    
                    mysuccessalert("按  [刪除]鈕");
                }
            }  

      2> icon-excel 定義的檔案: ext-patch.css
C:\Users\611292\source\repos\TLSWEB_AMM\TLSWEB_AMM\Content\ext-patch.css       
C:\Users\611292\source\repos\TLSWEB_AMM\TLSWEB_AMM\images\icons\

1>>ext-patch.css - 定義 icon的實際對應檔案
.icon-excel {
    background-image: url('../images/icons/excel.png');
}

.icon-add {
    background-image: url('../images/icons/add.gif')
}

.icon-edit {
    background-image: url('../images/icons/cog_edit.png')
}

.icon-delete {
    background-image: url('../images/icons/delete.gif')
}

.icon-copy {
    background-image: url('../images/icons/copy.png')
}







V80202 – 工單查詢 - 畫面底部如何加一ToolBar -分成2行 - AddDocked - DockedItems

 目的:V80202 – 工單查詢   畫面底部如何加一ToolBar

處理說明:  1> Ext.Panel.AddDocked( {
                                  dock: ":元件位置, Ex:bottom",
                                  dockedItem:[{Items: [":元件,Ex: cmp_mytoolBar]}],
                                  },1);
                     2> Ext.getCmp("grid_Single").dockedItems : 列出目前Panel的DockedItems
                     3> 加入[過濾欄位]Toolbar, 
                          Ext.getCmp("grid_Single").AddDocked({
                                dock:"top",
                                dockedItem:[{items{Query,Query1}}]
                           });
                      4> 加入[額外按鈕]Toolbar
                         Ext.getCmp('grid_Single').addDocked({
                           dock: "bottom",
                           dockedItems: [{items: [cmp_mytoolBar]}],        
                             },3);
                      5>grid_ptb的 dockedItem.index 必需固定為 1
                          否則 .insertBtn(xxx); 會Error 




1>*.js  - 上方 -加入過濾欄位 Bar
      var cmp_filter1 = get_cmp_filter1("過濾條件1", "s_filter1", 80, 130, Tmp_Store);
      var cmp_filter2 = get_cmp_filter1("過濾條件2", "s_filter2", 80, 130, Tmp_Store);
      var cmp_filter3 = get_cmp_filter1("過濾條件3", "s_filter3", 80, 130, Tmp_Store);

      var Query1 = new Ext.FormPanel({
            id: 's_form1',
            layout: { type: 'hbox', align: 'stretch' },
            fieldDefaults: { labelAlign: 'right' },
            defaults: { margin: { top: 3 } },
             items: [{
           xtype: 'panel', id: 'panel21', layout: { type: 'hbox', align: 'stretch' }, flex: 14, border: 0, height: 25,            items: [ cmp_filter1, cmp_filter2, cmp_filter3,]
        }]
    });

 Ext.getCmp('grid_Single').addDocked({
        dock: "top",
        dockedItems: [{
            items: [Query, Query1]
        }]
    },0);


2>*.js  - 底部 -加入按鈕
var cmp_mytoolBar =
    {
        xtype: 'toolbar',
        dock: 'bottom',
        id: 'mytoolBar1',
        items: [
            {
                xtype: 'button', text: '整機抽換紀錄匯出', id: 'Call_V80202I_Btn',
                iconCls: 'icon-excel',
                listeners: {
                    click: function () {
                        Call_V80202I();
                    }
                }
            },                
            {
                xtype: 'button', text: 'F16V_CHECK', id: 'Call_V80202K_Btn',
                iconCls: 'icon-check',
                listeners: {
                    click: function () {
                        Call_V80202K();
                    }
                }
            },                
            {
                xtype: 'button', text: 'SAP單況比對', id: 'Call_V80202L_Btn',
                iconCls: 'icon-check',
                listeners: {
                    click: function () {
                        Call_V80202L();
                    }
                }
            },                
            {
                xtype: 'button', text: 'Finding處置匯入', id: 'Call_V80202M_Btn',
                iconCls: 'icon-add',
                border: '2',
                listeners: {
                    click: function () {
                        Call_V80202M();
                    }
                }
            },        
        ]
    };

 Ext.getCmp('grid_Single').addDocked({
        dock: "bottom",
        dockedItems: [{            
            items: [cmp_mytoolBar]
        }],        
    },1);

3>Ext.getCmp("grid_Single").dockedItems內容

.Items[0] : 上方,過濾條件
.Items[1]:  底部, ToolBar
.Items[2]:  grid , Grid 內容
.Items[3]: grid_ptb , 分頁按鈕

-->實際內容階層
Items[0]-dockedItems-Items[0].items.keys : [s_form,s_form1]
Items[1]-dockedItems-Items[0].items.keys : [mytoolBar1]


4>TMGrid.js
  insertBtn: function (i_btnJson) {
        //console.log('insertBtn_1');
   //如下因為在TMGrid Source, grid_ptb.index限定為1, 所以若 grid_ptb.index 改變時,Error
        var bar = Ext.getCmp(this.dockedItems.keys[1]);
        if (i_btnJson.length > 0) {
            for (var i = 0; i < i_btnJson.length; i++) {
                bar.insert(bar.items.length - 2, i_btnJson[i]);
            }
        } else {
            bar.insert(bar.items.length - 2, i_btnJson);
        }
    },
    reloadGridData: function (i_is_warnalert, i_idx) {



--> 所以改成 3
  Ext.getCmp('grid_Single').addDocked({
        dock: "bottom",
        dockedItems: [{            
            items: [cmp_mytoolBar]
        }],        
    },3);


2024年8月28日 星期三

V80202- 新增過濾欄位1,2,3

 目的: V80202- 新增過濾欄位1,2,3

處理說明: 1>提供[過濾欄位]挑選 - 挑選要過濾的欄位 & 過濾欄位值 & 欄位值挑選([...])
                  2>在畫面下方新增 Query1 - 過濾欄位 Panel
                        var Query1 = new Ext.FormPanel({ ,
                                                       items: [ cmp_filter1, cmp_filter2, cmp_filter3,]
                  3>產生[過濾欄位1,2,3]
                       var cmp_filter1 = get_cmp_filter1("過濾條件1", "s_filter1", 80, 80, Tmp_Store);                                    var cmp_filter2 = get_cmp_filter1("過濾條件2", "s_filter2", 80, 80, Tmp_Store);                                     var cmp_filter3 = get_cmp_filter1("過濾條件3", "s_filter3", 80, 80, Tmp_Store);
     
               4>[過濾欄位]名稱(combo.id):  Ex:  s_filter1  
                   [過濾欄位值].名稱(combo.id+"_txt"): Ex:   s_filter1_txt
                   [過濾欄位挑選按鈕].名稱(combo.id+"_btn"): Ex:   s_filter1_btn

                5>設定過濾欄位.挑選子視窗  - [過濾欄位挑選按鈕] .handler= function;
                    var onSelect = function (combo, records) {
                          var record = records[0] || records;
                         var cur_value = record.get("value");
                         switch (cur_value) {
                            case "MKNO":

                                  Ext.getCmp(cur_comboid_btn).handler = s_MKNO_pick1;
                                  break;
                             case "FIXPONO":
                                  Ext.getCmp(cur_comboid_btn).handler = s_FIXPONO_pick1;
                                  break;
                           default:
                                Ext.getCmp(cur_comboid_btn).handler = null;
                          }

                        //製程欄位 - DoubleClick 挑選子視窗
                           var s_MKNO_pick1 = function (me, e) {
                                 var Tmp_id = me.id; //s_filter1_btn
                                 var Tmp_pos = Tmp_id.indexOf("_btn");        
                                 var cur_comboid_txt = Tmp_id.substr(0, Tmp_pos)+"_txt";
                                 //允選多選 - get_pick1
                                 get_pick1('挑選製程',
                                                  '../api/V80202API/get_s_MKNOPick',
                                ['MKNO'], [cur_comboid_txt], J_pickstore_s_MKNO, J_pickcolumns_s_MKNO);        
                                };
                       //提領編號欄位 - DoubleClick 挑選子視窗
                         var s_FIXPONO_pick1 = function (me, e) {
                              var Tmp_id = me.id; //s_filter1_btn
                             var Tmp_pos = Tmp_id.indexOf("_btn");
                             var cur_comboid_txt = Tmp_id.substr(0, Tmp_pos) + "_txt";
                             //單選 - get_pick0
                             get_pick0('挑選提領編號', 
                                          '../api/V80202API/get_s_FIXPONOPick',
                  ['FIXPONO'], [cur_comboid_txt], J_pickstore_s_FIXPONO, J_pickcolumns_s_FIXPONO);
                    };

                6>[過濾欄位]值 np[]  傳至後端  -  [資料顯示]鈕
                     var selectedValues = {        
                           s_filter1: null,
                           s_filter2: null,
                           s_filter3: null,
                      };
                     var Tmp_filter_Ary = ['s_filter1', 's_filter2', 's_filter3'];  //過濾條件的 Array
                     //取得過濾欄位的過濾值, 並傳入  np
                     Tmp_filter_Ary.forEach(function (cur_filter) {
                                //取得過濾欄位名稱(Ex: AMMNO,SAPNO)
                                var Tmp_filter_NM = selectedValues[cur_filter];  
                                if (!checkisnull(Tmp_filter_NM)) {
                                     var cur_filter_txt = cur_filter + "_txt";
                                 var Tmp_filter_txt = nulltoStr(Ext.getCmp(cur_filter_txt).getValue()).trim();
                                    Tmp_filter_NM = "s_" + Tmp_filter_NM;
                                    np[Tmp_filter_NM] = Tmp_filter_txt;
                            }
                            }
                            );

              7>設定過濾欄位.挑選子視窗  - button.onclick handle
var s_MKNO_pick1 = function (me, e) {
        var Tmp_id = me.id; //s_filter1_btn
        var Tmp_pos = Tmp_id.indexOf("_btn");        
        var cur_comboid_txt = Tmp_id.substr(0, Tmp_pos)+"_txt";
         //允許多選 
           get_pick1('挑選製程',
            '../api/V80202API/get_s_MKNOPick',
            ['MKNO'], [cur_comboid_txt], J_pickstore_s_MKNO, J_pickcolumns_s_MKNO);        
    };
    var s_FIXPONO_pick1 = function (me, e) {
        var Tmp_id = me.id; //s_filter1_btn
        var Tmp_pos = Tmp_id.indexOf("_btn");
        var cur_comboid_txt = Tmp_id.substr(0, Tmp_pos) + "_txt";
         get_pick0('挑選提領編號', 
            '../api/V80202API/get_s_FIXPONOPick',
             ['FIXPONO'], [cur_comboid_txt], J_pickstore_s_FIXPONO, J_pickcolumns_s_FIXPONO);
    };







2024年8月27日 星期二

V80202 -Object.Keys() -Object.Values() -Object.entries() - Object2Array:Object.entries(Obj) - Array2Object: Object.fromEntries(Ary)

  目的:  Object 轉成 Array , Array 轉成Object

處理說明:  1>Object 轉成 Array  - Object.entries(obj);
                         const obj = { name: 'Luke Skywalker', title: 'Jedi Knight', age: 23 };
                         const Ary = Object.entries(obj);

                  2>Array 轉  Object  - Object.fromEntries(Ary);
                      const  Ary_filtered = Ary.filter(  ([key, value]) => typeof value === 'string');
                     const  obj_str = Object.fromEntries(Ary_filtered);

                3>Sample:
                     const Obj_num = { 'BUF': 11, 'MIA': 9, 'NE': 6, 'NYJ': 1 };
                     const Ary_num= Object.entries(Obj_num );
                     Ary_num.filter( function(key,value){ return value>=9; } ); //正式函式寫法
                     Ary_num.filter( ([key,value]) => value>=9; ); //另一寫法
                    const Obj_num9=Object.fromEntries(Ary_num);

               4>Object  - for  (key in Obj) {}
                  let rectangle = {width: 16, height: 9}; 
                  for (const key in rectangle) 
                    { console.log(key, rectangle[key]); } 
                  -->  // width 16 // height 9
               5>Object.keys() : 傳回  Array of  Keys
                   let obj = {a: 1, b: 2, c: 3}; 
                  console.log(Object.keys(obj)); // ["a", "b", "c"]
               6>Object.Values() : 傳回  Array of  Values
                   console.log(Object.values(obj)); // [1, 2, 3]
              7>Object.entries()直接取得所有 property 的 name 和 value,並以陣列回傳
                   console.log(Object.entries(object)); // [
                                                                                      ["a",1],
                                                                                      ["b",2],
                                                                                      ["c",3],
                                                                                  ]      

V80202 - store - filterBy - 過濾欄位 -只顯示符合條件的資料 - forEach() - filterBy()

 目的: V80202 - store - filterBy  - 過濾欄位 -只顯示符合條件的資料

處理說明: 1> store.filterBy(function(cur_rec))  :  過濾 function 傳回值為  true 的資料

        var Tmp_filter_Ary = ['s_filter1', 's_filter2', 's_filter3'];  //過濾條件的 Array
        Tmp_filter_Ary.forEach(function (id) {
            if (id !== combo.id) {
                var otherCombo = Ext.getCmp(id);
                otherCombo.getStore().clearFilter();  //清除  store.filter 內容
                otherCombo.getStore().filterBy(function (record) 
               {//filterBy function , 若為 true ,則包含該選項     
                    var Tmp_isAdd = true;
                    if (record.get('value') == cur_value)
                        Tmp_isAdd = false;
                    var selectedValues_Ary = Object.entries(selectedValues);
                    console.log("selectedValues_Ary: ", selectedValues_Ary);
                    for (i = 0; i < selectedValues_Ary.length; i++) {
                        if (record.get('value') == selectedValues[i])
                            Tmp_isAdd = false;
                    }
                    return Tmp_isAdd;
                });
                console.log(" selectedValues: ", selectedValues);
                console.log(" id: ", id);
                var Tmp_store = otherCombo.getStore();
                console.log(" otherCombo.getStore()- Tmp_store", Tmp_store);
            }


V80202 - combobox - 產生靜態的選項(store local) - combo - 過濾欄位 - get_cmp_filter1

 目的:  Combobox 選項內容由 store(local) 提供

處理說明: 1>產生local  store
                      var Tmp_Store = Ext.create("Ext.data.Store", {
                           fields: ["value", "displayName"],
                           data: [
                                    { value: "", displayName: "請選擇", },
                                    { value: "ECNO", displayName: "EO  ECN", },
                                    { value: "PROCWC", displayName: "生產工廠", },
                                    { value: "PN", displayName: "件號", },
                                    { value: "AMMNO", displayName: "AMM單號", },
                                 ]
                         }  );

                2>產生過濾欄位
                    var cmp_filter1 = get_cmp_filter1("過濾條件1", "s_filter1", 80, 80, Tmp_Store);
                3>get_cmp_filter1
//get_cmp_combox1 取得 combobox 元件 , 資料來源為 local , 非遠端, 獨立 checkbox , id : par_id, 且含有過濾條件的值
function get_cmp_filter1(par_caption, par_id, par_l_width, par_width, par_store, par_flex,par_t_width) {
    if (checkisnull(par_l_width)) {
        par_l_width = 60;
    }
    if (checkisnull(par_width)) {
        par_width = 80;
    }
    if (checkisnull(par_flex)) {
        par_flex = 10;
    }
    if (checkisnull(par_t_width)) {
        par_t_width = 40;
    }
    var rtn_cmp =
    {
        xtype: "fieldcontainer", fieldLabel: par_caption, labelWidth: par_l_width, layout: "hbox", flex: par_flex,
        items: [{
            xtype: "combo",
            id: par_id,
            //fieldLabel: par_caption,
            //labelWidth: par_l_width,
            width: par_width,
            queryMode: 'local',
            store: par_store,
            displayField: 'displayName',
            valueField: 'value',
            padding: "0 4 0 0",
            editable: false, // 禁止編輯
        },
            {
                xtype: "textfield", id: par_id + "_val", width: par_t_width, padding: "0 4 0 0",
            }, // end of s_AMM單號
        ]
    }; // end of s_AMM單號
    return rtn_cmp;
};