Skip to content

Commit

Permalink
✨ support for worldwide holidays has been added (thanks @AndreasBomholtz
Browse files Browse the repository at this point in the history
)

✨ Customer selection in project properties is now an interactive search field (implements Client selection #131)
🧏 improved a11y throughout the application
🐳 reduced docker image size a bit after adding date-holidays dependency
💄 improved PWA icon and settings
  • Loading branch information
faburem committed Jun 5, 2022
1 parent bf6c730 commit 66b5a18
Show file tree
Hide file tree
Showing 32 changed files with 225 additions and 109 deletions.
11 changes: 8 additions & 3 deletions Dockerfile
Expand Up @@ -27,9 +27,14 @@ RUN cd /app/bundle/programs/server; npm ci; npm prune --production;
RUN curl -sfL https://gobinaries.com/tj/node-prune -o /tmp/node-prune.sh
RUN chmod +x /tmp/node-prune.sh
RUN /tmp/node-prune.sh
RUN rm -r /app/bundle/programs/server/npm/node_modules/meteor/babel-compiler/node_modules/typescript
RUN rm -r /app/bundle/programs/server/npm/node_modules/meteor/babel-compiler/node_modules/@babel
RUN rm -r /app/bundle/programs/server/npm/node_modules/@neovici/nullxlsx/cc-test-reporter
RUN rm -rf /app/bundle/programs/server/npm/node_modules/meteor/babel-compiler/node_modules/typescript
RUN rm -rf /app/bundle/programs/server/npm/node_modules/meteor/babel-compiler/node_modules/@babel
RUN rm -rf /app/bundle/programs/server/npm/node_modules/@neovici/nullxlsx/cc-test-reporter
RUN rm -rf /app/bundle/programs/server/npm/node_modules/moment/locale
RUN rm -rf /app/bundle/programs/server/npm/node_modules/moment/dist/locale
RUN rm -rf /app/bundle/programs/server/npm/node_modules/moment/src/locale
RUN find /app/bundle/programs/server/npm/node_modules/astronomia/data/ -type f -not -name "deltat.js" -or -name "vsop87Bearth.js" -delete
RUN find /app/bundle/programs/server/npm/node_modules/astronomia/lib/data/ -type f -not -name "deltat.js" -or -name "vsop87Bearth.js" -delete

FROM node:14.1-alpine
RUN apk --no-cache add \
Expand Down
2 changes: 1 addition & 1 deletion client/head.html
@@ -1,6 +1,6 @@
<head>
<title>titra - modern open source time tracking</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no maximum-scale=1.0, minimum-scale=1, user-scalable=0, viewport-fit=cover" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no maximum-scale=1.0, minimum-scale=1, viewport-fit=cover" />
<meta charset="UTF-8">
<meta name="description" content="modern open soure time tracking for small companies">
<meta name="keywords" content="open source, time, tracking, meteor, sandstorm, javascript, web">
Expand Down
9 changes: 9 additions & 0 deletions imports/api/customers/server/methods.js
@@ -0,0 +1,9 @@
import Projects from '../../projects/projects.js'
import { checkAuthentication } from '../../../utils/server_method_helpers.js'

Meteor.methods({
getAllCustomers: function getAllCustomers() {
checkAuthentication(this)
return Projects.rawCollection().aggregate([{ $match: { $or: [{ userId: this.userId }, { public: true }, { team: this.userId }] } }, { $group: { _id: '$customer' } }]).toArray()
},
})
1 change: 1 addition & 0 deletions imports/startup/server/index.js
Expand Up @@ -17,6 +17,7 @@ import '../../api/dashboards/dashboards.js'
import '../../api/dashboards/server/publications.js'
import '../../api/dashboards/methods.js'
import '../../api/customers/server/publications.js'
import '../../api/customers/server/methods.js'
import '../../api/statistics/methods.js'
import '../../api/globalsettings/server/publications.js'
import '../../api/globalsettings/methods.js'
Expand Down
2 changes: 1 addition & 1 deletion imports/ui/components/allprojectschart.html
Expand Up @@ -4,7 +4,7 @@
{{t "overview.total_time_tracked"}} <br/>
{{timeInUserUnit(totalHours)}} ({{timeunitVerbose}})
<div class="my-2"></div>
<button type="button" class="btn btn-secondary border" data-bs-toggle="collapse" data-bs-target=".js-allproject-filter"><i class="fa fa-funnel-dollar"></i>&nbsp; {{t "details.filter"}}</button>
<button type="button" class="btn btn-secondary border" data-bs-toggle="collapse" data-bs-target=".js-allproject-filter" aria-label='{{t "details.filter"}}'><i class="fa fa-funnel-dollar"></i>&nbsp; {{t "details.filter"}}</button>
<div class="collapse card js-allproject-filter all-projects-bg">
<div class="card-body p-2">
<div class="form-check form-switch">
Expand Down
2 changes: 1 addition & 1 deletion imports/ui/components/backbutton.html
@@ -1,3 +1,3 @@
<template name="backbutton">
<button type="button" class="btn btn-secondary border js-backbutton">{{t "navigation.back"}}</button>
<button type="button" class="btn btn-secondary border js-backbutton" aria-label='{{t "navigation.back"}}'>{{t "navigation.back"}}</button>
</template>
8 changes: 4 additions & 4 deletions imports/ui/components/dailytimetable.html
Expand Up @@ -3,11 +3,11 @@
<div class="col-lg-3 col-sm-6">
<div class="btn-group">
{{#if dailyTimecards}}
<button type="button" class="btn btn-secondary border js-export-csv"><i class="fa fa-download"></i> <span class="d-none d-md-inline">CSV</span></button>
<button type="button" class="btn btn-secondary border js-export-xlsx"><i class="fa fa-download"></i> <span class="d-none d-md-inline">Excel</span></button>
<button type="button" class="btn btn-secondary border js-export-csv" aria-label="CSV export"><i class="fa fa-download"></i> <span class="d-none d-md-inline">CSV</span></button>
<button type="button" class="btn btn-secondary border js-export-xlsx" aria-label="Excel export"><i class="fa fa-download"></i> <span class="d-none d-md-inline">Excel</span></button>
{{else}}
<button type="button" class="btn btn-secondary border js-export-csv" disabled><i class="fa fa-download"></i> <span class="d-none d-md-inline">CSV</span></button>
<button type="button" class="btn btn-secondary border js-export-xlsx" disabled><i class="fa fa-download"></i> <span class="d-none d-md-inline">Excel</span></button>
<button type="button" class="btn btn-secondary border js-export-csv" aria-label="CSV export" disabled><i class="fa fa-download"></i> <span class="d-none d-md-inline">CSV</span></button>
<button type="button" class="btn btn-secondary border js-export-xlsx" aria-label="Excel export" disabled><i class="fa fa-download"></i> <span class="d-none d-md-inline">Excel</span></button>
{{/if}}
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion imports/ui/components/detailtimetable.html
Expand Up @@ -25,7 +25,7 @@
</div>
<div class="col-xl-3 col-md-7 mt-2">
<div class="input-group">
<input type="search" class="js-search form-control float-end" placeholder='{{t "details.search"}}'/>
<input type="search" class="js-search form-control float-end" placeholder='{{t "details.search"}}' aria-label='{{t "details.search"}}'/>
<button type="button" class="btn btn-secondary border"><i class="fa fa-search"></i></button>
</div>
</div>
Expand Down
6 changes: 3 additions & 3 deletions imports/ui/components/navbar.html
@@ -1,7 +1,7 @@
<template name="navbar">
<nav class="navbar navbar-expand bg-dark fixed-top d-print-none">
<div class="container-fluid">
<a class="navbar-brand text-white" href="/"><img src="/favicons/favicon-32x32.png" alt="titra - open source time tracking for small companies" class="d-inline-block" height="25"/>{{#unless currentUser}}&nbsp;&nbsp;titra{{/unless}}</a>
<a class="navbar-brand text-white" href="/"><img src="/img/navbar_logo.svg" alt="titra - open source time tracking for small companies" class="d-inline-block" height="24" width="24"/>{{#unless currentUser}}&nbsp;&nbsp;titra{{/unless}}</a>
{{#if currentUser}}
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
Expand All @@ -21,10 +21,10 @@
</div>
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle {{isRouteActive 'settings'}}" href="#" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<a class="nav-link dropdown-toggle {{isRouteActive 'settings'}}" href="#" aria-label="Menu dropdown" id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{{avatar}}}
</a>
<div class="dropdown-menu mt-0 bg-dark" aria-labelledby="navbarDropdownMenuLink" style="left:auto;right:-1rem;">
<div class="dropdown-menu mt-0 bg-dark" aria-label="navbarDropdownMenuLink" style="left:auto;right:-1rem;">
<a class="dropdown-item text-white" href="/profile"><i class="fa fa-user-circle"></i> {{t "navigation.profile"}}</a>
<a class="dropdown-item text-white" href="/settings"><i class="fa fa-cogs"></i> {{t "navigation.settings"}}</a>
{{#unless currentUser.loggingIn}}
Expand Down
4 changes: 2 additions & 2 deletions imports/ui/components/periodpicker.html
Expand Up @@ -25,11 +25,11 @@ <h5 class="modal-title">{{t "period.custom_period"}}</h5>
<div class="modal-body">
<div class="mb-3">
<label>{{t "details.startTime"}}:</label>
<input class="form-control" name="customStartDate" id="customStartDate" type="date" value="{{startDate}}"/>
<input aria-label='{{t "details.startTime"}}' class="form-control" name="customStartDate" id="customStartDate" type="date" value="{{startDate}}"/>
</div>
<div class="mb-3">
<label>{{t "details.endTime"}}:</label>
<input class="form-control" name="customEndDate" id="customEndDate" type="date" value="{{endDate}}"/>
<input class="form-control" aria-label='{{t "details.endTime"}}' name="customEndDate" id="customEndDate" type="date" value="{{endDate}}"/>
</div>
</div>
<div class="modal-footer">
Expand Down
4 changes: 2 additions & 2 deletions imports/ui/components/projectAccessRights.html
Expand Up @@ -18,9 +18,9 @@
{{#unless disablePublic}}
<div class="form-check">
{{#if public}}
<input name="public" id="public" type="checkbox" checked class="form-check-input" />
<input name="public" aria-label='{{t "project.public_project"}}' id="public" type="checkbox" checked class="form-check-input" />
{{else}}
<input name="public" id="public" type="checkbox" class="form-check-input" />
<input name="public" aria-label='{{t "project.public_project"}}' id="public" type="checkbox" class="form-check-input" />
{{/if}}
<label class="form-check-label">{{t "project.public_project"}}</label>
</div>
Expand Down
1 change: 0 additions & 1 deletion imports/ui/components/projectchart.js
Expand Up @@ -127,7 +127,6 @@ Template.projectchart.onRendered(() => {
templateInstance.autorun(() => {
if (templateInstance.subscriptionsReady() && templateInstance.isVisible.get()) {
const stats = ProjectStats.findOne({ _id: templateInstance.data.projectId })
console.log(stats)
if (stats) {
import('frappe-charts').then((chartModule) => {
const { Chart } = chartModule
Expand Down
2 changes: 1 addition & 1 deletion imports/ui/components/tablecell.html
@@ -1,7 +1,7 @@
<template name="tablecell">
{{#if canBeModified}}
<div class="text-end">
<a href="/edit/timecard/{{_id}}"><i class="fa fa-edit"></i></a> <a href="#" class="js-delete-timecard"><i class="fa fa-trash"></i></a>
<a href="/edit/timecard/{{_id}}" aria-label="Edit"><i class="fa fa-edit"></i></a> <a href="#" class="js-delete-timecard" aria-label="Delete"><i class="fa fa-trash"></i></a>
</div>
{{/if}}
</template>
2 changes: 1 addition & 1 deletion imports/ui/components/taskSelectPopup.html
Expand Up @@ -22,7 +22,7 @@ <h5 class="modal-title">{{t "globals.task_plural"}}</h5>
</div>
<div class="col">
<div class="input-group mb-3 form-floating">
<input class="form-control" placeholder='{{t "task.search"}}' type="text" id="taskSelectSearch"/>
<input class="form-control" aria-label='{{t "task.search"}}' placeholder='{{t "task.search"}}' type="text" id="taskSelectSearch"/>
<button type="button" class="btn btn-outline-primary" id="button-addon2"><i class="fas fa-search"></i></button>
<label class="form-label">{{t "task.search"}}</label>
</div>
Expand Down
10 changes: 5 additions & 5 deletions imports/ui/components/tasksearch.html
@@ -1,9 +1,9 @@
<template name="tasksearch">
{{#if isComponent}}
<input type="text" value="{{task}}" class="js-tasksearch-input form-control" autocomplete="off" placeholder='{{t "tracktime.task_placeholder"}}'/>
<input type="text" aria-label='{{t "tracktime.task_placeholder"}}' value="{{task}}" class="js-tasksearch-input form-control" autocomplete="off" placeholder='{{t "tracktime.task_placeholder"}}'/>
{{else}}
<div class="input-group form-floating">
<input type="text" value="{{task}}" class="js-tasksearch-input form-control" autocomplete="off" placeholder='{{t "tracktime.task_placeholder"}}'/>
<input type="text" aria-label='{{t "tracktime.task_placeholder"}}' value="{{task}}" class="js-tasksearch-input form-control" autocomplete="off" placeholder='{{t "tracktime.task_placeholder"}}'/>
{{#if displayTaskSelectionIcon}}
<button type="button" class="btn btn-outline-secondary js-show-task-select-popup">
<i class="fas fa-list-alt"></i>
Expand All @@ -20,9 +20,9 @@
</div>
{{/unless}}
{{#each tasks}}
<button type="button" id="{{id}}" class="list-group-item list-group-item-action js-tasksearch-result" tabindex="{{@index}}">
{{#if wekan}}<img src="/img/wekan.png"/>{{/if}}
{{#if zammad}}<img style="width:15px;" src="/img/zammad.svg"/>{{/if}}
<button type="button" id="{{id}}" class="list-group-item list-group-item-action js-tasksearch-result">
{{#if wekan}}<img src="/img/wekan.png" alt="Wekan"/>{{/if}}
{{#if zammad}}<img style="width:15px;" src="/img/zammad.svg" alt="Zammad"/>{{/if}}
&nbsp;<span class="js-tasksearch-task-name">{{emojify (name)}}</span>
</button>
{{/each}}
Expand Down
12 changes: 6 additions & 6 deletions imports/ui/components/timetracker.html
Expand Up @@ -2,15 +2,15 @@
{{#if timerIsRunning}}
{{#if isWidget}}
<div class="input-group">
<input type="text" class="form-control bg-secondary js-timer px-2" value="00:00:00"/>
<button type="button" class="btn btn-outline-secondary js-stop">
<input type="text" aria-label="Timer" class="form-control bg-secondary js-timer px-2" value="00:00:00"/>
<button type="button" class="btn btn-outline-secondary js-stop" aria-label="Stop timer">
<i class="fa fa-stopwatch"></i>
</button>
</div>
{{else}}
<div class="input-group form-floating">
<input type="text" class="form-control bg-secondary js-timer" value="00:00:00"/>
<button type="button" class="btn btn-outline-secondary js-stop">
<input aria-label="Timer" type="text" class="form-control bg-secondary js-timer" value="00:00:00"/>
<button type="button" class="btn btn-outline-secondary js-stop" aria-label="Stop timer">
<i class="fa fa-stop"></i>
</button>
<label class="form-label">{{t "tracktime.timer"}}</label>
Expand All @@ -19,9 +19,9 @@
{{else}}
<div class="input-group form-floating">
<!-- <button class="btn btn-secondary border js-start form-control"> -->
<input type="text" disabled class="bg-secondary form-control" placeholder="test"/>
<input aria-label="Timer" type="text" disabled class="bg-secondary form-control" placeholder="00:00:00"/>
<!-- </button> -->
<button type="button" class="btn btn-outline-secondary js-start">
<button type="button" class="btn btn-outline-secondary js-start" aria-label="Start timer">
<i class="fa fa-circle"></i>
</button>
<label class="form-label">{{t "tracktime.timer"}}</label>
Expand Down
2 changes: 1 addition & 1 deletion imports/ui/components/weektable.html
Expand Up @@ -59,7 +59,7 @@
</td>
{{#each weekday in weekDays}}
<td>
<input type="number" value="{{getHoursForDay weekday task}}" data-task="{{task._id}}" data-project-id="{{projectId}}" data-week-day="{{@index}}" class="form-control js-hours" placeholder="0.00"/>
<input aria-label="Weekday {{@index}}" type="number" value="{{getHoursForDay weekday task}}" data-task="{{task._id}}" data-project-id="{{projectId}}" data-week-day="{{@index}}" class="form-control js-hours" placeholder="0.00"/>
</td>
{{/each}}
<td class="pt-2">{{getTotalForTask(task)}}</td>
Expand Down
2 changes: 1 addition & 1 deletion imports/ui/pages/about.html
Expand Up @@ -34,7 +34,7 @@
</div>
<div class="card mb-3">
<div class="card-header">
{{t "settings.titra_changelog"}} <a href="#" class="week-row float-end" data-bs-toggle="collapse" data-bs-target="#changelog" id="retrieveChangeLog"><i class="fa fa-chevron-right"></i></a>
{{t "settings.titra_changelog"}} <a href="#" aria-label='{{t "settings.titra_changelog"}}' class="week-row float-end" data-bs-toggle="collapse" data-bs-target="#changelog" id="retrieveChangeLog"> <i class="fa fa-chevron-right"></i></a>
</div>
<div class="card-block collapse" id="changelog">
<!-- <button class="btn btn-outline-primary" id="retrieveChangeLog">Retrieve change log from GitHub</button> -->
Expand Down

0 comments on commit 66b5a18

Please sign in to comment.