Expand new layout code.

This commit is contained in:
James Cole 2020-06-17 07:06:45 +02:00
parent 5cc1369191
commit c8f1e4bbd7
54 changed files with 40101 additions and 95 deletions

View File

@ -22,6 +22,7 @@ declare(strict_types=1);
namespace FireflyIII\Http\Controllers;
use Carbon\Carbon;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Models\TransactionCurrency;
@ -95,6 +96,30 @@ class JavascriptController extends Controller
->header('Content-Type', 'text/javascript');
}
/**
* Bit of a hack but OK.
*
* @param Request $request
*
* @return Response
*/
public function variablesV2(Request $request): Response
{
/** @var Carbon $start */
$start = clone session('start', Carbon::now()->startOfMonth());
/** @var Carbon $end */
$end = clone session('end', Carbon::now()->endOfMonth());
$data = [
'start' => $start->format('Y-m-d'),
'end' => $end->format('Y-m-d'),
];
return response()
->view('javascript.variables', $data)
->header('Content-Type', 'text/javascript');
}
/**
* Show some common variables to be used in scripts.
*

View File

@ -13,8 +13,8 @@ rm -rf ../public/v2/css
npm run prod
# move to right directory
mv public/js ../public/v2
mv public/css ../public/v2
# mv public/js ../public/v2
# mv public/css ../public/v2
# also copy fonts
cp -r fonts ../public

View File

@ -1,11 +1,7 @@
{
"/public/js/manifest.js": "/public/js/manifest.js",
"/public/js/manifest.js.map": "/public/js/manifest.js.map",
"/public/js/vendor.js": "/public/js/vendor.js",
"/public/js/vendor.js.map": "/public/js/vendor.js.map",
"/public/js/dashboard.js": "/public/js/dashboard.js",
"/public/css/app.css": "/public/css/app.css",
"/public/js/dashboard.js.map": "/public/js/dashboard.js.map",
"/public/js/manifest.js": "/public/js/manifest.js",
"/public/js/register.js": "/public/js/register.js",
"/public/js/register.js.map": "/public/js/register.js.map"
"/public/js/vendor.js": "/public/js/vendor.js"
}

View File

@ -2242,6 +2242,32 @@
"integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
"dev": true
},
"chart.js": {
"version": "2.9.3",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz",
"integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==",
"requires": {
"chartjs-color": "^2.1.0",
"moment": "^2.10.2"
}
},
"chartjs-color": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz",
"integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==",
"requires": {
"chartjs-color-string": "^0.6.0",
"color-convert": "^1.9.3"
}
},
"chartjs-color-string": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz",
"integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==",
"requires": {
"color-name": "^1.0.0"
}
},
"check-types": {
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
@ -2436,7 +2462,6 @@
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
@ -2444,8 +2469,7 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"color-string": {
"version": "1.5.3",
@ -5814,6 +5838,11 @@
"minimist": "^1.2.5"
}
},
"moment": {
"version": "2.26.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
"integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw=="
},
"move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@ -9281,6 +9310,11 @@
"integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==",
"dev": true
},
"vue-chartjs": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-3.5.0.tgz",
"integrity": "sha512-yWNhG3B6g6lvYqNInP0WaDWNZG/SNb6XnltkjR0wYC5pmLm6jvdiotj8er7Mui8qkJGfLZe6ULjrZdHWjegAUg=="
},
"vue-hot-reload-api": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",

View File

@ -26,10 +26,12 @@
"@fortawesome/fontawesome-free": "^5.13.0",
"@popperjs/core": "^2.4.2",
"bootstrap": "^4.5.0",
"chart.js": "^2.9.3",
"icheck-bootstrap": "^3.0.1",
"jquery": "^3.5.1",
"jquery-ui": "^1.12.1",
"overlayscrollbars": "^1.12.0",
"popper.js": "^1.16.1"
"popper.js": "^1.16.1",
"vue-chartjs": "^3.5.0"
}
}

36167
frontend/public/css/app.css Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
/*!
* AdminLTE v3.0.5 (https://adminlte.io)
* Copyright 2014-2020 Colorlib <http://colorlib.com>
* Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE)
*/

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,154 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ function webpackJsonpCallback(data) {
/******/ var chunkIds = data[0];
/******/ var moreModules = data[1];
/******/ var executeModules = data[2];
/******/
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0, resolves = [];
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
/******/ resolves.push(installedChunks[chunkId][0]);
/******/ }
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ for(moduleId in moreModules) {
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
/******/ modules[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(parentJsonpFunction) parentJsonpFunction(data);
/******/
/******/ while(resolves.length) {
/******/ resolves.shift()();
/******/ }
/******/
/******/ // add entry modules from loaded chunk to deferred list
/******/ deferredModules.push.apply(deferredModules, executeModules || []);
/******/
/******/ // run deferred modules when all chunks ready
/******/ return checkDeferredModules();
/******/ };
/******/ function checkDeferredModules() {
/******/ var result;
/******/ for(var i = 0; i < deferredModules.length; i++) {
/******/ var deferredModule = deferredModules[i];
/******/ var fulfilled = true;
/******/ for(var j = 1; j < deferredModule.length; j++) {
/******/ var depId = deferredModule[j];
/******/ if(installedChunks[depId] !== 0) fulfilled = false;
/******/ }
/******/ if(fulfilled) {
/******/ deferredModules.splice(i--, 1);
/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
/******/ }
/******/ }
/******/
/******/ return result;
/******/ }
/******/
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // object to store loaded and loading chunks
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ // Promise = chunk loading, 0 = chunk loaded
/******/ var installedChunks = {
/******/ "/public/js/manifest": 0
/******/ };
/******/
/******/ var deferredModules = [];
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/";
/******/
/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
/******/ jsonpArray.push = webpackJsonpCallback;
/******/ jsonpArray = jsonpArray.slice();
/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
/******/ var parentJsonpFunction = oldJsonpFunction;
/******/
/******/
/******/ // run deferred modules from other chunks
/******/ checkDeferredModules();
/******/ })
/************************************************************************/
/******/ ([]);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,38 @@
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/public/js/register"],{
/***/ "./src/bootstrap-basic.js":
/*!********************************!*\
!*** ./src/bootstrap-basic.js ***!
\********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// export jquery for others scripts to use\nwindow.$ = window.jQuery = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"); // admin stuff\n\n__webpack_require__(/*! bootstrap */ \"./node_modules/bootstrap/dist/js/bootstrap.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYm9vdHN0cmFwLWJhc2ljLmpzPzc1MmQiXSwibmFtZXMiOlsid2luZG93IiwiJCIsImpRdWVyeSIsInJlcXVpcmUiXSwibWFwcGluZ3MiOiJBQUNBO0FBQ0FBLE1BQU0sQ0FBQ0MsQ0FBUCxHQUFXRCxNQUFNLENBQUNFLE1BQVAsR0FBZ0JDLG1CQUFPLENBQUMsb0RBQUQsQ0FBbEMsQyxDQUVBOztBQUNBQSxtQkFBTyxDQUFDLGdFQUFELENBQVAiLCJmaWxlIjoiLi9zcmMvYm9vdHN0cmFwLWJhc2ljLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyBleHBvcnQganF1ZXJ5IGZvciBvdGhlcnMgc2NyaXB0cyB0byB1c2VcbndpbmRvdy4kID0gd2luZG93LmpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuXG4vLyBhZG1pbiBzdHVmZlxucmVxdWlyZSgnYm9vdHN0cmFwJyk7XG5cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/bootstrap-basic.js\n");
/***/ }),
/***/ "./src/pages/register.js":
/*!*******************************!*\
!*** ./src/pages/register.js ***!
\*******************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _components_dashboard_Dashboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/dashboard/Dashboard */ \"./src/components/dashboard/Dashboard.vue\");\n/* harmony import */ var _components_dashboard_TopBoxes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/dashboard/TopBoxes */ \"./src/components/dashboard/TopBoxes.vue\");\n\n\n/**\n * First we will load Axios via bootstrap.js\n * jquery and bootstrap-sass preloaded in app.js\n * vue, uiv and vuei18n are in app_vue.js\n */\n\n__webpack_require__(/*! ../bootstrap-basic */ \"./src/bootstrap-basic.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvcGFnZXMvcmVnaXN0ZXIuanM/NjkyNiJdLCJuYW1lcyI6WyJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7Ozs7OztBQU1BQSxtQkFBTyxDQUFDLG9EQUFELENBQVAiLCJmaWxlIjoiLi9zcmMvcGFnZXMvcmVnaXN0ZXIuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGFzaGJvYXJkIGZyb20gXCIuLi9jb21wb25lbnRzL2Rhc2hib2FyZC9EYXNoYm9hcmRcIjtcbmltcG9ydCBUb3BCb3hlcyBmcm9tIFwiLi4vY29tcG9uZW50cy9kYXNoYm9hcmQvVG9wQm94ZXNcIjtcblxuLyoqXG4gKiBGaXJzdCB3ZSB3aWxsIGxvYWQgQXhpb3MgdmlhIGJvb3RzdHJhcC5qc1xuICoganF1ZXJ5IGFuZCBib290c3RyYXAtc2FzcyBwcmVsb2FkZWQgaW4gYXBwLmpzXG4gKiB2dWUsIHVpdiBhbmQgdnVlaTE4biBhcmUgaW4gYXBwX3Z1ZS5qc1xuICovXG5cbnJlcXVpcmUoJy4uL2Jvb3RzdHJhcC1iYXNpYycpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/pages/register.js\n");
/***/ }),
/***/ 1:
/*!*************************************!*\
!*** multi ./src/pages/register.js ***!
\*************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! /sites/FF3/release/firefly-iii/frontend/src/pages/register.js */"./src/pages/register.js");
/***/ })
},[[1,"/public/js/manifest","/public/js/vendor"]]]);

