Guest User

survey_web

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