Browse Source

Working Trackers; Working; Working Archive;

poc/redesign-trackers
Nero Ignis 4 years ago
parent
commit
b2a7f13834
  1. 262
      package-lock.json
  2. 4
      package.json
  3. 7
      src/App.vue
  4. 12
      src/router/index.js
  5. 4
      src/store/index.js
  6. 115
      src/views/Archive.vue
  7. 41
      src/views/Menu.vue
  8. 3
      src/views/Trackers.vue
  9. 188
      src/views/TrackersDetail.vue
  10. 1
      timetrack_legacy

262
package-lock.json generated

@ -27,7 +27,9 @@ @@ -27,7 +27,9 @@
"@vue/compiler-sfc": "^3.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^7.0.0"
"eslint-plugin-vue": "^7.0.0",
"sass": "^1.43.5",
"sass-loader": "^10.2.0"
}
},
"node_modules/@babel/code-frame": {
@ -3455,7 +3457,6 @@ @@ -3455,7 +3457,6 @@
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true,
"optional": true,
"engines": {
"node": ">=8"
}
@ -4023,7 +4024,6 @@ @@ -4023,7 +4024,6 @@
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
"integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
"dev": true,
"optional": true,
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@ -4046,7 +4046,6 @@ @@ -4046,7 +4046,6 @@
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"optional": true,
"dependencies": {
"fill-range": "^7.0.1"
},
@ -4059,7 +4058,6 @@ @@ -4059,7 +4058,6 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"optional": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
@ -4072,7 +4070,6 @@ @@ -4072,7 +4070,6 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"optional": true,
"dependencies": {
"is-glob": "^4.0.1"
},
@ -4085,7 +4082,6 @@ @@ -4085,7 +4082,6 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"optional": true,
"engines": {
"node": ">=0.12.0"
}
@ -4095,7 +4091,6 @@ @@ -4095,7 +4091,6 @@
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"optional": true,
"dependencies": {
"is-number": "^7.0.0"
},
@ -8266,7 +8261,6 @@ @@ -8266,7 +8261,6 @@
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"optional": true,
"dependencies": {
"binary-extensions": "^2.0.0"
},
@ -8788,9 +8782,9 @@ @@ -8788,9 +8782,9 @@
"dev": true
},
"node_modules/json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
"dev": true
},
"node_modules/json-schema-traverse": {
@ -8845,18 +8839,18 @@ @@ -8845,18 +8839,18 @@
}
},
"node_modules/jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"dev": true,
"engines": [
"node >=0.6.0"
],
"dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"json-schema": "0.4.0",
"verror": "1.10.0"
},
"engines": {
"node": ">=0.6.0"
}
},
"node_modules/killable": {
@ -8874,6 +8868,15 @@ @@ -8874,6 +8868,15 @@
"node": ">=0.10.0"
}
},
"node_modules/klona": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
"integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/launch-editor": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz",
@ -11550,7 +11553,6 @@ @@ -11550,7 +11553,6 @@
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"optional": true,
"dependencies": {
"picomatch": "^2.2.1"
},
@ -11950,6 +11952,123 @@ @@ -11950,6 +11952,123 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"node_modules/sass": {
"version": "1.43.5",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.43.5.tgz",
"integrity": "sha512-WuNm+eAryMgQluL7Mbq9M4EruyGGMyal7Lu58FfnRMVWxgUzIvI7aSn60iNt3kn5yZBMR7G84fAGDcwqOF5JOg==",
"dev": true,
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0"
},
"bin": {
"sass": "sass.js"
},
"engines": {
"node": ">=8.9.0"
}
},
"node_modules/sass-loader": {
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz",
"integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==",
"dev": true,
"dependencies": {
"klona": "^2.0.4",
"loader-utils": "^2.0.0",
"neo-async": "^2.6.2",
"schema-utils": "^3.0.0",
"semver": "^7.3.2"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"fibers": ">= 3.1.0",
"node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0",
"sass": "^1.3.0",
"webpack": "^4.36.0 || ^5.0.0"
},
"peerDependenciesMeta": {
"fibers": {
"optional": true
},
"node-sass": {
"optional": true
},
"sass": {
"optional": true
}
}
},
"node_modules/sass-loader/node_modules/loader-utils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
"dev": true,
"dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
},
"engines": {
"node": ">=8.9.0"
}
},
"node_modules/sass-loader/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/sass-loader/node_modules/schema-utils": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/sass-loader/node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/sass-loader/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
@ -18061,8 +18180,7 @@ @@ -18061,8 +18180,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true,
"optional": true
"dev": true
},
"bindings": {
"version": "1.5.0",
@ -18551,7 +18669,6 @@ @@ -18551,7 +18669,6 @@
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
"integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
"dev": true,
"optional": true,
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@ -18568,7 +18685,6 @@ @@ -18568,7 +18685,6 @@
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"optional": true,
"requires": {
"fill-range": "^7.0.1"
}
@ -18578,7 +18694,6 @@ @@ -18578,7 +18694,6 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"optional": true,
"requires": {
"to-regex-range": "^5.0.1"
}
@ -18588,7 +18703,6 @@ @@ -18588,7 +18703,6 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"optional": true,
"requires": {
"is-glob": "^4.0.1"
}
@ -18597,15 +18711,13 @@ @@ -18597,15 +18711,13 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"optional": true
"dev": true
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"optional": true,
"requires": {
"is-number": "^7.0.0"
}
@ -21903,7 +22015,6 @@ @@ -21903,7 +22015,6 @@
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"optional": true,
"requires": {
"binary-extensions": "^2.0.0"
}
@ -22280,9 +22391,9 @@ @@ -22280,9 +22391,9 @@
"dev": true
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
"dev": true
},
"json-schema-traverse": {
@ -22328,14 +22439,14 @@ @@ -22328,14 +22439,14 @@
}
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
"integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"dev": true,
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"json-schema": "0.4.0",
"verror": "1.10.0"
}
},
@ -22351,6 +22462,12 @@ @@ -22351,6 +22462,12 @@
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
"klona": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
"integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
"dev": true
},
"launch-editor": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz",
@ -24579,7 +24696,6 @@ @@ -24579,7 +24696,6 @@
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"optional": true,
"requires": {
"picomatch": "^2.2.1"
}
@ -24906,6 +25022,76 @@ @@ -24906,6 +25022,76 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"sass": {
"version": "1.43.5",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.43.5.tgz",
"integrity": "sha512-WuNm+eAryMgQluL7Mbq9M4EruyGGMyal7Lu58FfnRMVWxgUzIvI7aSn60iNt3kn5yZBMR7G84fAGDcwqOF5JOg==",
"dev": true,
"requires": {
"chokidar": ">=3.0.0 <4.0.0"
}
},
"sass-loader": {
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz",
"integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==",
"dev": true,
"requires": {
"klona": "^2.0.4",
"loader-utils": "^2.0.0",
"neo-async": "^2.6.2",
"schema-utils": "^3.0.0",
"semver": "^7.3.2"
},
"dependencies": {
"loader-utils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
"yallist": "^4.0.0"
}
},
"schema-utils": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
}
},
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",

