custom_bindings/numbering.js

/**
 * Responsible for adding a formatted numbering on fields
 * @module app/custom_binding/numbering
 * @requires knockout
 * @requires jquery
 * @requires app/models/Field
 * @requires hasher
 *
 * @example
 * var field_stub = {
 *     showNumbering: true,
 *     numbering: false,
 *     showNumbering: true
 * };
 * <div data-bind="with: field">
 *     //prints 1.0
 *     <label data-bind="numbering: numbering"></label>
 * </div>
 */
define(['knockout', 'jquery', 'models/Field', 'hasher'], function(ko, $, Field, hasher) {
    ko.bindingHandlers.numbering = {
        update: function(el, valueAccessor, allBindings, viewModel, bindingContext) {
            var index = bindingContext.$index() + 1,
                valAccessor = valueAccessor(),
                numbering = valAccessor() ? valAccessor() + '.0 ' : '  ',
                field = ko.dataFor(el),
                parents = _.uniqBy(bindingContext.$parents, 'name'),
                temp = [],
                fieldDummyText = 'Item ' + numbering.replace('.0', ''),
                currentRoute = hasher.getHashAsArray()[0];

            // field.label(fieldDummyText);
            if (!valAccessor()) {
                valAccessor(index);
            }



            if (field.showNumbering()) {
                if (parents.length > 2) {
                    ko.utils.arrayForEach(parents, function(parent) {
                        if (parent instanceof Field) {
                            if (parent !== field && parent.numbering()) {
                                temp.unshift(parent.numbering());
                            } else {
                                var field_index = ko.utils.arrayIndexOf(parent.childFields(), field);
                                console.log('ddddd', field_index);
                                // if(field_index > -1) {
                                //     temp.unshift(field_index+1);
                                // }
                            }
                        }

                    });
                    if (temp.length && parents[1].showNumbering()) {
                        label = temp.join('.') + '.' + valAccessor() + ' ' + '';
                    } else {
                        label = '';
                    }
                } else {
                    label = numbering + '';

                }
            } else {
                label = '';
            }
            field.formatted_numbering = label;
            field.temporary_label = label;
            newValueAccessor = function() {
                return label;
            };
            temp = null;
            ko.bindingHandlers.text.update(el, newValueAccessor, allBindings, viewModel, bindingContext);

        }
    }
});