We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. Image for the cookie policy date

Cell movement error due to "args.cancel=true" application

Hi

An error occurs when moving a cell using the "tab" key.

Please see the attached video through email.

As you can see in the video, when moving a cell using the "tab" key, if you encounter a cell with "args.cancel=true", you will randomly move to another cell instead of skipping the cell and moving to the next cell.


I also attach the code that prevented the cell from being edited.

function cellEdit(args) {

        if (args.rowData.RM_SNO == null) {
            switch (args.columnName) {
                case "RM_SNO":
                    args.cancel = true;
                    break;
                case "ROOM_NO":
                    args.cancel = true;
                    break;
                case "AIR_SYS_NM":
                    args.cancel = true;
                    break;
                case "ID_COND_ZONE":
                    args.cancel = true;
                    break;
                case "RM_NM":
                    args.cancel = true;
                    break;
                case "RM_AREA":
                    args.cancel = true;
                    break;
                case "RM_WIDTH":
                    args.cancel = true;
                    break;
                case "RM_LGTH":
                    args.cancel = true;
                    break;
                case "RM_CLG_HGT":
                    args.cancel = true;
                    break;
                case "RM_FULL_HGT":
                    args.cancel = true;
                    break;
                case "RM_VOL":
                    args.cancel = true;
                    break;
                case "RM_NO_OF_OCC":
                    args.cancel = true;
                    break;
                case "ID_COND_SUMM_DB":
                    args.cancel = true;
                    break;
                case "ID_COND_WNTR_DB":
                    args.cancel = true;
                    break;
                case "ID_COND_RH":
                    args.cancel = true;
                    break;
                case "ID_COND_AH":
                    args.cancel = true;
                    break;
                case "OWL_N":
                    args.cancel = true;
                    break;
                case "OWL_E":
                    args.cancel = true;
                    break;
                case "OWL_S":
                    args.cancel = true;
                    break;
                case "OWL_W":
                    args.cancel = true;
                    break;
                case "OWA_N":
                    args.cancel = true;
                    break;
                case "OWA_E":
                    args.cancel = true;
                    break;
                case "OWA_S":
                    args.cancel = true;
                    break;
                case "OWA_W":
                    args.cancel = true;
                    break;
                case "DOOR_QTY_N":
                    args.cancel = true;
                    break;
                case "DOOR_QTY_E":
                    args.cancel = true;
                    break;
                case "DOOR_QTY_S":
                    args.cancel = true;
                    break;
                case "DOOR_QTY_W":
                    args.cancel = true;
                    break;
                case "WIN_QTY_N":
                    args.cancel = true;
                    break;
                case "WIN_QTY_E":
                    args.cancel = true;
                    break;
                case "WIN_QTY_S":
                    args.cancel = true;
                    break;
                case "WIN_QTY_W":
                    args.cancel = true;
                    break;
                case "HD_ELTR_WT":
                    args.cancel = true;
                    break;
                case "HD_ELTR_WT_AREA":
                    args.cancel = true;
                    break;
                case "HD_ISTRM_WT":
                    args.cancel = true;
                    break;
                case "HD_ISTRM_WT_AREA":
                    args.cancel = true;
                    break;
                case "HD_TC_WT":
                    args.cancel = true;
                    break;
                case "HD_TC_WT_AREA":
                    args.cancel = true;
                    break;
                case "HD_PROC_WT":
                    args.cancel = true;
                    break;
                case "HD_PROC_WT_AREA":
                    args.cancel = true;
                    break;
                case "HD_MCC_WT":
                    args.cancel = true;
                    break;
                case "HD_MCC_WT_AREA":
                    args.cancel = true;
                    break;
                case "HD_ETC_WT":
                    args.cancel = true;
                    break;
                case "HD_ETC_WT_AREA":
                    args.cancel = true;
                    break;
                case "HD_TOTAL_WT":
                    args.cancel = true;
                    break;
                case "HD_TOTAL_WT_AREA":
                    args.cancel = true;
                    break;
                case "FAS_OB_OCC_UTFL":
                    args.cancel = true;
                    break;
                case "FAS_OB_OCC_FLRT":
                    args.cancel = true;
                    break;
                case "FAS_AB_UTFL":
                    args.cancel = true;
                    break;
                case "FAS_AB_FLRT":
                    args.cancel = true;
                    break;
                case "FAS_FUB_TILT_UNFW":
                    args.cancel = true;
                    break;
                case "FAS_FUB_TILT_FLRT":
                    args.cancel = true;
                    break;
                case "FAS_FUB_SHW_UNFW":
                    args.cancel = true;
                    break;
                case "FAS_FUB_SHW_FLRT":
                    args.cancel = true;
                    break;
                case "FAS_DPB_DP":
                    args.cancel = true;
                    break;
                case "FAS_DPB_TIGHT":
                    args.cancel = true;
                    break;
                case "FAS_DPB_FLRT":
                    args.cancel = true;
                    break;
                case "FAS_ACH":
                    args.cancel = true;
                    break;
                case "FAS_ACH_FLRT":
                    args.cancel = true;
                    break;
                case "FAS_FA_FLRT":
                    args.cancel = true;
                    break;
                case "FAS_FA_SELEC_FLRT":
                    args.cancel = true;
                    break;
                case "AIR_FRESH":
                    args.cancel = true;
                    break;
                case "AIR_SUPPLY":
                    args.cancel = true;
                    break;
                case "AIR_RETURN":
                    args.cancel = true;
                    break;
                case "AIR_OV_PRS":
                    args.cancel = true;
                    break;
                case "AIR_EXHAUST":
                    args.cancel = true;
                    break;
                case "AIR_EXHAUST_CHK":
                    args.cancel = true;
                    break;
                case "SHL_CSLW":
                    args.cancel = true;
                    break;
                case "SHL_CLLW":
                    args.cancel = true;
                    break;
                case "SHL_HSLW":
                    args.cancel = true;
                    break;
                case "SHL_HLLW":
                    args.cancel = true;
                    break;
                case "PF_VALV_WC":
                    args.cancel = true;
                    break;
                case "PF_TANK_WC":
                    args.cancel = true;
                    break;
                case "PF_FHPS":
                    args.cancel = true;
                    break;
                case "PF_URINAL":
                    args.cancel = true;
                    break;
                case "PF_LAVATORY":
                    args.cancel = true;
                    break;
                case "PF_SERVICE_SK":
                    args.cancel = true;
                    break;
                case "PF_ABLUTION_TAP":
                    args.cancel = true;
                    break;
                case "PF_KITCHEN_SK":
                    args.cancel = true;
                    break;
                case "PF_DK_FOUNTAIN":
                    args.cancel = true;
                    break;
                case "PF_HUMIDIFIER":
                    args.cancel = true;
                    break;
                case "PF_E_WASHER":
                    args.cancel = true;
                    break;
                case "PF_E_WS":
                    args.cancel = true;
                    break;
                case "PF_SHOWER":
                    args.cancel = true;
                    break;
            }
        }



9 Replies

TK TaeWook Kang October 5, 2022 07:07 PM

Mail address sent


: wrsec.73@partner.samsung.com


regards.



NS Nithya Sivaprakasam Syncfusion Team October 7, 2022 11:40 AM

Hi TaeWook,


Greetings from Syncfusion support.


Query:” Cell movement error due to "args.cancel=true" application”


Based on your query, we have tried to replicate your reported problem. But it was working fine on our end. Kindly check the attached video for reference. So, before providing a solution to your query, we need some more information that will help us to validate further at our end.


  1. Kindly share the complete grid rendering code.
  2. Please share the issue reproducible sample or hosted link.
  3. Kindly share the version of the Syncfusion package.


The above-requested details will be very useful for us to provide a better solution as soon as possible.


Regards,

Nithya Sivaprakasam.


Attachment: 178010_e0f39e1.zip


TK TaeWook Kang October 19, 2022 01:07 AM

//cshtml

@{

    var empty = string.Empty;


    string sUrl_UC = $"/IDI/TEST_URL?JobNo=SG6472&RevNo=2&sState=S0";
    string sCrud_UC = $"/IDI/UC_CRUD?JobNo=SG6472&RevNo=2&sState=U1";
}


<ejs-treegrid id="CalGrid" height="680" rowHeight="30" frozenColumns="7" gridLines="Both" treeColumnIndex="5"
              idMapping="SUB_BLDG_SNO" hasChildMapping="B_IS_PARENT" parentIdMapping='P_BLDG_SNO' allowTextWrap="true" allowResizing="true" beforeBatchAdd="beforeBatchAdd" toolbar="@(new List<string>() {"Add","Delete","Update","Cancel" })" cellEdit="CoverCellEdit" >
    <e-data-manager url="@sUrl_UC" crudUrl="@sCrud_UC" adaptor="UrlAdaptor"></e-data-manager>
    <e-treegrid-editsettings allowAdding="true" allowEditing="true" allowDeleting="true" mode="Batch" newRowPosition="Child"></e-treegrid-editsettings>
    <e-treegrid-textwrapsettings wrapMode="Header"></e-treegrid-textwrapsettings>
    <e-treegrid-columns>
        <e-treegrid-column field="SUB_BLDG_SNO" visible="false" defaultValue="@empty" isPrimaryKey="true"></e-treegrid-column>
        <e-treegrid-column field="BLDG_SNO" visible="false" defaultValue="@empty"></e-treegrid-column>
        <e-treegrid-column field="P_BLDG_SNO" visible="false" defaultValue="@empty"></e-treegrid-column>
        <e-treegrid-column field="IS_PARENT" visible="false" defaultValue="@empty"></e-treegrid-column>
        <e-treegrid-column field="B_IS_PARENT" visible="false" defaultValue="@empty"></e-treegrid-column>


        <e-treegrid-column field="BLDG_NO" headerText="BUILDING NO." width="150" defaultValue="@empty" headerTextAlign="Center" textAlign="Center"></e-treegrid-column>
        <e-treegrid-column field="BLDG_NM" headerText="BUILDING NAME" width="150" defaultValue="@empty" headerTextAlign="Center" textAlign="Left"></e-treegrid-column>


        <e-treegrid-column field="VALV_WC" headerText="WATER CLOSET (FLUSH VALVE)" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="TANK_WC" headerText="WATER CLOSET (FLUSH TANK)" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="FHPS" headerText="FAUCET/ HOSS BIBB/ PERENNIAL SPRAY" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="URINAL" headerText="URINAL" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="LAVATORY" headerText="LAVATORY" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="SERVICE_SK" headerText="SERVICE SINK" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="ABLUTION_TAP" headerText="ABLUTION TAP" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="KITCHEN_SK" headerText="KITCHEN SINK" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="DK_FOUNTAIN" headerText="DRINKING FOUNTAIN" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="HUMIDIFIER" headerText="HUMIDIFIER" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="E_WASHER" headerText="EYE WASHER" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="E_WS" headerText="EYE WASH & SHOWER" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="SHOWER" headerText="SHOWER" width="85" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>


        <e-treegrid-column field="TOTAL_FU" headerText="TOTAL F.U" width="100" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="PEAK_FLRT_GPM" headerText="PEAK FLOW RATE(GPM)" width="100" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="PEAK_FLRT_LPM" headerText="PEAK FLOW RATE(LPM)" width="100" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="P_SIZE" headerText="PIPE SIZE (INCH)" width="100" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="NO_OF_OCC" headerText="NUMBER OF OCCUPANCY" width="100" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="SUPPLY_WATER" headerText="SUPPLY WATER [GALLON/DAY/PERSON]" width="100" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="GALLON" headerText="PERSON [GALLON/DAY]" width="100" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
        <e-treegrid-column field="LITER" headerText="PERSON [LITER/DAY]" width="100" defaultValue="@empty" headerTextAlign="Center" textAlign="Right"></e-treegrid-column>
    </e-treegrid-columns>
</ejs-treegrid>






<script>
    var DataGrid = null;
    var rowSel = null;


    function beforeBatchAdd(args) {
        DataGrid = document.getElementById("CalGrid").ej2_instances[0];
        rowSel = DataGrid.getSelectedRecords();


        if (rowSel.length > 0) {
            var P_BLDG_SNO = rowSel[0].P_BLDG_SNO;
            if (P_BLDG_SNO == null) {


            }
            else { args.cancel = true; }
        }
        else { args.cancel = true; }
    }


    //cellEdit
    function CoverCellEdit(args) {


        var colName = args.columnName;
        if (colName == "BLDG_NO" || colName == "BLDG_NM" || colName == "PEAK_FLRT_LPM" || colName == "ABLUTION_TAP" || colName == "E_WASHER" || colName == "PEAK_FLRT_LPM" || colName == "SUPPLY_WATER") {
            args.cancel = true;
        }
    }


    function testBound(args) {
        var aa = 1;
    }
</script>


//controller


public IActionResult TEST_URL([FromBody] DataManagerRequest dm)
        {
            List<testModel> list = new List<testModel>();


            for (int i = 0; i < 5; i++)
            {
                testModel model = new testModel();
                switch(i)
                {
                    case 0:
                            model.SUB_BLDG_SNO = 169;
                            model.BLDG_SNO = "SG6472-2-864-B-6430";
                            model.P_BLDG_SNO = null;
                            model.IS_PARENT = 0;
                            model.B_IS_PARENT = false;
                            model.BLDG_NO = "A";
                            model.BLDG_NM = "B";
                            model.VALV_WC = "C";
                            model.TANK_WC = "D";
                            model.FHPS = "E";
                            model.URINAL = "E";
                            model.LAVATORY = "E";
                            model.SERVICE_SK = "E";
                            model.ABLUTION_TAP = "E";
                            model.KITCHEN_SK = "E";
                            model.DK_FOUNTAIN = "E";
                            model.HUMIDIFIER = "E";
                            model.E_WASHER = "E";
                            model.SHOWER = "E";
                            model.TOTAL_FU = "E";
                            model.PEAK_FLRT_GPM = "E";
                            model.PEAK_FLRT_LPM = "E";
                            model.P_SIZE = "E";
                            model.NO_OF_OCC = "E";
                            model.SUPPLY_WATER = "E";
                            model.GALLON = "E";
                            model.LITER = "E";
                        break;
                    case 1:
                        model.SUB_BLDG_SNO = 170;
                        model.BLDG_SNO = "SG6472-2-864-B-6430";
                        model.P_BLDG_SNO = null;
                        model.IS_PARENT = 0;
                        model.B_IS_PARENT = false;
                        model.BLDG_NO = "A";
                        model.BLDG_NM = "B";
                        model.VALV_WC = "C";
                        model.TANK_WC = "D";
                        model.FHPS = "E";
                        model.URINAL = "E";
                        model.LAVATORY = "E";
                        model.SERVICE_SK = "E";
                        model.ABLUTION_TAP = "E";
                        model.KITCHEN_SK = "E";
                        model.DK_FOUNTAIN = "E";
                        model.HUMIDIFIER = "E";
                        model.E_WASHER = "E";
                        model.SHOWER = "E";
                        model.TOTAL_FU = "E";
                        model.PEAK_FLRT_GPM = "E";
                        model.PEAK_FLRT_LPM = "E";
                        model.P_SIZE = "E";
                        model.NO_OF_OCC = "E";
                        model.SUPPLY_WATER = "E";
                        model.GALLON = "E";
                        model.LITER = "E";
                        break;
                    case 2:
                        model.SUB_BLDG_SNO = 171;
                        model.BLDG_SNO = "SG6472-2-864-B-6430";
                        model.P_BLDG_SNO = null;
                        model.IS_PARENT = 0;
                        model.B_IS_PARENT = false;
                        model.BLDG_NO = "A";
                        model.BLDG_NM = "B";
                        model.VALV_WC = "C";
                        model.TANK_WC = "D";
                        model.FHPS = "E";
                        model.URINAL = "E";
                        model.LAVATORY = "E";
                        model.SERVICE_SK = "E";
                        model.ABLUTION_TAP = "E";
                        model.KITCHEN_SK = "E";
                        model.DK_FOUNTAIN = "E";
                        model.HUMIDIFIER = "E";
                        model.E_WASHER = "E";
                        model.SHOWER = "E";
                        model.TOTAL_FU = "E";
                        model.PEAK_FLRT_GPM = "E";
                        model.PEAK_FLRT_LPM = "E";
                        model.P_SIZE = "E";
                        model.NO_OF_OCC = "E";
                        model.SUPPLY_WATER = "E";
                        model.GALLON = "E";
                        model.LITER = "E";
                        break;
                    case 3:
                        //model.test1 = "";
                        //model.test2 = "";
                        //model.test3 = "";
                        //model.test4 = "";
                        //model.test5 = "";
                        break;
                    case 4:
                        //model.BLDG_NO = "A";
                        //model.BLDG_NM = "B";
                        //model.VALV_WC = "C";
                        //model.TANK_WC = "D";
                        //model.FHPS = "E";
                        //model.URINAL = "E";
                        //model.LAVATORY = "E";
                        //model.SERVICE_SK = "E";
                        //model.ABLUTION_TAP = "E";
                        //model.KITCHEN_SK = "E";
                        //model.DK_FOUNTAIN = "E";
                        //model.HUMIDIFIER = "E";
                        //model.E_WASHER = "E";
                        //model.SHOWER = "E";
                        //model.TOTAL_FU = "E";
                        //model.PEAK_FLRT_GPM = "E";
                        //model.PEAK_FLRT_LPM = "E";
                        //model.P_SIZE = "E";
                        //model.NO_OF_OCC = "E";
                        //model.SUPPLY_WATER = "E";
                        //model.GALLON = "E";
                        //model.LITER = "E";
                        break;
                }
                list.Add(model);
            }


            int listCnt = list.Count();


            return dm.RequiresCounts ? Json(new { result = list, count = listCnt }) : Json(list);
        }


        public class testModel
        {
            public int SUB_BLDG_SNO { get; set; }
            public string BLDG_SNO { get; set; }
            public string P_BLDG_SNO { get; set; }
            public int IS_PARENT { get; set; }
            public bool B_IS_PARENT { get; set; }
            public string BLDG_NO { get; set; }
            public string BLDG_NM { get; set; }
            public string VALV_WC { get; set; }
            public string TANK_WC { get; set; }
            public string FHPS { get; set; }
            public string URINAL { get; set; }
            public string LAVATORY { get; set; }
            public string SERVICE_SK { get; set; }
            public string ABLUTION_TAP { get; set; }
            public string KITCHEN_SK { get; set; }
            public string DK_FOUNTAIN { get; set; }
            public string HUMIDIFIER { get; set; }
            public string E_WASHER { get; set; }
            public string SHOWER { get; set; }
            public string TOTAL_FU { get; set; }
            public string PEAK_FLRT_GPM { get; set; }
            public string PEAK_FLRT_LPM { get; set; }
            public string P_SIZE { get; set; }
            public string NO_OF_OCC { get; set; }
            public string SUPPLY_WATER { get; set; }
            public string GALLON { get; set; }
            public string LITER { get; set; }
        }


TK TaeWook Kang October 19, 2022 01:12 AM

We provide the code, package, and package versions.


I hope it helps you with your answer.


Syncfusion.DocIO.Net.Core ;  20.2.0.36

Syncfusion.EJ2.AspNet.Core ;  20.2.0.36

Syncfusion.EJ2.PdfViewer.AspNet.Core.Windo ;  20.2.0.36

Syncfusion.EJ2.Spreadsheet.AspNet.Core ;  20.2.0.36

Syncfusion.XlsIO.Net.Core ;  20.2.0.36

Syncfusion.XlsIORenderer.Net.Core ;  20.2.0.36

Syncfusion.DocIO.Net.Core ;  20.2.0.36




PS Pon Selva Jeganathan Syncfusion Team October 20, 2022 09:20 AM

Hi TaeWook Kang,


Thanks for the update.


Query:” Cell movement error due to "args.cancel=true" application”


We checked your query by preparing a sample based on your code snippet and package version(20.2.36). We were able to replicate the issue at our end. And this issue is fixed in the latest version(20.3.50). So we suggest you upgrade to the latest version(20.3.50).


Please refer to the below sample,

https://www.syncfusion.com/downloads/support/directtrac/general/ze/coresample-EJ2-1005459455


Please refer to the below video demo,

https://www.syncfusion.com/downloads/support/directtrac/general/ze/videodemo-1647708815


Kindly get back to us for further assistance.


Regards,
Pon selva


If this post is helpful, please consider Accepting it as the solution so that other members can locate it more quickly.









TK TaeWook Kang October 20, 2022 05:53 PM

As you answered, we updated the 'Syncfusion' package, but the issue has not been resolved.


I would appreciate it if you could check the unresolved points after updating to 20.3.50 and reply again.


Regards.



PS Pon Selva Jeganathan Syncfusion Team October 21, 2022 10:13 PM

Hi TaeWook Kang,


Thanks for the update.


Query:” Cell movement error due to "args.cancel=true" application”


We checked your query by preparing a sample using latest package version(20.2.50) but we were unable to replicate the issue at our end.


Please refer to the below sample,

https://www.syncfusion.com/downloads/support/directtrac/general/ze/coresample-EJ2-100-918257820


If you still facing issue after trying the above method, please provide the following information


  1. Replication steps of the issue
  2. Confirm whether you are using the latest syncfusion script and CSS files in your application.
  3. Video demo of the issue and share the stacktrace details (if face any)
  4. Try to replicate the issue in our shared sample or share the issue reproducible sample.


The requested information will be helpful to proceed further


Regards,
Pon selva





TK TaeWook Kang October 23, 2022 08:06 PM

Thank you for updating your answer.


However, the problem has not been solved.


As the respondent informed us, we have implemented the latest package (20.3.50) updated. The problem continues.


Please try again using the code that you have already reproduced and the code I attached in the question comment.


I believe that the problem is a bug and I hope this problem will be resolved as soon as possible.



The "bootstrap5.css" and "ej2.min.js" that I applied.Please refer to this.


https://cdn.syncfusion.com/ej2/20.3.50/bootstrap5.css


https://cdn.syncfusion.com/ej2/20.2.50/dist/ej2.min.js



Regards.





FS Farveen Sulthana Thameeztheen Basha Syncfusion Team October 24, 2022 05:47 AM

Hi TaeWook Kang,


We have created a new ticket under your account to follow up with this query. We suggest you to follow up with the ticket for further updates. Please login using the below link.

https://support.syncfusion.com/support


Regards,

Farveen sulthana T


Loader.
Live Chat Icon For mobile
Up arrow icon