EntityBusinessMetaDataItemView.js 18.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
define(['require',
    'backbone',
20
    'hbs!tmpl/entity/EntityBusinessMetaDataItemView_tmpl',
21
    'moment',
22
    'utils/Globals',
23
    'daterangepicker'
24
], function(require, Backbone, EntityBusinessMetaDataItemViewTmpl, moment, Globals) {
25 26 27
    'use strict';

    return Backbone.Marionette.ItemView.extend({
28
        _viewName: 'EntityBusinessMetaDataItemView',
29

30
        template: EntityBusinessMetaDataItemViewTmpl,
31 32 33 34 35 36

        templateHelpers: function() {
            return {
                editMode: this.editMode,
                entity: this.entity,
                getValue: this.getValue.bind(this),
37 38
                getBusinessMetadataDroupdown: this.getBusinessMetadataDroupdown.bind(this),
                businessMetadataCollection: this.businessMetadataCollection,
39 40 41
                model: this.model.toJSON()
            }
        },
42
        tagName: 'li',
43
        className: "business-metadata-tree-child",
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

        /** Layout sub regions */
        regions: {},

        /** ui selector cache */
        ui: {
            keyEl: "[data-id='key']",
            valueEl: "[data-type='value']",
            addItem: "[data-id='addItem']",
            deleteItem: "[data-id='deleteItem']",
            editMode: "[data-id='editMode']"
        },
        /** ui events hash */
        events: function() {
            var events = {};
            events["click " + this.ui.deleteItem] = 'onDeleteItem';
            events["change " + this.ui.keyEl] = 'onAttrChange';
            return events;
        },

        /**
65
         * intialize a new EntityBusinessMetaDataItemView Layout
66 67 68 69 70 71 72 73 74 75 76
         * @constructs
         */
        initialize: function(options) {
            _.extend(this, options);
        },
        onRender: function() {
            var that = this;
            this.ui.keyEl.val("");
            this.ui.keyEl.select2({ placeholder: "Select Attribute" });

            if (this.editMode && (!this.model.has("isNew"))) {
77
                this.getEditBusinessMetadataEl();
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
            }
            this.initializeElement();
            this.bindEvent();
        },
        initializeElement: function() {},
        bindEvent: function() {
            var that = this;
            if (this.editMode) {
                this.listenTo(this.model.collection, 'destroy unset:attr', function() {
                    if (this.model.has("isNew")) {
                        this.render();
                    }
                });
                this.listenTo(this.model.collection, 'selected:attr', function(value, model) {
                    if (model.cid !== this.model.cid && this.model.has("isNew")) {
                        var $select2el = that.$el.find('.custom-col-1:first-child>select[data-id="key"]');
                        $select2el.find('option[value="' + value + '"]').remove();
                        var select2val = $select2el.select2("val");
                        $select2el.select2({ placeholder: "Select Attribute" });
                        if (this.model.keys().length <= 2) {
                            $select2el.val("").trigger("change", true);
                        }
                    }
                });
                this.$el.off("change", ".custom-col-1[data-id='value']>[data-key]").on("change", ".custom-col-1[data-id='value']>[data-key]", function(e) {
                    var key = $(this).data("key"),
104
                        businessMetadata = $(this).data("businessMetadata"),
105 106 107 108 109 110
                        typeName = $(this).data("typename"),
                        multi = $(this).data("multi"),
                        updateObj = that.model.toJSON();
                    if (_.isUndefinedNull(updateObj[key])) {
                        updateObj[key] = { value: null, typeName: typeName };
                    }
111 112 113 114
                    updateObj[key].value = e.currentTarget.value;
                    if (multi && typeName.indexOf("date") == -1) {
                        updateObj[key].value = $(this).select2("val");
                    }
115 116
                    if (!that.model.has("__internal_UI_businessMetadataName")) {
                        updateObj["__internal_UI_businessMetadataName"] = businessMetadata;
117
                    }
118 119 120 121 122 123 124 125 126 127 128 129 130
                    if (typeName.indexOf("date") > -1) {
                        if (multi && updateObj[key].value) {
                            var dateValues = updateObj[key].value.split(','),
                                dateStr = [];
                            if (dateValues.length) {
                                _.each(dateValues, function(selectedDate) {
                                    dateStr.push(new Date(selectedDate.trim()).getTime());
                                });
                                updateObj[key].value = dateStr;
                            }
                        } else {
                            updateObj[key].value = new Date(updateObj[key].value).getTime()
                        }
131 132 133 134
                    }
                    that.model.set(updateObj);
                });
                this.$el.on('keypress', '.select2_only_number .select2-search__field', function() {
135 136 137 138
                    var typename = $(this).parents(".select2_only_number").find("select[data-typename]").data("typename")
                    if (typename.indexOf("float") > -1 && event.which == 46) {
                        return;
                    }
139
                    if ((event.which < 48 || event.which > 57)) {
140

141 142 143 144 145
                        event.preventDefault();
                    }
                });
            }
        },
146
        getAttrElement: function(opt) {
147
            var that = this,
148 149
                returnEL = "N/A",
                options = $.extend(true, {}, opt);
150 151 152 153 154
            if (options) {
                var key = options.key,
                    typeName = options.val.typeName || "",
                    val = options.val.value,
                    isMultiValued = typeName && typeName.indexOf("array<") === 0,
155
                    businessMetadata = options.businessMetadata,
156 157
                    allowOnlyNum = false;
                var elType = isMultiValued ? "select" : "input";
158
                if (!isMultiValued && !_.isEmpty(val)) {
159 160
                    val = _.escape(val);
                }
161
                if (!_.isUndefinedNull(val) && typeName.indexOf("boolean") > -1) {
162 163
                    val = String(val);
                }
164
                if (typeName.indexOf("date") > -1) {
165 166 167 168
                    if (isMultiValued && val && val.length) {
                        var dateStr = [];
                        _.each(val, function(selectedDate) {
                            selectedDate = parseInt(selectedDate);
169
                            dateStr.push(moment(selectedDate).format(Globals.dateFormat));
170 171 172
                        });
                        val = dateStr.join(',');
                    } else if (!isMultiValued && val) {
173
                        val = parseInt(val);
174
                        val = moment(val).format(Globals.dateFormat);
175
                    }
176 177
                }
                if (typeName.indexOf("string") > -1) {
178
                    returnEL = '<' + elType + ' type="text" data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" data-multi="' + isMultiValued + '" data-tags="true"  placeholder="Enter String" class="form-control" ' + (!_.isUndefinedNull(val) ? 'value="' + val + '"' : "") + '></' + elType + '>';
179
                } else if (typeName.indexOf("boolean") > -1) {
180
                    returnEL = '<select data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" data-multi="' + isMultiValued + '" class="form-control">' + (isMultiValued ? "" : '<option value="">--Select Value--</option>') + '<option value="true" ' + (!_.isUndefinedNull(val) && val == "true" ? "selected" : "") + '>true</option><option value="false" ' + (!_.isUndefinedNull(val) && val == "false" ? "selected" : "") + '>false</option></select>';
181
                } else if (typeName.indexOf("date") > -1) {
182
                    returnEL = '<' + (isMultiValued ? "textarea" : "input") + ' type="text" data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '"data-multi="' + isMultiValued + '" data-type="date" class="form-control" ' + (isMultiValued === false && !_.isUndefinedNull(val) ? 'value="' + val + '"' : "") + '>' + (isMultiValued === true && !_.isUndefinedNull(val) ? val : "") + (isMultiValued ? "</textarea>" : "");
183
                    setTimeout(function() {
184
                        var dateObj = { singleDatePicker: true, showDropdowns: true, autoUpdateInput: isMultiValued ? false : true },
185 186 187 188 189 190 191
                            dateEl = that.$el.find('[data-type="date"][data-key="' + key + '"]').daterangepicker(dateObj);
                        if (isMultiValued) {
                            dateEl.on("apply.daterangepicker", function(ev, picker) {
                                var val = picker.element.val();
                                if (val !== "") {
                                    val += ", ";
                                }
192
                                picker.element.val(val += picker.startDate.format(Globals.dateFormat));
193 194 195
                                that.$el.find(".custom-col-1[data-id='value']>[data-key]").trigger('change');
                            });
                        }
196
                    }, 0);
197
                } else if (typeName.indexOf("byte") > -1 || typeName.indexOf("short") > -1 || typeName.indexOf("int") > -1 || typeName.indexOf("float") > -1 || typeName.indexOf("double") > -1 || typeName.indexOf("long") > -1) {
198
                    allowOnlyNum = true;
199
                    returnEL = '<' + elType + ' data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" type="number" data-multi="' + isMultiValued + '" data-tags="true" placeholder="Enter Number" class="form-control" ' + (!_.isUndefinedNull(val) ? 'value="' + val + '"' : "") + '></' + elType + '>';
200
                } else if (typeName) {
201
                    var modTypeName = typeName;
202 203 204
                    if (isMultiValued) {
                        var multipleType = typeName.match("array<(.*)>");
                        if (multipleType && multipleType[1]) {
205
                            modTypeName = multipleType[1];
206 207
                        }
                    }
208
                    var foundEnumType = this.enumDefCollection.fullCollection.find({ name: modTypeName });
209 210 211 212 213
                    if (foundEnumType) {
                        var enumOptions = "";
                        _.forEach(foundEnumType.get("elementDefs"), function(obj) {
                            enumOptions += '<option value="' + obj.value + '">' + obj.value + '</option>'
                        });
214
                        returnEL = '<select data-key="' + key + '" data-businessMetadata="' + businessMetadata + '" data-typename="' + typeName + '" data-multi="' + isMultiValued + '" >' + enumOptions + '</select>';
215 216
                    }
                    setTimeout(function() {
217 218 219 220 221
                        if (!isMultiValued) {
                            var selectEl = that.$el.find('.custom-col-1[data-id="value"] select[data-key="' + key + '"]');
                            selectEl.val((val || ""));
                            selectEl.select2();
                        }
222 223 224 225 226
                    }, 0);
                }
                if (isMultiValued) {
                    setTimeout(function() {
                        var selectEl = that.$el.find('.custom-col-1[data-id="value"] select[data-key="' + key + '"][data-multi="true"]');
227
                        var data = val && val.length && (_.isArray(val) ? val : val.split(",")) || [];
228 229 230
                        if (allowOnlyNum) {
                            selectEl.parent().addClass("select2_only_number");
                        }
231 232 233 234 235
                        selectEl.select2({
                            tags: selectEl.data("tags") ? true : false,
                            multiple: true,
                            data: data
                        });
236 237 238 239 240 241 242 243 244 245 246 247 248
                        selectEl.val(data).trigger("change");
                    }, 0);
                }
            }
            return returnEL;
        },
        onAttrChange: function(e, manual) {
            var key = e.currentTarget.value.split(":");
            if (key.length && key.length === 3) {
                var valEl = $(e.currentTarget).parent().siblings(".custom-col-1"),
                    hasModalData = this.model.get(key[1]);
                if (!hasModalData) {
                    var tempObj = {
249
                        "__internal_UI_businessMetadataName": key[0]
250 251 252 253 254 255 256
                    };
                    if (this.model.has("isNew")) {
                        tempObj["isNew"] = true;
                    }
                    tempObj[key[1]] = null;
                    this.model.clear({ silent: true }).set(tempObj)
                }
257
                valEl.html(this.getAttrElement({ businessMetadata: key[0], key: key[1], val: hasModalData ? hasModalData : { typeName: key[2] } }));
258 259 260 261 262
                if (manual === undefined) {
                    this.model.collection.trigger("selected:attr", e.currentTarget.value, this.model);
                }
            }
        },
263
        getValue: function(value, key, businessMetadataName) {
264 265 266
            var typeName = value.typeName,
                value = value.value;
            if (typeName === "date") {
267
                return moment(value).format(Globals.dateFormat);
268 269 270 271
            } else {
                return value;
            }
        },
272
        getBusinessMetadataDroupdown: function(businessMetadataCollection) {
273 274
            var optgroup = "";
            var that = this;
275
            var model = that.model.omit(["isNew", "__internal_UI_businessMetadataName"]),
276 277 278 279 280 281
                keys = _.keys(model),
                isSelected = false,
                selectdVal = null;
            if (keys.length === 1) {
                isSelected = true;
            }
282
            _.each(businessMetadataCollection, function(obj, key) {
283
                var options = "";
284 285
                if (obj.length) {
                    _.each(obj, function(attrObj) {
286
                        var entityBusinessMetadata = that.model.collection.filter({ __internal_UI_businessMetadataName: key }),
287
                            hasAttr = false;
288 289
                        if (entityBusinessMetadata) {
                            var found = entityBusinessMetadata.find(function(eObj) {
290
                                return eObj.attributes.hasOwnProperty(attrObj.name);
291 292 293 294 295
                            });
                            if (found) {
                                hasAttr = true;
                            }
                        }
296 297
                        if ((isSelected && keys[0] === attrObj.name) || !(hasAttr)) {
                            var value = key + ":" + attrObj.name + ":" + attrObj.typeName;
298 299 300 301 302
                            if (isSelected && keys[0] === attrObj.name) { selectdVal = value };
                            options += '<option value="' + value + '">' + attrObj.name + ' (' + _.escape(attrObj.typeName) + ')</option>';
                        }
                    });
                    if (options.length) {
303
                        optgroup += '<optgroup label="' + key + '">' + options + '</optgroup>';
304 305 306 307 308 309 310 311 312 313 314 315 316
                    }
                }
            });

            setTimeout(function() {
                if (selectdVal) {
                    that.$el.find('.custom-col-1:first-child>select[data-id="key"]').val(selectdVal).trigger("change", true);
                } else {
                    that.$el.find('.custom-col-1:first-child>select[data-id="key"]').val("").trigger("change", true);
                }
            }, 0);
            return '<select data-id="key">' + optgroup + '</select>';
        },
317
        getEditBusinessMetadataEl: function() {
318 319 320
            var that = this,
                trs = "";
            _.each(this.model.attributes, function(val, key) {
321 322
                if (key !== "__internal_UI_businessMetadataName" && key !== "isNew") {
                    var td = '<td class="custom-col-1" data-key=' + key + '>' + key + ' (' + _.escape(val.typeName) + ')</td><td class="custom-col-0">:</td><td class="custom-col-1" data-id="value">' + that.getAttrElement({ businessMetadata: that.model.get("__internal_UI_businessMetadataName"), key: key, val: val }) + '</td>';
323 324 325 326 327

                    td += '<td class="custom-col-2 btn-group">' +
                        '<button class="btn btn-default btn-sm" data-key="' + key + '" data-id="deleteItem">' +
                        '<i class="fa fa-times"> </i>' +
                        '</button></td>';
328
                    trs += "<tr class='custom-tr'>" + td + "</tr>";
329 330
                }
            })
331
            this.$("[data-id='businessMetadataTreeChild']").html("<table class='custom-table'>" + trs + "</table>");
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
        },
        onDeleteItem: function(e) {
            var key = $(e.currentTarget).data("key");
            if (this.model.has(key)) {
                if (this.model.keys().length === 2) {
                    this.model.destroy();
                } else {
                    this.model.unset(key);
                    if (!this.model.has("isNew")) {
                        this.$el.find("tr>td:first-child[data-key='" + key + "']").parent().remove()
                    }
                    this.model.collection.trigger("unset:attr");
                }
            } else {
                this.model.destroy();
            }
        }
    });
});