You are viewing limited content. For full access, please sign in.

Question

Question

use javascript to select a checkbox based on a field value

asked on July 24

I have a form with a table in it for signing up for a training.  Some trainings are multi-day trainings and users have to sign up for all of the days. What I want is for my checkbox to auto-select if the training ID matches and it is a multiday training any of the previous rows that the training ID is the same.  Is that possible?  

 

Say I have this:

0 0

Answer

SELECTED ANSWER
replied on July 29
(function () {
    var TRAINING_ID_FIELD_ID = 4;
    var CHECKBOX_FIELD_ID    = 5;
    var CHECKBOX_VALUE       = "Choice_1";

    var isSyncing = false;

    function isRowChecked(row) {
        return !!(row && row.value && row.value.length > 0);
    }

    function setCheckbox(rowIndex) {
        var target = { fieldId: CHECKBOX_FIELD_ID, index: rowIndex };
        var attempts = [
            { value: [CHECKBOX_VALUE] },
            { value: [CHECKBOX_VALUE], otherChoiceValue: "" },
            { value: { value: [CHECKBOX_VALUE], otherChoiceValue: "" } }
        ];
        for (var i = 0; i < attempts.length; i++) {
            try {
                LFForm.setFieldValues(target, attempts[i]);
                return;
            } catch (e) {}
        }
    }

    LFForm.onFieldChange(function () {
        if (isSyncing) return;

        var trainingIdValues = LFForm.getFieldValues({ fieldId: TRAINING_ID_FIELD_ID }) || [];
        var checkboxValues   = LFForm.getFieldValues({ fieldId: CHECKBOX_FIELD_ID }) || [];

        var checkedIds = {};
        for (var i = 0; i < checkboxValues.length; i++) {
            if (isRowChecked(checkboxValues[i]) && trainingIdValues[i]) {
                checkedIds[trainingIdValues[i]] = true;
            }
        }

        var rowsToUpdate = [];
        for (var r = 0; r < trainingIdValues.length; r++) {
            if (checkedIds[trainingIdValues[r]] && !isRowChecked(checkboxValues[r])) {
                rowsToUpdate.push(r);
            }
        }

        if (rowsToUpdate.length === 0) return;

        isSyncing = true;
        rowsToUpdate.forEach(setCheckbox);
        setTimeout(function () { isSyncing = false; }, 100);
    }, { fieldId: CHECKBOX_FIELD_ID });
})();

Change the IDs to match your field IDs and whatever value you are using for the checkbox.  This one worked for me.

0 0

Replies

replied on July 24

Are you using Modern or Classic?

0 0
replied on July 27

Modern

 

0 0
SELECTED ANSWER
replied on July 29
(function () {
    var TRAINING_ID_FIELD_ID = 4;
    var CHECKBOX_FIELD_ID    = 5;
    var CHECKBOX_VALUE       = "Choice_1";

    var isSyncing = false;

    function isRowChecked(row) {
        return !!(row && row.value && row.value.length > 0);
    }

    function setCheckbox(rowIndex) {
        var target = { fieldId: CHECKBOX_FIELD_ID, index: rowIndex };
        var attempts = [
            { value: [CHECKBOX_VALUE] },
            { value: [CHECKBOX_VALUE], otherChoiceValue: "" },
            { value: { value: [CHECKBOX_VALUE], otherChoiceValue: "" } }
        ];
        for (var i = 0; i < attempts.length; i++) {
            try {
                LFForm.setFieldValues(target, attempts[i]);
                return;
            } catch (e) {}
        }
    }

    LFForm.onFieldChange(function () {
        if (isSyncing) return;

        var trainingIdValues = LFForm.getFieldValues({ fieldId: TRAINING_ID_FIELD_ID }) || [];
        var checkboxValues   = LFForm.getFieldValues({ fieldId: CHECKBOX_FIELD_ID }) || [];

        var checkedIds = {};
        for (var i = 0; i < checkboxValues.length; i++) {
            if (isRowChecked(checkboxValues[i]) && trainingIdValues[i]) {
                checkedIds[trainingIdValues[i]] = true;
            }
        }

        var rowsToUpdate = [];
        for (var r = 0; r < trainingIdValues.length; r++) {
            if (checkedIds[trainingIdValues[r]] && !isRowChecked(checkboxValues[r])) {
                rowsToUpdate.push(r);
            }
        }

        if (rowsToUpdate.length === 0) return;

        isSyncing = true;
        rowsToUpdate.forEach(setCheckbox);
        setTimeout(function () { isSyncing = false; }, 100);
    }, { fieldId: CHECKBOX_FIELD_ID });
})();

Change the IDs to match your field IDs and whatever value you are using for the checkbox.  This one worked for me.

0 0
replied on July 29

Thanks.  I'll give this a try.  

0 0
replied on July 29

It worked on my test form.  I'm going to try it on my "live" form.  THANK YOU!

0 0
replied on July 29

One more thing I need to add.  It only should do this if Multiday  = "Y".  This works for training IDs, but not for only Multiday = "Y"

0 0
replied on July 30

Here is an updated script: 

(function () {
    var TRAINING_ID_FIELD_ID = 4;
    var CHECKBOX_FIELD_ID    = 5;
    var CHECKBOX_VALUE       = "Choice_1";
    var MultiDayField        = 7;
    var MultiDayFieldValue   = "Y";

    var isSyncing = false;

    function isRowChecked(row) {
        return !!(row && row.value && row.value.length > 0);
    }

    function setCheckbox(rowIndex) {
        var target = { fieldId: CHECKBOX_FIELD_ID, index: rowIndex };
        var attempts = [
            { value: [CHECKBOX_VALUE] },
            { value: [CHECKBOX_VALUE], otherChoiceValue: "" },
            { value: { value: [CHECKBOX_VALUE], otherChoiceValue: "" } }
        ];
        for (var i = 0; i < attempts.length; i++) {
            try {
                LFForm.setFieldValues(target, attempts[i]);
                return;
            } catch (e) {}
        }
    }

    LFForm.onFieldChange(function () {
        if (isSyncing) return;

        var trainingIdValues = LFForm.getFieldValues({ fieldId: TRAINING_ID_FIELD_ID }) || [];
        var checkboxValues   = LFForm.getFieldValues({ fieldId: CHECKBOX_FIELD_ID }) || [];
        var multiDayValues   = LFForm.getFieldValues({ fieldId: MultiDayField }) || [];

        var checkedIds = {};
        for (var i = 0; i < checkboxValues.length; i++) {
            if (isRowChecked(checkboxValues[i]) && trainingIdValues[i] && multiDayValues[i] === MultiDayFieldValue) {
                checkedIds[trainingIdValues[i]] = true;
            }
        }

        var rowsToUpdate = [];
        for (var r = 0; r < trainingIdValues.length; r++) {
            if (checkedIds[trainingIdValues[r]] && !isRowChecked(checkboxValues[r]) && multiDayValues[r] === MultiDayFieldValue) {
                rowsToUpdate.push(r);
            }
        }

        if (rowsToUpdate.length === 0) return;

        isSyncing = true;
        rowsToUpdate.forEach(setCheckbox);
        setTimeout(function () { isSyncing = false; }, 100);
    }, { fieldId: CHECKBOX_FIELD_ID });
})();

 

0 0
You are not allowed to follow up in this post.

Sign in to reply to this post.