Merge branch 'master' of github.com:gradido/gradido

This commit is contained in:
einhornimmond 2021-03-22 19:52:50 +01:00
commit a68cad4b87
35 changed files with 526 additions and 347 deletions

View File

@ -1,18 +0,0 @@
name: on-push
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build the stack
run: |
git submodule update --init --recursive
docker-compose up -d
- name: Test
env:
GN_INSTANCE_FOLDER: /tmp/gradio-node-instance
GN_CONTAINER_NAME: gradido-node-build
run: docker run gradido-node-test
timeout-minutes: 2

View File

@ -4,34 +4,13 @@ name: gradido test CI
on: [push]
jobs:
##############################################################################
# JOB: PREPARE #####################################################
##############################################################################
#prepare:
# name: Prepare
# runs-on: ubuntu-latest
# # needs: [nothing]
# steps:
# ##########################################################################
# # CHECKOUT CODE ##########################################################
# ##########################################################################
# - name: Checkout code
# uses: actions/checkout@v2
# ##########################################################################
# # TODO: DO STUFF ??? #####################################################
# ##########################################################################
# - name: Check translation files
# run: |
# scripts/translations/sort.sh
# scripts/translations/missing-keys.sh
##############################################################################
# JOB: DOCKER BUILD TEST FRONTEND ############################################
##############################################################################
build_test_frontend:
name: Docker Build Test - Frontend
runs-on: ubuntu-latest
#needs: [nothing] # [prepare]
#needs: [nothing]
steps:
##########################################################################
# CHECKOUT CODE ##########################################################
@ -39,7 +18,7 @@ jobs:
- name: Checkout code
uses: actions/checkout@v2
##########################################################################
# NEO4J ##################################################################
# FRONTEND ###############################################################
##########################################################################
- name: Frontend | Build `test` image
run: |
@ -78,30 +57,58 @@ jobs:
# path: /tmp/backend.tar
##############################################################################
# JOB: DOCKER BUILD TEST WEBAPP ##############################################
# JOB: DOCKER BUILD TEST LOGIN SERVER ########################################
##############################################################################
#build_test_webapp:
# name: Docker Build Test - WebApp
# runs-on: ubuntu-latest
# needs: [prepare]
# steps:
# ##########################################################################
# # CHECKOUT CODE ##########################################################
# ##########################################################################
# - name: Checkout code
# uses: actions/checkout@v2
# ##########################################################################
# # BUILD WEBAPP DOCKER IMAGE (build) ######################################
# ##########################################################################
# - name: webapp | Build `test` image
# run: |
# docker build --target test -t "ocelotsocialnetwork/webapp:test" webapp/
# docker save "ocelotsocialnetwork/webapp:test" > /tmp/webapp.tar
# - name: Upload Artifact
# uses: actions/upload-artifact@v2
# with:
# name: docker-webapp-test
# path: /tmp/webapp.tar
build_test_login_server:
name: Docker Build Test - Login Server
runs-on: ubuntu-latest
#needs: [nothing]
steps:
##########################################################################
# CHECKOUT CODE ##########################################################
##########################################################################
- name: Checkout code
uses: actions/checkout@v2
with:
submodules: recursive
##########################################################################
# BUILD LOGIN SERVER DOCKER IMAGE (build) ################################
##########################################################################
- name: login server | Build `test` image
run: |
docker build --target login_server_debug -t "gradido/loginserver:test" -f ./login_server/Dockerfile.debug login_server/
docker save "gradido/loginserver:test" > /tmp/loginserver.tar
- name: Upload Artifact
uses: actions/upload-artifact@v2
with:
name: docker-loginserver-test
path: /tmp/loginserver.tar
##############################################################################
# JOB: DOCKER BUILD TEST COMMUNITY SERVER ####################################
##############################################################################
build_test_community_server:
name: Docker Build Test - Community Server
runs-on: ubuntu-latest
#needs: [nothing]
steps:
##########################################################################
# CHECKOUT CODE ##########################################################
##########################################################################
- name: Checkout code
uses: actions/checkout@v2
##########################################################################
# BUILD COMMUNITY SERVER DOCKER IMAGE (build) ############################
##########################################################################
- name: community server | Build `test` image
run: |
docker build -t "gradido/communityserver:test" -f ./community_server/Dockerfile ./
docker save "gradido/communityserver:test" > /tmp/communityserver.tar
- name: Upload Artifact
uses: actions/upload-artifact@v2
with:
name: docker-communityserver-test
path: /tmp/communityserver.tar
##############################################################################
# JOB: LINT FRONTEND #########################################################
@ -241,4 +248,19 @@ jobs:
# run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps webapp
# - name: webapp | Unit tests
# #run: docker run --rm ocelotsocialnetwork/webapp:build yarn run test
# run: docker-compose exec -T webapp yarn test
# run: docker-compose exec -T webapp yarn test
#test:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v2
# - name: Build the stack
# run: |
# git submodule update --init --recursive
# docker-compose up -d
# - name: Test
# env:
# GN_INSTANCE_FOLDER: /tmp/gradio-node-instance
# GN_CONTAINER_NAME: gradido-node-build
# run: docker run gradido-node-test
# timeout-minutes: 2

11
.gitmodules vendored
View File

@ -2,12 +2,12 @@
path = gn
url = https://github.com/gradido/gn.git
branch = master
[submodule "mithril_client"]
path = community_server/mithril_client
url = git@github.com:gradido/gradido_mithrilJS_client.git
#[submodule "mithril_client"]
# path = community_server/mithril_client
# url = https://github.com/gradido/gradido_mithrilJS_client.git
[submodule "src/protobuf"]
path = community_server/src/protobuf
url = git@github.com:gradido/gradido_protocol.git
url = https://github.com/gradido/gradido_protocol.git
[submodule "dependencies/tinf"]
path = login_server/dependencies/tinf
url = https://github.com/jibsen/tinf.git
@ -22,5 +22,4 @@
url = https://github.com/gradido/iroha-ed25519.git
[submodule "dependencies/spirit-po"]
path = login_server/dependencies/spirit-po
url = https://github.com/cbeck88/spirit-po.git
url = https://github.com/cbeck88/spirit-po.git

