</main-tab>
<log-term>
-<form id="term" show={enabled}>
-<p>
-<label><input type="radio" name="term" value="0" checked="checked">直近一か月</label>
-<label><input type="radio" name="term" value="1">期間指定: </label>
-<input type="text" id="term_from" style="width: 7em">~<input type="text" id="term_to" style="width: 7em">
-<input type="button" id="term_apply" value="適用">
-</p>
-</form>
+<div id="term" show={enabled}>
+<ul class="tab tabsub" style="float: left; margin-right: 0.2em">
+ <li each={name, i in rangeTabs} class={select: opts.logRange.val === i} onclick={parent.rangeTabChange}>{name}</li>
+</ul>
+<div style="padding: 0.2em 0;">
+<input type="text" id="term_from" style="width: 10em">~<input type="text" id="term_to" style="width: 10em">
+</div>
+</div>
<script>
-this.on("mount", function() {
- $('#term_from').datepicker({
- defaultDate: moment().subtract(1, 'months').toDate(),
- onClose: function() { $('input[name=term]').val(['1']); }
- });
- $('#term_to').datepicker({
- onClose: function() { $('input[name=term]').val(['1']); }
- });
- $('#term_apply').click(function() {
- opts.observable.trigger("termApplied");
- });
-});
+var self = this;
+
+this.rangeTabs = [
+"今日",
+"今週",
+"今月",
+"すべて",
+"期間指定"
+];
this.enabled = false;
-var self = this;
opts.observable.on("mainTabChanged", function(idx) {
self.update({enabled: idx >= 0 && idx < self.logTables});
});
+
+var val = sessionStorage.getItem('logRange');
+opts.logRange.val = val === null ? 2 : +val;
+
+this.init = function() {
+ self.initPicker('#term_from', '#term_to', function() {
+ if (opts.logRange.val === 4)
+ opts.observable.trigger( "logRangeChanged");
+ });
+};
+
+this.on("mount", this.init);
+
+this.rangeTabChange = function(e) {
+ sessionStorage.setItem("logRange", e.item.i);
+ opts.logRange.val = e.item.i;
+ opts.observable.trigger("logRangeChanged");
+};
+
</script>
</log-term>
<script>
this.tables = [
-"<th>日付</th><th>海域</th><th>マス</th><th>ボス</th><th>ランク</th><th>ドロップ艦種</th><th>ドロップ艦娘", // ドロップ
-"<th>日付</th><th style=\"min-width: 3.2em;\">海域</th><th>マス</th><th>ボス</th><th>ランク</th><th>艦隊行動</th><th>味方陣形</th><th>敵陣形</th><th style=\"min-width: 3.2em;\">敵艦隊</th><th>味方艦1</th><th>味方艦1HP</th><th>味方艦2</th><th>味方艦2HP</th><th>味方艦3</th><th>味方艦3HP</th><th>味方艦4</th><th>味方艦4HP</th><th>味方艦5</th><th>味方艦5HP</th><th>味方艦6</th><th>味方艦6HP</th><th>大破艦</ht><th style=\"min-width: 2.2em;\">敵艦1</th><th>敵艦1HP</th><th style=\"min-width: 2.2em;\">敵艦2</th><th>敵艦2HP</th><th style=\"min-width: 2.2em;\">敵艦3</th><th>敵艦3HP</th><th style=\"min-width: 2.2em;\">敵艦4</th><th>敵艦4HP</th><th style=\"min-width: 2.2em;\">敵艦5</th><th>敵艦5HP</th><th style=\"min-width: 2.2em;\">敵艦6</th><th>敵艦6HP</th><th>味方制空値</th><th>敵制空値</th><th>制空状態</th>", // 海戦
+"<th>æ\97¥ä»\98</th><th>æµ·å\9f\9f</th><th>ã\83\9eã\83\83ã\83\97</th><th>ã\83\9eã\82¹</th><th>ã\83\9cã\82¹</th><th>ã\83©ã\83³ã\82¯</th><th>ã\83\89ã\83ã\83\83ã\83\97è\89¦ç¨®</th><th>ã\83\89ã\83ã\83\83ã\83\97è\89¦å¨\98", // ã\83\89ã\83ã\83\83ã\83\97
+"<th>æ\97¥ä»\98</th><th style=\"min-width: 3.2em;\">æµ·å\9f\9f</th><th>ã\83\9eã\83\83ã\83\97</th><th>ã\83\9eã\82¹</th><th>ã\83\9cã\82¹</th><th>ã\83©ã\83³ã\82¯</th><th>è\89¦é\9a\8aè¡\8cå\8b\95</th><th>å\91³æ\96¹é\99£å½¢</th><th>æ\95µé\99£å½¢</th><th style=\"min-width: 3.2em;\">æ\95µè\89¦é\9a\8a</th><th>å\91³æ\96¹è\89¦1</th><th>å\91³æ\96¹è\89¦1HP</th><th>å\91³æ\96¹è\89¦2</th><th>å\91³æ\96¹è\89¦2HP</th><th>å\91³æ\96¹è\89¦3</th><th>å\91³æ\96¹è\89¦3HP</th><th>å\91³æ\96¹è\89¦4</th><th>å\91³æ\96¹è\89¦4HP</th><th>å\91³æ\96¹è\89¦5</th><th>å\91³æ\96¹è\89¦5HP</th><th>å\91³æ\96¹è\89¦6</th><th>å\91³æ\96¹è\89¦6HP</th><th>å¤§ç ´è\89¦</ht><th style=\"min-width: 2.2em;\">æ\95µè\89¦1</th><th>æ\95µè\89¦1HP</th><th style=\"min-width: 2.2em;\">æ\95µè\89¦2</th><th>æ\95µè\89¦2HP</th><th style=\"min-width: 2.2em;\">æ\95µè\89¦3</th><th>æ\95µè\89¦3HP</th><th style=\"min-width: 2.2em;\">æ\95µè\89¦4</th><th>æ\95µè\89¦4HP</th><th style=\"min-width: 2.2em;\">æ\95µè\89¦5</th><th>æ\95µè\89¦5HP</th><th style=\"min-width: 2.2em;\">æ\95µè\89¦6</th><th>æ\95µè\89¦6HP</th><th>å\91³æ\96¹å\88¶ç©ºå\80¤</th><th>æ\95µå\88¶ç©ºå\80¤</th><th>å\88¶ç©ºç\8a¶æ\85\8b</th>", // æµ·æ\88¦
"<th>日付</th><th>結果</th><th>遠征</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>開発資材</th><th>高速修復材</th><th>高速建造材</th>", // 遠征
"<th>日付</th><th>開発装備</th><th>種別</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>秘書艦</th><th>司令部Lv</th>", // 開発
"<th>日付</th><th>種類</th><th>名前</th><th>艦種</th><th>燃料</th><th>弾薬</th><th>鋼材</th><th>ボーキ</th><th>開発資材</th><th>空きドック</th><th>秘書艦</th><th>司令部Lv</th>", // 建造
self.show();
});
-opts.observable.on("termApplied", function() {
+opts.observable.on("logRangeChanged", function() {
self.show();
});
}
};
if (t === 0) {
- opts.columns = [{ data: 0 }, { data: 1 }, { data: 2 }, { data: 3 }, { data: 4 }, { data: 9 }, { data: 10 }];
+ opts.columns = [{data: 0}, {data: 1}, {data: 39}, {data: 2}, {data: 3}, {data: 4}, {data: 9}, {data: 10}];
} else if (t === 1) {
var entries = [];
- for (var i = 0; i < 39; i++) {
+ for (var i = 0; i < 38; i++) {
+ if (i === 2)
+ entries.push({data: 39});
if (i === 9 || i === 10)
continue;
- entries.push({ data: i });
+ if (i === 23)
+ entries.push({data: 38});
+ entries.push({data: i});
}
opts.columns = entries;
}
this.show = function() {
if (this.mainTab >= this.jsons.length)
return;
- var query = "?from=" + moment().subtract(1, 'months').valueOf();
- if ($('input[name=term]:eq(1)').prop('checked')) {
- var from = $('#term_from').datepicker("getDate");
- var to = $('#term_to').datepicker("getDate");
- if (from !== null)
- query = "?from=" + from.valueOf();
+ var now = moment();
+ var from;
+ var query = "?from=";
+ switch (opts.logRange.val){
+ case 0:
+ from = now.clone().startOf('day').hours(5);
+ if (now.hour() < 5)
+ from.subtract(1, 'days');
+ query += from.valueOf();
+ break;
+ case 1:
+ from = now.clone().startOf('week').hours(5);
+ if (now.hour() < 5 && now.days() === 1)
+ from.subtract(1, 'weeks');
+ query += from.valueOf();
+ break;
+ case 2:
+ if (now.hours() >= 22 &&
+ now.dates() === now.clone().endOf('month').date()) {
+ from = now.clone().hours(22);
+ } else {
+ from = now.clone().startOf('month').subtract(1, 'days').hours(22);
+ }
+ query += from.valueOf();
+ break;
+ case 3:
+ query = "";
+ break;
+ case 4:
+ from = $('#term_from').datetimepicker("getValue");
+ var to = $('#term_to').datetimepicker("getValue");
+ if (from === null)
+ return;
+ query += from.valueOf();
if (to !== null)
- query += "&to=" + (to.valueOf() + this.oneDay);
+ query += "&to=" + to.valueOf();
+ break;
}
$('#loading').show();
var url = this.jsons[this.mainTab] + query;
<li each={name, i in diffChartRanges} class={select: chartSpec.diffRange === i} onclick={parent.rangeTabChange}>{name}</li>
</ul>
<div style="padding: 0.2em 0;">
-<input type="text" id="chart_from" style="width: 7em">~<input type="text" id="chart_to" style="width: 7em">
+<input type="text" id="chart_from" style="width: 10em">~<input type="text" id="chart_to" style="width: 10em">
<label><input type="checkbox" id="tooltip" value="" style="margin-left: 2em;" onchange={tooltipChange} checked={opts.chartSpec.tooltip === 1}>ツールチップ</label>
</div>
</div>
opts.chartSpec.type === 1 && opts.chartSpec.diffRange === 4;
};
+var self = this;
+
this.init = function() {
- $('#chart_from').datepicker({
- onClose: function() {
- if (self.useDatePicker())
- opts.observable.trigger("chartSpecChanged");
- }
- });
- $('#chart_to').datepicker({
- onClose: function() {
- if (self.useDatePicker())
- opts.observable.trigger("chartSpecChanged");
- }
+ self.initPicker('#chart_from', '#chart_to', function() {
+ if (self.useDatePicker())
+ opts.observable.trigger("chartSpecChanged");
});
};
-this.on("mount", this.init);
-
this.mainTab = 0;
-var self = this;
+
+this.on("mount", self.init);
opts.observable.on("mainTabChanged", function(idx) {
self.update({mainTab: idx});
};
this.drawChart = function(data) {
+ var range = this.calcRange(opts.chartSpec.seqRange);
+ if (range.last === 0)
+ return;
if (!data) {
$('#loading').show();
$.ajax({
- url: "./資材ログ.json?number=true",
+ url: "./資材ログ.json?number=true" +
+ "&from=" + range.first + "&to=" + range.last,
success: function(d) { self.drawChart(d); },
dataType: "json", cache: false
});
return;
}
var picked;
- picked = this.pickChartData(data.data, opts.chartSpec.seqRange);
+ picked = this.pickChartData(data.data, range);
picked.data.unshift(self.header);
this.drawSeqChart(picked);
};
+this.calcRange = function(range) {
+ var first = 0;
+ var last = (new Date()).valueOf();
+ switch (range) {
+ case 0:
+ first = moment(last).subtract(24, 'hours').valueOf();
+ break;
+ case 1:
+ first = moment(last).subtract(7, 'days').valueOf();
+ break;
+ case 2:
+ first = moment(last).subtract(1, 'months').valueOf();
+ break;
+ case 3:
+ first = moment(last).subtract(3, 'months').valueOf();
+ break;
+ case 4:
+ break;
+ case 5:
+ var fromDate = $('#chart_from').datetimepicker("getValue");
+ var toDate = $('#chart_to').datetimepicker("getValue");
+ if (fromDate === null || toDate === null)
+ return {first: 0, last:0};
+ first = fromDate.valueOf();
+ last = toDate.valueOf();
+ break;
+ }
+ return {first: first, last: last};
+};
+
this.unselected = {};
this.drawSeqChart = function(picked) {
},
data: {
x: '日付',
- xFormat: '%Y-%m-%d %X',
+ xFormat: '%Y-%m-%d %H:%M:%S',
rows: picked.data,
axes: {
燃料: 'y',
var newdata = [];
var ticks = [];
var grid = [];
- var first = data[0][0];
- var last = data[data.length - 1][0];
+ var first = range.first;
+ var last = range.last;
var interval, tickInterval, lastTick;
- switch (range) {
- case 0:
- first = moment(last).subtract(24, 'hours').valueOf();
- break;
- case 1:
- first = moment(last).subtract(7, 'days').valueOf();
- break;
- case 2:
- first = moment(last).subtract(1, 'months').valueOf();
- break;
- case 3:
- first = moment(last).subtract(3, 'months').valueOf();
- break;
- case 4:
- break;
- case 5:
- var fromDate = $('#chart_from').datepicker("getDate");
- var toDate = $('#chart_to').datepicker("getDate");
- if (fromDate === null || toDate === null)
- return { data: [], tick: [], grid: [] };
- var from = fromDate.valueOf() + 3600 * 5000;
- var to = toDate.valueOf() + this.oneDay + 3600 * 5000;
- first = Math.max(first, from);
- last = Math.min(last, to);
- break;
- }
if (last <= first + this.oneDay) {
interval = 1000;
tickInterval = 3600 * 1000;
tickInterval = this.oneDay * 14;
lastTick = this.to5am(moment(last).day(1).valueOf());
} else {
- var years = Math.floor((last - first) / (this.oneDay * 365));
- interval = 3600 * (years > 2 ? 24000 : 12000);
- tickInterval = this.oneDay * 28;
+ var magn = Math.ceil((last - data[0][0]) / (this.oneDay * 365) / 2);
+ interval = this.oneDay * magn;
+ tickInterval = this.oneDay * 28 * magn;
lastTick = this.to5am(moment(last).day(1).valueOf());
}
var lastData;
for (var i = data.length - 1; i >= 0; i--) {
var row = data[i];
var date = row[0];
- if (date > first) {
+ if (date >= first) {
if (date <= last) {
var v = date - date % interval;
if (lastData !== v) {
};
this.drawChart = function(data) {
+ var range = this.calcRange(opts.chartSpec.diffRange);
+ if (range.last === 0)
+ return;
if (!data) {
$('#loading').show();
$.ajax({
- url: "./資材ログ.json?number=true",
+ url: "./資材ログ.json?number=true" +
+ "&from=" + range.first + "&to=" + range.last,
success: function(d) { self.drawChart(d); },
dataType: "json", cache: false
});
return;
}
var picked;
- picked = this.pickChartData(data.data, opts.chartSpec.diffRange);
+ picked = this.pickChartData(data.data, range);
picked.data.unshift(self.header);
this.drawDiffChart(picked);
};
+this.calcRange = function(range) {
+ var first = 0;
+ var last = (new Date()).valueOf();
+ switch (range) {
+ case 0:
+ first = moment(last).subtract(1, 'months').valueOf();
+ break;
+ case 1:
+ first = moment(last).subtract(3, 'months').valueOf();
+ break;
+ case 2:
+ first = moment(last).subtract(6, 'months').subtract(1, 'weeks').valueOf();
+ break;
+ case 3:
+ break;
+ case 4:
+ var fromDate = $('#chart_from').datetimepicker("getValue");
+ var toDate = $('#chart_to').datetimepicker("getValue");
+ if (fromDate === null || toDate === null)
+ return {first: 0, last: 0};
+ first = Math.max(first, fromDate.valueOf());
+ last = Math.min(last, toDate.valueOf());
+ break;
+ }
+ return {first: first, last: last};
+};
+
this.unselected = {};
this.drawDiffChart = function(picked) {
var newdata = [];
var ticks = [];
var grid = [];
- var first = data[0][0];
- var last = data[data.length - 1][0];
+ var first = range.first;
+ var last = range.last;
var interval, tickInterval, lastTick;
- switch (range) {
- case 0:
- first = moment(last).subtract(1, 'months').valueOf();
- break;
- case 1:
- first = moment(last).subtract(3, 'months').valueOf();
- break;
- case 2:
- first = moment(last).subtract(6, 'months').subtract(1, 'weeks').valueOf();
- break;
- case 3:
- return this.pickMonthlyChartData(data);
- case 4:
- var fromDate = $('#chart_from').datepicker("getDate");
- var toDate = $('#chart_to').datepicker("getDate");
- if (fromDate === null || toDate === null)
- return { data: [], tick: [], grid: [] };
- var from = fromDate.valueOf() + 3600 * 5000;
- var to = toDate.valueOf() + this.oneDay + 3600 * 5000;
- first = Math.max(first, from);
- last = Math.min(last, to);
- break;
- }
var barWidth;
+ if (first === 0)
+ return this.pickMonthlyChartData(data);
if (last <= first + this.oneDay * 2 * 31) {
interval = this.oneDay;
tickInterval = this.oneDay * 2;
</ul>
<div style="padding: 0.2em 0;">
-<input type="text" id="sortie_stat_from" style="width: 7em">~<input type="text" id="sortie_stat_to" style="width: 7em">
+<input type="text" id="sortie_stat_from" style="width: 10em">~<input type="text" id="sortie_stat_to" style="width: 10em">
</div>
<div style="clear: both;" show={type === "recent"}>
<h3>今日</h3>
<table id="sortie_stat_day">
-<thead>
-<tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
-</thead>
</table>
<h3>今週</h3>
<table id="sortie_stat_week">
-<thead>
-<tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
</table>
<h3>今月</h3>
<table id="sortie_stat_month">
-<thead>
-<tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th></tr>
</table>
</div>
-<div id="sortie_stat_all_table" show={type === "range"}>
-<table id="sortie_stat_all">
-<thead>
-<tr><th>マップ</th><th>出撃</th><th>S</th><th>A</th><th>B</th><th>C</th><th>D以下</th><th>輸送船</th></tr>
-</thead>
+<div show={type === "range"}>
+<table id="sortie_stat_all" style="width: 100%;">
</table>
</div>
});
this.init = function() {
- this.initTable();
- this.initDatePicker();
-};
-
-this.initTable = function() {
- var terms = ['day', 'week', 'month', 'all'];
- for (var i = 0; i < terms.length; i++) {
- $("#sortie_stat_" + terms[i]).dataTable({
- paging: false,
- searching: false,
- ordering: false,
- columns: terms[i] !== 'month' ? [
- { data: "map" },
- { data: "start" },
- { data: "S" },
- { data: "A" },
- { data: "B" },
- { data: "C" },
- { data: "D" },
- { data: "R" }
- ] : [
- { data: "map" },
- { data: "start" },
- { data: "S" },
- { data: "A" },
- { data: "B" },
- { data: "C" },
- { data: "D" }
- ]
- });
- }
-};
-
-this.initDatePicker = function() {
- $('#sortie_stat_from').datepicker({
- onClose: function() { if (self.type === "range") self.show(); }
- });
- $('#sortie_stat_to').datepicker({
- onClose: function() { if (self.type === "range") self.show(); }
+ self.initPicker('#sortie_stat_from', '#sortie_stat_to', function() {
+ if (self.type === "range")
+ self.show();
});
};
from = moment().subtract(1, 'months').subtract(1, 'day').valueOf();
to = new Date().valueOf();
} else {
- var fromDate = $('#sortie_stat_from').datepicker("getDate");
- var toDate = $('#sortie_stat_to').datepicker("getDate");
+ var fromDate = $('#sortie_stat_from').datetimepicker("getValue");
+ var toDate = $('#sortie_stat_to').datetimepicker("getValue");
if (fromDate === null || toDate === null) {
this.show([]);
return;
}
- from = moment(fromDate);
- if (from.date() === 1)
- from.subtract(2, 'hours');
- from = from.valueOf();
- to = moment(toDate);
- if (to.date() === to.clone().endOf('month').date()) {
- to.hour(22);
- } else {
- to.endOf('day');
- }
- to = to.valueOf();
+ from = fromDate.valueOf();
+ to = toDate.valueOf();
}
$.ajax({
url: "./海戦・ドロップ報告書.json?from=" + from + "&to=" + to,
var isBoss = row[3].indexOf("ボス") !== -1;
var isStart = row[3].indexOf("出撃") !== -1;
var resR = 0;
- for (var j = 23; j < row.length; j++) {
+ for (var j = 22; j < row.length; j++) {
if (/^輸送/.test(row[j]) && /^0\x2f/.test(row[j + 1]))
resR++;
}
+ var item = /アイテム/.test(row[9]) ? /[^+]+$/.exec(row[10])[0] : null;
var res = row[4];
if (res === "E")
res = "D";
}
mo["R"] += resR;
mo[res]++;
+ if (item) {
+ if (!mo[item])
+ mo[item] = 0;
+ mo[item]++;
+ }
if ((b === 0 || b === 2) && isStart) {
if (mo.start === "-")
mo.start = 0;
return r;
};
-this.arrangeTable = function(r) {
+this.isItemColumn = function(col) {
+ return !/^(?:map|start|[SABCDR])$/.test(col);
+};
+
+this.sortItemOrder = function(items) {
+ ["お米", "梅干", "海苔", "お茶"].reverse().forEach(function(item) {
+ var idx = items.indexOf(item);
+ if (idx !== -1) {
+ items.splice(idx, 1);
+ items.unshift(item);
+ }
+ });
+};
+
+this.setupColumns = function(r) {
+ for (var term in r) {
+ var columns = [{ data: "map", title: "マップ" },
+ { data: "start", title: "出撃" },
+ { data: "S", title: "S" },
+ { data: "A", title: "A" },
+ { data: "B", title: "B" },
+ { data: "C", title: "C" },
+ { data: "D", title: "D" },
+ { data: "R", title: "輸送船" }];
+ if (term === "month")
+ columns.pop();
+ var items = [];
+ for (var col in r[term].stat["合計"]) {
+ if (this.isItemColumn(col))
+ items.push(col);
+ }
+ this.sortItemOrder(items);
+ items.forEach(function(item) {
+ columns.push({data: item, title: item});
+ });
+ r[term].columns = columns;
+ }
+};
+
+this.fillupItemRecords = function(r) {
+ for (var term in r) {
+ for (var col in r[term].stat["合計"]) {
+ if (!this.isItemColumn(col))
+ continue;
+ for (var map in r[term].stat) {
+ if (map === "合計")
+ continue;
+ if (!r[term].stat[map][col]){
+ r[term].stat[map][col] = 0;
+ }
+ }
+ }
+ }
+};
+
+this.reorderRows = function(r) {
for (var term in r) {
if (!r.hasOwnProperty(term))
continue;
return;
}
var r = this.gatherData(data);
- this.arrangeTable(r);
+ this.setupColumns(r);
+ this.fillupItemRecords(r);
+ this.reorderRows(r);
for (var term in r) {
- if (!r.hasOwnProperty(term))
- continue;
- var dt = $("#sortie_stat_" + term).DataTable();
- dt.clear();
- dt.rows.add(r[term].table).draw();
+ var table = $("#sortie_stat_" + term);
+ if ($.fn.dataTable.isDataTable(table))
+ table.DataTable().destroy();
+ table.html("<thead><tr>" +
+ r[term].columns.reduce(function(acc, cur) {
+ return acc + "<th>" + cur.title + "</th>";
+ }, "") + "</tr></thead>");
+ table.DataTable({
+ paging: false,
+ searching: false,
+ ordering: false,
+ columns: r[term].columns,
+ data: r[term].table
+ });
}
$('#loading').hide();
};