4
package.json

@ -28,7 +28,9 @@ @@ -28,7 +28,9 @@
"@vue/compiler-sfc": "^3.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^7.0.0"
"eslint-plugin-vue": "^7.0.0",
"sass": "^1.43.5",
"sass-loader": "^10.2.0"
},
"eslintConfig": {
"root": true,

7
src/App.vue

@ -1,10 +1,9 @@ @@ -1,10 +1,9 @@
<template>
<div class="container">
<div class="container" id="content">
<link rel="stylesheet" :href="'https://bootswatch.com/5/materia/bootstrap.min.css'">
<router-view/>
</div>
<Archive/>
<Menu/>
</template>
@ -14,12 +13,10 @@ import iziToast from 'izitoast' @@ -14,12 +13,10 @@ import iziToast from 'izitoast'
import axios from 'axios'
import bootstrap from 'bootstrap'
import Menu from "./views/Menu";
import Archive from "./views/Archive";
export default {
el: '#root',
components: {
Archive,
Menu
},
data() {
@ -427,10 +424,10 @@ function playSound(sound, extension = null) { @@ -427,10 +424,10 @@ function playSound(sound, extension = null) {
<style>
body {
background-color: #e7e7e7;
overflow-y: auto;
}
.container {
margin: 20px auto 20px 60px;
height: 100vh;
}
</style>

12
src/router/index.js

@ -1,6 +1,8 @@ @@ -1,6 +1,8 @@
import { createRouter, createWebHashHistory } from 'vue-router'
import Trackers from "../views/Trackers";
import Settings from "../views/Settings";
import TrackersDetail from "../views/TrackersDetail";
import Archive from "../views/Archive";
Array.prototype.pushToBeginning = function (toPush) {
return this.unshift.apply(this, [toPush]);
@ -12,6 +14,16 @@ const routes = [ @@ -12,6 +14,16 @@ const routes = [
name: 'Trackers',
component: Trackers
},
{
path: '/trackers',
name: 'TrackersDetail',
component: TrackersDetail
},
{
path: '/archive',
name: 'Archive',
component: Archive
},
{
path: '/settings',
name: 'Settings',

4
src/store/index.js

@ -61,13 +61,9 @@ export default createStore({ @@ -61,13 +61,9 @@ export default createStore({
if (archive) {
Object.assign(state.trashed, state.archive[index]);
let name = state.archive[index].number;
message = 'Tracker "' + name + '" wurde gelöscht';
state.archive.splice(index, 1);
} else {
Object.assign(state.trashed, state.trackers[index]);
let name = state.trackers[index].number;
message = 'Tracker "' + name + '" wurde gelöscht';
state.trackers.splice(index, 1);
}

115
src/views/Archive.vue

@ -1,68 +1,63 @@ @@ -1,68 +1,63 @@
<template>
<div class="modal modal-fullscreen fade" id="showArchivedTrackersModal" tabindex="-1" role="dialog"
aria-labelledby="showArchivedTrackersModalLabel"
aria-hidden="true">
<div class="modal-dialog showArchivedTrackersModalDialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><i class="fas fa-archive"></i> Archivierte Tracker</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<h5 class="modal-title"><i class="fas fa-archive"></i> Archivierte Tracker</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<div class="row">
<div class="col-sm-6"></div>
<div class="col-sm-6">
<i class="fas fa-search"></i>
<input @keydown="$forceUpdate()" type="text" class="form-control search-field float-right"
v-model="searchQuery" placeholder="Suche..">
</div>
<template v-for="(tracker, trackerIndex) in $store.state.archive" v-bind:key="trackerIndex">
<div class="col-md-6"
v-if="searchQuery === '' || tracker.number.search(searchQuery) >= 0 || (tracker.description && tracker.description.search(searchQuery)) >= 0">
<h6><span v-if="isTrackerNumber(tracker.number)"></span>{{ tracker.number }}</h6>
<div v-if="tracker.description">
<p class="fst-italic">{{ tracker.description }}</p>
</div>
<div class="tracker-time-info">
<span class="float-end">{{ getTotalTime(tracker) }}</span>
<span class="current-tracker-info">Gesamt: </span>
</div>
<div class="modal-body">
<div class="row">
<div class="col-sm-6"></div>
<div class="col-sm-6">
<i class="fas fa-search"></i>
<input @keydown="$forceUpdate()" type="text" class="form-control search-field float-right" v-model="searchQuery" placeholder="Suche..">
</div>
<template v-for="(tracker, trackerIndex) in $store.state.archive" v-bind:key="trackerIndex">
<div class="col-md-6" v-if="searchQuery === '' || tracker.number.search(searchQuery) >= 0 || (tracker.description && tracker.description.search(searchQuery)) >= 0">
<h6><span v-if="isTrackerNumber(tracker.number)"></span>{{ tracker.number }}</h6>
<div v-if="tracker.description">
<p class="fst-italic">{{ tracker.description }}</p>
</div>
<div class="tracker-time-info">
<span class="float-end">{{ getTotalTime(tracker) }}</span>
<span class="current-tracker-info">Gesamt: </span>
</div>
<span class="float-end">{{ getTotalTimeToday(tracker) }}</span>
<span class="">Heute: </span>
<br>
<div class="row">
<div class="col">
<button class="btn btn-success tracker-action-button" data-bs-dismiss="modal"
@click="reactivateTracker(trackerIndex)" title="Reaktivieren">
<i class="fas fa-power-off"></i>
</button>
</div>
<div class="col" v-if="tracker.history.length > 0">
<button class="btn btn-info tracker-action-button" data-bs-dismiss="modal"
@click="showHistoryForTracker(tracker)" title="History">
<i class="fas fa-history"></i>
</button>
</div>
<div class="col">
<button class="btn btn-danger tracker-action-button"
@click="deleteTracker(trackerIndex, true)" title="Löschen">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="col" v-if="trackerSystemUrl">
<a v-if="isTrackerNumber(tracker.number)" :href="trackerSystemUrl + tracker.number.replace('#', '')"
target="_blank" class="btn btn-dark tracker-action-button" title="Tracker">
<i class="fas fa-external-link-square-alt"></i>
</a>
</div>
</div>
<br/>
</div>
</template>
<span class="float-end">{{ getTotalTimeToday(tracker) }}</span>
<span class="">Heute: </span>
<br>
<div class="row">
<div class="col">
<router-link to="/"
type="button"
class="btn btn-success tracker-action-button"
data-bs-placement="left"
title="Reaktivieren"
v-on:click="reactivateTracker(trackerIndex)">
<i class="fas fa-power-off"></i>
</router-link>
</div>
<div class="col" v-if="tracker.history.length > 0">
<button class="btn btn-info tracker-action-button" data-bs-dismiss="modal"
@click="showHistoryForTracker(tracker)" title="History">
<i class="fas fa-history"></i>
</button>
</div>
<div class="col">
<button class="btn btn-danger tracker-action-button"
@click="deleteTracker(trackerIndex, true)" title="Löschen">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="col" v-if="$store.state.settings.trackerSystemUrl">
<a v-if="isTrackerNumber(tracker.number)"
:href="$store.state.settings.trackerSystemUrl + tracker.number.replace('#', '')"
target="_blank" class="btn btn-dark tracker-action-button" title="Tracker">
<i class="fas fa-external-link-square-alt"></i>
</a>
</div>
</div>
<br/>
</div>
</div>
</template>
</div>
</template>

41
src/views/Menu.vue

@ -4,12 +4,21 @@ @@ -4,12 +4,21 @@
<div class="row">
<div class="col">
<div class="dropup">
<button class="btn btn-success text-light bottom-menu-item" type="button" id="create-dropdown-menu" data-bs-toggle="dropdown" aria-expanded="false" title="Neu">
<button class="btn btn-success text-light bottom-menu-item" type="button"
id="create-dropdown-menu" data-bs-toggle="dropdown" aria-expanded="false" title="Neu">
<i class="fas fa-plus"></i>
</button>
<ul class="dropdown-menu" aria-labelledby="create-dropdown-menu">
<li><button class="btn btn-light dropdown-menu-button" type="button" @click="createTracker()">Tracker</button></li>
<li><button class="btn btn-light dropdown-menu-button" type="button" @click="createTimeBox()">Timebox</button></li>
<li>
<button class="btn btn-light dropdown-menu-button" type="button"
@click="createTracker()">Tracker
</button>
</li>
<li>
<button class="btn btn-light dropdown-menu-button" type="button"
@click="createTimeBox()">Timebox
</button>
</li>
</ul>
</div>
</div>
@ -23,24 +32,22 @@ @@ -23,24 +32,22 @@
</router-link>
</div>
<div class="" v-if="$store.state.trackers.length > 0">
<a type="button"
class="btn btn-primary text-light bottom-menu-item"
data-bs-toggle="modal"
data-bs-target="#showTrackersModal"
data-bs-placement="top"
title="Alle Tracker">
<router-link to="/trackers"
type="button"
class="btn btn-primary text-light bottom-menu-item"
data-bs-placement="left"
title="Alle Tracker">
<i class="fas fa-clock"></i>
</a>
</router-link>
</div>
<div class="" v-if="$store.state.archive.length > 0">
<a type="button"
class="btn btn-warning bottom-menu-item"
data-bs-toggle="modal"
data-bs-target="#showArchivedTrackersModal"
data-bs-placement="top"
title="Archivierte Tracker">
<router-link to="/archive"
type="button"
class="btn btn-warning bottom-menu-item"
data-bs-placement="left"
title="Archivierte Tracker">
<i class="fas fa-archive"></i>
</a>
</router-link>
</div>
<div class="">
<a type="button"

3
src/views/Trackers.vue

@ -293,7 +293,8 @@ export default { @@ -293,7 +293,8 @@ export default {
return number.indexOf('#') >= 0;
},
deleteTracker(index, archive = false) {
let message = this.$store.commit("deleteTracker", index, archive);
this.$store.commit("deleteTracker", index, archive);
let message = 'Tracker "' + this.$store.state.trashed.number + '" wurde gelöscht';
iziToast.show({
message: message,

188
src/views/TrackersDetail.vue

@ -1,74 +1,146 @@ @@ -1,74 +1,146 @@
<template>
<div class="modal modal-fullscreen fade" id="showTrackersModal" tabindex="-1" role="dialog"
aria-labelledby="showTrackersModalLabel"
aria-hidden="true">
<div class="modal-dialog showTrackersModalDialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><i class="fas fa-clock"></i> Tracker</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<div>
<h5 class="modal-title"><i class="fas fa-clock"></i> Tracker</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="row">
<div class="col-md-6" v-for="(tracker, trackerIndex) in $store.state.trackers" v-bind:key="trackerIndex">
<h6>{{ tracker.number }}</h6>
<div class="form-group">
<input type="text" class="form-control" v-model="tracker.description"
@keydown="$store.commit('updateTrackers')"
placeholder="Beschreibung"/>
</div>
<span v-if="getTotalTime(tracker) > 0">
Gesamtzeit: {{ getTotalTime(tracker) }}
</span>
<br>
<div class="row">
<div class="col">
<button class="btn btn-info tracker-action-button"
@click="showCustomBookingForTracker(tracker)"
title="Manuelle Buchung">
<i class="fas fa-user-edit"></i>
</button>
</div>
<div class="col">
<button class="btn btn-warning tracker-action-button" data-bs-dismiss="modal"
@click="archiveTracker(trackerIndex)" title="Archivieren">
<i class="fas fa-archive"></i>
</button>
</div>
<div class="modal-body">
<div class="row">
<template v-for="(tracker, trackerIndex) in trackers">
<div class="col-md-6">
<h6><span v-if="isTrackerNumber(tracker.number)"></span>{{ tracker.number }}</h6>
<div class="form-group">
<input type="text" class="form-control" v-model="tracker.description" @keydown="updateStorage()" placeholder="Beschreibung">
</div>
<span v-if="getTotalTime(tracker) > 0">Gesamtzeit: {{getTotalTime(tracker)}}</span>
<br>
<div class="row">
<div class="col">
<button class="btn btn-info tracker-action-button"
@click="showCustomBookingForTracker(tracker)"
title="Manuelle Buchung">
<i class="fas fa-user-edit"></i>
</button>
</div>
<div class="col">
<button class="btn btn-warning tracker-action-button" data-bs-dismiss="modal"
@click="archiveTracker(trackerIndex)" title="Archivieren">
<i class="fas fa-archive"></i>
</button>
</div>
<div class="col" v-if="tracker.history.length > 0">
<button class="btn btn-info tracker-action-button" data-bs-dismiss="modal"
@click="showHistoryForTracker(tracker)" title="History">
<i class="fas fa-history"></i>
</button>
</div>
<div class="col">
<button class="btn btn-danger tracker-action-button"
@click="deleteTracker(trackerIndex)" title="Löschen">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="col" v-if="trackerSystemUrl">
<a v-if="isTrackerNumber(tracker.number)" :href="trackerSystemUrl + tracker.number.replace('#', '')"
target="_blank" class="btn btn-dark tracker-action-button" title="Tracker">
<i class="fas fa-external-link-square-alt"></i>
</a>
</div>
</div>
<br/>
</div>
</template>
</div>
<div class="col" v-if="tracker.history.length > 0">
<button class="btn btn-info tracker-action-button" data-bs-dismiss="modal"
@click="showHistoryForTracker(tracker)" title="History">
<i class="fas fa-history"></i>
</button>
</div>
<div class="col">
<button class="btn btn-danger tracker-action-button"
@click="$store.commit('deleteTracker', trackerIndex)" title="Löschen">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="col" v-if="$store.state.settings.trackerSystemUrl">
<a v-if="isTrackerNumber(tracker.number)"
:href="$store.state.settings.trackerSystemUrl + tracker.number.replace('#', '')"
target="_blank" class="btn btn-dark tracker-action-button" title="Tracker">
<i class="fas fa-external-link-square-alt"></i>
</a>
</div>
</div>
<br/>
</div>
</div>
</template>
<script>
import moment from "moment";
import bootstrap from "bootstrap";
export default {
name: "TrackersDetail"
name: "TrackersDetail",
methods: {
isTrackerNumber(number) {
return number.indexOf('#') >= 0;
},
getTotalTime(tracker, raw = false) {
let totalTime = 0;
if (tracker.history.length > 0) {
tracker.history.forEach(function (historyEntry) {
totalTime += Math.round(historyEntry.minutes);
});
}
if (tracker.tracking) {
totalTime += Math.round(moment.duration(moment().diff(tracker.trackingStarted)).as('minutes'));
}
if (raw) {
return totalTime;
} else {
return this.timeWithPostFix(totalTime);
}
},
timeWithPostFix(time) {
let postFix = ' Minute';
if (time >= 480 && this.showPT) {
postFix = ' PT';
time = (time / 480).toFixed(1);
} else if (time >= 60 || this.$store.state.settings.dontShowMinutes) {
postFix = ' Stunde';
time = (time / 60).toFixed(2);
}
let plural = '';
if (((time > 1 || time <= 0) || this.$store.state.settings.dontShowMinutes) && postFix !== ' PT') {
plural = 'n'
}
return time + postFix + plural;
},
getTotalTimeToday(tracker) {
let totalTime = 0;
if (tracker.history.length > 0) {
tracker.history.forEach(function (historyEntry) {
if (moment(historyEntry.trackingStarted).format("MMM Do YY") === moment().format("MMM Do YY")) {
totalTime += Math.round(historyEntry.minutes);
}
});
}
if (tracker.tracking) {
totalTime += Math.round(moment.duration(moment().diff(tracker.trackingStarted)).as('minutes'));
}
return this.timeWithPostFix(totalTime);
},
reactivateTracker(index) {
this.$store.commit('reactivateTracker', index);
this.$store.commit('saveTrackers');
},
showHistoryForTracker(tracker) {
this.$store.commit('selectTracker', tracker);
setTimeout(() => {
let historyModal = new bootstrap.Modal(document.getElementById('historyModal'));
historyModal.toggle();
}, 50);
},
}
}
</script>
<style scoped>
.tracker-action-button {
margin-top: 10px;
padding: 1px 5px 1px 5px;
width: 100%;
}
</style>

1
timetrack_legacy

@ -1 +0,0 @@ @@ -1 +0,0 @@
Subproject commit 77cf11aed719b970208e6b43e5a8940a3d35c47d
Loading…
Cancel
Save