HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.104.1.lve.el8.x86_64 #1 SMP Tue Feb 10 20:07:30 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.29
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/posscale/subdomains/xibo/modules/datasetview-designer-javascript.twig
{#
/*
 * Spring Signage Ltd - http://www.springsignage.com
 * Copyright (C) 2016 Spring Signage Ltd
 * (${FILE_NAME})
 */

#}


{% raw %}
<script type="text/x-handlebars-template" id="dataSetViewOrderClauseTemplate">
    <div class="form-group">
        <label class="col-sm-1 control-label" for="orderClause[]">{{ title }}</label>
        <div class="col-sm-7">
            <select class="form-control" name="orderClause[]">
                <option value=""></option>
                {{#each columns}}
                    <option value="{{ heading }}" {{#if_eq heading ../orderClause}}selected{{/if_eq}}>{{ heading }}</option>
                {{/each}}
            </select>
        </div>
        <div class="col-sm-3">
            <label for="orderClauseDirection[]">
                <select class="form-control" name="orderClauseDirection[]">
                    <option value="ASC" {{#if orderClauseAsc}}selected{{/if}}>{{ ascTitle }}</option>
                    <option value="DESC" {{#if orderClauseDesc}}selected{{/if}}>{{ descTitle }}</option>
                </select>
            </label>
        </div>
        <div class="col-sm-1">
            <button class="btn btn-default btn-sm"><i class="fa {{ buttonGlyph }}"></i></button>
        </div>
    </div>
</script>

<script type="text/x-handlebars-template" id="dataSetViewFilterClauseTemplate">
    <div class="form-group">
        <label class="col-sm-1 control-label" for="filterClause[]">{{ title }}</label>
        <div class="col-sm-2">
            <label for="filterClauseOperator[]" {{#if_eq title "1"}}class="hidden"{{/if_eq}}>
                <select class="form-control" name="filterClauseOperator[]">
                    {{#each filterOperatorOptions}}
                    <option value="{{ id }}" {{#if_eq id ../filterClauseOperator}}selected{{/if_eq}}>{{ value }}</option>
                    {{/each}}
                </select>
            </label>
        </div>
        <div class="col-sm-3">
            <select class="form-control" name="filterClause[]">
                <option value=""></option>
                {{#each columns}}
                    <option value="{{ heading }}" {{#if_eq heading ../filterClause}}selected{{/if_eq}}>{{ heading }}</option>
                {{/each}}
            </select>
        </div>
        <div class="col-sm-3">
            <label for="filterClauseCriteria[]">
                <select class="form-control" name="filterClauseCriteria[]">
                    {{#each filterOptions}}
                    <option value="{{ id }}" {{#if_eq id ../filterClauseCriteria}}selected{{/if_eq}}>{{ value }}</option>
                    {{/each}}
                </select>
            </label>
        </div>
        <div class="col-sm-2">
            <label for="filterClauseValue[]">
                <input class="form-control" name="filterClauseValue[]" type="text" value="{{ filterClauseValue }}" />
            </label>
        </div>
        <div class="col-sm-1">
            <button class="btn btn-default btn-sm"><i class="fa {{ buttonGlyph }}"></i></button>
        </div>
    </div>
</script>

{% endraw %}

<script type="text/javascript">
    Handlebars.registerHelper('if_eq', function(a, b, opts) {
        if(a == b) // Or === depending on your needs
            return opts.fn(this);
        else
            return opts.inverse(this);
    });

    function dataSetFormSetup(dialog) {

        $("#columnsIn, #columnsOut").sortable({
            connectWith: '.connectedSortable',
            dropOnEmpty: true
        }).disableSelection();

        $(".li-sortable", dialog).dblclick(switchLists);

        // If all 3 of the template fields are empty, then the template should be reapplied.
        if (!$("#overrideTemplate").is(":checked") && $("#styleSheet").val() == "") {
            // Reapply
            var templateId = $("#templateId").val();

            $.each($('.bootbox').data().extra.templates, function(index, value) {
                if (value.id == templateId) {
                    $("#styleSheet").val(value.css);
                }
            });
        }

        $("#templateId").on('change', function() {
            // Check to see if the override template check box is unchecked
            if (!$("#overrideTemplate").is(":checked")) {

                var templateId = $("#templateId").val();

                $.each($('.bootbox').data().extra.templates, function(index, value) {
                    if (value.id == templateId) {
                        $("#styleSheet").val(value.css);
                    }
                });
            }
        });

        configureQueryBuilder(dialog);

        // Configure the editor
        CKEDITOR.replace("noDataMessage", CKEDITOR_DEFAULT_CONFIG);
        CKEDITOR.instances["noDataMessage"].on('instanceReady', function () {

            $("#cke_noDataMessage .cke_contents").css({
                background: $('#layout').css('background-color')
            });

            $("#cke_noDataMessage iframe").css({
                "background": "transparent"
            });

            // Reapply the background style after switching to source view and back to the normal editing view
            CKEDITOR.instances["noDataMessage"].on('contentDom', function () {

                $("#cke_noDataMessage .cke_contents").css({
                    background: $('#layout').css('background-color')
                });

                $("#cke_noDataMessage iframe").css({
                    "background": "transparent"
                });
            });
        });

        // Make sure when we close the dialog we also destroy the editor
        dialog.on("hide.bs.modal", function() {
            try {
                if (CKEDITOR.instances["noDataMessage"] !== undefined) {
                    CKEDITOR.instances["noDataMessage"].destroy();
                }
            } catch (e) {
                console.log("Unable to remove CKEditor instance. " + e);
            }
        });
    }

    function dataSetTickerFormSetup(dialog) {
        text_callback(dialog, $('.bootbox').data().extra.templates);
        configureQueryBuilder(dialog);
    }

    function configureQueryBuilder(dialog) {
        // Order Clause
        var orderClauseFields = $("#orderClause");

        if (orderClauseFields.length == 0)
            return;

        var orderClauseTemplate = Handlebars.compile($("#dataSetViewOrderClauseTemplate").html());
        var ascTitle = "{% trans "Ascending" %}";
        var descTitle = "{% trans "Descending" %}";

        if (dialog.data().extra.orderClause.length == 0) {
            // Add a template row
            var context = {columns: dialog.data().extra.columns, title: "1", orderClause: "", orderClauseAsc: "", orderClauseDesc: "", buttonGlyph: "fa-plus", ascTitle: ascTitle, descTitle: descTitle};
            orderClauseFields.append(orderClauseTemplate(context));
        } else {
            // For each of the existing codes, create form components
            var i = 0;
            $.each(dialog.data().extra.orderClause, function (index, field) {
                i++;

                var direction = (field.orderClauseDirection == "ASC");

                var context = {columns: dialog.data().extra.columns, title: i, orderClause: field.orderClause, orderClauseAsc: direction, orderClauseDesc: !direction, buttonGlyph: ((i == 1) ? "fa-plus" : "fa-minus"), ascTitle: ascTitle, descTitle: descTitle};

                orderClauseFields.append(orderClauseTemplate(context));
            });
        }

        // Nabble the resulting buttons
        orderClauseFields.on("click", "button", function (e) {
            e.preventDefault();

            // find the gylph
            if ($(this).find("i").hasClass("fa-plus")) {
                var context = {columns: dialog.data().extra.columns, title: orderClauseFields.find('.form-group').length + 1, orderClause: "", orderClauseAsc: "", orderClauseDesc: "", buttonGlyph: "fa-minus", ascTitle: ascTitle, descTitle: descTitle};
                orderClauseFields.append(orderClauseTemplate(context));
            } else {
                // Remove this row
                $(this).closest(".form-group").remove();
            }
        });

        //
        // Filter Clause
        //
        var filterClauseFields = $("#filterClause");
        var filterClauseTemplate = Handlebars.compile($("#dataSetViewFilterClauseTemplate").html());
        var filterOptions = [
            {
                id: "starts-with",
                value: "{% trans "starts with" %}"
            },{
                id: "ends-with",
                value: "{% trans "ends with" %}"
            },{
                id: "contains",
                value: "{% trans "contains" %}"
            },{
                id: "equals",
                value: "{% trans "equals" %}"
            },{
                id: "not-starts-with",
                value: "{% trans "does not start with" %}"
            },{
                id: "not-ends-with",
                value: "{% trans "does not end with" %}"
            },{
                id: "not-contains",
                value: "{% trans "does not contain" %}"
            },{
                id: "not-equals",
                value: "{% trans "does not equal" %}"
            },{
                id: "greater-than",
                value: "{% trans "greater than" %}"
            },{
                id: "less-than",
                value: "{% trans "less than" %}"
            }
        ];
        var filterOperatorOptions = [
            {
                id: "OR",
                value: "{% trans "Or" %}"
            },{
                id: "AND",
                value: "{% trans "And" %}"
            }
        ];

        if (dialog.data().extra.filterClause.length == 0) {
            // Add a template row
            context = {
                columns: dialog.data().extra.columns,
                filterOptions: filterOptions,
                filterOperatorOptions: filterOperatorOptions,
                title: "1",
                filterClause: "",
                filterClauseOperator: "AND",
                filterClauseCriteria: "",
                filterClauseValue: "",
                buttonGlyph: "fa-plus"
            };
            filterClauseFields.append(filterClauseTemplate(context));
        } else {
            // For each of the existing codes, create form components
            var j = 0;
            $.each(dialog.data().extra.filterClause, function (index, field) {
                j++;

                var context = {
                    columns: dialog.data().extra.columns,
                    filterOptions: filterOptions,
                    filterOperatorOptions: filterOperatorOptions,
                    title: j,
                    filterClause: field.filterClause,
                    filterClauseOperator: field.filterClauseOperator,
                    filterClauseCriteria: field.filterClauseCriteria,
                    filterClauseValue: field.filterClauseValue,
                    buttonGlyph: ((j == 1) ? "fa-plus" : "fa-minus")
                };

                filterClauseFields.append(filterClauseTemplate(context));
            });
        }

        // Nabble the resulting buttons
        filterClauseFields.on("click", "button", function (e) {
            e.preventDefault();

            // find the gylph
            if ($(this).find("i").hasClass("fa-plus")) {
                var context = {
                    columns: dialog.data().extra.columns,
                    filterOptions: filterOptions,
                    filterOperatorOptions: filterOperatorOptions,
                    title: filterClauseFields.find('.form-group').length + 1,
                    filterClause: "",
                    filterClauseOperator: "AND",
                    filterClauseCriteria: "",
                    filterClauseValue: "",
                    buttonGlyph: "fa-minus"
                };
                filterClauseFields.append(filterClauseTemplate(context));
            } else {
                // Remove this row
                $(this).closest(".form-group").remove();
            }
        });
    }

    function DataSetViewSubmit(apply) {

        var form = $("#dataSetViewEditForm");
        
        // Clean the previous generated hidden dataSetColumns from the form
        form.find('input[name="dataSetColumnId[]"]').remove();

        // Add all the selected columns to the form as hidden input fields
        $($("#columnsIn").sortable('toArray')).each(function() {
            form.append('<input type="hidden" name="dataSetColumnId[]" value="' + this + '" />');
        });

        // Submit the form
        if (apply == 1)
            form.data("apply", true);

        form.submit();
    }
</script>