First set of code for new layout based on AdminLTE 3.0

This commit is contained in:
James Cole
2020-06-14 15:51:20 +02:00
parent caddf3d1c6
commit 7c1139e42b
42 changed files with 13385 additions and 3 deletions

1
.gitignore vendored
View File

@@ -1,5 +1,6 @@
/node_modules
/frontend/node_modules
/frontend/fonts
/public/hot
/public/storage
/storage/*.key

20
frontend/build.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# build translations.
php /sites/tools/firefly-iii-tools/cli.php ff3:json-translations --v2
# remove old stuff
rm -rf public/
rm -rf ../public/fonts
rm -rf ../public/v2/js
rm -rf ../public/v2/css
# build new stuff
npm run prod
# move to right directory
mv public/js ../public/v2
mv public/css ../public/v2
# also copy fonts
cp -r fonts ../public

View File

@@ -0,0 +1,9 @@
{
"/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/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"
}

10356
frontend/package-lock.json generated Executable file

File diff suppressed because it is too large Load Diff

35
frontend/package.json Executable file
View File

@@ -0,0 +1,35 @@
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "npm run development -- --watch",
"watch-poll": "npm run watch -- --watch-poll",
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --disable-host-check --config=node_modules/laravel-mix/setup/webpack.config.js",
"prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"axios": "^0.19",
"cross-env": "^7.0",
"laravel-mix": "^5.0.1",
"laravel-mix-bundle-analyzer": "^1.0.5",
"lodash": "^4.17.13",
"resolve-url-loader": "^3.1.0",
"sass": "^1.15.2",
"sass-loader": "^8.0.0",
"vue": "^2.6",
"vue-i18n": "^8.15",
"vue-template-compiler": "^2.6.11"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^5.13.0",
"@popperjs/core": "^2.4.2",
"bootstrap": "^4.5.0",
"icheck-bootstrap": "^3.0.1",
"jquery": "^3.5.1",
"jquery-ui": "^1.12.1",
"overlayscrollbars": "^1.12.0",
"popper.js": "^1.16.1"
}
}

14
frontend/src/app.scss vendored Normal file
View File

@@ -0,0 +1,14 @@
// Fonts
@import '~@fortawesome/fontawesome-free/css/all.css';
// OverlayScrollbars
@import '~overlayscrollbars/css/OverlayScrollbars.css';
// iCheck
@import '~icheck-bootstrap/icheck-bootstrap.css';
// AdminLTE
@import 'dist/css/adminlte.css';
// Bootstrap
// Already imported by AdminLTE
//@import '~bootstrap/scss/bootstrap';

34
frontend/src/bootstrap.js vendored Normal file
View File

@@ -0,0 +1,34 @@
// imports
import Vue from 'vue';
import VueI18n from 'vue-i18n'
import * as uiv from 'uiv';
// export jquery for others scripts to use
window.$ = window.jQuery = require('jquery');
// axios
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
// CSRF
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
// admin stuff
require('jquery-ui');
require('bootstrap');
require('./dist/js/adminlte');
require('overlayscrollbars');
// vue
window.vuei18n = VueI18n;
window.uiv =uiv;
Vue.use(vuei18n);
Vue.use(uiv);
window.Vue = Vue;

1867
frontend/src/classic/adminlte.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,56 @@
<!--
- ExampleComponent.vue
- Copyright (c) 2019 james@firefly-iii.org
-
- This file is part of Firefly III (https://github.com/firefly-iii).
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-->
<template>
<top-boxes />
<div class="container">
<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="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>
</div>
</div>
</template>
<script>
export default {
name: "Dashboard",
mounted() {
console.log('Dashboard mounted.')
}
}
</script>

View File

@@ -0,0 +1,73 @@
<template>
<div class="row">
<div class="col-12 col-sm-6 col-md-3">
<div class="info-box">
<span class="info-box-icon bg-info elevation-1"><i class="fas fa-cog"></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>
</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-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 -->
<!-- fix for small devices only -->
<div class="clearfix hidden-md-up"></div>
<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-content">
<span class="info-box-text">{{ $t('firefly.left_to_spend') }}</span>
<span class="info-box-number">xxxxx</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-warning elevation-1"><i class="fas fa-users"></i></span>
<div class="info-box-content">
<span class="info-box-text">{{ $t('firefly.net_worth') }}</span>
<span class="info-box-number">xxxxx</span>
</div>
<!-- /.info-box-content -->
</div>
<!-- /.info-box -->
</div>
<!-- /.col -->
</div>
</template>
<script>
export default {
name: "TopBoxes"
}
</script>
<style scoped>
</style>

27
frontend/src/i18n.js vendored Normal file
View File

@@ -0,0 +1,27 @@
// Create VueI18n instance with options
module.exports = new vuei18n({
locale: document.documentElement.lang, // set locale
fallbackLocale: 'en',
messages: {
'cs': require('./locales/cs.json'),
'de': require('./locales/de.json'),
'en': require('./locales/en.json'),
'es': require('./locales/es.json'),
'el': require('./locales/el.json'),
'fr': require('./locales/fr.json'),
'hu': require('./locales/hu.json'),
'id': require('./locales/id.json'),
'it': require('./locales/it.json'),
'nl': require('./locales/nl.json'),
'nb': require('./locales/nb.json'),
'pl': require('./locales/pl.json'),
'fi': require('./locales/fi.json'),
'pt-br': require('./locales/pt-br.json'),
'ro': require('./locales/ro.json'),
'ru': require('./locales/ru.json'),
'zh-tw': require('./locales/zh-tw.json'),
'zh-cn': require('./locales/zh-cn.json'),
'sv': require('./locales/sv.json'),
'vi': require('./locales/vi.json'),
}
});

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"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"
},
"config": {
"html_language": "cs"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Kontostand",
"bills_to_pay": "Unbezahlte Rechnungen",
"left_to_spend": "Verbleibend zum Ausgeben",
"net_worth": "Eigenkapital"
},
"config": {
"html_language": "de"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"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"
},
"config": {
"html_language": "el"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Balance",
"bills_to_pay": "Bills to pay",
"left_to_spend": "Left to spend",
"net_worth": "Net worth"
},
"config": {
"html_language": "en"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Balance",
"bills_to_pay": "Facturas por pagar",
"left_to_spend": "Disponible para gastar",
"net_worth": "Valor Neto"
},
"config": {
"html_language": "es"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Saldo",
"bills_to_pay": "Laskuja maksettavana",
"left_to_spend": "K\u00e4ytett\u00e4viss\u00e4",
"net_worth": "Varallisuus"
},
"config": {
"html_language": "fi"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Solde",
"bills_to_pay": "Factures \u00e0 payer",
"left_to_spend": "Reste \u00e0 d\u00e9penser",
"net_worth": "Avoir net"
},
"config": {
"html_language": "fr"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Egyenleg",
"bills_to_pay": "Fizetend\u0151 sz\u00e1ml\u00e1k",
"left_to_spend": "Elk\u00f6lthet\u0151",
"net_worth": "Nett\u00f3 \u00e9rt\u00e9k"
},
"config": {
"html_language": "hu"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Keseimbangan",
"bills_to_pay": "Bills untuk membayar",
"left_to_spend": "Kiri untuk dibelanjakan",
"net_worth": "Nilai bersih"
},
"config": {
"html_language": "id"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Saldo",
"bills_to_pay": "Bollette da pagare",
"left_to_spend": "Altro da spendere",
"net_worth": "Patrimonio"
},
"config": {
"html_language": "it"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Saldo",
"bills_to_pay": "Regninger \u00e5 betale",
"left_to_spend": "Igjen \u00e5 bruke",
"net_worth": "Formue"
},
"config": {
"html_language": "nb"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Saldo",
"bills_to_pay": "Openstaande contracten",
"left_to_spend": "Over om uit te geven",
"net_worth": "Kapitaal"
},
"config": {
"html_language": "nl"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Saldo",
"bills_to_pay": "Rachunki do zap\u0142acenia",
"left_to_spend": "Pozosta\u0142o do wydania",
"net_worth": "Warto\u015b\u0107 netto"
},
"config": {
"html_language": "pl"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Saldo",
"bills_to_pay": "Faturas a pagar",
"left_to_spend": "Restante para gastar",
"net_worth": "Valor L\u00edquido"
},
"config": {
"html_language": "pt-br"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Balant\u0103",
"bills_to_pay": "Facturile de plat\u0103",
"left_to_spend": "Ramas de cheltuit",
"net_worth": "Valoarea net\u0103"
},
"config": {
"html_language": "ro"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"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"
},
"config": {
"html_language": "ru"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Saldo",
"bills_to_pay": "Notor att betala",
"left_to_spend": "\u00c5terst\u00e5r att spendera",
"net_worth": "Nettof\u00f6rm\u00f6genhet"
},
"config": {
"html_language": "sv"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "Denge",
"bills_to_pay": "\u00d6denecek fatura",
"left_to_spend": "Harcama i\u00e7in b\u0131rak\u0131ld\u0131",
"net_worth": "Net de\u011fer"
},
"config": {
"html_language": "tr"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"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"
},
"config": {
"html_language": "vi"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "\u4f59\u989d",
"bills_to_pay": "\u5f85\u4ed8\u5e10\u5355",
"left_to_spend": "\u5269\u4f59\u53ef\u82b1\u8d39",
"net_worth": "\u51c0\u503c"
},
"config": {
"html_language": "zh-cn"
}
}

View File

@@ -0,0 +1,11 @@
{
"firefly": {
"balance": "\u9918\u984d",
"bills_to_pay": "\u5f85\u4ed8\u5e33\u55ae",
"left_to_spend": "\u5269\u9918\u53ef\u82b1\u8cbb",
"net_worth": "\u6de8\u503c"
},
"config": {
"html_language": "zh-tw"
}
}

26
frontend/src/pages/dashboard.js vendored Normal file
View File

@@ -0,0 +1,26 @@
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');
// components as an example
Vue.component('dashboard', Dashboard);
Vue.component('top-boxes', TopBoxes);
// i18n
let i18n = require('../i18n');
let props = {};
new Vue({
i18n,
el: "#dashboard",
render: (createElement) => {
return createElement(Dashboard, { props: props });
},
});

44
frontend/webpack.mix.js vendored Normal file
View File

@@ -0,0 +1,44 @@
const mix = require('laravel-mix');
require('laravel-mix-bundle-analyzer');
// production
mix.webpackConfig({
resolve: {
alias: {
'vue$': 'vue/dist/vue.runtime.common.js'
}
}
});
mix
// AUTO LOAD
// .autoload({
// jquery: ['$', 'window.jQuery','jQuery']
// })
// MIX IN CLASSIC SCRIPT
// .babel([
// '../resources/assets/js/v2/classic/adminlte.js',
// ], 'public/v2/js/classic.js')
// MIX IN CLASSIC SCRIPT
// .scripts([
// '../resources/assets/js/v2/classic/adminlte.js',
// ], 'public/v2/js/classic.js')
// COPY SCRIPT
//.copy('../resources/assets/js/v2/classic/adminlte.js', 'public/v2/js/classic.js')
// dashboard component (frontpage):
.js('src/pages/dashboard.js', 'public/js')
.extract().sourceMaps()
.sass('src/app.scss', 'public/css');
if (!mix.inProduction()) {
mix.bundleAnalyzer();
}

View File

@@ -42,7 +42,7 @@ import Budget from "./components/transactions/Budget";
* vue, uiv and vuei18n are in app_vue.js
*/
require('./bootstrap');
require('./bootstrap');
// components for create and edit transactions.
Vue.component('budget', Budget);

