daily pastebin goal
41%
SHARE
TWEET

4-5axis

a guest Jan 29th, 2018 59 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import sharedData from "./../sharedData"
  2. import select2Factory from "../helpers/select2Factory";
  3.  
  4. var t = require("text!../templates/AnketaItemsCube.tpl");
  5. var subtemplate = require("text!../templates/AnketaItemsSubCube.tpl");
  6.  
  7. export default Backbone.View.extend({
  8.     events: {
  9.         "click .add-new-item-btn": "addItemToSelect",
  10.         "click #add-subanswer-btn": "addNewSubanswerForm",
  11.         "click #next-row": "showNextRow",
  12.         "click #prev-row": "showPrevRow",
  13.         "click .delete-subanswer": "deleteSubanswerForm",
  14.         "click .alphabet-sort-btn": "sortByAlphabet",
  15.         "click .number-sort-btn": "sortByNumber",
  16.         "selectSelect2 select": "setModelValues",
  17.         "unselectSelect2 select": "setModelValues",
  18.         "nextSelect select": "openNextSelect",
  19.         "openSelect2 select": "select2EnterKeySortListener"
  20.     },
  21.  
  22.     initialize() {
  23.         this.dictionaries = {};
  24.         this.template = _.template(t);
  25.         this.subtemplate = _.template(subtemplate);
  26.         this.allValues = [];
  27.         this.change = true;
  28.         this.isFilled = false;
  29.     },
  30.  
  31.     /**
  32.      * https://teamtrack.macc.com.ua/view.php?id=55133#217913
  33.      * Edit in vendor library - web-client\node_modules\select2\dist\js\select2.js
  34.      * Lines :4286, :4287
  35.      *  var enoughRoomAbove = false;
  36.      *  var enoughRoomBelow = true;
  37.      * Library edit, because there is no other predefined way to set dropdown position below
  38.      * */
  39.  
  40.     excludeByRule(data, answers){
  41.         let excludedData = _.filter(data, function (column) {
  42.             return false;
  43.         });
  44.  
  45.         let dataIds = _.pluck(data, "ID");
  46.  
  47.        
  48.  
  49.  
  50.         return excludedData;
  51.     },
  52.  
  53.     render() {
  54.         let model = this.model;
  55.         let data = model.get('AnketaItems');
  56.         let answers = model.get('AnketaCubeDicItems');
  57.         let cubeLength = data.length;
  58.  
  59.        /* if(answers && cubeLength > 1){
  60.            data = this.excludeByRule(data, answers);
  61.         }*/
  62.  
  63.         this.$el.empty();
  64.         this.$el.html(this.template({axisCount: cubeLength}));
  65.         $('#question-area').empty().html(this.$el);
  66.  
  67.         _.each(data, (item) => {
  68.             let itemData = item.AnketaDicItems;
  69.             this.dictionaries[item.ID] = _.sortBy(this.formatData(itemData), "OrderBy");
  70.         });
  71.  
  72.  
  73.         if (this.dictionaries) { // add all items at this moment
  74.             _.each(this.dictionaries, (item) => {
  75.                 this.renderSubForm(item.RowNumber);
  76.             });
  77.         }
  78.  
  79.         console.log(this.dictionaries);
  80.  
  81.         /*let subAnswers;
  82.         let model = this.model;
  83.         let selectsData = model.get('AnketaItems') || [];
  84.  
  85.         this.$el.empty();
  86.         // render main view
  87.         this.$el.html(this.template({axisCount: selectsData.length}));
  88.         $('#question-area').empty().html(this.$el);
  89.  
  90.         $(document).unbind('keypress');
  91.         $(document).unbind('keydown');
  92.         this.setListeners();
  93.  
  94.         // set count of axes in cube
  95.         model.set("axes", selectsData.length);
  96.  
  97.         _.each(selectsData, (item) => {
  98.             let data = item.AnketaDicItems;
  99.             this.dictionaries[item.ID] = _.sortBy(this.formatData(data), (value) => {
  100.                 return value.OrderBy;
  101.             });
  102.         });
  103.  
  104.         subAnswers = this.prepareSubAnswers(selectsData.length);
  105.  
  106.         this.subAnswersLength = _.pairs(subAnswers).length;
  107.         model.set("subAnswersLength", this.subAnswersLength);
  108.  
  109.         if (subAnswers) { // add all items at this moment
  110.             _.each(subAnswers, (item) => {
  111.                 this.renderSubForm(item.RowNumber || 999)
  112.             });
  113.         } else {
  114.             this.addNewSubanswerForm()
  115.         }
  116.  
  117.         let $boxes = $('#subanswer-items .box');
  118.         let $box = $boxes.not('.hidden-row');
  119.  
  120.         this.setSelectsWidth();
  121.         this.$select = $('select');
  122.         this.select2EnterKeySortListener();
  123.         this.setSortListeners();
  124.         this.setAddButtonListener();
  125.  
  126.         this.isFilled = this.isFilledCube();
  127.  
  128.         if(!this.isFilled) {
  129.             this.disableNotLastSelect($box);
  130.         }
  131.  
  132.         this.cubeSelect2Listener();
  133.         this.cubeUnselectListener();
  134.  
  135.         this.blinkToRow();
  136.          */
  137.         return this;
  138.     },
  139.  
  140.     showPrevRow(){
  141.         let $rows = $('#subanswer-items .box');
  142.         let $visible = $rows.not('.hidden-row');
  143.         let rowNumber = $visible.attr('data-row');
  144.         let $lastSelect = $visible.find('select').last();
  145.         let label = $lastSelect.siblings('label').text();
  146.         let val = $lastSelect.val();
  147.         let empty = !(val instanceof Array);
  148.  
  149.         if(empty){
  150.             /* fill required input */
  151.             let error = 'Заполните поле "' + label + '"';
  152.             sharedData.views.notifyModule.showError(error);
  153.         }else if(rowNumber > 1){
  154.             /* go to the prev step */
  155.             rowNumber--;
  156.             $visible.addClass('hidden-row');
  157.             $('#subanswer-items .box[data-row="' + rowNumber + '"]').removeClass('hidden-row');
  158.  
  159.             let $box = $('#subanswer-items .box').not('.hidden-row');
  160.  
  161.             if(!this.isFilled) {
  162.                 this.disableNotLastSelect($box);
  163.             }
  164.  
  165.             this.cubeSelect2Listener();
  166.             this.cubeUnselectListener();
  167.             this.focusLastSelect($box);
  168.             $('.alert').addClass('hidden');
  169.         }else{
  170.             /* trigger save btn */
  171.             $('#save-app-btn').trigger('click');
  172.         }
  173.     },
  174.  
  175.     showNextRow(){
  176.         let $rows = $('#subanswer-items .box');
  177.         let rowsCount = $rows.length;
  178.         let $visible = $rows.not('.hidden-row');
  179.         let rowNumber = $visible.attr('data-row');
  180.         let $lastSelect = $visible.find('select').last();
  181.         let label = $lastSelect.siblings('label').text();
  182.         let val = $lastSelect.val();
  183.         let empty = !(val instanceof Array);
  184.  
  185.         if(empty){
  186.             /* fill required input */
  187.             let error = 'Заполните поле "' + label + '"';
  188.             sharedData.views.notifyModule.showError(error);
  189.         }else if(rowNumber < rowsCount){
  190.             /* go to the next step */
  191.             rowNumber++;
  192.             $visible.addClass('hidden-row');
  193.             $('#subanswer-items .box[data-row="' + rowNumber + '"]').removeClass('hidden-row');
  194.  
  195.             let $box = $('#subanswer-items .box').not('.hidden-row');
  196.  
  197.             if(!this.isFilled) {
  198.                 this.disableNotLastSelect($box);
  199.             }
  200.  
  201.             this.cubeSelect2Listener();
  202.             this.cubeUnselectListener();
  203.             this.focusLastSelect($box);
  204.             $('.alert').addClass('hidden');
  205.         }else{
  206.             /* trigger save btn */
  207.             $('#save-app-btn').trigger('click');
  208.         }
  209.     },
  210.  
  211.     isFilledCube(){
  212.         let anketaItems = this.model.get('AnketaItems') || [];
  213.         let axisCount = anketaItems.length;
  214.         let anketaCubeDicItems = this.model.get('AnketaCubeDicItems') || [];
  215.  
  216.         if(axisCount == 1){
  217.             return false;
  218.         }
  219.  
  220.         if(anketaCubeDicItems.length == 0){
  221.             return false;
  222.         }else if(anketaCubeDicItems.length > 0){
  223.             let groupedByRow = _.groupBy(anketaCubeDicItems, 'RowNumber');
  224.             let itemInFirstRow = groupedByRow['1'].length;
  225.  
  226.             return itemInFirstRow >= 2;
  227.  
  228.         }else{
  229.             return true;
  230.         }
  231.     },
  232.  
  233.     blinkToRow(){
  234.         let cubeSize = (this.model.get('AnketaItems')).length;
  235.         let $allSelects = $('.select-holder-row select');
  236.         let $box, x, y;
  237.  
  238.         switch (cubeSize){
  239.             case 3:
  240.                 $allSelects.on('select2:selecting', function(e){
  241.                     e.preventDefault();
  242.                     $box = $('#subanswer-items .box').not('.hidden-row');
  243.                     let rowNum;
  244.                     let $visibleSelects = $box.find('.select-holder-row select');
  245.                     let firstComplexID = $visibleSelects.eq(0).attr('id');
  246.                     let parentId = $(e.currentTarget).closest('.select-cube').attr('id');
  247.  
  248.                     x = e.params.args.data.id;
  249.  
  250.                     if(parentId == firstComplexID){ // first axis click if true
  251.                         y = $visibleSelects.eq(1).val();
  252.                     }else{
  253.                         y = $visibleSelects.eq(0).val();
  254.                     }
  255.  
  256.                     let tmp1 = [], tmp2 = [];
  257.                     _.each($allSelects, function(select){
  258.                         if(select.value == x){
  259.                             tmp1.push(getRowNum(select.id));
  260.                         }
  261.                         if(select.value == y){
  262.                             tmp2.push(getRowNum(select.id));
  263.                         }
  264.                     });
  265.  
  266.                     rowNum = (_.intersection(tmp1, tmp2))[0];
  267.  
  268.                     if(!rowNum){
  269.                         let error = 'Данное значение исключено правилом';
  270.                         sharedData.views.notifyModule.showError(error);
  271.                         return;
  272.                     }
  273.  
  274.                     $(e.currentTarget).select2('close');
  275.                     showRow(rowNum, $box);
  276.                 });
  277.                 break;
  278.             case 2:
  279.                 $allSelects.on('select2:selecting', function(e){
  280.                     e.preventDefault();
  281.                     let rowNum;
  282.                     $box = $('#subanswer-items .box').not('.hidden-row');
  283.                     x = e.params.args.data.id;
  284.  
  285.                     _.each($allSelects, function(select){
  286.                         if(select.value == x){
  287.                             rowNum = getRowNum(select.id);
  288.                         }
  289.                     });
  290.  
  291.                     if(!rowNum){
  292.                         let error = 'Данное значение исключено правилом';
  293.                         sharedData.views.notifyModule.showError(error);
  294.                         return;
  295.                     }
  296.  
  297.                     $(e.currentTarget).select2('close');
  298.                     showRow(rowNum, $box);
  299.  
  300.                 });
  301.                 break;
  302.         }
  303.  
  304.         function getRowNum(complexId){
  305.             return (complexId.split('-'))[3];
  306.         }
  307.  
  308.         function showRow(rowNum, $box){
  309.             $box.addClass('hidden-row');
  310.             $('#subanswer-items .box[data-row=' + rowNum + ']').removeClass('hidden-row');
  311.         }
  312.     },
  313.  
  314.     splitCurrentSelecID(complexId){
  315.         let splited = complexId.split('-');
  316.         return {
  317.             id: splited[1],
  318.             row: splited[3]
  319.         };
  320.     },
  321.  
  322.     disableNotLastSelect($box){
  323.         let selects = _.initial($box.find('select'));
  324.  
  325.         $(selects).prop('disabled', true);
  326.     },
  327.  
  328.     prepareSubAnswers(axisCount){  // Step1. Based on axis count call right method
  329.         let subAnswers = [];
  330.  
  331.         switch (axisCount){
  332.             case 4:
  333.                 this.renderRows();
  334.             case 3:
  335.                 this.prepare3AxisData();
  336.                 subAnswers = _.uniq(this.allValues, function(item){
  337.                     return item.RowNumber;
  338.                 });
  339.                 break;
  340.             case 2:
  341.                 this.prepare2AxisData();
  342.                 subAnswers = _.uniq(this.allValues, function(item){
  343.                     return item.RowNumber;
  344.                 });
  345.                 break;
  346.             case 1:
  347.                 this.renderSubForm(1);
  348.                 break;
  349.         }
  350.  
  351.         return subAnswers;
  352.     },
  353.     renderRows(){
  354.  
  355.     },
  356.  
  357.     prepare3AxisData(){
  358.         let data = [];
  359.         let modelData;
  360.         let model = this.model;
  361.  
  362.         if(model.get('AnketaCubeDicItems')){
  363.             modelData = model.get('AnketaCubeDicItems');
  364.             let firstRowData = _.where(modelData, {RowNumber: 1});
  365.             if(firstRowData.length > 1){
  366.                 data = modelData;
  367.             }else{
  368.                 let anketaItemID = modelData[0].AnketaItemID;
  369.                 let anketaItems = model.get("AnketaItems");
  370.                 let filteredItems = _.filter(anketaItems, function(item){
  371.                     return item.OrderBy != 3 && item.ID != anketaItemID;
  372.                 });
  373.                 let counter = 1;
  374.  
  375.                 _.each(modelData, function(row){
  376.                     _.each(filteredItems[0].AnketaDicItems, function(column){
  377.                         data.push({
  378.                             AnketaDicItemID: row.AnketaDicItemID,
  379.                             AnketaDicItemName: row.AnketaDicItemName,
  380.                             AnketaItemID: row.AnketaItemID,
  381.                             CubeAnketaItemID: model.get('ID'),
  382.                             RowNumber: counter
  383.                         });
  384.                         data.push({
  385.                             AnketaDicItemID: column.ID,
  386.                             AnketaDicItemName: column.Name,
  387.                             AnketaItemID: column.AnketaItemID,
  388.                             CubeAnketaItemID: model.get('ID'),
  389.                             RowNumber: counter
  390.                         });
  391.                         counter++;
  392.                     });
  393.                 });
  394.             }
  395.         }else{
  396.             data = this.addAllItems();
  397.         }
  398.  
  399.         this.allValues = data;
  400.     },
  401.  
  402.     prepare2AxisData(){
  403.         let data = [];
  404.         let model = this.model;
  405.         let anketaCubeDicItems = model.get('AnketaCubeDicItems');
  406.  
  407.         if(anketaCubeDicItems){
  408.             data = anketaCubeDicItems;
  409.         }else{
  410.             let anketaItems = _.sortBy(model.get('AnketaItems'), "OrderBy");
  411.             let tr = _.sortBy(anketaItems[0].AnketaDicItems, "OrderBy");
  412.  
  413.             _.each(tr, function(row, r_index){
  414.                 data.push({
  415.                     AnketaDicItemID: row.ID,
  416.                     AnketaDicItemName: row.Name,
  417.                     AnketaItemID: row.AnketaItemID,
  418.                     CubeAnketaItemID: model.get('ID'),
  419.                     RowNumber: r_index + 1
  420.                 });
  421.             });
  422.         }
  423.         this.allValues = data;
  424.     },
  425.  
  426.     addAllItems(){
  427.         let allAnketaItems = [];
  428.         let model = this.model;
  429.         let anketaItems = _.sortBy(model.get('AnketaItems'), "OrderBy");
  430.  
  431.         let tr = _.sortBy(anketaItems[0].AnketaDicItems, "OrderBy");
  432.         let td = _.sortBy(anketaItems[1].AnketaDicItems, "OrderBy");
  433.  
  434.         let counter = 1;
  435.  
  436.         _.each(tr, function(row){
  437.             _.each(td, function(column){
  438.                 allAnketaItems.push({
  439.                     AnketaDicItemID: row.ID,
  440.                     AnketaDicItemName: row.Name,
  441.                     AnketaItemID: row.AnketaItemID,
  442.                     CubeAnketaItemID: model.get('ID'),
  443.                     RowNumber: counter
  444.                 });
  445.                 allAnketaItems.push({
  446.                     AnketaDicItemID: column.ID,
  447.                     AnketaDicItemName: column.Name,
  448.                     AnketaItemID: column.AnketaItemID,
  449.                     CubeAnketaItemID: model.get('ID'),
  450.                     RowNumber: counter
  451.                 });
  452.                 counter++;
  453.             });
  454.         });
  455.         return allAnketaItems;
  456.     },
  457.  
  458.     setSelectsWidth(selects) {
  459.         let $box_holder = $('#subanswer-items .box');
  460.         let setWidth = (selects) => {
  461.             if (selects.length == 1) {
  462.                 selects.css('width', '96%');
  463.             } else if (selects.length > 1) {
  464.                 _.each(selects, (item) => {
  465.                     $(item).css('width', 'calc(100%/2.1)');
  466.                 })
  467.             }
  468.         };
  469.  
  470.         if (selects) {
  471.             setWidth(selects);
  472.         } else {
  473.             _.each($box_holder, (box) => {
  474.                 let $selects_row = $('.select-holder-row', $(box));
  475.                 setWidth($selects_row)
  476.             });
  477.         }
  478.     },
  479.  
  480.     focusLastSelect($box){
  481.         let $lastSelect = $box.find('.select-holder-last select');
  482.         $lastSelect.select2('open');
  483.         return false;
  484.     },
  485.  
  486.     focusEmptySelect() {
  487.         $.each(this.$select, (value, item) => {
  488.             let $item = $(item);
  489.             if ($item.val() == null) {
  490.                 $item.select2('focus');
  491.                 return false;
  492.             }
  493.         });
  494.     },
  495.  
  496.     sortController(e) {
  497.         let that = this;
  498.         let $select;
  499.  
  500.         if (e.keyCode === 33 || e.keyCode === 34) {
  501.             e.preventDefault();
  502.  
  503.             _.each(that.$select, (select) => {
  504.                 if ($(select).data('select2').isOpen()) {
  505.                     $select = $(select);
  506.                 }
  507.             });
  508.  
  509.             _.each($('#subanswer-items .box'), (item) => {
  510.                 let row = $(item).data('row');
  511.                 if (e.keyCode === 33 && e.shiftKey === false) {
  512.                     that.sortByAlphabet(e, row);
  513.                 }
  514.                 if (e.keyCode === 33 && e.shiftKey === true) {
  515.                     that.sortByNumber(e, row);
  516.                 }
  517.                 if (e.keyCode === 34 && e.shiftKey === false) {
  518.                     that.sortByAlphabet(e, row, "reverse");
  519.                 }
  520.                 if (e.keyCode === 34 && e.shiftKey === true) {
  521.                     that.sortByNumber(e, row, "reverse");
  522.                 }
  523.             });
  524.  
  525.             if ($select) {
  526.                 $select.select2('close');
  527.                 $select.select2('open');
  528.             }
  529.         }
  530.     },
  531.  
  532.     callbackAfterInsertKey() {
  533.         let $visibleBox = $('#subanswer-items .box').not('.hidden-row');
  534.         let $alternativeInput = $visibleBox.find('.value-input');
  535.         let $lastSelect = $visibleBox.find('.select-holder-last select');
  536.         $lastSelect.select2('close');
  537.         $alternativeInput.focus();
  538.     },
  539.  
  540.     cubeSelect2Listener() {
  541.         let that = this;
  542.         //let $select2Inputs = $('.select2-search > input');
  543.         let $visibleBox = $('#subanswer-items .box').not('.hidden-row');
  544.         let $select2search = $visibleBox.find('.select2-search');
  545.         let $select2Input = $select2search.find('input');
  546.         let $select = $visibleBox.find('.select-holder-last select');
  547.  
  548.         //$select2Inputs.unbind('keydown');
  549.  
  550.         $select2search.on('keydown', $select2Input,function(e){
  551.             if (e.keyCode === 32 || e.keyCode === 35) {
  552.                 e.preventDefault();
  553.                 $select.data('select2').trigger('results:select');
  554.                 that.cubeSelect2Listener();
  555.             }
  556.             if (e.keyCode === 13) {
  557.                 e.stopImmediatePropagation();
  558.                 e.preventDefault();
  559.                 if (!(e.originalEvent.code == "NumpadEnter")) {
  560.                     e.target.value += " ";
  561.                 }
  562.             }
  563.         });
  564.     },
  565.  
  566.     cubeUnselectListener(){
  567.         let that = this;
  568.         let $visibleBox = $('#subanswer-items .box').not('.hidden-row');
  569.         let $select = $visibleBox.find('.select-holder-last select');
  570.  
  571.         $select.on('unselectSelect2', function(e){
  572.             that.cubeSelect2Listener();
  573.         });
  574.     },
  575.  
  576.     select2EnterKeySortListener() {
  577.         let that = this;
  578.         let $select2Inputs = $('.select2-search > input');
  579.         let endKey = 35;
  580.  
  581.         _.each($select2Inputs, ($select2) => {
  582.             let $select = $($select2);
  583.  
  584.             $select.unbind('keydown.End');
  585.             $select.unbind('keydown.PgUp');
  586.             $select.unbind('keydown.Insert');
  587.  
  588.             $select.on('keydown.End', (e) => {
  589.                 if (e.keyCode === endKey) {
  590.                     let $box = $('#subanswer-items .box');
  591.                     let $visible = $box.not('.hidden-row');
  592.                     let $last = $visible.find('.select-holder-last select');
  593.                     $last.data('select2').trigger('results:select');
  594.                     e.preventDefault();
  595.                     that.showNextRow();
  596.                 }
  597.             });
  598.             $select.on('keydown.PgUp', (e) => {
  599.                 that.keyDownEvent = true;
  600.                 that.sortController(e);
  601.             });
  602.             $select.on('keydown.Insert', function (e) {
  603.                 if (e.keyCode === 45) {
  604.                     that.callbackAfterInsertKey();
  605.                 }
  606.             });
  607.         });
  608.     },
  609.  
  610.     setAddButtonListener() {
  611.         let that = this;
  612.         $('.value-input').on('keydown', function (e) {
  613.             if (e.keyCode === 32 || e.keyCode === 35 || (e.keyCode === 13 && e.originalEvent.code == "NumpadEnter")) {
  614.                 that.addItemToSelect(e);
  615.                 let dataSelect = $(e.currentTarget).data('select');
  616.                 let select2 = $('#' + dataSelect);
  617.                 select2.trigger('nextSelect');
  618.                 that.select2EnterKeySortListener();
  619.             }
  620.             if (e.keyCode === 13) {
  621.                 e.target.value += " ";
  622.             }
  623.         });
  624.         $(document).on('keydown.Insert', function (e) {
  625.             if (e.keyCode === 45) {
  626.                 that.callbackAfterInsertKey();
  627.             }
  628.         });
  629.     },
  630.  
  631.     setSortListeners() {
  632.         let that = this;
  633.         $(document).on('keydown', (e) => {
  634.             if (that.keyDownEvent) {
  635.                 that.keyDownEvent = false;
  636.                 return;
  637.             }
  638.             that.sortController(e);
  639.         });
  640.     },
  641.  
  642.     openNextSelect(e) {
  643.         this.cubeSelect2Listener();
  644.         if (e.target.id.split('-')[0] === 'axis') {
  645.             let $selects = $('select');
  646.             $selects.eq($selects.index( $(e.target) ) + 1 ).select2('focus');
  647.         }
  648.     },
  649.  
  650.     setListeners() {
  651.         let endKey = 35;
  652.         this.model.on("invalid", this.showErrors);
  653.         $(document).on('keydown', (e) => {
  654.             if (e.keyCode === endKey) {
  655.                 e.preventDefault();
  656.                 this.showNextRow();
  657.             }
  658.         })
  659.     },
  660.  
  661.     showErrors (model, error) {
  662.         if (!model) {return;}
  663.         let $el = $('#subanswer-items .box').not('.hidden-row').find('.select-holder-last select');
  664.         $el.select2('open');
  665.         sharedData.views.notifyModule.showError(error);
  666.     },
  667.  
  668.     renderSubForm(subanswerID) {
  669.         let selectsData = _.sortBy(this.model.get('AnketaItems'), (values) => {
  670.             return values.OrderBy;
  671.         });
  672.  
  673.         let lastSelect = _.last(selectsData);
  674.  
  675.         let openAnswer = _.findWhere(selectsData, {IsAnketaDicItemsExtendable: 1});
  676.  
  677.         $('#subanswer-items').append(this.subtemplate({
  678.             data: {
  679.                 selectsIDs: _.pluck(selectsData, "ID"),
  680.                 subanswerID: subanswerID,
  681.                 subanswerName:  _.pluck(selectsData, "Name"),
  682.                 openAnswer: openAnswer ? true : false,
  683.                 Pattern: lastSelect.Pattern
  684.             }
  685.         }));
  686.  
  687.         this.setSelect2Data(subanswerID, selectsData);
  688.     },
  689.  
  690.     formatData(data) {
  691.         _.forEach(data, (value, key) => {
  692.             data[key].id = value.ID;
  693.             data[key].text = value.OrderBy + ' ' + value.Name;
  694.         });
  695.  
  696.         return data;
  697.     },
  698.  
  699.     getValues() {
  700.         let values = [];
  701.         let rowNumbers = this.getRowNumbers();
  702.  
  703.         _.each(rowNumbers, (row) => {
  704.             _.each(this.dictionaries, (item, key) => {
  705.                 let id = "axis-" + key + "-subans-" + row;
  706.                 let selectValues = $('#' + id).val();
  707.  
  708.                 if (selectValues) {
  709.                     if (typeof selectValues === "string") {
  710.                         values.push({
  711.                             "AnketaItemID": +key,
  712.                             "AnketaDicItemID": parseInt(selectValues, 10),
  713.                             "RowNumber": row
  714.                         })
  715.                     } else {
  716.                         selectValues = this.formatNumbersInArray(selectValues);
  717.                         _.each(selectValues, (value) => {
  718.                             if (typeof value === 'string') {
  719.                                 let newItems = _.where(item, {"newID": value});
  720.                                 let name = newItems && newItems[newItems.length - 1].AnketaDicItemName;
  721.  
  722.                                 values.push({
  723.                                     "AnketaItemID": +key,
  724.                                     "AnketaDicItemID": null,
  725.                                     "AnketaDicItemName": name,
  726.                                     "RowNumber": row
  727.                                 })
  728.                             } else {
  729.                                 values.push({
  730.                                     "AnketaItemID": +key,
  731.                                     "AnketaDicItemID": value,
  732.                                     "RowNumber": row
  733.                                 })
  734.                             }
  735.                         });
  736.                     }
  737.                 }
  738.             });
  739.         });
  740.         return values;
  741.     },
  742.  
  743.     formatNumbersInArray(values) {
  744.         let newValues = [];
  745.  
  746.         _.each(values, (value) => {
  747.             newValues.push(parseInt(value, 10) || value);
  748.         });
  749.  
  750.         return newValues;
  751.     },
  752.  
  753.     setModelValues() {
  754.         let values = this.getValues();
  755.         this.model.set("AnketaCubeDicItems", values);
  756.     },
  757.  
  758.     addNewSubanswerForm () {
  759.         let $selects;
  760.         let rowNumbers;
  761.         let newSubanswerID;
  762.         let $selects_row;
  763.         let values = this.getValues();
  764.  
  765.         if (values.length < this.model.get('axes')*this.subAnswersLength) {
  766.             alert('Необходимо заполнить уже существующие оси');
  767.             return;
  768.         }
  769.  
  770.         this.subAnswersLength++;
  771.         this.model.set("subAnswersLength", this.subAnswersLength);
  772.         this.model.set("AnketaCubeDicItems", values);
  773.  
  774.         rowNumbers = this.getRowNumbers();
  775.         newSubanswerID = rowNumbers.length < 1 ? 1 : _.max(rowNumbers) + 1;
  776.  
  777.         this.renderSubForm(newSubanswerID);
  778.  
  779.         $selects_row = $('.box [data-row="' + newSubanswerID + '"] .select-holder-row');
  780.         $selects = $('select', $selects_row);
  781.         this.setSelectsWidth($selects_row);
  782.         $($selects[0]).select2('focus');
  783.  
  784.         $('.value-input').unbind('keydown');
  785.         $(document).unbind('keydown.Insert');
  786.         this.setAddButtonListener();
  787.     },
  788.  
  789.     getRowNumbers() {
  790.         let rowNumbers = [];
  791.         let $subAnswersRows = $("#subanswer-items .box");
  792.  
  793.         _.each($subAnswersRows, item => {
  794.             rowNumbers.push($(item).data('row'));
  795.         });
  796.  
  797.         return rowNumbers;
  798.     },
  799.  
  800.     deleteSubanswerForm(e) {
  801.         let row = $(e.target.parentNode).data("row");
  802.         let cubeObjects = this.model.get("AnketaCubeDicItems");
  803.         cubeObjects = _.filter(cubeObjects, (item) => {
  804.             return item.RowNumber !== row;
  805.         });
  806.  
  807.         this.subAnswersLength--;
  808.         this.model.set("subAnswersLength", this.subAnswersLength);
  809.         this.model.set("AnketaCubeDicItems", cubeObjects);
  810.  
  811.         $(e.target.parentNode).remove();
  812.     },
  813.  
  814.     setSelect2Data(subanswerID, selectsData, sortMethod, reverse) {
  815.         let self = this;
  816.         //let values = this.allValues;
  817.         let values = self.model.get('AnketaItems');
  818.  
  819.         _.each(selectsData, (item) => {
  820.             // find value for current select by select ID
  821.             let value = values && _.where(values, {AnketaItemID: item.ID, RowNumber: subanswerID});
  822.             let id = '#axis-' + item.ID + '-subans-' + subanswerID;
  823.             // default params for select factory
  824.             let select2params = {
  825.                 select: id,
  826.                 data: (() => {
  827.                     return self.sortData(sortMethod, item, reverse)
  828.                 })()
  829.             };
  830.             // set selected values into selects
  831.             if (value) {
  832.                 select2params.values = [];
  833.                 select2params.labels = [];
  834.                 _.each(value, (obj) => {
  835.                     if (obj.RowNumber) {
  836.                         let currentItem = _.findWhere(self.dictionaries[item.ID], { ID : obj.AnketaDicItemID});
  837.                         if (!currentItem) {
  838.                             currentItem = _.findWhere(self.dictionaries[item.ID], { Name : obj.AnketaDicItemName})
  839.                         }
  840.                         select2params.values.push(obj && obj.AnketaDicItemID || 'new.' + obj.AnketaDicItemName);
  841.                         select2params.labels.push(currentItem.text || currentItem.AnketaDicItemName);
  842.                     }
  843.                 })
  844.             }
  845.  
  846.             $(id).empty();
  847.             select2Factory(select2params);
  848.             if (value.length < 1 || !value[0] && !value[0].RowNumber) $(id).val('').trigger('change');
  849.         });
  850.     },
  851.  
  852.     sortData(sortMethod, item, reverse) {
  853.         let data;
  854.  
  855.         switch (sortMethod) {
  856.             case "byAlphabet":
  857.                 data =_.sortBy(this.dictionaries[item.ID], value => {
  858.                     return value.Name.toLowerCase();
  859.                 });
  860.                 if (reverse) { data.reverse(); }
  861.                 return data;
  862.             case "byNumber":
  863.                 data = _.sortBy(this.dictionaries[item.ID], value => {
  864.                     return value.OrderBy;
  865.                 });
  866.                 if (reverse) { data.reverse(); }
  867.                 return data;
  868.             default:
  869.                 return this.dictionaries[item.ID]
  870.         }
  871.     },
  872.  
  873.     sortByNumber(e, currentRow, reverse) {
  874.         let row =  currentRow ? currentRow : $(e.target.parentNode).data("row");
  875.  
  876.         $(".alphabet-sort-btn", ".list-sort-buttons[data-row='" + row +"']").removeClass('active');
  877.         $(".number-sort-btn", ".list-sort-buttons[data-row='" + row +"']").addClass('active');
  878.         this.prepareToSort(row, "byNumber", reverse);
  879.     },
  880.  
  881.     sortByAlphabet(e, currentRow, reverse) {
  882.         let row =  currentRow ? currentRow : $(e.target.parentNode).data("row");
  883.  
  884.         $(".alphabet-sort-btn", ".list-sort-buttons[data-row='" + row +"']").addClass('active');
  885.         $(".number-sort-btn", ".list-sort-buttons[data-row='" + row +"']").removeClass('active');
  886.         this.prepareToSort(row, "byAlphabet", reverse);
  887.     },
  888.  
  889.     prepareToSort(row, sortMethod, reverse) {
  890.         let selectsData = _.sortBy(this.model.get('AnketaItems'), (values) => {
  891.             return values.OrderBy;
  892.         });
  893.         this.setSelect2Data(row, selectsData, sortMethod, reverse);
  894.     },
  895.  
  896.     getLastVisibleSelect(){
  897.         return $('#subanswer-items .box').not('.hidden-row').find('.select-holder-last select');
  898.     },
  899.  
  900.     addItemToSelect(e) {
  901.         e.preventDefault();
  902.         let select2params, anketaItemId, newValue, isExist;
  903.         let dataSelect = $(e.currentTarget).data('select');
  904.         let select2 = $('#' + dataSelect);
  905.         let $input = $('.open-item-wrap input[data-select="'+ dataSelect +'"]');
  906.         let name = $input.val();
  907.         let orderNum = (select2.find('option')).length + 1;
  908.         let $lastSelects = $('#subanswer-items .box .select-holder-last select');
  909.         let splitedDataSelect = this.splitCurrentSelecID(dataSelect);
  910.         let selectID = splitedDataSelect.id;
  911.         let selectRow = splitedDataSelect.row;
  912.  
  913.         let options = this.dictionaries[selectID];
  914.  
  915.         if (name === "") { return; }
  916.  
  917.         /* if value exist just add it to select */
  918.         _.each(options, (option) => {
  919.             if(name.toLowerCase() == (option.Name).toLowerCase()){
  920.                 let $lastSelect = this.getLastVisibleSelect();
  921.                 let selectedValues = $lastSelect.val() || [];
  922.                 selectedValues.push(option.id);
  923.                 $lastSelect.val(selectedValues).trigger('change');
  924.                 $input.val('');
  925.                 isExist = true;
  926.             }
  927.         });
  928.         if(isExist) return;
  929.         /* */
  930.  
  931.         let option = new Option(name, 'new.' + name, true, true);
  932.         let modelValues = this.model.get('AnketaCubeDicItems');
  933.         let selectValues = modelValues && _.where(modelValues, {AnketaItemID: +selectID, RowNumber: +selectRow}) || [];
  934.         selectValues = _.map(selectValues, (value) => {
  935.             let currentItem = _.findWhere(this.dictionaries[selectID], {ID: value.AnketaDicItemID});
  936.             let orderBy = currentItem && currentItem.OrderBy;
  937.  
  938.             value.id = value.AnketaDicItemID || _.findWhere(this.dictionaries[selectID], {AnketaDicItemName: value.AnketaDicItemName}).newID;
  939.             value.text = orderBy && orderBy + ' ' + currentItem.Name || value.AnketaDicItemName;
  940.             value.OrderBy = orderBy;
  941.             anketaItemId = value.AnketaItemID;
  942.             return value;
  943.         });
  944.         newValue = {
  945.             id: option.value,
  946.             text: orderNum + " " + option.text,
  947.             Name: option.text,
  948.             AnketaDicItemID: null,
  949.             AnketaDicItemName: option.text,
  950.             AnketaItemId: anketaItemId,
  951.             newID: option.value,
  952.             RowNumber: selectRow
  953.         };
  954.  
  955.         this.dictionaries[selectID].push(newValue);
  956.         selectValues.push(newValue);
  957.  
  958.         select2params = {
  959.             select: select2,
  960.             data: this.dictionaries[selectID]
  961.         };
  962.  
  963.         select2params.values = _.pluck(selectValues, 'id');
  964.         select2params.labels = _.pluck(selectValues, 'text');
  965.  
  966.         $input.val('');
  967.         select2.empty();
  968.         select2Factory(select2params);
  969.  
  970.         /* Add new value to all another last select */
  971.         _.each($lastSelects, (select) => {
  972.             let $select = $(select);
  973.             let selectID = $select.attr('id');
  974.             let currentSelect = this.splitCurrentSelecID(selectID);
  975.             let id = currentSelect.id;
  976.             if(selectID != dataSelect ){
  977.                 let params = {
  978.                     select: $select,
  979.                     data: this.dictionaries[id]
  980.                 };
  981.  
  982.                 let values = $select.val() || [];
  983.                 let labels = [];
  984.                 let $selectedOption = $select.find('option:selected');
  985.                 _.each($selectedOption, function(option){
  986.                     let label = $(option).text();
  987.                     if(label){
  988.                         labels.push(label);
  989.                     }
  990.                 });
  991.  
  992.                 params.values = values;
  993.                 params.labels = labels;
  994.  
  995.                 $(select).empty();
  996.                 select2Factory(params);
  997.             }
  998.         });
  999.         /* */
  1000.  
  1001.         this.setModelValues();
  1002.         select2.select2('focus');
  1003.     }
  1004. });
RAW Paste Data
Pastebin PRO WINTER Special!
Get 40% OFF Pastebin PRO accounts!
Top