File diff suppressed because one or more lines are too long

2181
frontend/public/js/vendor.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,89 @@
/*!
* Bootstrap v4.5.0 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
/*!
* OverlayScrollbars
* https://github.com/KingSora/OverlayScrollbars
*
* Version: 1.12.0
*
* Copyright KingSora | Rene Haas.
* https://github.com/KingSora
*
* Released under the MIT license.
* Date: 05.04.2020
*/
/*!
* Sizzle CSS Selector Engine v2.3.5
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2020-03-14
*/
/*!
* Vue.js v2.6.11
* (c) 2014-2019 Evan You
* Released under the MIT License.
*/
/*!
* jQuery JavaScript Library v3.5.1
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2020-05-04T22:49Z
*/
/*!
* jQuery UI Widget 1.12.1
* http://jqueryui.com
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*/
/*!
* vue-i18n v8.18.2
* (c) 2020 kazuya kawaguchi
* Released under the MIT License.
*/
/**!
* @fileOverview Kickass library to create and place poppers near their reference elements.
* @version 1.16.1
* @license
* Copyright (c) 2016 Federico Zivolo and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

File diff suppressed because one or more lines are too long

View File

@ -19,28 +19,43 @@
-->
<template>
<top-boxes />
<div class="container">
<div>
<top-boxes/>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Example Component</div>
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<main-account />
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<main-account-list/>
</div>
</div>
<div class="panel-body">
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Dropdown button
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<main-budget-chart/>
</div>
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<main-category-chart/>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<main-debit-chart/>
</div>
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<main-credit-chart/>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<main-bills-chart/>
</div>
<div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
<main-piggy-list/>
</div>
</div>
</div>

View File

@ -0,0 +1,74 @@
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">{{ $t('firefly.yourAccounts') }}</h3>
</div>
<div class="card-body">
<div class="main-account-chart">
<main-account-chart :styles="myStyles" :options="datacollection.options" :chart-data="datacollection"></main-account-chart>
</div>
</div>
<div class="card-footer">
<a href="./accounts/asset" class="btn btn-default button-sm"><i class="far fa-money-bill-alt"></i> {{ $t('firefly.go_to_asset_accounts') }}</a>
</div>
</div>
</template>
<script>
import MainAccountChart from "./MainAccountChart";
export default {
components: {
MainAccountChart
},
data() {
return {
datacollection: null
}
},
mounted() {
this.fillData()
},
methods: {
fillData() {
this.datacollection = {
options: {
responsive: true,
maintainAspectRatio: false
},
labels: [this.getRandomInt(), this.getRandomInt()],
datasets: [
{
label: 'Data One',
backgroundColor: '#f87979',
data: [this.getRandomInt(), this.getRandomInt()]
}, {
label: 'Data One',
backgroundColor: '#f87979',
data: [this.getRandomInt(), this.getRandomInt()]
}
]
}
},
getRandomInt() {
return Math.floor(Math.random() * (50 - 5 + 1)) + 5
}
},
computed: {
myStyles() {
return {
height: '400px',
'max-height': '400px',
position: 'relative',
display: 'block',
}
}
},
name: "MainAccount"
}
</script>
<style scoped>
.main-account-chart {
}
</style>

View File

@ -0,0 +1,19 @@
<script>
import { Line } from 'vue-chartjs'
export default {
extends: Line,
props: ['options'],
mounted () {
// this.chartData is created in the mixin.
// If you want to pass options please create a local options object
this.renderChart(this.chartData, this.options)
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,22 @@
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">I am a card</h3>
</div>
<div class="card-body">
<p>
I am card body
</p>
</div>
</div>
</template>
<script>
export default {
name: "MainAccountList"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,22 @@
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">I am a card</h3>
</div>
<div class="card-body">
<p>
I am card body
</p>
</div>
</div>
</template>
<script>
export default {
name: "MainBillsChart"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,22 @@
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">I am a card</h3>
</div>
<div class="card-body">
<p>
I am card body
</p>
</div>
</div>
</template>
<script>
export default {
name: "MainBudgetChart"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,22 @@
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">I am a card</h3>
</div>
<div class="card-body">
<p>
I am card body
</p>
</div>
</div>
</template>
<script>
export default {
name: "MainCategoryChart"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,22 @@
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">I am a card</h3>
</div>
<div class="card-body">
<p>
I am card body
</p>
</div>
</div>
</template>
<script>
export default {
name: "MainCrebitChart"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,22 @@
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">I am a card</h3>
</div>
<div class="card-body">
<p>
I am card body
</p>
</div>
</div>
</template>
<script>
export default {
name: "MainDebitChart"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,22 @@
<template>
<div class="card">
<div class="card-header">
<h3 class="card-title">I am a card</h3>
</div>
<div class="card-body">
<p>
I am card body
</p>
</div>
</div>
</template>
<script>
export default {
name: "MainPiggyList"
}
</script>
<style scoped>
</style>

View File

@ -1,70 +1,162 @@
<template>
<div class="row">
<div class="col-12 col-sm-6 col-md-3">
<div class="col-md-3 col-sm-6 col-12">
<div class="info-box">
<span class="info-box-icon bg-info elevation-1"><i class="fas fa-cog"></i></span>
<span class="info-box-icon"><i class="far fa-bookmark text-info"></i></span>
<div class="info-box-content">
<span class="info-box-text">{{ $t("firefly.balance") }}</span>
<span class="info-box-number">
xxxxxxx
<small>xx</small>
</span>
<!-- dont take the first, take default currency OR first -->
<span class="info-box-number" v-if="balances.length > 0">{{ balances[0].value_parsed }}</span>
<div class="progress bg-info">
<div class="progress-bar" style="width: 0"></div>
</div>
<span class="progress-description">
<span v-for="balance in balances">{{ balance.sub_title }}<br></span>
</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
<div class="col-12 col-sm-6 col-md-3">
<div class="info-box mb-3">
<span class="info-box-icon bg-danger elevation-1"><i class="fas fa-thumbs-up"></i></span>
<div class="info-box">
<span class="info-box-icon"><i class="far fa-calendar-alt text-teal"></i></span>
<div class="info-box-content">
<span class="info-box-text">{{ $t('firefly.bills_to_pay') }}</span>
<span class="info-box-number">xxxxxx</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
<span class="info-box-text"><span>{{ $t('firefly.bills_to_pay') }}</span></span>
<!-- dont take the first, take default currency OR first -->
<span class="info-box-number" v-if="1 === billsUnpaid.length && billsPaid.length > 0">{{ billsUnpaid[0].value_parsed }}</span>
<div class="progress bg-teal">
<div class="progress-bar" style="width: 0"></div>
</div>
<span class="progress-description">
<!-- dont take the first, take default currency OR first -->
<span v-if="1 === billsUnpaid.length && 1 === billsPaid.length">{{ $t('firefly.paid') }}: {{ billsPaid[0].value_parsed }}</span>
<span v-if="billsUnpaid.length > 1">
<span v-for="(bill, index) in billsUnpaid" :key="bill.key">
{{ bill.value_parsed }}<span v-if="index+1 !== billsUnpaid.length">, </span>
</span>
</span>
</span>
</div>
</div>
</div>
<!-- altijd iets in bold -->
<!-- subtitle verschilt -->
<!-- fix for small devices only -->
<div class="clearfix hidden-md-up"></div>
<!-- left to spend -->
<div class="col-12 col-sm-6 col-md-3">
<div class="info-box mb-3">
<span class="info-box-icon bg-success elevation-1"><i class="fas fa-shopping-cart"></i></span>
<div class="info-box">
<span class="info-box-icon"><i class="fas fa-money-bill text-success"></i></span>
<div class="info-box-content">
<span class="info-box-text">{{ $t('firefly.left_to_spend') }}</span>
<span class="info-box-number">xxxxx</span>
<span class="info-box-text"><span>{{ $t('firefly.left_to_spend') }}</span></span>
<!-- dont take the first, take default currency OR first -->
<!-- change color if negative -->
<span class="info-box-number" v-if="leftToSpend.length > 0">{{ leftToSpend[0].value_parsed }}</span>
<div class="progress bg-success">
<div class="progress-bar" style="width: 0"></div>
</div>
<span class="progress-description">
<!-- list all EXCEPT default currency -->
<span v-for="(spent, index) in leftToSpend" :key="spent.key">
{{ spent.value_parsed }}<span v-if="index+1 !== leftToSpend.length">, </span>
</span>
</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
<!-- net worth -->
<div class="col-12 col-sm-6 col-md-3">
<div class="info-box mb-3">
<span class="info-box-icon bg-warning elevation-1"><i class="fas fa-users"></i></span>
<div class="info-box">
<span class="info-box-icon"><i class="fas fa-money-bill text-success"></i></span>
<div class="info-box-content">
<span class="info-box-text">{{ $t('firefly.net_worth') }}</span>
<span class="info-box-number">xxxxx</span>
<span class="info-box-text"><span>{{ $t('firefly.net_worth') }}</span></span>
<!-- dont take the first, take default currency OR first -->
<span class="info-box-number" v-if="netWorth.length > 0">{{ netWorth[0].value_parsed }}</span>
<div class="progress bg-success">
<div class="progress-bar" style="width: 0"></div>
</div>
<span class="progress-description">
<!-- list all EXCEPT default currency -->
<span v-for="(net, index) in netWorth" :key="net.key">
{{ net.value_parsed }}<span v-if="index+1 !== net.length">, </span>
</span>
</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
</div>
</template>
<script>
export default {
name: "TopBoxes"
name: "TopBoxes",
data() {
return {
summary: [],
balances: [],
billsPaid: [],
billsUnpaid: [],
leftToSpend: [],
netWorth: [],
}
},
mounted() {
this.prepareComponent();
},
methods: {
/**
* Prepare the component.
*/
prepareComponent() {
axios.get('./api/v1/summary/basic?start=' + window.sessionStart + '&end=' + window.sessionEnd)
.then(response => {
this.summary = response.data;
this.buildComponent();
});
},
buildComponent() {
this.getBalanceEntries();
this.getBillsEntries();
this.getLeftToSpend();
this.getNetWorth();
},
getBalanceEntries() {
this.balances = this.getKeyedEntries('balance-in-');
},
getNetWorth() {
this.netWorth = this.getKeyedEntries('net-worth-in-');
},
getLeftToSpend() {
this.leftToSpend = this.getKeyedEntries('left-to-spend-in-');
},
getBillsEntries() {
this.billsPaid = this.getKeyedEntries('bills-paid-in-');
this.billsUnpaid = this.getKeyedEntries('bills-unpaid-in-');
},
getKeyedEntries(expected) {
let result = [];
for (const key in this.summary) {
if (this.summary.hasOwnProperty(key)) {
if (expected === key.substr(0, expected.length)) {
result.push(this.summary[key]);
}
}
}
return result;
}
}
}
</script>

