@extends('base') @section('body-class', 'property') @section('header') <span>Property {{ $base['property_platform_id'] }}</span><button popovertarget="prop-details"></button> <div popover id="prop-details"> <dl> <dt>Region</dt> <dd>{{ $base['region_name'] }}</dd> <dt>Zum ersten mal gefunden</dt> <dd>{{ $base['first_found'] }}</dd> <dt>Zum letzten mal gefunden</dt> <dd>{{ $base['last_found'] }}</dd> </dl> <h2>Kurzzeitmietobjekte in der Nähe</h2> <ul> @foreach($neighbours as $n) <li><a href="/prop/{{ $n['id'] }}">{{ $n['lat'] }}, {{$n['lon']}}</a></li> @endforeach </ul> </div> @endsection @section('main') <article style="grid-area: timeline;"> <div id="timeline"></div> </article> <article class="header" style="grid-area: chart1;"> <header> <h2 id="belegung-title"> Belegung am {{ json_decode($extractiondates)[0] }} </h2> </header> <div id="chart-calendar"></div> </article> <article class="header" style="grid-area: chart3;"> <header> <h2> Auslastung nach Monat am 2024-04-15T07:06:22 </h2> </header> <div id="chart-capacity-monthly"> </div> </article> <article class="header" style="grid-area: chart2;"> <header> <h2> Entwicklung der Verfügbarkeit </h2> <button popovertarget="chart-capacity-popover"></button> <div id="chart-capacity-popover" popover> <h2>Erkläung zum Diagramm</h2> <p>Das Liniendiagramm zeigt, wie sich die insgesamte Verfügbarkeit des Kurzzeitmietobjekts entwickelt hat.</p> </div> </header> <div id="chart-capacity"></div> </article> <article class="header" style="grid-area: chart4;"> <header> <h2> Auslastung Tage für Monat </h2> </header> <div id="chart-capacity-daily"> </article> <script type="module"> const chartTimeline = document.getElementById('timeline'); const cTimeline = echarts.init(chartTimeline); const cTimelineOptions = { grid: { show: false, }, timeline: { data: {!! $extractiondates !!}, playInterval: 2000, axisType: 'time', left: 8, right: 8, bottom: 0, label: { show: false } } }; cTimeline.setOption(cTimelineOptions); const chartCapacityMonthly = document.getElementById('chart-capacity-monthly'); const cCapacityMonthly = echarts.init(chartCapacityMonthly); const cCapacityMonthlyOptions = { timeline: { show: false, data: {!! $extractiondates !!}, axisType: 'time', }, grid: { top: 0, bottom: 25, left: 70, right: 10 }, xAxis: { type: 'value', max: 100 }, yAxis: { type: 'category', }, options: [ @foreach ($capacitiesMonthly as $cM) { yAxis: { data: {!! json_encode($cM['months']) !!} }, series: [{ type: 'bar', data: {!! json_encode($cM['capacities']) !!} }] }, @endforeach ] }; cCapacityMonthly.setOption(cCapacityMonthlyOptions); const chartCapacityDaily = document.getElementById('chart-capacity-daily'); const cCapacityDaily = echarts.init(chartCapacityDaily); const cCapacityDailyOptions = { timeline: { show: false, data: {!! $extractiondates !!}, axisType: 'time', }, grid: { top: 0, bottom: 25, left: 70, right: 10 }, xAxis: { type: 'value', max: 100 }, yAxis: { type: 'category', }, options: [ @foreach ($capacitiesDaily as $cD) { yAxis: { data: {!! json_encode($cD['weekdays']) !!} }, series: [{ type: 'bar', data: {!! json_encode($cD['capacities']) !!} }] }, @endforeach ] }; cCapacityDaily.setOption(cCapacityDailyOptions); const chartCapacity = document.getElementById('chart-capacity'); const cCapacity = echarts.init(chartCapacity); const cCapacityOptions = { tooltip: { trigger: 'axis', formatter: 'Datum Scraping: {b}<br />Verfügbarkeit: {c} %' }, grid: { top: 20, left: 25, right: 10, bottom: 20, containLabel: true }, xAxis: { type: 'category', boundaryGap: false, data: {!! json_encode($capacities['dates']) !!}, name: 'Zeitpunkt Scraping', nameLocation: 'center', nameGap: 24, nameTextStyle: { fontWeight: 'bold', } }, yAxis: { type: 'value', min: 0, max: 100, name: 'Auslastung in Prozent', nameLocation: 'center', nameGap: 38, nameTextStyle: { fontWeight: 'bold', } }, series: [{ name: 'Auslastung', type: 'line', symbolSize: 7, data: {!! json_encode($capacities['capacities']) !!} }, { name: 'Auslastung Region', type: 'line', symbolSize: 7, data: {!! json_encode($capacities['capacities']) !!} }] }; cCapacity.setOption(cCapacityOptions); const chartCalendar = document.getElementById('chart-calendar'); const cCalendar = echarts.init(chartCalendar); const h2Belegung = document.getElementById('belegung-title'); const cCalendarOptions = { timeline: { show: false, data: {!! $extractiondates !!}, axisType: 'time', }, visualMap: { categories: [0,1,2], inRange: { color: ['#d95f02', '#7570b3', '#1b9e77'] }, formatter: (cat) => { switch (cat) { case 0: return 'Ausgebucht'; case 1: return 'Verfügbar (kein Anreisetag)'; case 2: return 'Verfügbar'; } }, type: 'piecewise', orient: 'horizontal', left: 'center', top: 0 }, calendar:[ { orient: 'horizontal', range: '2024', top: '15%', right: 10, bottom: '65%', left: 50, }, { orient: 'horizontal', range: '2025', top: '47%', right: 10, bottom: '33%', left: 50, }, { orient: 'horizontal', range: '2026', top: '79%', right: 10, bottom: '1%', left: 50, } ], options: [ @foreach ($calendar as $c) { series: [{ type: 'heatmap', coordinateSystem: 'calendar', calendarIndex: 0, data: {!! json_encode($c) !!} }, { type: 'heatmap', coordinateSystem: 'calendar', calendarIndex: 1, data: {!! json_encode($c) !!} }, { type: 'heatmap', coordinateSystem: 'calendar', calendarIndex: 2, data: {!! json_encode($c) !!} }] }, @endforeach ] }; cCalendar.setOption(cCalendarOptions); cTimeline.on('timelinechanged', (e) => { h2Belegung.innerText = "Belegung am "+cCalendarOptions.timeline.data[e.currentIndex]; // Set markpoint on linechart let x = cCapacityOptions.xAxis.data[e.currentIndex]; let y = cCapacityOptions.series[0].data[e.currentIndex]; cCapacityMonthly.dispatchAction({ type: 'timelineChange', currentIndex: e.currentIndex }); cCapacityDaily.dispatchAction({ type: 'timelineChange', currentIndex: e.currentIndex }); cCalendar.dispatchAction({ type: 'timelineChange', currentIndex: e.currentIndex }); cCapacity.setOption({ series: { markPoint: { data: [{ coord: [x, y] }] } } }); }) cCapacity.on('click', 'series', (e) => { // Switch to correct calendar in the timeline cTimeline.dispatchAction({ type: 'timelineChange', currentIndex: e.dataIndex }); }); </script> @endsection