🔀 Merge pull request #1278 from wozboz/master

Add new widget for RescueTime
This commit is contained in:
Alicia Sykes 2023-08-13 14:21:17 +01:00 committed by GitHub
commit d4126baa88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 144 additions and 0 deletions

View File

@ -39,6 +39,7 @@ Dashy has support for displaying dynamic content in the form of widgets. There a
- [Mvg Departure](#mvg-departure)
- [Mvg Connection](#mvg-connection)
- [Custom search](#custom-search)
- [Rescuetime overview](#rescuetime-overview)
- **[Self-Hosted Services Widgets](#self-hosted-services-widgets)**
- [System Info](#system-info)
- [Cron Monitoring](#cron-monitoring-health-checks)
@ -1339,6 +1340,38 @@ This widget allows searching multiple search engines from dashy.
---
### RescueTime Overview
Show an overview of how you have spent your time for the current day.
<p align="center"><img width="400" src="https://i.ibb.co/bvx3PQM/rescuetime.png" /></p>
#### Options
**Field** | **Type** | **Required** | **Description**
--- | --- | --- | ---
**`apiKey`** | `string` | required | The API-Key generated in the RescueTime UI.
#### Example
```yaml
- type: rescue-time
useProxy: true
options:
apiKey: abcdefghijkl_mnop
```
#### Info
- **CORS**: 🟢 Required
- **Auth**: 🔴 Required
- **Price**: 🟠 Depends on user subscription
- **Host**: [RescueTime](https://www.rescuetime.com)
- **Privacy**: _See [RescueTime Privacy](https://www.rescuetime.com/privacy)_
---
## Self-Hosted Services Widgets

View File

@ -0,0 +1,109 @@
<template>
<div class="rescuetime-wrapper">
<div class="title-row">
<p class="title-rank">Rank</p>
<p class="title-name">Category</p>
<p class="title-time">Time spent</p>
</div>
<div
v-for="(category, indx) in categories"
:key="indx"
class="category-row"
>
<p class="category-rank">{{ category.rank }}</p>
<p class="category-name">{{ indx }}</p>
<p class="category-time">{{ category.minutes }} min</p>
</div>
</div>
</template>
<script>
import WidgetMixin from '@/mixins/WidgetMixin';
import { widgetApiEndpoints } from '@/utils/defaults';
export default {
mixins: [WidgetMixin],
data() {
return {
categories: [],
};
},
mounted() {
this.checkOptions();
},
computed: {
endpoint() {
const todaystring = this.getDate();
return `${widgetApiEndpoints.rescueTime}?key=${this.options.apiKey}&restrict_begin=${todaystring}&restrict_end=${todaystring}&restrict_kind=overview&format=json`;
},
},
methods: {
fetchData() {
this.makeRequest(this.endpoint).then(this.processData);
},
processData(data) {
const formateddata = this.calculateTimeCategories(data);
this.categories = formateddata;
},
checkOptions() {
const ops = this.options;
if (!ops.apiKey) this.error('Missing API key for RescueTime');
},
getDate() {
const today = new Date();
let day = today.getDate();
let month = today.getMonth() + 1;
const year = today.getFullYear();
if (day < 10) {
day = `0${day}`;
}
if (month < 10) {
month = `0${month}`;
}
return `${day}-${month}-${year}`;
},
calculateTimeCategories(timeArray) {
const results = {};
for (let i = 0; i < timeArray.rows.length; i += 1) {
const [rank, seconds, persons, category] = timeArray.rows[i];
const minutes = (parseInt(seconds, 10) / 60).toFixed(2);
results[category] = { minutes, rank, persons };
}
return results;
},
},
};
</script>
<style scoped lang="scss">
.rescuetime-wrapper {
padding: 0.5rem 0;
.title-row {
display: flex;
justify-content: space-between;
p {
margin: 0.25rem 0;
color: var(--widget-text-color);
font-weight: 700;
font-size: 1.15rem;
}
&:not(:last-child) {
border-bottom: 1px dashed var(--widget-text-color);
}
}
.category-rank {
font-weight: 700;
}
.category-row {
display: flex;
justify-content: space-between;
p {
margin: 0.25rem 0;
color: var(--widget-text-color);
opacity: var(--dimming-factor);
}
}
}
</style>

View File

@ -104,6 +104,7 @@ const COMPAT = {
'proxmox-lists': 'Proxmox',
'public-holidays': 'PublicHolidays',
'public-ip': 'PublicIp',
'rescue-time': 'RescueTime',
'rss-feed': 'RssFeed',
sabnzbd: 'Sabnzbd',
'sports-scores': 'SportsScores',

View File

@ -238,6 +238,7 @@ module.exports = {
publicIp2: 'https://api.ipgeolocation.io/ipgeo',
publicIp3: 'http://ip-api.com/json',
readMeStats: 'https://github-readme-stats.vercel.app/api',
rescueTime: 'https://www.rescuetime.com/anapi/data',
rssToJson: 'https://api.rss2json.com/v1/api.json',
sportsScores: 'https://www.thesportsdb.com/api/v1/json',
stockPriceChart: 'https://www.alphavantage.co/query',