вторник, 18 апреля 2017 г.

Итоги (суммирование) для вычисляемого поля в представлении.

В этой статье я расскажу как можно вывести итоги для вычисляемого поля.
по умолчанию SharePoint не предоставляет возможности вывести сумму по Calculated field, но мы можем это исправить и изменить шаблон рендера представления CSR и самостоятельно посчитать сумму.

и так начнем.
хочу рассказать что решение получилось достаточно универсальным и не зависит:
1. сколько полей вычисляемых полей мы можем вывести.

2. положение поля вычисляется в коде (есть проблемы если вычисляемое поле первое с лева).

3. отображается ли стандартная панель итогов или нет.


как использовать:
необходимо в шаблоне указать id вычисляемого поля

файл можно скачать по ссылке sumJs.js

SP.SOD.executeFunc("clienttemplates.js", "SPClientTemplates", function() {

  function getBaseHtml(ctx) {
    return SPClientTemplates["_defaultTemplates"].Fields.default.all.all[ctx.CurrentFieldSchema.FieldType][ctx.BaseViewID](ctx);
  };

  function init() {
    var totalSum = {};
    var ctx = {};
    ctx.Templates = {};
    ctx.OnPostRender = postRenderer;
    ctx.Templates.Fields = {
        "calc": { 'View':  summation  }, // указать ID  поля
        "Sum": { 'View':  summation  }, // указать ID  поля
    };    
    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(ctx);    
    function postRenderer(ctx){
      console.log(totalSum);
      for(var f in totalSum){
        var fieldId = f;
        var fieldSum = Math.round(totalSum[f] * 100) / 100;
        var fiedPOsition = getCellField(ctx,fieldId); 
        if(! jQuery("#aggr"+ ctx.wpq).length > 0){         
          var tableId = ctx.listName + "-" + ctx.view;
          var tr = "";
          for (var i = 0; i < ctx.ListSchema.Field.length+2; i++) {
              tr+="";
          };
          tr+="";
          var tbody = ''+tr+'';
          jQuery("[id='"+tableId+"'] tbody").before(tbody);
          
        }
        jQuery("#aggr"+ ctx.wpq).find("tr").children().eq(fiedPOsition -1).html("Sum= " + fieldSum + "");
      };
    };
    function summation(ctx){            
      var fieldValue = ctx.CurrentItem[ctx.CurrentFieldSchema.RealFieldName];
      if(fieldValue){
        var currSum = fieldValue.replace(",",".").replace(/\s/g,"")*1;
        if(!isNaN(currSum)){
            var sum =  totalSum[ctx.CurrentFieldSchema.RealFieldName];
            if(sum){
              totalSum[ctx.CurrentFieldSchema.RealFieldName] = sum + currSum;
            }else{
              totalSum[ctx.CurrentFieldSchema.RealFieldName] = currSum;
            };
        };
      }
      return '
'+ fieldValue + '
'; }; }; function getCellField(Ctx, NameField) { for (var f = 0; f < Ctx.ListSchema.Field.length; ++f) { var listField = Ctx.ListSchema.Field[f]; if (listField.Name == NameField) { return f + 3; }; }; return null; }; //RegisterModuleInit(SPClientTemplates.Utility.ReplaceUrlTokens("~siteCollection/Style Library/sumJs.js"), init); init(); });