2017-05-09 7 views
1

無料のjqGrid 4.14を使用して、時間ロギンググリッドを設定しようとしましたが、SO、github、trirand、そしてもちろんgoogleを検索しましたが、私は基本的な機能のほとんどを動作させていますが、私が今一週間働いていることがいくつかあり、完了するのに援助が必要です。私がこれまでに持っていることを示すイメージが添付され、自分のコード/ jsonが含まれます。私が達成できなかったのは、グループヘッダーがグループの日付の最初の列に、日付が関連する日付をそれぞれの列に入れることです。 2番目のグループには日付が正しく表示されていますが、1番目の日付は長い番号で表示されます。フィールドのプロパティとjsonの取り込み方法は同じです。Needは、各グループの列とサマリー行の両方を合計します。時間はHH:MMの文字列として入力されるため、カスタム合計は文字列から合計秒に変換され、文字列に変換されて計算されます。合計が40時間を超える場合、色は赤色になります。願っています。無料jqGrid 4.14フォーマットしていないヘッダーをグルーピングするカスタム合計が機能しない

enter image description here

JSON:

[ 
    "total": 5, 
    "page": 1, 
    "records": 5, 
    "rows": 
    { 
     "CDPayCodeId": 1, 
     "EndPayPeriod": "2017-05-15T00:00:00.0000000-05:00", 
     "Fri": null, 
     "Mon": null, 
     "PersonId": 1, 
     "Sat": null, 
     "Sun": null, 
     "Thu": null, 
     "Total": null, 
     "Tue": null, 
     "Wed": "00:15", 
     "WeekStart": "2017-04-30T00:00:00.0000000-05:00" 
    }, 
    { 
     "CDPayCodeId": 2, 
     "EndPayPeriod": "2017-05-15T00:00:00.0000000-05:00", 
     "Fri": null, 
     "Mon": null, 
     "PersonId": 1, 
     "Sat": null, 
     "Sun": null, 
     "Thu": null, 
     "Total": null, 
     "Tue": null, 
     "Wed": "06:15", 
     "WeekStart": "2017-04-30T00:00:00.0000000-05:00" 
    }, 
    { 
     "CDPayCodeId": 1, 
     "EndPayPeriod": "2017-05-15T00:00:00.0000000-05:00", 
     "Fri": null, 
     "Mon": "04:30", 
     "PersonId": 1, 
     "Sat": null, 
     "Sun": null, 
     "Thu": null, 
     "Total": null, 
     "Tue": null, 
     "Wed": null, 
     "WeekStart": "2017-05-14T00:00:00.0000000-05:00" 
    }, 
    { 
     "CDPayCodeId": 2, 
     "EndPayPeriod": "2017-05-15T00:00:00.0000000-05:00", 
     "Fri": null, 
     "Mon": null, 
     "PersonId": 1, 
     "Sat": null, 
     "Sun": "04:30", 
     "Thu": null, 
     "Total": null, 
     "Tue": null, 
     "Wed": null, 


"WeekStart": "2017-05-14T00:00:00.0000000-05:00" 
}, 
{ 
    "CDPayCodeId": 3, 
    "EndPayPeriod": "2017-05-15T00:00:00.0000000-05:00", 
    "Fri": null, 
    "Mon": "04:30", 
    "PersonId": 1, 
    "Sat": null, 
    "Sun": null, 
    "Thu": null, 
    "Total": null, 
    "Tue": null, 
    "Wed": null, 
    "WeekStart": "2017-05-14T00:00:00.0000000-05:00" 
} 

]

HTML

<table id="TimesheetGrid"></table> 
<script> 
    var PCList = '@ViewBag.PCList' 
    var selectedId = '@ViewBag.PId' 
</script> 

JSコード

