SHARE
TWEET
4-5axis
a guest
Jan 29th, 2018
59
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
- import sharedData from "./../sharedData"
- import select2Factory from "../helpers/select2Factory";
- var t = require("text!../templates/AnketaItemsCube.tpl");
- var subtemplate = require("text!../templates/AnketaItemsSubCube.tpl");
- export default Backbone.View.extend({
- events: {
- "click .add-new-item-btn": "addItemToSelect",
- "click #add-subanswer-btn": "addNewSubanswerForm",
- "click #next-row": "showNextRow",
- "click #prev-row": "showPrevRow",
- "click .delete-subanswer": "deleteSubanswerForm",
- "click .alphabet-sort-btn": "sortByAlphabet",
- "click .number-sort-btn": "sortByNumber",
- "selectSelect2 select": "setModelValues",
- "unselectSelect2 select": "setModelValues",
- "nextSelect select": "openNextSelect",
- "openSelect2 select": "select2EnterKeySortListener"
- },
- initialize() {
- this.dictionaries = {};
- this.template = _.template(t);
- this.subtemplate = _.template(subtemplate);
- this.allValues = [];
- this.change = true;
- this.isFilled = false;
- },
- /**
- * https://teamtrack.macc.com.ua/view.php?id=55133#217913
- * Edit in vendor library - web-client\node_modules\select2\dist\js\select2.js
- * Lines :4286, :4287
- * var enoughRoomAbove = false;
- * var enoughRoomBelow = true;
- * Library edit, because there is no other predefined way to set dropdown position below
- * */
- excludeByRule(data, answers){
- let excludedData = _.filter(data, function (column) {
- return false;
- });
- let dataIds = _.pluck(data, "ID");
- return excludedData;
- },
- render() {
- let model = this.model;
- let data = model.get('AnketaItems');
- let answers = model.get('AnketaCubeDicItems');
- let cubeLength = data.length;
- /* if(answers && cubeLength > 1){
- data = this.excludeByRule(data, answers);
- }*/
- this.$el.empty();
- this.$el.html(this.template({axisCount: cubeLength}));
- $('#question-area').empty().html(this.$el);
- _.each(data, (item) => {
- let itemData = item.AnketaDicItems;
- this.dictionaries[item.ID] = _.sortBy(this.formatData(itemData), "OrderBy");
- });
- if (this.dictionaries) { // add all items at this moment
- _.each(this.dictionaries, (item) => {
- this.renderSubForm(item.RowNumber);
- });
- }
- console.log(this.dictionaries);
- /*let subAnswers;
- let model = this.model;
- let selectsData = model.get('AnketaItems') || [];
- this.$el.empty();
- // render main view
- this.$el.html(this.template({axisCount: selectsData.length}));
- $('#question-area').empty().html(this.$el);
- $(document).unbind('keypress');
- $(document).unbind('keydown');
- this.setListeners();
- // set count of axes in cube
- model.set("axes", selectsData.length);
- _.each(selectsData, (item) => {
- let data = item.AnketaDicItems;
- this.dictionaries[item.ID] = _.sortBy(this.formatData(data), (value) => {
- return value.OrderBy;
- });
- });
- subAnswers = this.prepareSubAnswers(selectsData.length);
- this.subAnswersLength = _.pairs(subAnswers).length;
- model.set("subAnswersLength", this.subAnswersLength);
- if (subAnswers) { // add all items at this moment
- _.each(subAnswers, (item) => {
- this.renderSubForm(item.RowNumber || 999)
- });
- } else {
- this.addNewSubanswerForm()
- }
- let $boxes = $('#subanswer-items .box');
- let $box = $boxes.not('.hidden-row');
- this.setSelectsWidth();
- this.$select = $('select');
- this.select2EnterKeySortListener();
- this.setSortListeners();
- this.setAddButtonListener();
- this.isFilled = this.isFilledCube();
- if(!this.isFilled) {
- this.disableNotLastSelect($box);
- }
- this.cubeSelect2Listener();
- this.cubeUnselectListener();
- this.blinkToRow();
- */
- return this;
- },
- showPrevRow(){
- let $rows = $('#subanswer-items .box');
- let $visible = $rows.not('.hidden-row');
- let rowNumber = $visible.attr('data-row');
- let $lastSelect = $visible.find('select').last();
- let label = $lastSelect.siblings('label').text();
- let val = $lastSelect.val();
- let empty = !(val instanceof Array);
- if(empty){
- /* fill required input */
- let error = 'Заполните поле "' + label + '"';
- sharedData.views.notifyModule.showError(error);
- }else if(rowNumber > 1){
- /* go to the prev step */
- rowNumber--;
- $visible.addClass('hidden-row');
- $('#subanswer-items .box[data-row="' + rowNumber + '"]').removeClass('hidden-row');
- let $box = $('#subanswer-items .box').not('.hidden-row');
- if(!this.isFilled) {
- this.disableNotLastSelect($box);
- }
- this.cubeSelect2Listener();
- this.cubeUnselectListener();
- this.focusLastSelect($box);
- $('.alert').addClass('hidden');
- }else{
- /* trigger save btn */
- $('#save-app-btn').trigger('click');
- }
- },
- showNextRow(){
- let $rows = $('#subanswer-items .box');
- let rowsCount = $rows.length;
- let $visible = $rows.not('.hidden-row');
- let rowNumber = $visible.attr('data-row');
- let $lastSelect = $visible.find('select').last();
- let label = $lastSelect.siblings('label').text();
- let val = $lastSelect.val();
- let empty = !(val instanceof Array);
- if(empty){
- /* fill required input */
- let error = 'Заполните поле "' + label + '"';
- sharedData.views.notifyModule.showError(error);
- }else if(rowNumber < rowsCount){
- /* go to the next step */
- rowNumber++;
- $visible.addClass('hidden-row');
- $('#subanswer-items .box[data-row="' + rowNumber + '"]').removeClass('hidden-row');
- let $box = $('#subanswer-items .box').not('.hidden-row');
- if(!this.isFilled) {
- this.disableNotLastSelect($box);
- }
- this.cubeSelect2Listener();
- this.cubeUnselectListener();
- this.focusLastSelect($box);
- $('.alert').addClass('hidden');
- }else{
- /* trigger save btn */
- $('#save-app-btn').trigger('click');
- }
- },
- isFilledCube(){
- let anketaItems = this.model.get('AnketaItems') || [];
- let axisCount = anketaItems.length;
- let anketaCubeDicItems = this.model.get('AnketaCubeDicItems') || [];
- if(axisCount == 1){
- return false;
- }
- if(anketaCubeDicItems.length == 0){
- return false;
- }else if(anketaCubeDicItems.length > 0){
- let groupedByRow = _.groupBy(anketaCubeDicItems, 'RowNumber');
- let itemInFirstRow = groupedByRow['1'].length;
- return itemInFirstRow >= 2;
- }else{
- return true;
- }
- },
- blinkToRow(){
- let cubeSize = (this.model.get('AnketaItems')).length;
- let $allSelects = $('.select-holder-row select');
- let $box, x, y;
- switch (cubeSize){
- case 3:
- $allSelects.on('select2:selecting', function(e){
- e.preventDefault();
- $box = $('#subanswer-items .box').not('.hidden-row');
- let rowNum;
- let $visibleSelects = $box.find('.select-holder-row select');
- let firstComplexID = $visibleSelects.eq(0).attr('id');
- let parentId = $(e.currentTarget).closest('.select-cube').attr('id');
- x = e.params.args.data.id;
- if(parentId == firstComplexID){ // first axis click if true
- y = $visibleSelects.eq(1).val();
- }else{
- y = $visibleSelects.eq(0).val();
- }
- let tmp1 = [], tmp2 = [];
- _.each($allSelects, function(select){
- if(select.value == x){
- tmp1.push(getRowNum(select.id));
- }
- if(select.value == y){
- tmp2.push(getRowNum(select.id));
- }
- });
- rowNum = (_.intersection(tmp1, tmp2))[0];
- if(!rowNum){
- let error = 'Данное значение исключено правилом';
- sharedData.views.notifyModule.showError(error);
- return;
- }
- $(e.currentTarget).select2('close');
- showRow(rowNum, $box);
- });
- break;
- case 2:
- $allSelects.on('select2:selecting', function(e){
- e.preventDefault();
- let rowNum;
- $box = $('#subanswer-items .box').not('.hidden-row');
- x = e.params.args.data.id;
- _.each($allSelects, function(select){
- if(select.value == x){
- rowNum = getRowNum(select.id);
- }
- });
- if(!rowNum){
- let error = 'Данное значение исключено правилом';
- sharedData.views.notifyModule.showError(error);
- return;
- }
- $(e.currentTarget).select2('close');
- showRow(rowNum, $box);
- });
- break;
- }
- function getRowNum(complexId){
- return (complexId.split('-'))[3];
- }
- function showRow(rowNum, $box){
- $box.addClass('hidden-row');
- $('#subanswer-items .box[data-row=' + rowNum + ']').removeClass('hidden-row');
- }
- },
- splitCurrentSelecID(complexId){
- let splited = complexId.split('-');
- return {
- id: splited[1],
- row: splited[3]
- };
- },
- disableNotLastSelect($box){
- let selects = _.initial($box.find('select'));
- $(selects).prop('disabled', true);
- },
- prepareSubAnswers(axisCount){ // Step1. Based on axis count call right method
- let subAnswers = [];
- switch (axisCount){
- case 4:
- this.renderRows();
- case 3:
- this.prepare3AxisData();
- subAnswers = _.uniq(this.allValues, function(item){
- return item.RowNumber;
- });
- break;
- case 2:
- this.prepare2AxisData();
- subAnswers = _.uniq(this.allValues, function(item){
- return item.RowNumber;
- });
- break;
- case 1:
- this.renderSubForm(1);
- break;
- }
- return subAnswers;
- },
- renderRows(){
- },
- prepare3AxisData(){
- let data = [];
- let modelData;
- let model = this.model;
- if(model.get('AnketaCubeDicItems')){
- modelData = model.get('AnketaCubeDicItems');
- let firstRowData = _.where(modelData, {RowNumber: 1});
- if(firstRowData.length > 1){
- data = modelData;
- }else{
- let anketaItemID = modelData[0].AnketaItemID;
- let anketaItems = model.get("AnketaItems");
- let filteredItems = _.filter(anketaItems, function(item){
- return item.OrderBy != 3 && item.ID != anketaItemID;
- });
- let counter = 1;
- _.each(modelData, function(row){
- _.each(filteredItems[0].AnketaDicItems, function(column){
- data.push({
- AnketaDicItemID: row.AnketaDicItemID,
- AnketaDicItemName: row.AnketaDicItemName,
- AnketaItemID: row.AnketaItemID,
- CubeAnketaItemID: model.get('ID'),
- RowNumber: counter
- });
- data.push({
- AnketaDicItemID: column.ID,
- AnketaDicItemName: column.Name,
- AnketaItemID: column.AnketaItemID,
- CubeAnketaItemID: model.get('ID'),
- RowNumber: counter
- });
- counter++;
- });
- });
- }
- }else{
- data = this.addAllItems();
- }
- this.allValues = data;
- },
- prepare2AxisData(){
- let data = [];
- let model = this.model;
- let anketaCubeDicItems = model.get('AnketaCubeDicItems');
- if(anketaCubeDicItems){
- data = anketaCubeDicItems;
- }else{
- let anketaItems = _.sortBy(model.get('AnketaItems'), "OrderBy");
- let tr = _.sortBy(anketaItems[0].AnketaDicItems, "OrderBy");
- _.each(tr, function(row, r_index){
- data.push({
- AnketaDicItemID: row.ID,
- AnketaDicItemName: row.Name,
- AnketaItemID: row.AnketaItemID,
- CubeAnketaItemID: model.get('ID'),
- RowNumber: r_index + 1
- });
- });
- }
- this.allValues = data;
- },
- addAllItems(){
- let allAnketaItems = [];
- let model = this.model;
- let anketaItems = _.sortBy(model.get('AnketaItems'), "OrderBy");
- let tr = _.sortBy(anketaItems[0].AnketaDicItems, "OrderBy");
- let td = _.sortBy(anketaItems[1].AnketaDicItems, "OrderBy");
- let counter = 1;
- _.each(tr, function(row){
- _.each(td, function(column){
- allAnketaItems.push({
- AnketaDicItemID: row.ID,
- AnketaDicItemName: row.Name,
- AnketaItemID: row.AnketaItemID,
- CubeAnketaItemID: model.get('ID'),
- RowNumber: counter
- });
- allAnketaItems.push({
- AnketaDicItemID: column.ID,
- AnketaDicItemName: column.Name,
- AnketaItemID: column.AnketaItemID,
- CubeAnketaItemID: model.get('ID'),
- RowNumber: counter
- });
- counter++;
- });
- });
- return allAnketaItems;
- },
- setSelectsWidth(selects) {
- let $box_holder = $('#subanswer-items .box');
- let setWidth = (selects) => {
- if (selects.length == 1) {
- selects.css('width', '96%');
- } else if (selects.length > 1) {
- _.each(selects, (item) => {
- $(item).css('width', 'calc(100%/2.1)');
- })
- }
- };
- if (selects) {
- setWidth(selects);
- } else {
- _.each($box_holder, (box) => {
- let $selects_row = $('.select-holder-row', $(box));
- setWidth($selects_row)
- });
- }
- },
- focusLastSelect($box){
- let $lastSelect = $box.find('.select-holder-last select');
- $lastSelect.select2('open');
- return false;
- },
- focusEmptySelect() {
- $.each(this.$select, (value, item) => {
- let $item = $(item);
- if ($item.val() == null) {
- $item.select2('focus');
- return false;
- }
- });
- },
- sortController(e) {
- let that = this;
- let $select;
- if (e.keyCode === 33 || e.keyCode === 34) {
- e.preventDefault();
- _.each(that.$select, (select) => {
- if ($(select).data('select2').isOpen()) {
- $select = $(select);
- }
- });
- _.each($('#subanswer-items .box'), (item) => {
- let row = $(item).data('row');
- if (e.keyCode === 33 && e.shiftKey === false) {
- that.sortByAlphabet(e, row);
- }
- if (e.keyCode === 33 && e.shiftKey === true) {
- that.sortByNumber(e, row);
- }
- if (e.keyCode === 34 && e.shiftKey === false) {
- that.sortByAlphabet(e, row, "reverse");
- }
- if (e.keyCode === 34 && e.shiftKey === true) {
- that.sortByNumber(e, row, "reverse");
- }
- });
- if ($select) {
- $select.select2('close');
- $select.select2('open');
- }
- }
- },
- callbackAfterInsertKey() {
- let $visibleBox = $('#subanswer-items .box').not('.hidden-row');
- let $alternativeInput = $visibleBox.find('.value-input');
- let $lastSelect = $visibleBox.find('.select-holder-last select');
- $lastSelect.select2('close');
- $alternativeInput.focus();
- },
- cubeSelect2Listener() {
- let that = this;
- //let $select2Inputs = $('.select2-search > input');
- let $visibleBox = $('#subanswer-items .box').not('.hidden-row');
- let $select2search = $visibleBox.find('.select2-search');
- let $select2Input = $select2search.find('input');
- let $select = $visibleBox.find('.select-holder-last select');
- //$select2Inputs.unbind('keydown');
- $select2search.on('keydown', $select2Input,function(e){
- if (e.keyCode === 32 || e.keyCode === 35) {
- e.preventDefault();
- $select.data('select2').trigger('results:select');
- that.cubeSelect2Listener();
- }
- if (e.keyCode === 13) {
- e.stopImmediatePropagation();
- e.preventDefault();
- if (!(e.originalEvent.code == "NumpadEnter")) {
- e.target.value += " ";
- }
- }
- });
- },
- cubeUnselectListener(){
- let that = this;
- let $visibleBox = $('#subanswer-items .box').not('.hidden-row');
- let $select = $visibleBox.find('.select-holder-last select');
- $select.on('unselectSelect2', function(e){
- that.cubeSelect2Listener();
- });
- },
- select2EnterKeySortListener() {
- let that = this;
- let $select2Inputs = $('.select2-search > input');
- let endKey = 35;
- _.each($select2Inputs, ($select2) => {
- let $select = $($select2);
- $select.unbind('keydown.End');
- $select.unbind('keydown.PgUp');
- $select.unbind('keydown.Insert');
- $select.on('keydown.End', (e) => {
- if (e.keyCode === endKey) {
- let $box = $('#subanswer-items .box');
- let $visible = $box.not('.hidden-row');
- let $last = $visible.find('.select-holder-last select');
- $last.data('select2').trigger('results:select');
- e.preventDefault();
- that.showNextRow();
- }
- });
- $select.on('keydown.PgUp', (e) => {
- that.keyDownEvent = true;
- that.sortController(e);
- });
- $select.on('keydown.Insert', function (e) {
- if (e.keyCode === 45) {
- that.callbackAfterInsertKey();
- }
- });
- });
- },
- setAddButtonListener() {
- let that = this;
- $('.value-input').on('keydown', function (e) {
- if (e.keyCode === 32 || e.keyCode === 35 || (e.keyCode === 13 && e.originalEvent.code == "NumpadEnter")) {
- that.addItemToSelect(e);
- let dataSelect = $(e.currentTarget).data('select');
- let select2 = $('#' + dataSelect);
- select2.trigger('nextSelect');
- that.select2EnterKeySortListener();
- }
- if (e.keyCode === 13) {
- e.target.value += " ";
- }
- });
- $(document).on('keydown.Insert', function (e) {
- if (e.keyCode === 45) {
- that.callbackAfterInsertKey();
- }
- });
- },
- setSortListeners() {
- let that = this;
- $(document).on('keydown', (e) => {
- if (that.keyDownEvent) {
- that.keyDownEvent = false;
- return;
- }
- that.sortController(e);
- });
- },
- openNextSelect(e) {
- this.cubeSelect2Listener();
- if (e.target.id.split('-')[0] === 'axis') {
- let $selects = $('select');
- $selects.eq($selects.index( $(e.target) ) + 1 ).select2('focus');
- }
- },
- setListeners() {
- let endKey = 35;
- this.model.on("invalid", this.showErrors);
- $(document).on('keydown', (e) => {
- if (e.keyCode === endKey) {
- e.preventDefault();
- this.showNextRow();
- }
- })
- },
- showErrors (model, error) {
- if (!model) {return;}
- let $el = $('#subanswer-items .box').not('.hidden-row').find('.select-holder-last select');
- $el.select2('open');
- sharedData.views.notifyModule.showError(error);
- },
- renderSubForm(subanswerID) {
- let selectsData = _.sortBy(this.model.get('AnketaItems'), (values) => {
- return values.OrderBy;
- });
- let lastSelect = _.last(selectsData);
- let openAnswer = _.findWhere(selectsData, {IsAnketaDicItemsExtendable: 1});
- $('#subanswer-items').append(this.subtemplate({
- data: {
- selectsIDs: _.pluck(selectsData, "ID"),
- subanswerID: subanswerID,
- subanswerName: _.pluck(selectsData, "Name"),
- openAnswer: openAnswer ? true : false,
- Pattern: lastSelect.Pattern
- }
- }));
- this.setSelect2Data(subanswerID, selectsData);
- },
- formatData(data) {
- _.forEach(data, (value, key) => {
- data[key].id = value.ID;
- data[key].text = value.OrderBy + ' ' + value.Name;
- });
- return data;
- },
- getValues() {
- let values = [];
- let rowNumbers = this.getRowNumbers();
- _.each(rowNumbers, (row) => {
- _.each(this.dictionaries, (item, key) => {
- let id = "axis-" + key + "-subans-" + row;
- let selectValues = $('#' + id).val();
- if (selectValues) {
- if (typeof selectValues === "string") {
- values.push({
- "AnketaItemID": +key,
- "AnketaDicItemID": parseInt(selectValues, 10),
- "RowNumber": row
- })
- } else {
- selectValues = this.formatNumbersInArray(selectValues);
- _.each(selectValues, (value) => {
- if (typeof value === 'string') {
- let newItems = _.where(item, {"newID": value});
- let name = newItems && newItems[newItems.length - 1].AnketaDicItemName;
- values.push({
- "AnketaItemID": +key,
- "AnketaDicItemID": null,
- "AnketaDicItemName": name,
- "RowNumber": row
- })
- } else {
- values.push({
- "AnketaItemID": +key,
- "AnketaDicItemID": value,
- "RowNumber": row
- })
- }
- });
- }
- }
- });
- });
- return values;
- },
- formatNumbersInArray(values) {
- let newValues = [];
- _.each(values, (value) => {
- newValues.push(parseInt(value, 10) || value);
- });
- return newValues;
- },
- setModelValues() {
- let values = this.getValues();
- this.model.set("AnketaCubeDicItems", values);
- },
- addNewSubanswerForm () {
- let $selects;
- let rowNumbers;
- let newSubanswerID;
- let $selects_row;
- let values = this.getValues();
- if (values.length < this.model.get('axes')*this.subAnswersLength) {
- alert('Необходимо заполнить уже существующие оси');
- return;
- }
- this.subAnswersLength++;
- this.model.set("subAnswersLength", this.subAnswersLength);
- this.model.set("AnketaCubeDicItems", values);
- rowNumbers = this.getRowNumbers();
- newSubanswerID = rowNumbers.length < 1 ? 1 : _.max(rowNumbers) + 1;
- this.renderSubForm(newSubanswerID);
- $selects_row = $('.box [data-row="' + newSubanswerID + '"] .select-holder-row');
- $selects = $('select', $selects_row);
- this.setSelectsWidth($selects_row);
- $($selects[0]).select2('focus');
- $('.value-input').unbind('keydown');
- $(document).unbind('keydown.Insert');
- this.setAddButtonListener();
- },
- getRowNumbers() {
- let rowNumbers = [];
- let $subAnswersRows = $("#subanswer-items .box");
- _.each($subAnswersRows, item => {
- rowNumbers.push($(item).data('row'));
- });
- return rowNumbers;
- },
- deleteSubanswerForm(e) {
- let row = $(e.target.parentNode).data("row");
- let cubeObjects = this.model.get("AnketaCubeDicItems");
- cubeObjects = _.filter(cubeObjects, (item) => {
- return item.RowNumber !== row;
- });
- this.subAnswersLength--;
- this.model.set("subAnswersLength", this.subAnswersLength);
- this.model.set("AnketaCubeDicItems", cubeObjects);
- $(e.target.parentNode).remove();
- },
- setSelect2Data(subanswerID, selectsData, sortMethod, reverse) {
- let self = this;
- //let values = this.allValues;
- let values = self.model.get('AnketaItems');
- _.each(selectsData, (item) => {
- // find value for current select by select ID
- let value = values && _.where(values, {AnketaItemID: item.ID, RowNumber: subanswerID});
- let id = '#axis-' + item.ID + '-subans-' + subanswerID;
- // default params for select factory
- let select2params = {
- select: id,
- data: (() => {
- return self.sortData(sortMethod, item, reverse)
- })()
- };
- // set selected values into selects
- if (value) {
- select2params.values = [];
- select2params.labels = [];
- _.each(value, (obj) => {
- if (obj.RowNumber) {
- let currentItem = _.findWhere(self.dictionaries[item.ID], { ID : obj.AnketaDicItemID});
- if (!currentItem) {
- currentItem = _.findWhere(self.dictionaries[item.ID], { Name : obj.AnketaDicItemName})
- }
- select2params.values.push(obj && obj.AnketaDicItemID || 'new.' + obj.AnketaDicItemName);
- select2params.labels.push(currentItem.text || currentItem.AnketaDicItemName);
- }
- })
- }
- $(id).empty();
- select2Factory(select2params);
- if (value.length < 1 || !value[0] && !value[0].RowNumber) $(id).val('').trigger('change');
- });
- },
- sortData(sortMethod, item, reverse) {
- let data;
- switch (sortMethod) {
- case "byAlphabet":
- data =_.sortBy(this.dictionaries[item.ID], value => {
- return value.Name.toLowerCase();
- });
- if (reverse) { data.reverse(); }
- return data;
- case "byNumber":
- data = _.sortBy(this.dictionaries[item.ID], value => {
- return value.OrderBy;
- });
- if (reverse) { data.reverse(); }
- return data;
- default:
- return this.dictionaries[item.ID]
- }
- },
- sortByNumber(e, currentRow, reverse) {
- let row = currentRow ? currentRow : $(e.target.parentNode).data("row");
- $(".alphabet-sort-btn", ".list-sort-buttons[data-row='" + row +"']").removeClass('active');
- $(".number-sort-btn", ".list-sort-buttons[data-row='" + row +"']").addClass('active');
- this.prepareToSort(row, "byNumber", reverse);
- },
- sortByAlphabet(e, currentRow, reverse) {
- let row = currentRow ? currentRow : $(e.target.parentNode).data("row");
- $(".alphabet-sort-btn", ".list-sort-buttons[data-row='" + row +"']").addClass('active');
- $(".number-sort-btn", ".list-sort-buttons[data-row='" + row +"']").removeClass('active');
- this.prepareToSort(row, "byAlphabet", reverse);
- },
- prepareToSort(row, sortMethod, reverse) {
- let selectsData = _.sortBy(this.model.get('AnketaItems'), (values) => {
- return values.OrderBy;
- });
- this.setSelect2Data(row, selectsData, sortMethod, reverse);
- },
- getLastVisibleSelect(){
- return $('#subanswer-items .box').not('.hidden-row').find('.select-holder-last select');
- },
- addItemToSelect(e) {
- e.preventDefault();
- let select2params, anketaItemId, newValue, isExist;
- let dataSelect = $(e.currentTarget).data('select');
- let select2 = $('#' + dataSelect);
- let $input = $('.open-item-wrap input[data-select="'+ dataSelect +'"]');
- let name = $input.val();
- let orderNum = (select2.find('option')).length + 1;
- let $lastSelects = $('#subanswer-items .box .select-holder-last select');
- let splitedDataSelect = this.splitCurrentSelecID(dataSelect);
- let selectID = splitedDataSelect.id;
- let selectRow = splitedDataSelect.row;
- let options = this.dictionaries[selectID];
- if (name === "") { return; }
- /* if value exist just add it to select */
- _.each(options, (option) => {
- if(name.toLowerCase() == (option.Name).toLowerCase()){
- let $lastSelect = this.getLastVisibleSelect();
- let selectedValues = $lastSelect.val() || [];
- selectedValues.push(option.id);
- $lastSelect.val(selectedValues).trigger('change');
- $input.val('');
- isExist = true;
- }
- });
- if(isExist) return;
- /* */
- let option = new Option(name, 'new.' + name, true, true);
- let modelValues = this.model.get('AnketaCubeDicItems');
- let selectValues = modelValues && _.where(modelValues, {AnketaItemID: +selectID, RowNumber: +selectRow}) || [];
- selectValues = _.map(selectValues, (value) => {
- let currentItem = _.findWhere(this.dictionaries[selectID], {ID: value.AnketaDicItemID});
- let orderBy = currentItem && currentItem.OrderBy;
- value.id = value.AnketaDicItemID || _.findWhere(this.dictionaries[selectID], {AnketaDicItemName: value.AnketaDicItemName}).newID;
- value.text = orderBy && orderBy + ' ' + currentItem.Name || value.AnketaDicItemName;
- value.OrderBy = orderBy;
- anketaItemId = value.AnketaItemID;
- return value;
- });
- newValue = {
- id: option.value,
- text: orderNum + " " + option.text,
- Name: option.text,
- AnketaDicItemID: null,
- AnketaDicItemName: option.text,
- AnketaItemId: anketaItemId,
- newID: option.value,
- RowNumber: selectRow
- };
- this.dictionaries[selectID].push(newValue);
- selectValues.push(newValue);
- select2params = {
- select: select2,
- data: this.dictionaries[selectID]
- };
- select2params.values = _.pluck(selectValues, 'id');
- select2params.labels = _.pluck(selectValues, 'text');
- $input.val('');
- select2.empty();
- select2Factory(select2params);
- /* Add new value to all another last select */
- _.each($lastSelects, (select) => {
- let $select = $(select);
- let selectID = $select.attr('id');
- let currentSelect = this.splitCurrentSelecID(selectID);
- let id = currentSelect.id;
- if(selectID != dataSelect ){
- let params = {
- select: $select,
- data: this.dictionaries[id]
- };
- let values = $select.val() || [];
- let labels = [];
- let $selectedOption = $select.find('option:selected');
- _.each($selectedOption, function(option){
- let label = $(option).text();
- if(label){
- labels.push(label);
- }
- });
- params.values = values;
- params.labels = labels;
- $(select).empty();
- select2Factory(params);
- }
- });
- /* */
- this.setModelValues();
- select2.select2('focus');
- }
- });
RAW Paste Data