View File

@@ -0,0 +1,101 @@
{% extends "./layout/auth" %}
{% block content %}
{# error when logging in #}
{% if errors.has('email') %}
<div class="row">
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h5><i class="icon fas fa-ban"></i> {{ 'flash_error'|_ }}</h5>
{{ errors.get('email')[0] }}
</div>
</div>
{% endif %}
{# error when logout force #}
{% if session('logoutMessage') %}
<div class="row">
<div class="alert alert-info alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h5><i class="icon fas fa-info"></i>
{{ session('logoutMessage') }}
</div>
</div>
{% endif %}
{# default header #}
<div class="login-box">
<div class="login-logo">
<img src="v2/images/logo-small.png" alt="Firefly III" width="40"/>
<a href="{{ route('index') }}"><b>Firefly</b>III</a>
</div>
{# demo site info #}
{% if IS_DEMO_SITE %}
<div class="callout callout-success">
<h5><i class="fas fa-info"></i> Firefly III demonistration website</h5>
To log in, please use email address <code>{{ DEMO_USERNAME }}</code> and password <code>{{ DEMO_PASSWORD }}</code>
</div>
{% endif %}
<!-- /.login-logo -->
<div class="card">
<div class="card-body login-card-body">
<p class="login-box-msg">{{ 'sign_in_to_start'|_ }}</p>
<form action="{{ route('login') }}" method="post">
<input type="hidden" name="_token" value="{{ csrf_token() }}"/>
<div class="input-group mb-3">
{% if config('firefly.login_provider') == 'eloquent' %}
<input type="email" required autocomplete="email" name="email" value="{{ email }}" class="form-control"
placeholder="{{ trans('form.email') }}"/>
{% else %}
<input type="text" required autocomplete="username" name="email" value="{{ email }}" class="form-control"
placeholder="{{ trans('form.login_name') }}"/>
{% endif %}
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-envelope"></span>
</div>
</div>
</div>
<div class="input-group mb-3">
<input type="password" name="password" required autocomplete="current-password" class="form-control"
placeholder="{{ trans('form.password') }}"/>
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-lock"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-8">
<div class="icheck-primary">
<input id="remember" type="checkbox" name="remember" {% if remember %}checked="checked"{% endif %} value="1">
<label for="remember">
{{ trans('form.remember_me') }}
</label>
</div>
</div>
<!-- /.col -->
<div class="col-4">
<button type="submit" class="btn btn-primary btn-block">{{ 'sign_in'|_ }}</button>
</div>
<!-- /.col -->
</div>
</form>
{% if allowReset %}
<p class="mb-1">
<a href="{{ URL.to('/password/reset') }}">{{ 'forgot_my_password'|_ }}</a>
</p>
{% endif %}
{% if allowRegistration %}
<p class="mb-0">
<a href="{{ URL.to('/register') }}">{{ 'register_new_account'|_ }}</a><br>
</p>
{% endif %}
</div>
<!-- /.login-card-body -->
</div>
</div>
<!-- /.login-box -->
{% endblock %}

View File

@@ -0,0 +1,16 @@
{% extends "./layout/default" %}
{% block content %}
<!-- Small boxes (Stat box) -->
<!-- Main row -->
<div id="dashboard"></div>
<!-- /.row (main row) -->
{% endblock %}
{% block styles %}
{% endblock %}
{% block scripts %}
<script src="v2/js/dashboard.js" nonce="{{ JS_NONCE }}"></script>
{% endblock %}

View File

@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html>
<head>
<base href="{{ route('index') }}/">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="robots" content="noindex, nofollow, noarchive, noodp, NoImageIndex, noydir">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>
{% if subTitle %}
{{ subTitle }} »
{% endif %}
{% if title != "Firefly III" %}
{{ title }} »
{% endif %}
Firefly III
</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="v2/plugins/local-fonts/gf-source.css">
<link rel="stylesheet" href="v2/css/app.css">
</head>
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">
<!-- Navbar -->
{% include('partials.layout.navbar') %}
<!-- Main Sidebar Container -->
{% include('partials.layout.sidebar') %}
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0 text-dark">{% if mainTitleIcon %}<i class="fa fas {{ mainTitleIcon }}"></i>{% endif %}
{{ title }} <small class="text-muted">
{% if subTitleIcon %}<i class="fa fas {{ subTitleIcon }}"></i>{% endif %}
{{ subTitle }}</small></h1>
</div><!-- /.col -->
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li>
<li class="breadcrumb-item active">Bread crumbs v1</li>
</ol>
</div><!-- /.col -->
</div><!-- /.row -->
</div><!-- /.container-fluid -->
</div>
<!-- /.content-header -->
<!-- Main content -->
<section class="content">
<div class="container-fluid">
{% block content %}{% endblock %}
</div><!-- /.container-fluid -->
</section>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->
{% include('partials.layout.footer') %}
<!-- Control Sidebar -->
<aside class="control-sidebar control-sidebar-dark">
<!-- Control sidebar content goes here -->
bla bla bla
</aside>
<!-- /.control-sidebar -->
</div>
<!-- ./wrapper -->
<script src="v2/js/manifest.js" nonce="{{ JS_NONCE }}"></script>
<script src="v2/js/vendor.js" nonce="{{ JS_NONCE }}"></script>
{% block scripts %}{% endblock %}
<!-- jQuery -->
<!--<script src="v2/plugins/jquery/jquery.min.js" nonce="{{ JS_NONCE }}"></script>-->
<!-- jQuery UI 1.11.4 -->
<!--<script src="v2/plugins/jquery-ui/jquery-ui.min.js" nonce="{{ JS_NONCE }}"></script>-->
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip -->
<!--<script nonce="{{ JS_NONCE }}">
$.widget.bridge('uibutton', $.ui.button)
</script>
-->
<!-- Bootstrap 4 -->
<!--<script src="v2/plugins/bootstrap/js/bootstrap.bundle.min.js" nonce="{{ JS_NONCE }}"></script>-->
<!-- overlayScrollbars -->
<!--<script src="v2/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js" nonce="{{ JS_NONCE }}"></script>-->
<!-- AdminLTE App -->
<!--<script src="v2/dist/js/adminlte.js" nonce="{{ JS_NONCE }}"></script>-->
</body>
</html>

View File

@@ -0,0 +1,7 @@
<footer class="main-footer">
<small><a href="https://firefly-iii.org/">Firefly III</a> &copy; James Cole, <a href="https://www.gnu.org/licenses/agpl-3.0.html">AGPL-3.0-or-later</a></small>
<div class="float-right d-none d-sm-inline-block">
<b>{{ 'version'|_ }}</b> <a href="{{ route('debug') }}">{{ Config.get('firefly.version') }}</a>
</div>
</footer>

View File

@@ -0,0 +1,113 @@
<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<!-- Left navbar links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
</ul>
<!-- SEARCH FORM -->
<form class="form-inline ml-3">
<div class="input-group input-group-sm">
<input class="form-control form-control-navbar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-navbar" type="submit">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</form>
<!-- Right navbar links -->
<ul class="navbar-nav ml-auto">
<!-- Messages Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
<i class="far fa-calendar-alt"></i>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="v2/dist/img/user1-128x128.jpg" alt="User Avatar" class="img-size-50 mr-3 img-circle">
<div class="media-body">
<h3 class="dropdown-item-title">
Brad Diesel
<span class="float-right text-sm text-danger"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">Call me whenever you can...</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="v2/dist/img/user8-128x128.jpg" alt="User Avatar" class="img-size-50 img-circle mr-3">
<div class="media-body">
<h3 class="dropdown-item-title">
John Pierce
<span class="float-right text-sm text-muted"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">I got your message bro</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<!-- Message Start -->
<div class="media">
<img src="v2/dist/img/user3-128x128.jpg" alt="User Avatar" class="img-size-50 img-circle mr-3">
<div class="media-body">
<h3 class="dropdown-item-title">
Nora Silvester
<span class="float-right text-sm text-warning"><i class="fas fa-star"></i></span>
</h3>
<p class="text-sm">The subject goes here</p>
<p class="text-sm text-muted"><i class="far fa-clock mr-1"></i> 4 Hours Ago</p>
</div>
</div>
<!-- Message End -->
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Messages</a>
</div>
</li>
<!-- Notifications Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
<i class="far fa-user"></i>
</a>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-right">
<span class="dropdown-item dropdown-header">15 Notifications</span>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-envelope mr-2"></i> 4 new messages
<span class="float-right text-muted text-sm">3 mins</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-users mr-2"></i> 8 friend requests
<span class="float-right text-muted text-sm">12 hours</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item">
<i class="fas fa-file mr-2"></i> 3 new reports
<span class="float-right text-muted text-sm">2 days</span>
</a>
<div class="dropdown-divider"></div>
<a href="#" class="dropdown-item dropdown-footer">See All Notifications</a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#" role="button">
<i class="fas fa-th-large"></i>
</a>
</li>
</ul>
</nav>
<!-- /.navbar -->

View File

@@ -0,0 +1,254 @@
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="{{ route('index') }}" class="brand-link">
<img src="v2/dist/img/firefly-iii-logo.png" alt="Firefly III" class="brand-image"
style="opacity: .8"> <!-- img-circle elevation-3 -->
<span class="brand-text font-weight-light">Firefly III</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user panel (optional) -->
<!--
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<img src="v2/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image">
</div>
<div class="info">
<a href="#" class="d-block">Alexander Pierce</a>
</div>
</div>
-->
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
<!-- Add icons to the links using the .nav-icon class
with font-awesome or any other icon font library -->
<li class="nav-item">
<a href="{{ route('index') }}" class="nav-link">
<i class="nav-icon fas fa-tachometer-alt"></i>
<p>
{{ 'dashboard'|_ }}
</p>
</a>
</li>
<li class="nav-header text-uppercase">{{ 'financial_control'|_ }}</li>
<li class="nav-item">
<a href="{{ route('budgets.index') }}" class="nav-link">
<i class="nav-icon fas fa-chart-pie"></i>
<p>
{{ 'budgets'|_ }}
</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('bills.index') }}" class="nav-link">
<i class="nav-icon far fa-calendar-alt"></i>
<p>
{{ 'bills'|_ }}
</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('piggy-banks.index') }}" class="nav-link">
<i class="nav-icon fas fa-bullseye"></i>
<p>
{{ 'piggyBanks'|_ }}
</p>
</a>
</li>
<li class="nav-header text-uppercase">{{ 'accounting'|_ }}</li>
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-exchange-alt"></i>
<p>
{{ 'transactions'|_ }}
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('transactions.index', 'withdrawal') }}" class="nav-link">
<i class="fas fa-long-arrow-alt-left nav-icon"></i>
<p>{{ 'expenses'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('transactions.index', 'deposit') }}" class="nav-link">
<i class="fas fa-long-arrow-alt-right nav-icon"></i>
<p>{{ 'income'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('transactions.index', 'transfers') }}" class="nav-link">
<i class="fas fa-exchange-alt nav-icon"></i>
<p>{{ 'transfers'|_ }}</p>
</a>
</li>
</ul>
</li>
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-microchip"></i>
<p>
{{ 'automation'|_ }}
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('rules.index') }}" class="nav-link">
<i class="fas fa-random nav-icon"></i>
<p>{{ 'rules'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('recurring.index') }}" class="nav-link">
<i class="fas fa-magic nav-icon"></i>
<p>{{ 'recurrences'|_ }}</p>
</a>
</li>
</ul>
</li>
<li class="nav-header text-uppercase">{{ 'others'|_ }}</li>
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-credit-card"></i>
<p>
{{ 'accounts'|_ }}
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('accounts.index', 'asset') }}" class="nav-link">
<i class="far fa-money-bill-alt nav-icon"></i>
<p>{{ 'asset_accounts'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('accounts.index', 'expense') }}" class="nav-link">
<i class="fas fa-shopping-cart nav-icon"></i>
<p>{{ 'expense_accounts'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('accounts.index', 'revenue') }}" class="nav-link">
<i class="fas fa-briefcase nav-icon"></i>
<p>{{ 'revenue_accounts'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('accounts.index', 'liabilities') }}" class="nav-link">
<i class="far fa-funnel-dollar nav-icon"></i>
<p>{{ 'liabilities_accounts'|_ }}</p>
</a>
</li>
</ul>
</li>
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-tags"></i>
<p>
{{ 'classification'|_ }}
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('categories.index') }}" class="nav-link">
<i class="fas fa-bookmark nav-icon"></i>
<p>{{ 'categories'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('tags.index') }}" class="nav-link">
<i class="fas fa-tags nav-icon"></i>
<p>{{ 'tags'|_ }}</p>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="{{ route('reports.index') }}" class="nav-link">
<i class="nav-icon far fa-chart-bar"></i>
<p>
{{ 'reports'|_ }}
</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('export.index') }}" class="nav-link">
<i class="nav-icon fas fa-upload"></i>
<p>
{{ 'export_data_menu'|_ }}
</p>
</a>
</li>
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i class="nav-icon fas fa-sliders-h"></i>
<p>
{{ 'options'|_ }}
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('profile.index') }}" class="nav-link">
<i class="far fa-user nav-icon"></i>
<p>{{ 'profile'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('preferences.index') }}" class="nav-link">
<i class="fas fa-cogs nav-icon"></i>
<p>{{ 'preferences'|_ }}</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('currencies.index') }}" class="nav-link">
<i class="fas fa-euro-sign nav-icon"></i>
<p>{{ 'currencies'|_ }}</p>
</a>
</li>
{% if hasRole('owner') %}
<li class="nav-item">
<a href="{{ route('admin.index') }}" class="nav-link">
<i class="far fa-hand-spock nav-icon"></i>
<p>{{ 'administration'|_ }}</p>
</a>
</li>
{% endif %}
</ul>
</li>
<li class="nav-item">
<a href="{{ route('logout') }}" class="nav-link">
<i class="nav-icon fas fa-sign-out-alt"></i>
<p>
{{ 'logout'|_ }}
</p>
</a>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
</div>
<!-- /.sidebar -->
</aside>