$(function() { 
    "use strict"; 
    var $grid = $("#TimesheetGrid"), recreateFilterToolbar = function() { $(this).jqGrid("destroyFilterToolbar").jqGrid("filterToolbar"); }; 

    var editSettings = { 
     //recreateForm:true, 
     jqModal: false, 
     reloadAfterSubmit: false, 
     closeOnEscape: true, 
     savekey: [true, 13], 
     closeAfterEdit: true 
    }; 
    var addSettings = { 
     //recreateForm:true, 
     jqModal: false, 
     reloadAfterSubmit: false, 
     savekey: [true, 13], 
     closeOnEscape: true, 
     closeAfterAdd: true 
    }; 
    var delSettings = { 
     jqModal: false, 
     reloadAfterSubmit: false, 
     savekey: [true, 13], 
     closeOnEscape: true, 
     closeAfterAdd: true 
    }; 
    var inLineNaveSettings = { 
     add: true, 
     addtext: 'Inline', 
     addtitle: 'Add new record inline', 
     edit: false 
    }; 

    function SecondsFromTime(time) { 
     var timeParts = time.match(/(\d{2}):(\d{2})/); 
     if (timeParts !== null) { 
      var timeUntil = moment.duration({ 
       hours: timeParts[1], 
       minutes: timeParts[2], 
      }); 
      var timeSeconds = timeUntil.as('seconds'); 
      return timeSeconds; 
     } 
    } 

    function calcTotal(cellvalue, options, rowObject) { 
     //var time = '12d 00:57:30'; 
     var secs = 0; 
     var timeParts = ''; 
     for (var x = 1; x < 8; x++) { 
      if (x === 1 && rowObject.Sun !== null) { secs = SecondsFromTime(rowObject.Sun); } 
      else if (x === 2 && rowObject.Mon !== null) { secs += SecondsFromTime(rowObject.Mon); } 
      else if (x === 3 && rowObject.Tue !== null) { secs += SecondsFromTime(rowObject.Tue); } 
      else if (x === 4 && rowObject.Wed !== null) { secs += SecondsFromTime(rowObject.Wed); } 
      else if (x === 5 && rowObject.Thu !== null) { secs += SecondsFromTime(rowObject.Thu); } 
      else if (x === 6 && rowObject.Fri !== null) { secs += SecondsFromTime(rowObject.Fri); } 
      else if (x === 7 && rowObject.Sat !== null) { secs += SecondsFromTime(rowObject.Sat); } 
     } 
     return moment().startOf('day').seconds(secs).format('H:mm'); 
    } 

    $grid.jqGrid({ 
     autoencode: true, 
     url: '/Timesheet/GetTaskList?PId=' + selectedId, 
     editurl: '/Timesheet/UpdateTimesheet', 
     mtype: "GET", 
     caption: "Maintain Timesheet", 
     datatype: 'json', 
     loadonce: true, 
     //colNames: ['', 'PayCodeId', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Total'], 
     colModel: [ 
      { name: 'PersonId', editable: 'hidden', hidden: true }, 
      { name: 'EndPayPeriod', editable: 'hidden', sorttype: "date", formatter: "date", formatoptions: { newformat: "n/j/Y" } }, 
      { name: 'WeekStart', editable: 'hidden', sorttype: "date", formatter: "date", formatoptions: { newformat: "n/j/Y" } }, 
      { 
       name: 'CDPayCodeId', index: 'CDPayCodeId', label: 'Pay Code', align: "center", width: 90, 
       formatter: "select", autoResizable: true, sortable: false, 
       edittype: "select", editoptions: { value: PCList } 
      }, 
      { name: 'Sun', index: 'Sun', label: 'Sun', sortable: false, width: 50, autoResizable: true, summaryType: SumDay }, 
      { name: 'Mon', index: 'Mon', label: 'Mon', sortable: false, width: 50, autoResizable: true, summaryType: SumDay }, 
      { name: 'Tue', index: 'Tue', label: 'Tue', sortable: false, width: 50, autoResizable: true, summaryType: SumDay }, 
      { name: 'Wed', index: 'Wed', label: 'Wed', sortable: false, width: 50, autoResizable: true, summaryType: SumDay }, 
      { name: 'Thu', index: 'Thu', label: 'Thu', sortable: false, width: 50, autoResizable: true, summaryType: SumDay }, 
      { name: 'Fri', index: 'Fri', label: 'Fri', sortable: false, width: 50, autoResizable: true, summaryType: SumDay }, 
      { name: 'Sat', index: 'Sat', label: 'Sat', sortable: false, width: 50, autoResizable: true, summaryType: SumDay }, 
      { 
       name: 'Total', index: 'Total', label: 'Total', sortable: false, sidth: 70, autoResizable: true, 
       formatter: calcTotal 
      }, 
      { name: "act", template: "actions", width: 60 } 
     ], 
     //jsonReader: { id: "PersonId" }, 
     height: '100%', 
     shrinkToFit: true, 
     autowidth: false, 
     rownumbers: false, 
     autoresizeOnLoad: false, 
     cmTemplate: { editable: true, autoResizable: true, align: 'right' }, 
     iconSet: "fontAwesome", 
     rowNum: 10, 
     autoResizing: { compact: true }, 
     rowList: [5, 10, 20, "10000:All"], 
     viewrecords: true, 
     pager: true, 
     //toppager: true, 
     sortname: "SortOrder", 
     sortorder: "asc", 
     inlineEditing: { keys: true, defaultFocusField: "PayCode", focusField: "PayCode" }, 
     afterAddRow: function() { 
      recreateFilterToolbar.call(this); 
      $(this).trigger("reloadGrid", [{ current: true, fromServer: true }]); 
     }, 
     afterSetRow: function() { 
      recreateFilterToolbar.call(this); 
      $(this).trigger("reloadGrid", [{ current: true, fromServer: true }]); 
     }, 
     afterDelRow: function() { 
      recreateFilterToolbar.call(this); 
      $(this).trigger("reloadGrid", [{ current: true, fromServer: true }]); 
     }, 
     grouping: true, 
     groupingView: { 
      groupField: ['EndPayPeriod', 'WeekStart'], 
      groupOrder: ['asc', 'asc'], 
      groupText: ['Pay Period {0}' , 'Week Start {0}'], 
      //groupOrder [] // can use html if needed 
      groupColumnShow: [false, false], 
      groupDataSorted: true, 
      //showSummaryOnHide: false, 
      groupSummary: [true, true], 
      hideFirstGroupCol: true, 
      plusicon: 'fa-minus', 
      minusicon: 'fa-plus' 
     } 
    }).jqGrid("gridResize"); 

    $grid.jqGrid("navGrid", { 
     edit: editSettings, 
     add: addSettings, 
     del: delSettings, 
     search: false, 
     reloadGridOptions: { fromServer: true }, 
     beforeRefresh: function() { 
      alert('In beforeRefresh'); 
      grid.jqGrid('setGridParam', { datatype: 'json' }).trigger('reloadGrid'); 
     } 
    }); 
    $grid.jqGrid('inlineNav', inLineNaveSettings); 

    $("#SelectPerson").change(function() { 
     var selectedId = $("#SelectPerson").val(); 
     $("#TimesheetGrid").jqGrid('setGridParam', { datatype: 'json', url: '/Timesheet/GetTaskList?PId=' + selectedId }).trigger('reloadGrid'); 
    }); 

    function SumDay(val, name, record) { 
     if (record[name] !== "" && record[name] !== null) { 
      var totalTime = SecondsFromTime(record[name]); 
      var totalTimeString = moment().startOf('day').seconds(totalTime).format('H:mm'); 
     } 
     return totalTimeString; 
    } 
}); 