View File

@ -4,4 +4,25 @@ All notable changes to this project will be documented in this file. Dates are d
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
#### [0.9.2](https://github.com/gradido/gradido/compare/0.9.1...0.9.2)
- Reload after login fixed [`#50`](https://github.com/gradido/gradido/pull/50)
- Monorepo login server [`#48`](https://github.com/gradido/gradido/pull/48)
- Stage0 [`#3`](https://github.com/gradido/gradido/pull/3)
- Add auto-sign Transaction functionality [`5592275`](https://github.com/gradido/gradido/commit/55922753a7ffd9552be132501d744da491c409b5)
- read in login the real client ip X-Real-IP from nginx forwarded not from community server [`512d307`](https://github.com/gradido/gradido/commit/512d307a19b955bb6e26ae8b274def354829b50f)
- move check if all passwords allow direct into pwdValidation so it will work with every code which ask for password [`e2c38c1`](https://github.com/gradido/gradido/commit/e2c38c1a0fc25a4a2bc922c4bbc44d86b6d00d8b)
#### 0.9.1
> 13 March 2021
- Login gbb [`#12`](https://github.com/gradido/gradido/pull/12)
- Admin prework axios json [`#10`](https://github.com/gradido/gradido/pull/10)
- Merge pull request #1 from gradido/master [`#8`](https://github.com/gradido/gradido/pull/8)
- [WIP] 2 create a dockerfile for the frontend application [`#6`](https://github.com/gradido/gradido/pull/6)
- Master - first step [`#1`](https://github.com/gradido/gradido/pull/1)
- Add docker compose [`#7`](https://github.com/gradido/gradido/pull/7)
- style 404 side :) [`c7bdf89`](https://github.com/gradido/gradido/commit/c7bdf8978594b932615e48f9bb1c19d3c3bf3fcf)
- publish workflow test [`df6f66f`](https://github.com/gradido/gradido/commit/df6f66ffe70baa9ed3f70b460a6c0c14011bb944)
- many translations. translation structure [`bf68547`](https://github.com/gradido/gradido/commit/bf685479767d19c246c4d6abe3577dc3cb666346)

@ -1 +0,0 @@
Subproject commit f0b1d113cee2a76e9dbb098b315f4acaf38410d0

View File

@ -35,6 +35,15 @@ class StateBalance extends Entity
protected $_virtual = ['decay'];
private function convertToTimestamp($dateOrTime)
{
if(method_exists($dateOrTime, 'getTimestamp')) {
return $dateOrTime->getTimestamp();
} else {
return $dateOrTime->i18nFormat(Time::UNIX_TIMESTAMP_FORMAT);
}
}
protected function _getDecay()
{
// decay factor in seconds per year
@ -44,7 +53,7 @@ class StateBalance extends Entity
// SELECT TIMESTAMPDIFF(SECOND, modified, CURDATE()) AS age_in_seconds from state_balances
// decay_for_duration = decay_factor^seconds
// decay = gradido_cent * decay_for_duration
$decay_duration = intval(Time::now()->getTimestamp() - $this->record_date->getTimestamp());
$decay_duration = $this->decayDuration(Time::now());
if($decay_duration === 0) {
return $this->amount;
}
@ -53,7 +62,8 @@ class StateBalance extends Entity
}
public function partDecay($target_date)
{
$decay_duration = intval($target_date->getTimestamp() - $this->record_date->getTimestamp());
if($target_date == null) return 0;
$decay_duration = $this->decayDuration($target_date);
if($decay_duration <= 0) {
return $this->amount;
}
@ -61,7 +71,8 @@ class StateBalance extends Entity
}
public function decayDuration($target_date)
{
return intval($target_date->getTimestamp() - $this->record_date->getTimestamp());
{
if($this->record_date == null) return 0;
return intval($this->convertToTimestamp($target_date) - $this->record_date->getTimestamp());
}
}

View File

@ -3,6 +3,7 @@
namespace Model\Transactions;
use Cake\ORM\TableRegistry;
use Cake\I18n\Date;
class TransactionBody extends TransactionBase {
private $mProtoTransactionBody = null;
@ -75,6 +76,7 @@ class TransactionBody extends TransactionBase {
$transactionEntity->transaction_type_id = $this->transactionTypeId;
$transactionEntity->memo = $this->getMemo();
$transactionEntity->received = new Date();
if ($transactionsTable->save($transactionEntity)) {
// success

View File

@ -5,7 +5,8 @@ module.exports = {
},
extends: ['plugin:vue/essential'],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
// TODO no console!
'no-console': 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
},
parserOptions: {

View File

@ -1,6 +1,6 @@
{
"name": "bootstrap-vue-gradido-wallet",
"version": "0.9.1",
"version": "0.9.2",
"private": true,
"scripts": {
"start": "node server.js",

View File

@ -4,8 +4,7 @@
</header>
<div class="">
<particles-bg type="custom" :config="config" :bg="true" />
<router-view />
<router-view />
</div>
</div>
</template>
@ -19,17 +18,17 @@ export default {
components: {
ParticlesBg
},
created () {
//console.log("this.$cookies.get('gdd_session_id') ", this.$cookies.get('gdd_session_id') )
console.log(" $cookies.isKey('gdd_session_id') ", this.$cookies.isKey("gdd_session_id") )
if ( this.$cookies.isKey('gdd_session_id') ) {
//this.$store.state.email = this.$cookies.get('gdd_u')
console.log("login to kontooverview")
this.$router.push('/KontoOverview')
}else {
console.log("login to LOGIN")
this.$router.push("/Login")
}
created () {
console.log('%cWillkommen bei Gradido %cgreen text', 'font-weight:bold', 'color: green')
if ( $cookies.isKey("gdd_session_id") == true) {
console.log('%cHey %c'+$cookies.get("gdd_u")+'', 'font-weight:bold', 'color: orange')
this.$store.commit('session_id', $cookies.get("gdd_session_id"))
this.$store.commit('email', $cookies.get("gdd_u"))
this.$router.push("overview")
}else {
console.log("app.vue to Logout")
this.$store.dispatch('logout')
}
},
data() {
return {
@ -52,7 +51,7 @@ export default {
}
</script>
<style>
.btn {
.btn-primary pim{
background-color: #5A7B02;
border-color: #5e72e4;
}

View File

@ -1,7 +1,7 @@
<template>
<bread-crumb list-classes="breadcrumb-links breadcrumb-dark">
<BreadCrumbItem>
<router-link to="/">
<router-link to="/overview">
<i class="fas fa-home"></i>
</router-link>
</BreadCrumbItem>

View File

@ -26,7 +26,7 @@
<template slot="footer">
<base-button type="white">Ok</base-button>
<base-button type="link" class="text-white ml-auto" @click="$store.state.modals = false">abbrechen</base-button>
<base-button type="link" class="ml-auto" @click="$store.state.modals = false">abbrechen</base-button>
</template>
</modal>

View File

@ -6,12 +6,12 @@
<navbar-toggle-button @click.native="showSidebar">
</navbar-toggle-button>
<router-link class="navbar-brand" to="/">
<router-link class="navbar-brand" to="/overview">
<img :src="logo" class="navbar-brand-img" alt="...">
</router-link>
<slot name="mobile-right">
<ul class="nav align-items-center d-md-none">
<ul class="nav align-items-center d-md-none">
<base-dropdown class="nav-item" menu-on-right tag="li" title-tag="a">
<a slot="title-container" class="nav-link" href="#" role="button">
@ -22,7 +22,7 @@
</div>
</a>
<router-link to="/KontoOverview" class="dropdown-item text-lg text-muted">
<router-link to="/overview" class="dropdown-item text-lg text-muted">
<i class="ni ni-single-02"></i>
<span>{{ $t('site.overview.account_overview')}}</span>
</router-link>
@ -40,10 +40,10 @@
</router-link>
<div class="dropdown-divider"></div>
<router-link @click="logout" class="dropdown-item text-lg text-muted">
<div @click="logout" class="dropdown-item text-lg text-muted" >
<i class="ni ni-support-16"></i>
<span>{{ $t('logout') }}</span>
</router-link>
{{ $t('logout') }}
</div>
</base-dropdown>
</ul>
</slot>
@ -53,7 +53,7 @@
<div class="navbar-collapse-header d-md-none">
<div class="row">
<div class="col-6 collapse-brand">
<router-link to="/">
<router-link to="/overview">
<img :src="logo">
</router-link>
</div>
@ -62,26 +62,20 @@
</div>
</div>
</div>
<ul class="navbar-nav">
<slot name="links">
</slot>
</ul>
<hr class="my-3">
<ul class="navbar-nav mb-md-3">
<hr class="my-3">
<ul class="navbar-nav mb-md-3">
<li class="nav-item">
<a class="nav-link text-lg bg-light" href="#!" @click="logout">
{{ $t('logout') }}
</a>
</li>
</ul>
</div>
</ul>
</div>
</div>
</nav>
</template>
<script>
@ -96,7 +90,7 @@
logo: {
type: String,
default: 'img/brand/green.png',
description: 'Sidebar app logo'
description: 'Gradido Sidebar app logo'
},
autoClose: {
type: Boolean,
@ -116,17 +110,9 @@
showSidebar() {
this.$sidebar.displaySidebar(true)
},
setLocale(locale) {
this.$i18n.locale = locale
//this.$router.push({
// params: { lang: locale }
//})
//this.hideDropdown()
},
logout(){
//console.log("DashboardNavbar.vue user logout() : ")
this.$store.dispatch('logout')
}
logout(){
this.$store.dispatch('logout')
}
},
beforeDestroy() {
if (this.$sidebar.showSidebar) {

View File

@ -29,6 +29,7 @@ import { messages } from 'vee-validate/dist/locale/en.json';
import VueQrcodeReader from "vue-qrcode-reader";
import VueQrcode from "vue-qrcode";
import VueFlatPickr from 'vue-flatpickr-component';
import VueGoodTablePlugin from 'vue-good-table';
// import the styles
@ -54,6 +55,7 @@ export default {
Vue.use(VueMoment);
Vue.use(VueQrcodeReader);
Vue.use(VueQrcode);
Vue.use(VueFlatPickr);
configure({
classes: {
valid: 'is-valid',

View File

@ -2,7 +2,7 @@ import DashboardLayout from '@/views/Layout/DashboardLayout.vue'
import AuthLayoutGDD from '@/views/Layout/AuthLayout_gdd.vue'
import AuthLayout from '@/views/Layout/AuthLayout.vue'
import NotFound from '@/views/NotFoundPage.vue'
// import NotFound from '@/views/NotFoundPage.vue'
const routes = [
@ -31,11 +31,11 @@ const routes = [
},
{
path: '/',
redirect: 'KontoOverview',
redirect: 'overview',
component: DashboardLayout,
children: [
{
path: '/KontoOverview',
path: '/overview',
component: () => import('../views/KontoOverview.vue'),
meta: {
requiresAuth: true
@ -70,15 +70,6 @@ const routes = [
}
}
]
},
{
path: '/',
redirect: 'login',
component: AuthLayout,
children: [
{ path: '*', component: NotFound }
]
}
];

View File

@ -5,6 +5,7 @@ import router from '../routes/router.js'
import loginAPI from '../apis/loginAPI'
import communityAPI from '../apis/communityAPI'
import axios from 'axios'
//import CONFIG from '../config'
export const store = new Vuex.Store({
@ -25,7 +26,14 @@ export const store = new Vuex.Store({
auto_sign: true
},
transactions: [],
modals: false
modals: false,
optionAxios: {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': 'true'
}
}
},
// Retrieve a state variable
getters: {
@ -59,20 +67,33 @@ export const store = new Vuex.Store({
// Asyncronous actions - used for api calls
actions: {
login: async ({ dispatch, commit }, data) => {
console.log('action: login')
// console.log('action: login')
//axios.post("http://localhost/login_api/unsecureLogin/",
// {"email": data.email, "password":data.password }).then((result) => {
// console.log("store login result", result)
const result = await loginAPI.login(data.email,data.password)
console.log('result',result)
console.log('result.success',result.success)
if( result.success ){
// console.log('result.data.state',result.data.state)
// console.log('result.data.session_id',result.data.session_id)
if( result.success){
commit('session_id', result.result.data.session_id)
commit('email', data.email)
$cookies.set('gdd_session_id', result.result.data.session_id);
$cookies.set('gdd_u', data.email);
router.push('/KontoOverview')
router.push('/overview')
} else {
// Register failed, we perform a logout
// console.log('action login to logout start')
dispatch('logout')
}
}
//}, (error) => {
// console.log(error);
//});
},
passwordReset: async (data) => {
console.log("<<<<<<<<<<< PASSWORT RESET TODO >>>>>>>>>>>", data.email)
@ -81,16 +102,17 @@ export const store = new Vuex.Store({
// http://localhost/transaction-creations/ajaxCreate
},
createUser: async ({ commit, dispatch }, data) => {
console.log('action: createUser')
// console.log('action: createUser')
const result = await loginAPI.create(data.email,data.first_name,data.last_name,data.password)
if( result.success ){
commit('session_id', result.result.data.session_id)
commit('email', data.email)
$cookies.set('gdd_session_id', result.result.data.session_id);
$cookies.set('gdd_u', data.email);
router.push('/KontoOverview')
router.push('/overview')
} else {
// Register failed, we perform a logout
// console.log('action createUser to logout start')
dispatch('logout')
}
},
@ -112,7 +134,7 @@ export const store = new Vuex.Store({
//console.log('action: ajaxCreate')
state.ajaxCreateData.amount = (state.ajaxCreateData.amount)*10000
axios.post("http://localhost/transaction-send-coins/ajaxCreate", state.ajaxCreateData).then((result) => {
console.log("store ajaxCreate result", result)
//console.log("store ajaxCreate result", result)
if( result.success ){
// TODO
@ -128,12 +150,18 @@ export const store = new Vuex.Store({
// const result = await communityAPI.transactions(state.session_id)
},
accountBalance: async ({ commit, dispatch, state }) => {
//console.log('action: accountBalance')
const result = await communityAPI.balance(state.session_id)
//console.log(result)
// console.log('action: accountBalance')
// console.log('action: dispatch', dispatch)
// console.log('action: state.session_id', state.session_id)
// console.log(" action: $cookies.get('gdd_session_id') ", $cookies.get("gdd_session_id") )
// commit('session_id', $cookies.get("gdd_session_id"))
// commit('email', $cookies.get("gdd_u"))
const result = await communityAPI.balance($cookies.get("gdd_session_id"))
// console.log("accountBalance result", result)
if(result.success) {
commit('user_balance', result.result.data.balance)
} else {
console.log('action accountBalance to logout start')
dispatch('logout')
}
}

View File

@ -65,7 +65,7 @@
<b-row align-v="center" slot="header">
<b-col>
<h6 class="text-light text-uppercase ls-1 mb-1">Charts</h6>
<h5 class="h3 text-white mb-0">Geschöpft</h5>
<h5 class="h3 mb-0">Geschöpft</h5>
</b-col>
<b-col>
<b-nav class="nav-pills justify-content-end">
@ -226,7 +226,7 @@
import AdminUserCreation from './AdminOverview/AdminUserCreation';
import axios from 'axios';
export default {
components: {
LineChart,

View File

@ -68,7 +68,7 @@
<b-row align-v="center" slot="header">
<b-col>
<h6 class="text-light text-uppercase ls-1 mb-1">Overview</h6>
<h5 class="h3 text-white mb-0">Sales value</h5>
<h5 class="h3 mb-0">Sales value</h5>
</b-col>
<b-col>
<b-nav class="nav-pills justify-content-end">

View File

@ -6,41 +6,43 @@
<gdd-sent />
<hr>
<gdd-table />
<hr>
<div>
<gdd-add-work />
<gdd-add-work-2 />
</div>
<br>
<!--
<!--
<div>
<gdd-add-work />
</div>
<br>
-->
<div>
<gdd-work-table />
</div>
-->
</div>
</base-header>
<hr>
</div>
</template>
<script>
import GddStatus from './KontoOverview/GddStatus.vue';
import GddSent from './KontoOverview/GddSent.vue';
import GddTable from './KontoOverview/GddTable.vue';
import GddAddWork from './KontoOverview/GddAddWork.vue';
// import GddWorkTable from './KontoOverview/GddWorkTable.vue';
import GddStatus from './KontoOverview/GddStatus.vue';
import GddSent from './KontoOverview/GddSent.vue';
import GddTable from './KontoOverview/GddTable.vue';
import GddAddWork2 from './KontoOverview/GddAddWork2.vue';
import GddWorkTable from './KontoOverview/GddWorkTable.vue';
export default {
name: "Overview",
components: {
GddStatus,
GddSent,
GddTable,
GddAddWork
//GddWorkTable
GddStatus,
GddSent,
GddTable,
GddAddWork2,
GddWorkTable
},
created() {
this.$store.dispatch('accountBalance')
},
this.$store.dispatch('accountBalance', $cookies.get("gdd_session_id"))
}
};
</script>

View File

@ -70,6 +70,15 @@
<base-input label="Beitrag">
<textarea class="form-control form-control-lg" rows="3" v-model="form.text" ></textarea>
</base-input>
<b-row class="form-group">
<label class="col-md-2 col-form-label form-control-label form-control-lg">Tätigkeit</label>
<b-col md="8">
<base-input placeholder="Tätigkeit" v-model="form.location" class="form-control-lg"></base-input>
</b-col>
<b-col md="2">
<base-input placeholder="Stunden" v-model="form.location" class="form-control-lg"></base-input>
</b-col>
</b-row>
<br>

View File

@ -0,0 +1,240 @@
<template>
<div>
<b-tabs content-class="mt-3" fill>
<b-tab :title="names.thisMonth" active>
<b-row>
<b-col cols="3">
<base-input label="Arbeitstunden" >
<b-form-input type="number" placeholder="23" />
</base-input>
<base-input label="Datum / Zeitraum" >
<flat-pickr class="form-control" v-model="date" :config="config"></flat-pickr>
</base-input>
</b-col>
<b-col cols="9">
<base-input label="Arbeitsreport">
<textarea class="form-control" rows="5" @focus="textFocus"></textarea>
</base-input>
</b-col>
</b-row>
<b-row>
<b-col><button class="btn btn-info text-right" @click.prevent="newWorkForm">weiteren Report hinzufügen</button></b-col>
<b-col>
<div class="text-right">
<button class="btn btn-info text-right" @click.prevent="submitForm2">save new Report</button>
</div>
</b-col>
</b-row>
</b-tab>
<b-tab :title="names.lastMonth">
<b-row>
<b-col cols="3">
<base-input label="Arbeitstunden" >
<b-form-input type="number" placeholder="23" />
</base-input>
<base-input label="Datum / Zeitraum" >
<flat-pickr class="form-control" v-model="date" :config="lastConfig"></flat-pickr>
</base-input>
</b-col>
<b-col cols="9">
<base-input label="Arbeitsreport">
<textarea class="form-control" rows="5" @focus="textFocus"></textarea>
</base-input>
</b-col>
</b-row>
<b-row>
<b-col><button class="btn btn-warning text-right" @click.prevent="newWorkForm">+ weiteren Report hinzufügen</button></b-col>
<b-col>
<div class="text-right">
<button class="btn btn-info text-right" @click.prevent="submitForm2">save new Report</button>
</div>
</b-col>
</b-row>
<hr>
<pre>Selected date is - {{date}}</pre>
<p>{{days.lastMonth}} Days in {{names.lastMonth}} </p>
<p>Du hast diesen Monat
{{stundenSumme>0 ? 'schon ' : 'noch keine' }}
{{stundenSumme>0 ? ''+ stundenSumme : '' }}
Stunden eingetragen</p>
</b-tab>
<b-tab :title="names.beforLastMonth">
<b-row>
<b-col cols="3">
<base-input label="Arbeitstunden" >
<b-form-input type="number" placeholder="23" />
</base-input>
<base-input label="Datum / Zeitraum" >
<flat-pickr class="form-control" v-model="date" :config="beforLastConfig"></flat-pickr>
</base-input>
</b-col>
<b-col cols="9">
<base-input label="Arbeitsreport">
<textarea class="form-control" rows="5" @focus="textFocus"></textarea>
</base-input>
</b-col>
</b-row>
<b-row>
<b-col><button class="btn btn-warning text-right" @click.prevent="newWorkForm">+ weiteren Report hinzufügen</button></b-col>
<b-col>
<div class="text-right">
<button class="btn btn-info text-right" @click.prevent="submitForm3">save new Report</button>
</div>
</b-col>
</b-row>
<hr>
<pre>Selected date is - {{date}}</pre>
<p>{{days.beforLastMonth}} Days in {{names.beforLastMonth}} </p>
<p>Du hast noch keine Einträge </p>
</b-tab>
</b-tabs>
</div>
</template>
<script>
import flatPickr from "vue-flatpickr-component"
import "flatpickr/dist/flatpickr.css"
export default {
name: 'GDDAddWork2',
components: {flatPickr},
data(){
return {
date: null,
config: {
altInput: false,
dateFormat: "d-m-Y",
minDate: this.$moment().startOf('month').format("DD.MM.YYYY"),
maxDate: this.$moment().format("DD.MM.YYYY"),
mode: 'range'
},
lastConfig:{
altInput: false,
dateFormat: "d-m-Y",
minDate: this.$moment().month(this.$moment().month()-1).startOf('month').format("DD.MM.YYYY"),
maxDate: this.$moment().month(this.$moment().month()-1).endOf('month').format("DD.MM.YYYY"),
mode: 'range'
},
beforLastConfig:{
altInput: false,
dateFormat: "d-m-Y",
minDate: this.$moment().month(this.$moment().month()-2).startOf('month').format("DD.MM.YYYY"),
maxDate: this.$moment().month(this.$moment().month()-2).endOf('month').format("DD.MM.YYYY"),
mode: 'range'
},
index: 0,
form:[],
stundenSumme: 0,
messages: [],
submitted:false,
days: {
thisMonth: this.$moment().month(this.$moment().month()).daysInMonth(),
lastMonth: this.$moment().month(this.$moment().month()-1).daysInMonth(),
beforLastMonth: this.$moment().month(this.$moment().month()-2).daysInMonth(),
},
names: {
thisMonth: this.$moment().month(this.$moment().month()).format('MMMM'),
lastMonth: this.$moment().month(this.$moment().month()-1).format('MMMM'),
beforLastMonth: this.$moment().month(this.$moment().month()-2).format('MMMM')
}
}
},
created() {
},
watch: {
$form: function(){
stunden(this.form)
}
},
methods: {
getTR(m,i){
console.log(m+"-"+i)
},
stunden(hour, i, mon) {
let n = 0
console.log("stunden(form)=>", hour)
console.log("stunden(i)=>", i)
console.log("stunden(mon)=>", mon)
console.log("this.stundenSumme start=> ", this.stundenSumme)
this.stundenSumme = 0
console.log("arr.length => ", this.form.length)
for (n; n < this.form.length; n++){
console.log(">arr[n]=> ",this.form[n])
if (this.form[n] > 0) {
this.stundenSumme += parseInt(this.form[n]) ;
}
}
this.messages.push({
id: this.index,
MonthsNumber: mon,
DaysNumber: i,
HoursNumber: hour,
DestinationText: '',
TextDecoded: ''
});
this.index++
console.log("this.stundenSumme ende=> ", this.stundenSumme)
},
addNewMessage: function(){
this.messages.push({
DaysNumber: '',
TextDecoded: ''
});
},
deleteNewMessage: function(event) {
console.log("deleteNewMessage:event) => ", event)
//console.log("deleteNewMessage:this.events.splice(this.event) => ", this.events.splice(this.event))
this.form.splice(event, null);
this.messages.splice(index, 1);
this.index--
},
submitForm: function(e) {
console.log(this.messages);
this.messages = [{ DaysNumber: '', TextDecoded: '' }];
this.submitted = true;
},
submitForm2() {
console.log("submitForm2 TODO")
},
submitForm3() {
console.log("submitForm3 TODO")
},
textFocus(){
console.log("textFocus TODO")
},
newWorkForm(){
console.log("newWorkForm TODO")
}
}
};
</script>

View File

@ -13,12 +13,10 @@
</b-row>
<b-row>
<qrcode-stream @decode="onDecode" @detect="onDetect" ></qrcode-stream>
<b-alert show variant="secondary">
<b-alert show variant="secondary">
<span class="alert-text"><strong>QR Code Scanner</strong> - Scanne den QR Code deines Partners</span>
</b-alert>
<b-alert show variant="warning" >
<b-alert show variant="warning" >
<span class="alert-text" @click="scan=false"><strong>abrechen!</strong></span>
</b-alert>
</b-row>
@ -38,10 +36,8 @@
size="lg"
class="mb-3"
>
<b-input-group-prepend>
<img src="img/icons/gradido/qr-scan-pure.png" width="80" height="auto" @click="scan=true"/>
<b-input-group-prepend>
<img src="img/icons/gradido/qr-scan-pure.png" width="80" height="auto" @click="scan=true"/>
</b-input-group-prepend>
<b-form-input
id="input-1"
@ -75,17 +71,13 @@
</b-form-input>
<b-input-group-prepend>
<div class="h1">GDD</div>
</b-input-group-prepend>
</b-input-group>
<b-input-group>
<b-input-group-prepend>
<b-icon icon="chat-right-text" class="display-1"></b-icon>
<b-input-group-prepend>
<b-icon icon="chat-right-text" class="display-1"></b-icon>
</b-input-group-prepend>
<b-form-textarea v-model="form.memo"></b-form-textarea>
</b-input-group>
@ -97,7 +89,6 @@
<br>
</b-form>
</validation-observer>
</b-card>
</b-collapse>
</b-col>
@ -133,14 +124,13 @@ export default {
async onDecode (decodedString) {
console.log('onDecode JSON.parse(decodedString)',JSON.parse(decodedString) )
const arr = JSON.parse(decodedString)
console.log('arr',arr[0].email )
// console.log('arr',arr[0].email )
this.modal.h4 = 'Scan erfolgreich'
this.modal.p = arr
this.form.email = arr[0].email
this.form.amount1 = arr[0].amount
console.log('arr mail',arr.email)
console.log('arr mail',arr.amount)
// console.log('arr mail',arr.email)
// console.log('arr mail',arr.amount)
this.modals2 = true
},
async onDetect (promise) {

View File

@ -40,7 +40,7 @@
<script>
import axios from 'axios';
export default {
name: 'GddTable',
data(){
@ -57,13 +57,12 @@ export default {
axios.get("http://localhost/state-balances/ajaxListTransactions/"+ this.$store.state.session_id).then((result) => {
//console.log("result",result)
//console.log("result.state",result.data.state)
//
//console.log("result.data.state == 'success'",result.data.state == "success")
//console.log("result.count",result.data.count)
// console.log("result.gdtSum",result.data.gdtSum)
console.log("result.transactions",typeof(result.data.transactions))
//commit('transactions', result.data.transactions)
//console.log("result.count",result.data.count)
//console.log("result.gdtSum",result.data.gdtSum)
//console.log("result.transactions",typeof(result.data.transactions))
//commit('transactions', result.data.transactions)
this.$store.state.user.balance_gdt = result.data.gdtSum
this.items = result.data.transactions
this.count = result.data.count
@ -76,7 +75,7 @@ export default {
},
computed: {
filteredItems(a) {
console.log("filteredItems date",a.items)
// console.log("filteredItems date",a.items)
return a.items
}

View File

@ -1,20 +1,18 @@
<template>
<div>
<b-list-group >
<b-list-group-item v-for="item in items" :key="item.id">
<div class="d-flex w-100 justify-content-between" @click="toogle(item)" >
<b-icon v-if="item.status == 'submitted'" icon="clock-history" class="m-1" font-scale="2" style="color:orange"></b-icon>
<b-icon v-else icon="check2-all" class="m-1" font-scale="2" style="color:green" ></b-icon>
<h2 class="text-muted"><small>{{item.datel}}</small> - {{item.text}}</h2>
</div>
</b-list-group-item>
</b-list-group>
<b-list-group >
<b-list-group-item v-for="item in items" :key="item.id">
<div class="d-flex w-100 justify-content-between" @click="toogle(item)" >
<b-icon v-if="item.status == 'submitted'" icon="clock-history" class="m-1" font-scale="2" style="color:orange"></b-icon>
<b-icon v-else icon="check2-all" class="m-1" font-scale="2" style="color:green" ></b-icon>
<h2 class="text-muted"><small>{{item.datel}}</small> - {{item.text}}</h2>
</div>
</b-list-group-item>
</b-list-group>
</div>
</template>
<script>
export default {
name: 'GddWorkTable',
data(){
@ -22,8 +20,8 @@ export default {
form: [],
items: [
{ id: 1, text: 'Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum ', datel: '12.12.2020 14:04', status: 'submitted' },
{ id: 2, text: 'Larsen Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum ', datel: '22.06.2020 22:23', status: 'submitted' },
{ id: 3, text: 'Geneva Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum ', datel: '15.04.2020 12:55', status: 'confirmed' },
{ id: 2, text: 'Larsen Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum ', datel: '22.06.2020 22:23', status: 'submitted' },
{ id: 3, text: 'Geneva Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum ', datel: '15.04.2020 12:55', status: 'confirmed' },
{ id: 4, text: 'Community Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum ', datel: '10.03.2020 18:20', status: 'confirmed'}
]
};
@ -37,10 +35,7 @@ export default {
},
toogle(item) {
const temp = '<b-collapse visible v-bind:id="item.id">xxx <small class="text-muted">porta</small></b-collapse>'
}
},
watch: {
}
};
</script>

View File

@ -10,7 +10,7 @@
<b-col xl="5" lg="6" md="6" class="px-5">
<h1 class="text-light">Landing Gradido</h1>
<br>
<router-link to="/KontoOverview" class="font-weight-bold text-white mt-5"> LoginUser</router-link>
<router-link to="/overview" class="font-weight-bold text-white mt-5"> LoginUser</router-link>
<br><br>
<router-link to="/AdminOverview" class="font-weight-bold text-white mt-5"> Login Admin</router-link>
<br><br>

View File

@ -6,7 +6,7 @@
<sidebar-item
:link="{
name: 'Kontoübersicht',
path: 'KontoOverview',
path: '/overview',
icon: 'ni ni-tv-2 text-primary',
}"
>

View File

@ -8,7 +8,7 @@
expand="lg"
>
<div slot="brand" class="navbar-wrapper">
<b-navbar-brand to="/">
<b-navbar-brand to="/overview">
<img src="img/brand/white.png">
</b-navbar-brand>
</div>
@ -17,7 +17,7 @@
<div class="navbar-collapse-header">
<b-row>
<b-col cols="6" class="collapse-brand">
<router-link to="/">
<router-link to="/overview">
<img src="img/brand/green.png">
</router-link>
</b-col>

View File

@ -13,17 +13,17 @@
</div>
</b-col>
<b-col xl="6" class="col-xl-6">
<b-nav class="nav-footer justify-content-center justify-content-xl-end">
<b-nav-item ref="https://www.creative-tim.com" target="_blank">
<b-nav class="nav-footer justify-content-center justify-content-lg-end">
<b-nav-item ref="https://gradido.net/" target="_blank">
Gradido
</b-nav-item>
<b-nav-item href="https://www.creative-tim.com/presentation" target="_blank">
<b-nav-item href="https://gradido.net/" target="_blank">
{{$t('imprint')}}
</b-nav-item>
<b-nav-item href="http://blog.creative-tim.com" target="_blank">
<b-nav-item href="https://gradido.net/" target="_blank">
{{$t('privacy_policy')}}
</b-nav-item>
<b-nav-item href="https://www.creative-tim.com/license" target="_blank">
<b-nav-item href="https://gradido.net/" target="_blank">
{{$t('license')}}
</b-nav-item>
</b-nav>
@ -41,25 +41,10 @@
</div>
</template>
<script>
import { BaseNav } from '@/components';
import { ZoomCenterTransition } from 'vue2-transitions';
export default {
components: {
//BaseNav,
//ZoomCenterTransition
},
props: {
backgroundColor: {
type: String,
default: 'black'
}
},
export default {
data() {
return {
showMenu: false,
menuTransitionDuration: 250,
pageTransitionDuration: 200,
year: new Date().getFullYear(),
pageClass: 'login-page'
};
@ -76,80 +61,10 @@
// params: { lang: locale }
//})
//this.hideDropdown()
},
toggleNavbar() {
document.body.classList.toggle('nav-open');
this.showMenu = !this.showMenu;
},
closeMenu() {
document.body.classList.remove('nav-open');
this.showMenu = false;
},
setBackgroundColor() {
document.body.classList.add('bg-default');
},
removeBackgroundColor() {
document.body.classList.remove('bg-default');
},
updateBackground() {
if (!this.$route.meta.noBodyBackground) {
this.setBackgroundColor();
} else {
this.removeBackgroundColor()
}
}
},
beforeDestroy() {
this.removeBackgroundColor();
},
beforeRouteUpdate(to, from, next) {
// Close the mobile menu first then transition to next page
if (this.showMenu) {
this.closeMenu();
setTimeout(() => {
next();
}, this.menuTransitionDuration);
} else {
next();
}
},
watch: {
$route: {
immediate: true,
handler: function () {
this.updateBackground()
}
}
}
};
</script>
<style lang="scss">
$scaleSize: 0.8;
@keyframes zoomIn8 {
from {
opacity: 0;
transform: scale3d($scaleSize, $scaleSize, $scaleSize);
}
100% {
opacity: 1;
}
}
.main-content .zoomIn {
animation-name: zoomIn8;
}
@keyframes zoomOut8 {
from {
opacity: 1;
}
to {
opacity: 0;
transform: scale3d($scaleSize, $scaleSize, $scaleSize);
}
}
.main-content .zoomOut {
animation-name: zoomOut8;
}
</style>

View File

@ -4,7 +4,7 @@
<side-bar>
<template slot="links" >
<b-nav-item href="#!" to="/KontoOverview">
<b-nav-item href="#!" to="/overview">
<b-nav-text class="p-0 text-lg text-muted">Senden</b-nav-text>
</b-nav-item>
@ -58,7 +58,7 @@
import DashboardNavbar from './DashboardNavbar.vue';
import ContentFooter from './ContentFooter.vue';
import DashboardContent from './Content.vue';
// import DashboardContent from './Content.vue';
import { FadeTransition } from 'vue2-transitions';
export default {
@ -74,11 +74,7 @@
if (isWindows) {
initScrollbar('sidenav');
}
},
logout(){
//console.log("DashboardLayout.vue user logout() : ")
this.$store.dispatch('logout')
}
}
},
mounted() {
this.initScrollbar()

View File

@ -4,7 +4,9 @@
class="navbar-top navbar-expand"
:class="{'navbar-dark': type === 'default'}"
>
<a href="#" aria-current="page" class="h4 mb-0 text-white text-uppercase d-none d-lg-inline-block active router-link-active"> {{$route.name}} </a>
<a href="#" aria-current="page" class="h4 mb-0 text-uppercase d-none d-lg-inline-block active router-link-active">
{{$route.name}}
</a>
<!-- Navbar links -->
<b-navbar-nav class="align-items-center ml-md-auto">
<!-- This item dont have <b-nav-item> because item have data-action/data-target on tag <a>, wich we cant add -->
@ -15,32 +17,20 @@
</li>
</b-navbar-nav>
<b-navbar-nav class="align-items-center ml-auto ml-md-0">
<!-- <b-form class="navbar-search form-inline mr-sm-3"
:class="{'navbar-search-dark': type === 'default', 'navbar-search-light': type === 'light'}"
id="navbar-search-main">
<b-form-group class="mb-0">
<b-input-group class="input-group-alternative input-group-merge">
<b-form-input placeholder="Search" type="text"> </b-form-input>
<div class="input-group-append">
<span class="input-group-text"><i class="fas fa-search"></i></span>
</div>
</b-input-group>
</b-form-group>
</b-form> -->
<base-dropdown menu-on-right
class="nav-item"
tag="li"
title-tag="a"
title-classes="nav-link pr-0">
<a href="#" class="nav-link pr-0" @click.prevent slot="title-container">
<a href="#" class="pr-1" @click.prevent slot="title-container">
<b-media no-body class="align-items-center">
<span class="avatar avatar-sm rounded-circle">
<vue-qrcode :value="$store.state.email" />
</span>
<b-media-body class="ml-2 d-none d-lg-block">
<span class="mb-0 text-lg font-weight-bold">{{this.$store.state.email}}</span>
<span class="avatar avatar-sm rounded-circle">
<vue-qrcode :value="$store.state.email" />
</span>
<span class="mb-0 text-lg font-weight-bold">{{ $store.state.email }}</span>
</b-media-body>
</b-media>
</a>
@ -50,7 +40,7 @@
<b-dropdown-header class="noti-title">
<h6 class="text-overflow m-0"> {{ $t('welcome') }}</h6>
</b-dropdown-header>
<b-dropdown-item href="#!" to="/KontoOverview">
<b-dropdown-item href="#!" to="/overview">
<i class="ni ni-single-02"></i>
<span>{{ $t('site.overview.account_overview')}}</span>
</b-dropdown-item>
@ -78,13 +68,13 @@
</base-nav>
</template>
<script>
import { CollapseTransition } from 'vue2-transitions';
import { BaseNav } from '@/components';
import { CollapseTransition } from 'vue2-transitions'
import { BaseNav } from '@/components'
import VueQrcode from 'vue-qrcode'
export default {
components: {
CollapseTransition,
//CollapseTransition,
BaseNav,
VueQrcode
},

View File

@ -348,7 +348,7 @@
<div class="pr-md-5">
<h1 class="text-light"> {{ $t('site.landing1.explore') }}</h1>
<p class="text-light">{{ $t('site.landing1.text') }}</p>
<router-link to="/user" class="font-weight-bold text-warning mt-5">{{ $t('site.landing1.link') }}</router-link>
<router-link to="/overview" class="font-weight-bold text-warning mt-5">{{ $t('site.landing1.link') }}</router-link>
</div>
</b-col>
</b-row>
@ -363,7 +363,7 @@ export default {
name: 'not-found',
data() {
return {
anime:{
anime:{
targets: '.row svg',
translateY: 10,
autoplay: true,
@ -371,7 +371,7 @@ export default {
easing: 'easeInOutSine',
direction: 'alternate'
},
anime:{
anime2:{
targets: '#zero',
translateX: 10,
autoplay: true,

View File

@ -6,8 +6,8 @@
<div class="text-center mb-7">
<b-row class="justify-content-center">
<b-col xl="5" lg="6" md="8" class="px-5">
<h1 class="text-white">Gradido Wallet</h1>
<p class="text-lead text-white">{{ $t('site.login.community')}}</p>
<h1>Gradido Wallet</h1>
<p class="text-lead">{{ $t('site.login.community')}}</p>
</b-col>
</b-row>
</div>

View File

@ -5,8 +5,8 @@
<div class="header-body text-center mb-7">
<b-row class="justify-content-center">
<b-col xl="5" lg="6" md="8" class="px-5">
<h1 class="text-white">{{ $t('site.password.title')}}</h1>
<p class="text-lead text-white">{{ $t('site.password.subtitle')}}</p>
<h1 >{{ $t('site.password.title')}}</h1>
<p class="text-lead">{{ $t('site.password.subtitle')}}</p>
</b-col>
</b-row>
</div>

View File

@ -6,8 +6,8 @@
<div class="header-body text-center mb-7">
<b-row class="justify-content-center">
<b-col xl="5" lg="6" md="8" class="px-5">
<h1 class="text-white">{{ $t('site.signup.title')}}</h1>
<p class="text-lead text-white">{{ $t('site.signup.subtitle')}}</p>
<h1 >{{ $t('site.signup.title')}}</h1>
<p class="text-lead">{{ $t('site.signup.subtitle')}}</p>
</b-col>
</b-row>
</div>

View File

@ -1,6 +1,6 @@
{
"name": "gradido",
"version": "0.9.1",
"version": "0.9.2",
"description": "Gradido",
"main": "index.js",
"repository": "git@github.com:gradido/gradido.git",