diff --git a/public/timeFrameSlope.jpg b/public/timeFrameSlope.jpg new file mode 100644 index 0000000..025834d Binary files /dev/null and b/public/timeFrameSlope.jpg differ diff --git a/src/components/Discover/Filter/Timeframes.vue b/src/components/Discover/Filter/Timeframes.vue index 12e629f..c6907d4 100644 --- a/src/components/Discover/Filter/Timeframes.vue +++ b/src/components/Discover/Filter/Timeframes.vue @@ -8,17 +8,18 @@
- +
{{ selectArea }}
- total: {{ this.filterTimeframe.data.length }} + total: {{ timeFrameData.length }}
Start date - +
+ @@ -26,6 +27,7 @@ import { storeToRefs } from 'pinia'; import AllMapDataStore from '@/stores/allMapData.js'; import getMoment from 'moment'; +import Chart from 'chart.js/auto' export default{ setup() { @@ -36,24 +38,71 @@ export default{ }, data() { return { + // timeFrameData: [], chartOptions: null, - selectArea: [1, 2], + selectArea: [1, 10], date: null } }, computed: { - chartData: function() { - let labels = this.filterTimeframe.data.map(time => getMoment(time.x).format("YYYY-MM-DD")); - let chartData = this.filterTimeframe.data.map(item => { - return { - x: getMoment(item.x).format("YYYY-MM-DD"), - y: item.y - } + // Set Slider Time Range,滑塊範圍: 最小值 + data(10 個) + 最大值 + timeFrameData: function(){ + let data = [...this.filterTimeframe.data]; + // y 軸斜率計算請參考 ./public/timeFrameSlope 的圖 + // x 值為 0 ~ 11, + // 將三的座標(ax, ay), (bx, by), (cx, cy)命名為 (a, b), (c, d), (e, f) + // 最小值: (f - b)(c - a) = (e - a)(d - b),求 b = (ed - ad - fa - fc) / (e - c - a) + // 最大值: (f - b)(e - c) = (f - d)(e - a),求 f = (be - bc -de + da) / (a - c) + + // y 軸最小值 + let a = 0; + let b; + let c = 1; + let d = this.filterTimeframe.data[0].y; + let e = 2; + let f = this.filterTimeframe.data[1].y; + b = (e*d - a*d - f*a - f*c) / (e - c - a) + // y 軸最大值 + let ma = 9; + let mb = this.filterTimeframe.data[8].y; + let mc = 10; + let md = this.filterTimeframe.data[9].y; + let me = 11; + let mf; + mf = (mb*me - mb*mc -md*me + md*ma) / (ma - mc) + + // 添加最小值 + data.unshift({ + x: this.filterTimeframe.x_axis.min, + y: b, }) + // 添加最大值 + data.push({ + x: this.filterTimeframe.x_axis.max, + y: mf, + }) + + return data; + }, + timeFrameTotal: function() { + return this.timeFrameData.length; + }, + chartData: function() { + // !!畫面顯示的時間,資料轉換,在這邊最後一個步驟做就好!! + let labels = this.timeFrameData.map(time => getMoment(time.x).format("YYYY-MM-DD")); + let chartData = this.timeFrameData.map(item => { + return item.y + // x: getMoment(item.x).format("YYYY-MM-DD"), + }) + + const start = this.selectArea[0]-1; + const end = this.selectArea[1]-1; + const inside = (ctx, value) => ctx.p0DataIndex >= start && ctx.p1DataIndex <= end ? value : undefined; + const outside = (ctx, value) => ctx.p0DataIndex < start || ctx.p1DataIndex > end ? value : undefined; return { // 要呈現的資料 - // labels, + labels, datasets: [ { label: 'Case', // 資料的標題標籤 @@ -61,50 +110,21 @@ export default{ fill: true, showLine: false, tension: 0.4, - backgroundColor: 'rgba(0,153,255)', - // pointRadius: 0, - + backgroundColor: 'rgba(203, 213, 225)', + pointRadius: 0, + spanGaps: true, + segment: { + backgroundColor: ctx => inside(ctx, 'rgb(0,153,255)') || outside(ctx, 'rgb(203, 213, 225)'), + }, }, - // { - // label: 'Selected Trace', - // // data: [ - // // {x: 0, y:37.8}, - // // {x: 0, y:29.5}, - // // {x: 0, y:17.9}, - // // {x: 0, y:8.8}, - // // {x: 0, y:3.2}, - // // {x: 0, y:0.8}, - // // {x: 0, y:0.4}, - // // {x: 0, y:0.4}, - // // {x: 0, y:0.4}, - // // {x: 0, y:0.4}, - // // {x: 0, y:0.4}, - // // ], - // data: [ - // {x: 0, y:37.8}, - // {x: 0, y:29.5}, - // {x: null, y:17.9}, - // ], - // // data: this.traces.map(trace=>trace.ratio), - // fill: true, - // // borderColor: documentStyle.getPropertyValue('--primary-500'), - // showLine: false, - // tension: 0.4, - // backgroundColor: documentStyle.getPropertyValue('--primary-500'), - // pointRadius: 0, - // } ] }; } }, methods: { - sss(e){ - console.log(e); - // e.stop(); - // e.prevent(); - // e.preventDefault(); - - }, + /** + * Set bar chart Options + */ setChartOptions() { // 找出 y 軸最大值,乘以 1.1 讓圖的上方多一點空間 const max = this.filterTimeframe.y_axis.max * 1.1; @@ -120,7 +140,10 @@ export default{ } }, plugins: { - legend: false // 圖例 + legend: false, // 圖例 + filler: { + propagate: false + } }, animations: false, // 取消動畫 scales: { @@ -153,11 +176,9 @@ export default{ }, mounted() { this.chartOptions = this.setChartOptions(); - this.selectArea = [1, 2]; - // console.log(Date.parse('2014/11/01 00:34:44')); + this.selectArea = [1, this.timeFrameTotal]; }, } diff --git a/src/components/Discover/SidebarFilter.vue b/src/components/Discover/SidebarFilter.vue index aee714c..d630829 100644 --- a/src/components/Discover/SidebarFilter.vue +++ b/src/components/Discover/SidebarFilter.vue @@ -132,7 +132,7 @@ export default { 'Mode': ['Directly follows', 'Eventually follows'], 'ModeAtt': ['Case', 'Activity'], 'Refine': ['Include', 'Exclude'], - 'Containment': ['Contained in', 'Started in', 'End in', 'Activity in', 'Trim'], + 'Containment': ['Contained in', 'Started in', 'Ended in', 'Active in', 'Trim'], }, tab: 'filter', // filter | funnel selectValue: { diff --git a/src/stores/files.js b/src/stores/files.js index 741290b..b4fa4ba 100644 --- a/src/stores/files.js +++ b/src/stores/files.js @@ -75,6 +75,7 @@ export default defineStore('filesStore', { }) if(this.httpStatus < 300) loading.isLoading = false; } catch(error) { + console.dir(error); // safari 測試 this.httpStatus = error.request.status; delay().then(() =>{ loading.isLoading = true; @@ -107,6 +108,7 @@ export default defineStore('filesStore', { }); if(this.httpStatus < 300) loading.isLoading = false; } catch(error) { + console.dir(error); // safari 測試 this.httpStatus = error.request.status; delay().then(() =>{ loading.isLoading = true; diff --git a/src/stores/login.js b/src/stores/login.js index 41511f7..4e4a793 100644 --- a/src/stores/login.js +++ b/src/stores/login.js @@ -41,6 +41,7 @@ export default defineStore('loginStore', { this.$router.push('/files'); } } catch(error) { + console.dir(error); // safari 測試 this.isInvalid = true; }; }, @@ -68,6 +69,7 @@ export default defineStore('loginStore', { this.userData = response.data; } catch(error) { + console.dir(error); // safari 測試 }; }, /** @@ -80,6 +82,7 @@ export default defineStore('loginStore', { const response = await axios.get(api); if(response.status !== 200) this.$router.push('/login'); } catch(error) { + console.dir(error); // safari 測試 this.$router.push('/login'); }; },