答えて

0

まず、コードを再現するためにデモを投稿すると役に立ちます。たとえば、JSFiddleを使用し、JSFiddleのEcho serviceを使用して、サーバーへの要求をシミュレートすることができます。あなたのコードとテストデータに基づいてデモを作成しました

コードの主な問題は、カスタムサマリー関数SumDayの最初のパラメータ(コードでval)を無視しています。パラメータの値は最初に""であり、グループの以前の要素の合計であるになります。値を現在の値に合計し、関数から新しい合計値を戻す必要があります。あなたはSecondsFromTimeで2桁(time.match(/(\d{2}):(\d{2})/)を参照)をテストするため、

function SumDay(val, name, record) { 
    var totalTime, totalTimeString; 
    if (record[name] !== "" && record[name] !== null) { 
     totalTime = SecondsFromTime(record[name]); 
     if (val !== "") { 
      totalTime += SecondsFromTime(val); 
     } 
     totalTimeString = moment().startOf('day').seconds(totalTime).format('HH:mm'); 
     val = totalTimeString; 
    } 
    return val; 
} 

私は.format('HH:mm')に加えて.format('H:mm')固定:固定のコードは次のようである可能性があります。

下図のような結果が表示されhttps://jsfiddle.net/OlegKi/ag1160e3/たデモ:編集、提案やコード修正のための

enter image description here

+0

感謝。合計は予想どおりに機能していますが、payperiodヘッダーの日付はまだ表示されます/日付/(長い番号)は、週の日付の2番目のグループヘッダーと同じ形式である必要があります。また、2番目のグループヘッダーでは、各セルの日付「m/d」の列見出しを使用することは可能ですか?たぶん、単語の週の開始とその日付を削除し、ちょうどそこに月と日の列見出しを持っている?私は他のグリッドで私を助けてくれたあなたの他の答えの多くを読んだことがあり、あなたの知識共有に対する心からの感謝を表したいと思います。 –

+0

@AlbertBrennan:ようこそ!もう一度コードを調べました。問題の理由:多くの間違ったオプションの不必要な使用。プロパティー「hideFirstGroupCol:true」は、最初の列の日付の書式が欠落しているという問題の原因です。コードの重複を減らすために列テンプレートを使用することをお勧めします。変更されたデモhttps://jsfiddle.net/ag1160e3/1/を参照してください。 – Oleg

+0

@Oleg sir助けてもらえますか?http://stackoverflow.com/questions/43870268/in-jqgrid-how-to-show-dropdown-value-which-was-updated-in-database-by-user-by- in – davidb

関連する問題