View File

@ -3,7 +3,10 @@
"balance": "Z\u016fstatek",
"bills_to_pay": "Faktury k zaplacen\u00ed",
"left_to_spend": "Zb\u00fdv\u00e1 k utracen\u00ed",
"net_worth": "\u010cist\u00e9 jm\u011bn\u00ed"
"net_worth": "\u010cist\u00e9 jm\u011bn\u00ed",
"paid": "Zaplaceno",
"yourAccounts": "Va\u0161e \u00fa\u010dty",
"go_to_asset_accounts": "Zobrazit \u00fa\u010dty s aktivy"
},
"config": {
"html_language": "cs"

View File

@ -3,7 +3,10 @@
"balance": "Kontostand",
"bills_to_pay": "Unbezahlte Rechnungen",
"left_to_spend": "Verbleibend zum Ausgeben",
"net_worth": "Eigenkapital"
"net_worth": "Eigenkapital",
"paid": "Bezahlt",
"yourAccounts": "Deine Konten",
"go_to_asset_accounts": "Bestandskonten anzeigen"
},
"config": {
"html_language": "de"

View File

@ -3,7 +3,10 @@
"balance": "\u0399\u03c3\u03bf\u03b6\u03cd\u03b3\u03b9\u03bf",
"bills_to_pay": "\u03a0\u03ac\u03b3\u03b9\u03b1 \u03ad\u03be\u03bf\u03b4\u03b1 \u03c0\u03c1\u03bf\u03c2 \u03c0\u03bb\u03b7\u03c1\u03c9\u03bc\u03ae",
"left_to_spend": "\u0394\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03ce\u03bd",
"net_worth": "\u039a\u03b1\u03b8\u03b1\u03c1\u03ae \u03b1\u03be\u03af\u03b1"
"net_worth": "\u039a\u03b1\u03b8\u03b1\u03c1\u03ae \u03b1\u03be\u03af\u03b1",
"paid": "\u03a0\u03bb\u03b7\u03c1\u03c9\u03bc\u03ad\u03bd\u03bf",
"yourAccounts": "\u039f\u03b9 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03af \u03c3\u03b1\u03c2",
"go_to_asset_accounts": "\u0394\u03b5\u03af\u03c4\u03b5 \u03c4\u03bf\u03c5\u03c2 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd\u03c2 \u03ba\u03b5\u03c6\u03b1\u03bb\u03b1\u03af\u03bf\u03c5 \u03c3\u03b1\u03c2"
},
"config": {
"html_language": "el"

View File

@ -3,7 +3,10 @@
"balance": "Balance",
"bills_to_pay": "Bills to pay",
"left_to_spend": "Left to spend",
"net_worth": "Net worth"
"net_worth": "Net worth",
"paid": "Paid",
"yourAccounts": "Your accounts",
"go_to_asset_accounts": "View your asset accounts"
},
"config": {
"html_language": "en"

View File

@ -3,7 +3,10 @@
"balance": "Balance",
"bills_to_pay": "Facturas por pagar",
"left_to_spend": "Disponible para gastar",
"net_worth": "Valor Neto"
"net_worth": "Valor Neto",
"paid": "Pagado",
"yourAccounts": "Tus cuentas",
"go_to_asset_accounts": "Ver tus cuentas de activos"
},
"config": {
"html_language": "es"

View File

@ -3,7 +3,10 @@
"balance": "Saldo",
"bills_to_pay": "Laskuja maksettavana",
"left_to_spend": "K\u00e4ytett\u00e4viss\u00e4",
"net_worth": "Varallisuus"
"net_worth": "Varallisuus",
"paid": "Maksettu",
"yourAccounts": "Omat tilisi",
"go_to_asset_accounts": "Tarkastele omaisuustilej\u00e4si"
},
"config": {
"html_language": "fi"

View File

@ -3,7 +3,10 @@
"balance": "Solde",
"bills_to_pay": "Factures \u00e0 payer",
"left_to_spend": "Reste \u00e0 d\u00e9penser",
"net_worth": "Avoir net"
"net_worth": "Avoir net",
"paid": "Pay\u00e9",
"yourAccounts": "Vos comptes",
"go_to_asset_accounts": "Afficher vos comptes d'actifs"
},
"config": {
"html_language": "fr"

View File

@ -3,7 +3,10 @@
"balance": "Egyenleg",
"bills_to_pay": "Fizetend\u0151 sz\u00e1ml\u00e1k",
"left_to_spend": "Elk\u00f6lthet\u0151",
"net_worth": "Nett\u00f3 \u00e9rt\u00e9k"
"net_worth": "Nett\u00f3 \u00e9rt\u00e9k",
"paid": "Kifizetve",
"yourAccounts": "Banksz\u00e1ml\u00e1k",
"go_to_asset_accounts": "Eszk\u00f6zsz\u00e1ml\u00e1k megtekint\u00e9se"
},
"config": {
"html_language": "hu"

View File

@ -3,7 +3,10 @@
"balance": "Keseimbangan",
"bills_to_pay": "Bills untuk membayar",
"left_to_spend": "Kiri untuk dibelanjakan",
"net_worth": "Nilai bersih"
"net_worth": "Nilai bersih",
"paid": "Dibayar",
"yourAccounts": "Akun anda",
"go_to_asset_accounts": "Menampilkan rekening aset"
},
"config": {
"html_language": "id"

View File

@ -3,7 +3,10 @@
"balance": "Saldo",
"bills_to_pay": "Bollette da pagare",
"left_to_spend": "Altro da spendere",
"net_worth": "Patrimonio"
"net_worth": "Patrimonio",
"paid": "Pagati",
"yourAccounts": "I tuoi conti",
"go_to_asset_accounts": "Visualizza i tuoi conti attivit\u00e0"
},
"config": {
"html_language": "it"

View File

@ -3,7 +3,10 @@
"balance": "Saldo",
"bills_to_pay": "Regninger \u00e5 betale",
"left_to_spend": "Igjen \u00e5 bruke",
"net_worth": "Formue"
"net_worth": "Formue",
"paid": "Betalt",
"yourAccounts": "Dine kontoer",
"go_to_asset_accounts": "Se aktivakontoene dine"
},
"config": {
"html_language": "nb"

View File

@ -3,7 +3,10 @@
"balance": "Saldo",
"bills_to_pay": "Openstaande contracten",
"left_to_spend": "Over om uit te geven",
"net_worth": "Kapitaal"
"net_worth": "Kapitaal",
"paid": "Betaald",
"yourAccounts": "Je betaalrekeningen",
"go_to_asset_accounts": "Bekijk je betaalrekeningen"
},
"config": {
"html_language": "nl"

View File

@ -3,7 +3,10 @@
"balance": "Saldo",
"bills_to_pay": "Rachunki do zap\u0142acenia",
"left_to_spend": "Pozosta\u0142o do wydania",
"net_worth": "Warto\u015b\u0107 netto"
"net_worth": "Warto\u015b\u0107 netto",
"paid": "Zap\u0142acone",
"yourAccounts": "Twoje konta",
"go_to_asset_accounts": "Zobacz swoje konta aktyw\u00f3w"
},
"config": {
"html_language": "pl"

View File

@ -3,7 +3,10 @@
"balance": "Saldo",
"bills_to_pay": "Faturas a pagar",
"left_to_spend": "Restante para gastar",
"net_worth": "Valor L\u00edquido"
"net_worth": "Valor L\u00edquido",
"paid": "Pago",
"yourAccounts": "Suas contas",
"go_to_asset_accounts": "Veja suas contas ativas"
},
"config": {
"html_language": "pt-br"

View File

@ -3,7 +3,10 @@
"balance": "Balant\u0103",
"bills_to_pay": "Facturile de plat\u0103",
"left_to_spend": "Ramas de cheltuit",
"net_worth": "Valoarea net\u0103"
"net_worth": "Valoarea net\u0103",
"paid": "Pl\u0103tit",
"yourAccounts": "Conturile dvs.",
"go_to_asset_accounts": "Vizualiza\u021bi conturile de active"
},
"config": {
"html_language": "ro"

View File

@ -3,7 +3,10 @@
"balance": "\u0411a\u043ba\u043dc",
"bills_to_pay": "\u0421\u0447\u0435\u0442\u0430 \u043a \u043e\u043f\u043b\u0430\u0442\u0435",
"left_to_spend": "\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c",
"net_worth": "\u041c\u043e\u0438 \u0441\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u044f"
"net_worth": "\u041c\u043e\u0438 \u0441\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u044f",
"paid": "\u041e\u043f\u043b\u0430\u0447\u0435\u043d\u043e",
"yourAccounts": "\u0412\u0430\u0448\u0438 \u0441\u0447\u0435\u0442\u0430",
"go_to_asset_accounts": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0432\u0430\u0448\u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432"
},
"config": {
"html_language": "ru"

View File

@ -3,7 +3,10 @@
"balance": "Saldo",
"bills_to_pay": "Notor att betala",
"left_to_spend": "\u00c5terst\u00e5r att spendera",
"net_worth": "Nettof\u00f6rm\u00f6genhet"
"net_worth": "Nettof\u00f6rm\u00f6genhet",
"paid": "Betald",
"yourAccounts": "Dina konton",
"go_to_asset_accounts": "Visa dina tillg\u00e5ngskonton"
},
"config": {
"html_language": "sv"

View File

@ -3,7 +3,10 @@
"balance": "Denge",
"bills_to_pay": "\u00d6denecek fatura",
"left_to_spend": "Harcama i\u00e7in b\u0131rak\u0131ld\u0131",
"net_worth": "Net de\u011fer"
"net_worth": "Net de\u011fer",
"paid": "\u00d6dendi",
"yourAccounts": "Hesaplar\u0131n\u0131z",
"go_to_asset_accounts": "Varl\u0131k hesaplar\u0131n\u0131z\u0131 g\u00f6r\u00fcnt\u00fcleyin"
},
"config": {
"html_language": "tr"

View File

@ -3,7 +3,10 @@
"balance": "Ti\u1ec1n c\u00f2n l\u1ea1i",
"bills_to_pay": "H\u00f3a \u0111\u01a1n ph\u1ea3i tr\u1ea3",
"left_to_spend": "C\u00f2n l\u1ea1i \u0111\u1ec3 chi ti\u00eau",
"net_worth": "T\u00e0i s\u1ea3n th\u1ef1c"
"net_worth": "T\u00e0i s\u1ea3n th\u1ef1c",
"paid": "\u0110\u00e3 thanh to\u00e1n",
"yourAccounts": "T\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n",
"go_to_asset_accounts": "Xem t\u00e0i kho\u1ea3n c\u1ee7a b\u1ea1n"
},
"config": {
"html_language": "vi"

View File

@ -3,7 +3,10 @@
"balance": "\u4f59\u989d",
"bills_to_pay": "\u5f85\u4ed8\u5e10\u5355",
"left_to_spend": "\u5269\u4f59\u53ef\u82b1\u8d39",
"net_worth": "\u51c0\u503c"
"net_worth": "\u51c0\u503c",
"paid": "\u5df2\u4ed8\u6b3e",
"yourAccounts": "\u60a8\u7684\u5e10\u6237",
"go_to_asset_accounts": "\u68c0\u89c6\u60a8\u7684\u8d44\u4ea7\u5e10\u6237"
},
"config": {
"html_language": "zh-cn"

View File

@ -3,7 +3,10 @@
"balance": "\u9918\u984d",
"bills_to_pay": "\u5f85\u4ed8\u5e33\u55ae",
"left_to_spend": "\u5269\u9918\u53ef\u82b1\u8cbb",
"net_worth": "\u6de8\u503c"
"net_worth": "\u6de8\u503c",
"paid": "\u5df2\u4ed8\u6b3e",
"yourAccounts": "\u60a8\u7684\u5e33\u6236",
"go_to_asset_accounts": "\u6aa2\u8996\u60a8\u7684\u8cc7\u7522\u5e33\u6236"
},
"config": {
"html_language": "zh-tw"

View File

@ -1,6 +1,13 @@
import Dashboard from "../components/dashboard/Dashboard";
import TopBoxes from "../components/dashboard/TopBoxes";
import MainAccount from "../components/dashboard/MainAccount";
import MainAccountList from "../components/dashboard/MainAccountList";
import MainBillsChart from "../components/dashboard/MainBillsChart";
import MainBudgetChart from "../components/dashboard/MainBudgetChart";
import MainCategoryChart from "../components/dashboard/MainCategoryChart";
import MainCrebitChart from "../components/dashboard/MainCrebitChart";
import MainDebitChart from "../components/dashboard/MainDebitChart";
import MainPiggyList from "../components/dashboard/MainPiggyList";
/**
* First we will load Axios via bootstrap.js
* jquery and bootstrap-sass preloaded in app.js
@ -12,6 +19,14 @@ require('../bootstrap');
// components as an example
Vue.component('dashboard', Dashboard);
Vue.component('top-boxes', TopBoxes);
Vue.component('main-account', MainAccount);
Vue.component('main-account-list', MainAccountList);
Vue.component('main-bills-chart', MainBillsChart);
Vue.component('main-budget-chart', MainBudgetChart);
Vue.component('main-category-chart', MainCategoryChart);
Vue.component('main-credit-chart', MainCrebitChart);
Vue.component('main-debit-chart', MainDebitChart);
Vue.component('main-piggy-list', MainPiggyList);
// i18n
let i18n = require('../i18n');

View File

@ -0,0 +1,10 @@
import Dashboard from "../components/dashboard/Dashboard";
import TopBoxes from "../components/dashboard/TopBoxes";
/**
* First we will load Axios via bootstrap.js
* jquery and bootstrap-sass preloaded in app.js
* vue, uiv and vuei18n are in app_vue.js
*/
require('../bootstrap-basic');

View File

@ -37,11 +37,12 @@ mix
// register page
.js('src/pages/register.js', 'public/js')
.extract().sourceMaps()
.sass('src/app.scss', 'public/css');
.sass('src/app.scss', 'public/css')
// move to right dir
.copy('public/js','../public/v2/js')
.copy('fonts','../public/fonts')
.copy('public/css','../public/v2/css')
;
if (!mix.inProduction()) {
mix.bundleAnalyzer();
}

View File

@ -0,0 +1,3 @@
var sessionStart = '{{ start }}';
var sessionEnd = '{{ end }}';

View File

@ -74,6 +74,7 @@
</div>
<!-- ./wrapper -->
<script src="{{ route('javascript.v2.variables') }}" nonce="{{ JS_NONCE }}"></script>
<script src="v2/js/manifest.js" nonce="{{ JS_NONCE }}"></script>
<script src="v2/js/vendor.js" nonce="{{ JS_NONCE }}"></script>
{% block scripts %}{% endblock %}

View File

@ -558,7 +558,7 @@ Route::group(
);
/**
* Budget Controller.
* JScript Controller.
*/
Route::group(
['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers', 'prefix' => 'v1/jscript', 'as' => 'javascript.'],
@ -569,6 +569,16 @@ Route::group(
}
);
/**
* JScript Controller.
*/
Route::group(
['middleware' => 'user-full-auth', 'namespace' => 'FireflyIII\Http\Controllers', 'prefix' => 'v2/jscript', 'as' => 'javascript.v2.'],
static function () {
Route::get('variables', ['uses' => 'JavascriptController@variablesV2', 'as' => 'variables']);
}
);
/**
* JSON Controller(s).
*/