Add 'frontend/' from commit 'd820caba3ffcf0e94e3740ee7a25e583176d6df0'

git-subtree-dir: frontend
git-subtree-mainline: a866d737678d48a6a32d93a12c166f882626e87d
git-subtree-split: d820caba3ffcf0e94e3740ee7a25e583176d6df0
This commit is contained in:
ogerly 2021-02-23 15:37:04 +01:00
commit 9891f5bd8e
291 changed files with 17623 additions and 0 deletions

3
frontend/.dockerignore Normal file
View File

@ -0,0 +1,3 @@
node_modules
.git
.gitignore

9
frontend/.editorconfig Normal file
View File

@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

14
frontend/.eslintrc.js Normal file
View File

@ -0,0 +1,14 @@
module.exports = {
root: true,
env: {
node: true
},
extends: ['plugin:vue/essential'],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
},
parserOptions: {
parser: 'babel-eslint'
}
};

15
frontend/.gitattributes vendored Normal file
View File

@ -0,0 +1,15 @@
# Auto detect text files and perform LF normalization
*.scss linguist-language=Vue
*.css linguist-language=Vue
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain

20
frontend/.gitignore vendored Normal file
View File

@ -0,0 +1,20 @@
.DS_Store
node_modules/
dist/
.cache/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
test/unit/coverage
package-lock.json
.env
.env.development.local
.env.production.local
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln

8
frontend/.postcssrc.js Normal file
View File

@ -0,0 +1,8 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
plugins: {
// to edit target browsers: use "browserslist" field in package.json
autoprefixer: {}
}
};

2
frontend/CHANGELOG.md Executable file
View File

@ -0,0 +1,2 @@
## [1.0.0] - 2020-07-27
### Initial Release

108
frontend/Dockerfile Normal file
View File

@ -0,0 +1,108 @@
##################################################################################
# BASE ###########################################################################
##################################################################################
FROM node:12.19.0-alpine3.10 as base
# ENVs (available in production aswell, can be overwritten by commandline or env file)
## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame
ENV DOCKER_WORKDIR="/app"
## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0
ENV BUILD_DATE="1970-01-01T00:00:00.00Z"
## We cannot do $(npm run version).${BUILD_NUMBER} here so we default to 0.0.0.0
ENV BUILD_VERSION="0.0.0.0"
## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000
ENV BUILD_COMMIT="0000000"
## SET NODE_ENV
ENV NODE_ENV="production"
## App relevant Envs
ENV PORT="8080"
# Labels
LABEL org.label-schema.build-date="${BUILD_DATE}"
LABEL org.label-schema.name="gradido:frontend"
LABEL org.label-schema.description="Gradido Vue Webwallet"
LABEL org.label-schema.usage="https://github.com/gradido/gradido_vue_wallet/blob/master/README.md"
LABEL org.label-schema.url="https://gradido.net"
LABEL org.label-schema.vcs-url="https://github.com/gradido/gradido_vue_wallet/tree/master/backend"
LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}"
LABEL org.label-schema.vendor="gradido Community"
LABEL org.label-schema.version="${BUILD_VERSION}"
LABEL org.label-schema.schema-version="1.0"
LABEL maintainer="support@ogradido.net"
# Install Additional Software
## install: git
#RUN apk --no-cache add git
# Settings
## Expose Container Port
EXPOSE ${PORT}
## Workdir
RUN mkdir -p ${DOCKER_WORKDIR}
WORKDIR ${DOCKER_WORKDIR}
##################################################################################
# DEVELOPMENT (Connected to the local environment, to reload on demand) ##########
##################################################################################
FROM base as development
# We don't need to copy or build anything since we gonna bind to the
# local filesystem which will need a rebuild anyway
# Run command
# (for development we need to execute npm install since the
# node_modules are on another volume and need updating)
CMD /bin/sh -c "npm install && npm run dev"
##################################################################################
# BUILD (Does contain all files and is therefore bloated) ########################
##################################################################################
FROM base as build
# Copy everything
COPY . .
# npm install
RUN npm install --production=false --frozen-lockfile --non-interactive
# npm build
RUN npm run build
##################################################################################
# TEST ###########################################################################
##################################################################################
FROM build as test
# Run command
CMD /bin/sh -c "npm run dev"
##################################################################################
# PRODUCTION (Does contain only "binary"- and static-files to reduce image size) #
##################################################################################
FROM base as production
# Copy "binary"-files from build image
COPY --from=build ${DOCKER_WORKDIR}/.nuxt ./.nuxt
COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules
COPY --from=build ${DOCKER_WORKDIR}/nuxt.config.js ./nuxt.config.js
# Copy static files
# TODO - this should be one Folder containign all stuff needed to be copied
#COPY --from=build ${DOCKER_WORKDIR}/constants ./constants
#COPY --from=build ${DOCKER_WORKDIR}/static ./static
#COPY --from=build ${DOCKER_WORKDIR}/locales ./locales
# Copy package.json for script definitions (lock file should not be needed)
COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json
# Run command
CMD /bin/sh -c "npm run start"
## add `/usr/src/app/node_modules/.bin` to $PATH
#ENV PATH /usr/src/app/node_modules/.bin:$PATH
#
## install and cache app dependencies
#COPY package.json /usr/src/app/package.json
#RUN npm install
#RUN npm install -g @vue/cli
## start app
#CMD ["npm", "run", "serve"]

View File

@ -0,0 +1,9 @@
<!--
IMPORTANT: Please use the following link to create a new issue:
https://www.gradido.net/new-issue/bootstrap-vue-gradido-wallet
**If your issue was not created using the app above, it will be closed immediately.**
-->

389
frontend/README.md Executable file
View File

@ -0,0 +1,389 @@
# Vue Gradido Wallet
# install mit npm
```
$ git clone https://github.com/gradido/gradido_vue_wallet.git [project-name]
$ cd [project-name]
$ npm install
$ npm run serve
### Build
$ npm run build
```
# install mit docker
```
### build
$ docker build -t [project-name] .
### run
$ docker run -it -p 80:80 --rm [project-name]
```
**Fully Coded Components**
Bootstrap Vue Gradido Wallet -
**DEMO:** [https://vast-atoll-44277.herokuapp.com/](https://vast-atoll-44277.herokuapp.com/)
ISSUES:
- [ ] csrf token management
- [ ] Userdaten - Testbenutzer - test.json
- [ ] Session Cookie: GRADIDO_LOGIN enhancement
- [ ] 🚀 [Feature] - Create a dockerfile for the frontend application enhancement
**DEMO:** [https://vast-atoll-44277.herokuapp.com/](https://vast-atoll-44277.herokuapp.com/)
___________
# 🌟 [EPIC] - Gradido Web- and App- Client
Web-App:
Einstiegspunkt:
[ ] Login-Server for app-requests (Sollte in der App einstellbar sein) https://staging.gradido.net/appRequest
[ ] Auch die url für Community-Server requests sollte in einer Variable gespeichert sein.
CakePHP Seite auf die der Login-Server nach dem Login weiterleitet.
https://staging.gradido.net/client
Hiermit kann ein Konto anlegt werden:
https://staging.gradido.net/account/registerDirect
# Fehler im Code
Wenn etwas nicht stimmt, entweder mit den Input-Paremetern, oder ein Fehler im Code gibt es meistens folgendes als Ergebnis:
```
{
"state": "error",
"msg": "<kurze Fehlerbeschreibung>",
"details": "<optional zusätzliche Informationen zum Fehler, z.B. Framework Fehlermeldung>"
}
```
# csfr Token
Bindet das js ein.
Stellt folgende js-Variablen zur Verfügung:
csfr : string
csfr Token (https://book.cakephp.org/3/en/controllers/components/csrf.html)
user: object
# Testbenutzer
Enthält Daten des aktuell eingeloggten Benutzers, z.B.: mein Testbenutzer:
console.log(user);
```
{
"created": 1578688666,
"disabled": false,
"email": "dervommond@gmail.com",
"email_checked": true,
"first_name": "Max",
"group_alias": "gdd1",
"ident_hash": 2928827813,
"last_name": "Miau",
"public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b",
"role": "admin",
"username": "",
"balance": 174500, // Gradido Cent, 4 Nachkommastellen (2 Reserve) entspricht 17,45
"id": 1,
"errorCount": 0
}
```
Das sind im Grunde die Benutzerangaben aus der Login-Server Datenbank.
session :int
Login-Server session id, notwendig für alle ajax-request.
# Seiten
Navigation:
Für alle Benutzer:
Kontoübersicht
Startseite
Überweisung
Mitgliederbereich (externer Link zu elopage: https://elopage.com/s/gradido/sign_in)
Rechts oben:
Profil
Abmelden
Startseite:
Für alle Benutzer:
Kontoübersicht
Überweisung
Benutzer Suche:
http://daten.einhornimmond.de/gradido_mithril_user_search.zip
# Mobile App
Login über eingebundene Login-Seite
auslesen der session_id aus dem Session Cookie: GRADIDO_LOGIN
Access Token vom Login-Server anfragen:
GET https://staging.gradido.net/appRequest/acquireAccessToken?session_id = <GRADIDO_LOGIN>
Du kannst auch den Cookie wieder mitschicken, solange die Login-Server Basis-url die gleiche ist, müsste das auch funktionieren.
Antwort:
```
{
"state":"success",
"access_token" : "<integer>",
"group_base_url":"<Community Server Base Url>"
}
```
Unterschied Access Token von der session_id: Access Tokens sind länger gültig
Du kannst über eine gültige session_id einen Access Token erhalten der eine Woche gültig ist. Die Client-IP des Aufrufess muss die gleiche sein, mit der eingeloggt wurde.
Mit einem gültigen Access-Token kannst du eine session_id erhalten.
GET https://staging.gradido.net/appRequest/appLogin?access_token =
Mit jedem Aufruf wird die Gültigkeit der Access-Tokens erneuert.
Antwort:
```
{
"state":"success",
"session_id" : "<integer>"
}
```
# Kontoübersicht:
Liefert den aktuellen Kontostand.
Ajax:
GET https://staging.gradido.net/state-balances/ajaxGetBalance
Antwort:
`{"state":"success","balance":<GDD cent (4 Nachkommastellen)>}`
Listet die letzten Transaktionen auf, mit Paging.
Ajax:
GET https://staging.gradido.net/state-user-transactions/ajaxListTransactions//
page: Seite der Transaktionen, default = 1
count: Wie viele Transaktionen pro Seite, default = 20
Antwort:
Wenn alles okay:
```
{"state":"success", "transactions":
[
{
"name": "<first_name last_name>",
"email": "<other_user.email>", //optional, only if send or receive and other user is known
"type": "creation|send|receive",
"transaction_id": <transaction_id>, // db id not id from blockchain
"date": "<date string>",
"balance": <GDD balance in GDD cent /10000>,
"memo": "<Verwendungszweck>",
"pubkey": "<other_user.public_key in hex>"
}
],
"transactionExecutingCount": <how many transaction for this user currently pending>,
"count": <sum of finished transactions user is involved>
}
```
Holt die aktuelle Summe und Anzahl Einträge vom GDT Server für den Benutzer.
Ajax:
GET https://staging.gradido.net/state-balances/ajaxGdtOverview
```{"state": "success", "gdt": {"sum": <sum of all gdt transactions>, "count":<count of all gdt transactions>}}```
# 🌟 [EPIC] - Gradido Web- and App- Client
Web-App:
Einstiegspunkt:
[ ] Login-Server for app-requests (Sollte in der App einstellbar sein) https://staging.gradido.net/appRequest
[ ] Auch die url für Community-Server requests sollte in einer Variable gespeichert sein.
CakePHP Seite auf die der Login-Server nach dem Login weiterleitet.
https://staging.gradido.net/client
Hiermit kann ein Konto anlegt werden:
https://staging.gradido.net/account/registerDirect
# Fehler im Code
Wenn etwas nicht stimmt, entweder mit den Input-Paremetern, oder ein Fehler im Code gibt es meistens folgendes als Ergebnis:
```
{
"state": "error",
"msg": "<kurze Fehlerbeschreibung>",
"details": "<optional zusätzliche Informationen zum Fehler, z.B. Framework Fehlermeldung>"
}
```
# csfr Token
Bindet das js ein.
Stellt folgende js-Variablen zur Verfügung:
csfr : string
csfr Token (https://book.cakephp.org/3/en/controllers/components/csrf.html)
user: object
# Testbenutzer
Enthält Daten des aktuell eingeloggten Benutzers, z.B.: mein Testbenutzer:
console.log(user);
```
{
"created": 1578688666,
"disabled": false,
"email": "dervommond@gmail.com",
"email_checked": true,
"first_name": "Max",
"group_alias": "gdd1",
"ident_hash": 2928827813,
"last_name": "Miau",
"public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b",
"role": "admin",
"username": "",
"balance": 174500, // Gradido Cent, 4 Nachkommastellen (2 Reserve) entspricht 17,45
"id": 1,
"errorCount": 0
}
```
Das sind im Grunde die Benutzerangaben aus der Login-Server Datenbank.
session :int
Login-Server session id, notwendig für alle ajax-request.
# Seiten
Navigation:
Für alle Benutzer:
Kontoübersicht
Startseite
Überweisung
Mitgliederbereich (externer Link zu elopage: https://elopage.com/s/gradido/sign_in)
Rechts oben:
Profil
Abmelden
Startseite:
Für alle Benutzer:
Kontoübersicht
Überweisung
Benutzer Suche:
http://daten.einhornimmond.de/gradido_mithril_user_search.zip
# Mobile App
Login über eingebundene Login-Seite
auslesen der session_id aus dem Session Cookie: GRADIDO_LOGIN
Access Token vom Login-Server anfragen:
GET https://staging.gradido.net/appRequest/acquireAccessToken?session_id = <GRADIDO_LOGIN>
Du kannst auch den Cookie wieder mitschicken, solange die Login-Server Basis-url die gleiche ist, müsste das auch funktionieren.
Antwort:
```
{
"state":"success",
"access_token" : "<integer>",
"group_base_url":"<Community Server Base Url>"
}
```
Unterschied Access Token von der session_id: Access Tokens sind länger gültig
Du kannst über eine gültige session_id einen Access Token erhalten der eine Woche gültig ist. Die Client-IP des Aufrufess muss die gleiche sein, mit der eingeloggt wurde.
Mit einem gültigen Access-Token kannst du eine session_id erhalten.
GET https://staging.gradido.net/appRequest/appLogin?access_token =
Mit jedem Aufruf wird die Gültigkeit der Access-Tokens erneuert.
Antwort:
```
{
"state":"success",
"session_id" : "<integer>"
}
```
# Kontoübersicht:
Liefert den aktuellen Kontostand.
Ajax:
GET https://staging.gradido.net/state-balances/ajaxGetBalance
Antwort:
`{"state":"success","balance":<GDD cent (4 Nachkommastellen)>}`
Listet die letzten Transaktionen auf, mit Paging.
Ajax:
GET https://staging.gradido.net/state-user-transactions/ajaxListTransactions//
page: Seite der Transaktionen, default = 1
count: Wie viele Transaktionen pro Seite, default = 20
Antwort:
Wenn alles okay:
```
{"state":"success", "transactions":
[
{
"name": "<first_name last_name>",
"email": "<other_user.email>", //optional, only if send or receive and other user is known
"type": "creation|send|receive",
"transaction_id": <transaction_id>, // db id not id from blockchain
"date": "<date string>",
"balance": <GDD balance in GDD cent /10000>,
"memo": "<Verwendungszweck>",
"pubkey": "<other_user.public_key in hex>"
}
],
"transactionExecutingCount": <how many transaction for this user currently pending>,
"count": <sum of finished transactions user is involved>
}
```
Holt die aktuelle Summe und Anzahl Einträge vom GDT Server für den Benutzer.
Ajax:
GET https://staging.gradido.net/state-balances/ajaxGdtOverview
```{"state": "success", "gdt": {"sum": <sum of all gdt transactions>, "count":<count of all gdt transactions>}}```
Holt die letzten 100 GDT-Einträge für den Benutzer
Ein GDT Eintrag sieht so aus:
```
{
"id": 8857,
"amount": 1000, // = 10,00 Euro
"date": "2020-06-17T14:12:00+00:00",
"email": "foerderkreis-1@gradido.org",
"comment": null,
"coupon_code": "",
"gdt_entry_type_id": 4,
"factor": "20.0000",
"amount2": 0,
"factor2": "0.0500",
"gdt": 1000
}
```
gdt entry types: (Auf welchen Weg der Eintrag eingetragen wurde)
1. Form: einzeln über das Formular, sollte nur wenige Einträg e betreffen
2. CVS: CVS Import, betrifft vor allem ältere Einträge von Spenden die weder über Elopage noch über Digistore reinkamen
3. Elopage: Alle GDT Einträge die automatisch durch eine Elopage-Transaktion erstellt wurden für den Einzahlenden.
4. Elopage-Publisher: Alle GDT Einträge die automatisch durch eine Elopage-Transaktion erstellt wurden für den Publisher, bis zu 5 Level nach oben.
5. Digistore: Alle GDT Einträge die automatisch durch eine Digistore-Transaktion angelegt wurden.
6. Cvs2: GDT Einträge die durch ein anderen CVS Import eingetragen wurden, betrifft ebenfalls nur alte Einträge.
amount: Menge in Euro-cent (2 Nachkommastellen) was eingezahlt wurde
factor: Der Umrechnungsfaktor der beim Einzahlen für den betreffenden Unterstützer galt.
amount2: ein Bonus Factor der drauf gerechnet wird bei Sonderaktionen, default 0
factor2: ein Bonus-Factor, default 1, wird aktuell im Code auf für Publisher-Transactionen benutzt.
Gdt: resultierender GDT Wert, wird folgendermaßen aus den bisherigen Werten berechnet:
gdt = amount * factor * factor2 + amount2
Es gibt zwei Arten von GDT Einträgen:
Was der Benutzer selbst in Euro gespendet hat
Was jemand anderes an Euro gespendet hat, der den Benutzer als Publisher gewählt hat (publisher-id bei Elopage), Publisher bis Level 5 erhalten jeweils 5% an GDT was der Spender erhalten hat.
z.B. Anna spendet 100 Euro bei einem Faktor von 20, bekommt also 2000 GDT.
Sie hat als Publisher Bernd angegeben, Bern erhält 100 GDT.
Bernd hat als Publisher damals Paul angegeben, Paul erhält also ebenfalls noch 100 GDT.
Bis zum 5. (Bernd ist 2.)
Diese Beziehung wird durch die connectEntries dargestellt.
Insbesondere durch den publishersPath, connect enthält einfach nur alle mögliche Daten.
# TODO
TODO: Update GDT-Server um paging und Zugriff auf alle Einträge zu erhalten, optimierter Zugriff
GET https://staging.gradido.net/state-balances/ajaxGdtTransactions
Liefert wenn alles in Ordnung ist:

14
frontend/babel.config.js Normal file
View File

@ -0,0 +1,14 @@
module.exports = {
"presets": [
"@vue/app"
],
"plugins": [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
]
]
}

View File

@ -0,0 +1,12 @@
// This configuration file is not used anywhere in the code, it's a hack to handle InteliJ relative path imports
// Keep in sync with actual webpack aliases
const path = require('path');
module.exports = {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
}
};

72
frontend/package.json Executable file
View File

@ -0,0 +1,72 @@
{
"name": "bootstrap-vue-gradido-wallet",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "node server.js",
"serve": "vue-cli-service serve --open",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"dev": "npm run serve",
"i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'"
},
"dependencies": {
"axios": "^0.21.1",
"bootstrap": "4.3.1",
"bootstrap-vue": "^2.5.0",
"chart.js": "^2.9.3",
"d3": "^5.7.0",
"datamaps": "^0.5.9",
"date-fns": "^1.30.1",
"dropzone": "^5.5.1",
"element-ui": "2.4.11",
"es6-promise": "^4.1.1",
"eslint": "^5.16.0",
"eslint-plugin-vue": "^7.5.0",
"express": "^4.17.1",
"flatpickr": "^4.5.7",
"fuse.js": "^3.2.0",
"google-maps": "^3.2.1",
"nouislider": "^12.1.0",
"perfect-scrollbar": "^1.3.0",
"quill": "^1.3.6",
"sweetalert2": "^9.5.4",
"vee-validate": "^3.2.1",
"vue": "^2.6.11",
"vue-bootstrap-typeahead": "^0.2.6",
"vue-chartjs": "^3.5.0",
"vue-cli-plugin-i18n": "^1.0.1",
"vue-clickaway": "^2.2.2",
"vue-clipboard2": "^0.3.0",
"vue-cookies": "^1.7.4",
"vue-flatpickr-component": "^8.1.2",
"vue-good-table": "^2.21.3",
"vue-i18n": "^8.22.4",
"vue-qrcode-reader": "^2.3.16",
"vue-router": "^3.0.6",
"vue2-transitions": "^0.2.3",
"vuex": "^3.6.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^3.7.0",
"@vue/cli-plugin-eslint": "^3.7.0",
"@vue/cli-service": "^3.7.0",
"@vue/eslint-config-prettier": "^4.0.1",
"babel-plugin-component": "^1.1.0",
"node-sass": "^4.12.0",
"sass-loader": "^7.1.0",
"vue-template-compiler": "^2.6.11"
},
"postcss": {
"plugins": {
"autoprefixer": {}
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 10"
],
"author": "Bernd Hückstädt - https://www.gradido.net/",
"description": "Gradido Wallet"
}

BIN
frontend/public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="36px" height="36px" viewBox="0 0 36 36" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
<title>UI/icons/dark/github</title>
<desc>Created with Sketch.</desc>
<defs/>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="UI/icons/dark/github" fill="#182359">
<path d="M17.9985267,2 C9.16436969,2 2,9.16338746 2,18.0004911 C2,25.0695847 6.58405721,31.0660855 12.9420179,33.1818042 C13.7425335,33.3291384 14.0342552,32.8350778 14.0342552,32.4107554 C14.0342552,32.0306332 14.020504,31.0248319 14.0126462,29.6899843 C9.56217195,30.6564965 8.62316216,27.5447988 8.62316216,27.5447988 C7.89533135,25.696246 6.84631204,25.2041499 6.84631204,25.2041499 C5.3935971,24.2120998 6.95632156,24.2317444 6.95632156,24.2317444 C8.56226404,24.3447006 9.40697996,25.8809049 9.40697996,25.8809049 C10.834157,28.3256699 13.1522146,27.6194481 14.063722,27.2098591 C14.2090917,26.1765554 14.6226097,25.4713159 15.0793456,25.0715492 C11.5266276,24.6678535 7.7912152,23.294699 7.7912152,17.163633 C7.7912152,15.417232 8.41492986,13.9880905 9.43841125,12.8703152 C9.27339697,12.4656374 8.72433162,10.8380859 9.5955677,8.63593112 C9.5955677,8.63593112 10.9382731,8.20571534 13.9949661,10.2762516 C15.27088,9.9206851 16.6401056,9.7438841 18.0004911,9.7370085 C19.3598944,9.7438841 20.7281378,9.9206851 22.0060161,10.2762516 C25.0607447,8.20571534 26.4014856,8.63593112 26.4014856,8.63593112 C27.2746861,10.8380859 26.7256208,12.4656374 26.5615888,12.8703152 C27.5870346,13.9880905 28.2058381,15.417232 28.2058381,17.163633 C28.2058381,23.3104147 24.4645324,24.6629424 20.9010099,25.0587802 C21.4746309,25.5528408 21.9863716,26.5291752 21.9863716,28.0211793 C21.9863716,30.1604715 21.966727,31.8862457 21.966727,32.4107554 C21.966727,32.8390067 22.255502,33.3369962 23.0668222,33.180822 C29.4198717,31.0601921 34,25.0676202 34,18.0004911 C34,9.16338746 26.8356303,2 17.9985267,2" id="icons/icon-github"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="36px" height="36px" viewBox="0 0 36 36" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
<title>UI/icons/color/google</title>
<desc>Created with Sketch.</desc>
<defs/>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="UI/icons/color/google">
<g id="Group" transform="translate(2.000000, 2.000000)">
<path d="M32.4365525,16.6024012 C32.4365525,15.4515967 32.3313665,14.344128 32.1357206,13.2820585 L16.5492615,13.2820585 L16.5492615,19.5616128 L25.4557094,19.5616128 C25.0721312,21.5908257 23.9059692,23.3098098 22.1535707,24.4613022 L22.1535707,28.5341733 L27.5019274,28.5341733 C30.631561,25.7077204 32.4365525,21.5461142 32.4365525,16.6024012 L32.4365525,16.6024012 Z" id="Shape" fill="#4285F4"/>
<path d="M16.5492615,32.4674071 C21.0175621,32.4674071 24.7635856,31.0139403 27.5019274,28.5341733 L22.1535707,24.4613022 C20.6718508,25.4353244 18.7756982,26.0110706 16.5492615,26.0110706 C12.2387399,26.0110706 8.59088994,23.1557272 7.2893887,19.3181072 L1.76011213,19.3181072 L1.76011213,23.5244249 C4.48302664,28.8299569 10.0796222,32.4674071 16.5492615,32.4674071 L16.5492615,32.4674071 Z" id="Shape" fill="#34A853"/>
<path d="M7.2893887,19.3181072 C6.95840347,18.344085 6.77047118,17.3033395 6.77047118,16.2337035 C6.77047118,15.1640676 6.95840347,14.1233221 7.2893887,13.1492999 L7.2893887,8.94298219 L1.76011213,8.94298219 C0.639530783,11.1345322 0,13.6142992 0,16.2337035 C0,18.8531079 0.639530783,21.3328749 1.76011213,23.5244249 L7.2893887,19.3181072 L7.2893887,19.3181072 Z" id="Shape" fill="#FBBC05"/>
<path d="M16.5492615,6.4563365 C18.9790577,6.4563365 21.160615,7.27558824 22.8758478,8.88382548 L27.6225407,4.22764161 C24.755872,1.60892511 21.0098485,0 16.5492615,0 C10.0803235,0 4.48302664,3.63813805 1.76011213,8.94298219 L7.2893887,13.1492999 C8.59088994,9.31236774 12.2394411,6.4563365 16.5492615,6.4563365 Z" id="Shape" fill="#EA4335"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
frontend/public/img/theme/vue.jpg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,38 @@
<!--
=========================================================
* Gradido Wallet - v0.0.1
=========================================================
* Product Page: https://www.gradido.net
* Copyright 2020 Bernd Hückstädt - Gradido (https://www.gradido.net)
* Coded by www.gradido.net
=========================================================
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="icon" type="image/png" sizes="96x96" href="<%= webpackConfig.output.publicPath %>favicon.png">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<title>Gradido Wallet</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<!-- Fonts -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">
</head>
<body>
<div class="wrapper" id="app">
</div>
<!-- built files will be auto injected -->
</body>
</html>

View File

@ -0,0 +1,36 @@
{"state":"success", "statisticdata":
[
{
"i_creation_sum": 29288278.4653,
"i_creation_mon": 68278.4653,
"i_creation_365d": 19288278.4653,
"i_creation_30d": 288278.4653,
"i_creation_14d": 88278.4653,
"i_creation_7d": 3278.4653
},
{
"i_transience_sum": 8278.4653,
"i_transience_mon": 8278.4653,
"i_transience_365d": 8278.4653,
"i_transience_30d": 178.4653,
"i_transience_14d": 78.4653,
"i_transience_7d": 8.4653
},
{
"i_exchange_sum": 23345.2324,
"i_exchange_mon": 2,
"i_exchange_365d": 2,
"i_exchange_30d": 2,
"i_exchange_14d": 2,
"i_exchange_7d": 2
},
{
"i_members_sum": 5398,
"i_members_mon": 234,
"i_members_365d": 2356,
"i_members_30d": 123,
"i_members_14d": 23,
"i_members_7d": 24
}
]
}

View File

@ -0,0 +1,64 @@
{"state":"success", "statisticdata":
[
{
"charts_creation_0_mon": 5635,
"charts_creation_1_mon": 5635,
"charts_creation_2_mon": 5635,
"charts_creation_3_mon": 5635,
"charts_creation_4_mon": 5635,
"charts_creation_5_mon": 5635,
"charts_creation_6_mon": 5635,
"charts_creation_7_mon": 5635,
"charts_creation_8_mon": 5635,
"charts_creation_9_mon": 5635,
"charts_creation_10_mon": 5635,
"charts_creation_11_mon": 5635,
"charts_creation_12_mon": 5635
},
{
"charts_transience_0_mon": 5635,
"charts_transience_1_mon": 5635,
"charts_transience_2_mon": 5635,
"charts_transience_3_mon": 5635,
"charts_transience_4_mon": 5635,
"charts_transience_5_mon": 5635,
"charts_transience_6_mon": 5635,
"charts_transience_7_mon": 5635,
"charts_transience_8_mon": 5635,
"charts_transience_9_mon": 5635,
"charts_transience_10_mon": 5635,
"charts_transience_11_mon": 5635,
"charts_transience_12_mon": 5635
},
{
"charts_exchange_0_mon": 5635,
"charts_exchange_1_mon": 5635,
"charts_exchange_2_mon": 5635,
"charts_exchange_3_mon": 5635,
"charts_exchange_4_mon": 5635,
"charts_exchange_5_mon": 5635,
"charts_exchange_6_mon": 5635,
"charts_exchange_7_mon": 5635,
"charts_exchange_8_mon": 5635,
"charts_exchange_9_mon": 5635,
"charts_exchange_10_mon": 5635,
"charts_exchange_11_mon": 5635,
"charts_exchange_12_mon": 5635
},
{
"charts_members_0_mon": 5635,
"charts_members_1_mon": 5635,
"charts_members_2_mon": 5635,
"charts_members_3_mon": 5635,
"charts_members_4_mon": 5635,
"charts_members_5_mon": 5635,
"charts_members_6_mon": 5635,
"charts_members_7_mon": 5635,
"charts_members_8_mon": 5635,
"charts_members_9_mon": 5635,
"charts_members_10_mon": 5635,
"charts_members_11_mon": 5635,
"charts_members_12_mon": 5635
}
]
}

View File

@ -0,0 +1,19 @@
{"state":"success", "statisticdata":
[
{
"community_entries1_mon": 5635,
"community_entries2_mon": 5635,
"community_entries3_mon": 5635,
"community_entries4_mon": 5635,
"community_entries5_mon": 5635,
"community_entries6_mon": 5635,
"community_entries7_mon": 5635,
"community_entries8_mon": 5635,
"community_entries9_mon": 5635,
"community_entries0_mon": 5635,
"community_entries10_mon": 5635,
"community_entries11_mon": 5635,
"community_entries12_mon": 5635
}
]
}

View File

@ -0,0 +1,61 @@
{"state":"success", "transactions":
[
{
"name": "Jon Tester",
"email": "jon@example.de",
"type": "send",
"transaction_id": 12,
"date": "29-11-2020",
"balance": 7000,
"memo": "Reperatur Waschbecken",
"pubkey": "abcdefghi123456789"
},
{
"name": "Gradido Community",
"email": "gradido@example.de",
"type": "creation",
"transaction_id": 11,
"date": "1-11-2020",
"balance": 10000,
"memo": "Müll gesammelt im Wald",
"pubkey": "abcdefghi123456789"
},
{
"name": "Maria Tester",
"email": "maria@example.de",
"type": "receive",
"transaction_id": 7,
"date": "23-10-2020",
"balance": 5000,
"memo": "Spende an Alice ",
"pubkey": "abcdefghi123456789"
},
{
"name": "Alice Tester",
"email": "alice@example.de",
"type": "receive",
"transaction_id": 5,
"date": "2-8-2020",
"balance": 1000,
"memo": "Bob hat meinen Müll getrennt",
"pubkey": "abcdefghi123456789"
},
{
"name": "Gradido Community",
"email": "gradido@example.de",
"type": "creation",
"transaction_id": 1,
"date": "11-7-2020",
"balance": 10000,
"memo": "Bob hat meinen Müll getrennt",
"pubkey": "abcdefghi123456789"
}
],
"transactionExecutingCount": 8750,
"count": 5
}

View File

@ -0,0 +1,49 @@
{"state":"success", "participation":
[
{
"name": "",
"type": "submitted",
"participation_id": 412,
"date_submitted": "9-12-2020",
"titel": "Lorem Ipsum panta lore es Tastina sero was. ",
"text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ",
"date_participation": "8-12-2020",
"plz_participation": "01099",
"pubkey": "abcdefghi123456789"
},
{
"name": "",
"type": "in progress",
"participation_id": 312,
"date_submitted": "2-11-2020",
"titel": "Lorem Ipsum panta lore es Tastina sero was. ",
"text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ",
"date_participation": "2-11-2020",
"plz_participation": "01099",
"pubkey": "abcdefghi123456789"
},
{
"name": "",
"type": "confirmed",
"participation_id": 212,
"date_submitted": "20-10-2020",
"titel": "Lorem Ipsum panta lore es Tastina sero was. ",
"text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ",
"date_participation": "20-10-2020",
"plz_participation": "01099",
"pubkey": "abcdefghi123456789"
},
{
"name": "",
"type": "rejected",
"participation_id": 142,
"date_submitted": "17-9-2020",
"titel": "Lorem Ipsum panta lore es Tastina sero was. ",
"text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ",
"date_participation": "17-9-2020",
"plz_participation": "01099",
"pubkey": "abcdefghi123456789"
}
],
"count": 4
}

View File

@ -0,0 +1,52 @@
{"state":"success", "admin0userlist":
[
{
"created": 1578688666,
"disabled": false,
"email": "dervommond@gmail.com",
"email_checked": true,
"first_name": "Max",
"group_alias": "gdd1",
"ident_hash": 2928827813,
"last_name": "Miau",
"public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b",
"role": "admin",
"username": "",
"balance_gdd": 174500,
"balance_gdt": 4500,
"errorCount": 0
},
{
"created": 1578685678,
"disabled": false,
"email": "ttwer@gmail.com",
"email_checked": true,
"first_name": "John",
"group_alias": "gdd1",
"ident_hash": 2928827813,
"last_name": "Doe",
"public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71x",
"role": "user",
"username": "",
"balance_gdd": 144500,
"balance_gdt": 0,
"errorCount": 0
},
{
"created": 1578635671,
"disabled": false,
"email": "test@gmail.com",
"email_checked": true,
"first_name": "Alice",
"group_alias": "gdd1",
"ident_hash": 4928827813,
"last_name": "Seer",
"public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71a",
"role": "user",
"username": "",
"balance_gdd": 444500,
"balance_gdt": 4500,
"errorCount": 0
}
]
}

View File

@ -0,0 +1,19 @@
{"state":"success", "userdata":
[
{
"created": 1578688666,
"disabled": false,
"email": "dervommond@gmail.com",
"email_checked": true,
"first_name": "Max",
"group_alias": "gdd1",
"ident_hash": 2928827813,
"last_name": "Miau",
"public_hex": "2ed28a1cf5e116d83615406bc577152221c2f774a5656f66a0e7540f7576d71b",
"role": "admin",
"username": "",
"balance": 174500,
"errorCount": 0
}
]
}

View File

@ -0,0 +1,45 @@
{"state":"success", "participation":
[
{
"type": "submitted",
"participation_id": 412,
"date_submitted": "9-12-2020",
"titel": "Lorem Ipsum panta lore es Tastina sero was. ",
"text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ",
"date_participation": "8-12-2020",
"plz_participation": "01099",
"pubkey": "abcdefghi123456789"
},
{
"type": "in progress",
"participation_id": 312,
"date_submitted": "2-11-2020",
"titel": "Lorem Ipsum panta lore es Tastina sero was. ",
"text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ",
"date_participation": "2-11-2020",
"plz_participation": "01099",
"pubkey": "abcdefghi123456789"
},
{
"type": "confirmed",
"participation_id": 212,
"date_submitted": "20-10-2020",
"titel": "Lorem Ipsum panta lore es Tastina sero was. ",
"text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ",
"date_participation": "20-10-2020",
"plz_participation": "01099",
"pubkey": "abcdefghi123456789"
},
{
"type": "rejected",
"participation_id": 142,
"date_submitted": "17-9-2020",
"titel": "Lorem Ipsum panta lore es Tastina sero was. ",
"text": "Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. Lorem Ipsum panta lore es Tastina sero was. ",
"date_participation": "17-9-2020",
"plz_participation": "01099",
"pubkey": "abcdefghi123456789"
}
],
"count": 4
}

View File

@ -0,0 +1,61 @@
{"state":"success", "transactions":
[
{
"name": "Jon Tester",
"email": "jon@example.de",
"type": "send",
"transaction_id": 12,
"date": "29-11-2020",
"balance": 7000,
"memo": "Reperatur Waschbecken",
"pubkey": "abcdefghi123456789"
},
{
"name": "Gradido Community",
"email": "gradido@example.de",
"type": "creation",
"transaction_id": 11,
"date": "1-11-2020",
"balance": 10000,
"memo": "Müll gesammelt im Wald",
"pubkey": "abcdefghi123456789"
},
{
"name": "Maria Tester",
"email": "maria@example.de",
"type": "receive",
"transaction_id": 7,
"date": "23-10-2020",
"balance": 5000,
"memo": "Spende an Alice ",
"pubkey": "abcdefghi123456789"
},
{
"name": "Alice Tester",
"email": "alice@example.de",
"type": "receive",
"transaction_id": 5,
"date": "2-8-2020",
"balance": 1000,
"memo": "Bob hat meinen Müll getrennt",
"pubkey": "abcdefghi123456789"
},
{
"name": "Gradido Community",
"email": "gradido@example.de",
"type": "creation",
"transaction_id": 1,
"date": "11-7-2020",
"balance": 10000,
"memo": "Bob hat meinen Müll getrennt",
"pubkey": "abcdefghi123456789"
}
],
"transactionExecutingCount": 8750,
"count": 5
}

7
frontend/server.js Normal file
View File

@ -0,0 +1,7 @@
var express = require('express');
var serveStatic = require('serve-static');
var app = express();
app.use(serveStatic(__dirname + "/dist"));
var port = process.env.PORT || 5000;
app.listen(port);
// console.log('http://localhost:5000 server started.');

71
frontend/src/App.vue Executable file
View File

@ -0,0 +1,71 @@
<template>
<div id="app" class="font-sans text-gray-800">
<header class="border-t-4 border-blue-700 bg-white z-10 absolute w-full shadow-md">
</header>
<div class="bg-gray-100 min-h-screen pt-40 text-lg">
<router-view />
</div>
</div>
</template>
<script>
export default {
name: 'app',
created () {
if (this.$cookies.get('gdd_is_auth') == 'true' && this.$store.state.is_auth == true) {
this.$store.state.user.email = this.$cookies.get('gdd_email')
// if ( this.$store.state.is_auth == false && this.$store.state.is_admin == false) {
// this.$router.push("/Landing")
// } else {
this.$router.push('/KontoOverview')
// }
}else {
this.$router.push("/Landing")
}
//var user = { id:1, name:'Journal',session:'25j_7Sl6xDq2Kc3ym0fmrSSk2xV2XkUkX' };
//this.$cookies.set('user',user);
//// print user name
//console.log("APP.vue START created get cookie is_auth=>",this.$cookies.get('gdd_is_auth'))
},
methods: {
/*
login() {
//console.log("app.vue user login() : " + this.$store.state.is_auth)
this.$store.commit('login')
//this.$router.push('/KontoOverview')
},
loginAsAdmin () {
// console.log("app.vue admin login(): " + this.$store.state.is_admin)
this.$store.state.modals = true
//this.$store.commit('loginAsAdmin')
//this.$router.push('/AdminOverview')
},
logout(){
// console.log("app.vue user logout() : ")
this.$store.commit('logout')
}
*/
}
}
</script>
<style>
gradido-global-color-text{color: #3D443B }
gradido-global-color-accent{color: #047006 }
gradido-global-color-6e0a9c9e{color: #000 }
gradido-global-color-2d0fb154{color: #047006 }
gradido-global-color-16efe88c{color: #7EBC55 }
gradido-global-color-1939326{color: #F6FFF6 }
gradido-global-color-9d79fc1{color: #047006 }
gradido-global-color-6347f4d{color: #5A7B02 }
gradido-global-color-4fbc19a{color: #014034 }
gradido-global-color-d341874{color: #B6D939 }
gradido-global-color-619d338{color: #8EBFB1 }
gradido-global-color-44819a9{color: #026873 }
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,69 @@
/*!
=========================================================
* Bootstrap Vue Gradido Wallet- v0.0.1
=========================================================
* Product Page: https://www.gradido.net
* Copyright 2020 Bernd Hückstädt - Gradido (https://www.gradido.net)
* Coded by www.gradido.net
=========================================================
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
// Core
@import "custom/functions";
@import "custom/variables";
@import "custom/mixins";
// Bootstrap (4.1.3) components
@import "~bootstrap/scss/root";
@import "~bootstrap/scss/reboot";
@import "~bootstrap/scss/type";
@import "~bootstrap/scss/images";
@import "~bootstrap/scss/code";
@import "~bootstrap/scss/grid";
@import "~bootstrap/scss/tables";
@import "~bootstrap/scss/forms";
@import "~bootstrap/scss/buttons";
@import "~bootstrap/scss/transitions";
@import "~bootstrap/scss/dropdown";
@import "~bootstrap/scss/button-group";
@import "~bootstrap/scss/input-group";
@import "~bootstrap/scss/custom-forms";
@import "~bootstrap/scss/nav";
@import "~bootstrap/scss/navbar";
@import "~bootstrap/scss/card";
@import "~bootstrap/scss/breadcrumb";
@import "~bootstrap/scss/pagination";
@import "~bootstrap/scss/badge";
@import "~bootstrap/scss/jumbotron";
@import "~bootstrap/scss/alert";
@import "~bootstrap/scss/progress";
@import "~bootstrap/scss/media";
@import "~bootstrap/scss/list-group";
@import "~bootstrap/scss/close";
@import "~bootstrap/scss/modal";
@import "~bootstrap/scss/tooltip";
@import "~bootstrap/scss/popover";
@import "~bootstrap/scss/carousel";
@import "~bootstrap/scss/utilities";
@import "~bootstrap/scss/print";
// Argon utilities and components
@import "custom/reboot";
@import "custom/utilities";
@import "custom/components";
// Vendor (Plugins)
@import "custom/vendors";

View File

@ -0,0 +1,39 @@
//
// Dismissible alert
//
.alert-dismissible {
.close {
top: 50%;
right: $alert-padding-x;
padding: 0;
transform: translateY(-50%);
color: rgba($white, .6);
opacity: 1;
&:hover,
&:focus {
color: rgba($white, .9);
opacity: 1 !important;
}
@include media-breakpoint-down(xs) {
top: 1rem;
right: .5rem;
}
&>span:not(.sr-only) {
font-size: 1.5rem;
background-color: transparent;
color: rgba($white, .6);
}
&:hover,
&:focus {
&>span:not(.sr-only) {
background-color: transparent;
color: rgba($white, .9);
}
}
}
}

View File

@ -0,0 +1,46 @@
//
// Alert
//
.alert {
font-size: $font-size-sm;
}
// Alert heading
.alert-heading {
font-weight: $font-weight-bold;
font-size: $h4-font-size;
margin-top: .15rem;
}
// Alert icon
.alert-icon {
font-size: 1.25rem;
margin-right: 1.25rem;
display: inline-block;
vertical-align: middle;
i.ni {
position: relative;
top: 1px;
}
}
// Alert text next to an alert icon
.alert-text {
display: inline-block;
vertical-align: middle;
}
// Alert links
[class*="alert-"] {
.alert-link {
color: $white;
border-bottom: 1px dotted rgba($white, .5);
}
}

View File

@ -0,0 +1,22 @@
//
// Avatar group
//
// General styles
.avatar-group {
.avatar {
position: relative;
z-index: 2;
border: 2px solid $card-bg;
&:hover {
z-index: 3;
}
}
.avatar + .avatar {
margin-left: -1rem;
}
}

View File

@ -0,0 +1,42 @@
//
// Avatar
//
// General styles
.avatar {
color: $white;
background-color: $gray-500;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 1rem;
border-radius: 50%;
height: 48px;
width: 48px;
img {
width: 100%;
border-radius: 50%;
}
+ .avatar-content {
display: inline-block;
margin-left: .75rem;
}
}
// Avatar size variations
.avatar-lg {
width: 58px;
height: 58px;
font-size: $font-size-sm;
}
.avatar-sm {
width: 36px;
height: 36px;
font-size: $font-size-sm;
}

View File

@ -0,0 +1,17 @@
//
// Circle badge
//
// General styles
.badge-circle {
text-align: center;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 50%;
width: 2rem;
height: 2rem;
font-size: .875rem;
}

View File

@ -0,0 +1,42 @@
//
// Dot badge
//
// General styles
.badge-dot {
padding-left: 0;
padding-right: 0;
background: transparent;
font-weight: $font-weight-normal;
font-size: $font-size-sm;
text-transform: none;
strong {
color: $gray-800;
}
i {
display: inline-block;
vertical-align: middle;
width: .375rem;
height: .375rem;
border-radius: 50%;
margin-right: .375rem;
}
&.badge-md {
i {
width: .5rem;
height: .5rem;
}
}
&.badge-lg {
i {
width: .625rem;
height: .625rem;
}
}
}

View File

@ -0,0 +1,55 @@
//
// Badge
//
// General styles
.badge {
text-transform: $badge-text-transfom;
a {
color: $white;
}
}
// Size variations
.badge-md {
padding: .65em 1em;
}
.badge-lg {
padding: .85em 1.375em;
}
// Multiple inline badges
.badge-inline {
margin-right: .625rem;
+ span {
top: 2px;
position: relative;
> a {
text-decoration: underline;
}
}
}
// Badge spacing inside a btn with some text
.btn {
.badge {
&:not(:first-child) {
margin-left: .5rem;
}
&:not(:last-child) {
margin-right: .5rem;
}
}
}

View File

@ -0,0 +1,12 @@
//
// Brand buttons
//
// Color variations
@each $color, $value in $brand-colors {
.btn-#{$color} {
@include button-variant($value, $value);
}
}

View File

@ -0,0 +1,92 @@
//
// Icon buttons
//
.btn-icon {
.btn-inner--icon {
img {
width: 20px;
}
}
.btn-inner--text:not(:first-child) {
margin-left: 0.75em;
}
.btn-inner--text:not(:last-child) {
margin-right: 0.75em;
}
}
// Button only with icon and NO text
.btn-icon-only {
width: 2.375rem;
height: 2.375rem;
padding: 0;
}
a.btn-icon-only {
line-height: 2.5;
}
.btn-icon-only.btn-sm {
width: 2rem;
height: 2rem;
}
//
// Clipboard button
// dedicated element for copying icons
//
.btn-icon-clipboard {
margin: 0;
padding: 1.5rem;
font-size: $font-size-base;
font-weight: $font-weight-normal;
line-height: 1.25;
color: $gray-800;
background-color: $gray-100;
border-radius: $border-radius;
border: 0;
text-align: left;
font-family: inherit;
display: inline-block;
vertical-align: middle;
text-decoration: none;
-moz-appearance: none;
cursor: pointer;
width: 100%;
margin: .5rem 0;
&:hover {
background-color: $white;
box-shadow: rgba(0, 0, 0, .1) 0 0 0 1px, rgba(0, 0, 0, .1) 0 4px 16px;
}
> div {
align-items: center;
display: flex;
}
i {
box-sizing: content-box;
color: theme-color("primary");
vertical-align: middle;
font-size: 1.5rem;
}
span {
display: inline-block;
font-size: 0.875rem;
line-height: 1.5;
margin-left: 16px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
vertical-align: middle;
}
}

View File

@ -0,0 +1,91 @@
//
// Icon buttons
//
// General styles
.btn {
position: relative;
text-transform: $btn-text-transform;
transition: $transition-base;
letter-spacing: $btn-letter-spacing;
font-size: $input-btn-font-size;
will-change: transform;
&:hover {
@include box-shadow($btn-hover-box-shadow);
transform: translateY($btn-hover-translate-y);
}
&:not(:last-child) {
margin-right: .5rem;
}
// Icons
i:not(:first-child),
svg:not(:first-child) {
margin-left: .5rem;
}
i:not(:last-child),
svg:not(:last-child) {
margin-right: .5rem;
}
}
// Remove translateY and margin animation when btn is included in a btn-group or input-group
.btn-group,
.input-group {
.btn {
margin-right: 0;
transform: translateY(0);
}
}
// Size variations
.btn-sm {
font-size: $input-btn-font-size-sm;
}
.btn-lg {
font-size: $input-btn-font-size-lg;
}
// Some quick fixes (to revise)
// Fixes
[class*="btn-outline-"] {
border-width: 1px;
}
.btn-outline-secondary {
color: darken(theme-color("secondary"), 50%);
}
.btn-inner--icon {
i:not(.fa) {
position: relative;
top: 2px;
}
}
.btn-link {
font-weight: $btn-font-weight;
box-shadow: none;
&:hover {
box-shadow: none;
transform: none;
}
}
.btn-neutral {
color: theme-color("primary");
}

View File

@ -0,0 +1,10 @@
//
// Card with hover animations
//
.card-lift--hover {
&:hover {
transform: translateY(-20px);
@include transition($transition-base);
}
}

View File

@ -0,0 +1,17 @@
//
// Card with blockquote
//
.card-blockquote {
padding: 2rem;
position: relative;
.svg-bg {
display: block;
width: 100%;
height: 95px;
position: absolute;
top: -94px;
left: 0;
}
}

View File

@ -0,0 +1,49 @@
//
// Profile card
//
.card-profile-image {
position: relative;
img {
max-width: 180px;
border-radius: $border-radius;
@extend .shadow;
transform: translate(-50%,-30%);
position: absolute;
left: 50%;
transition: $transition-base;
&:hover {
transform: translate(-50%, -33%);
}
}
}
.card-profile-stats {
padding: 1rem 0;
> div {
text-align: center;
margin-right: 1rem;
padding: .875rem;
&:last-child {
margin-right: 0;
}
.heading {
font-size: 1.1rem;
font-weight: bold;
display: block;
}
.description {
font-size: .875rem;
color: $gray-500;
}
}
}
.card-profile-actions {
padding: .875rem;
}

View File

@ -0,0 +1,16 @@
//
// Card stats
//
.card-stats {
.card-body {
padding: 1rem 1.5rem;
}
.card-status-bullet {
position: absolute;
top: 0;
right: 0;
transform: translate(50%, -50%);
}
}

View File

@ -0,0 +1,8 @@
//
// Card
//
.card-translucent {
background-color: rgba(18, 91, 152, 0.08);
}

View File

@ -0,0 +1,69 @@
//
// Chart
//
.chart {
position: relative;
height: $chart-height;
}
// Size variations
.chart-sm {
height: $chart-height-sm;
}
// Legend
.chart-legend {
display: flex;
justify-content: center;
margin-top: $chart-legend-margin-top;
font-size: $chart-legend-font-size;
text-align: center;
color: $chart-legend-color;
}
.chart-legend-item {
display: inline-flex;
align-items: center;
+ .chart-legend-item {
margin-left: 1rem;
}
}
.chart-legend-indicator {
display: inline-block;
width: 0.5rem;
height: 0.5rem;
margin-right: 0.375rem;
border-radius: 50%;
}
// Tooltip
#chart-tooltip {
z-index: 0;
.arrow {
top: 100%;
left: 50%;
transform: translateX(-50%) translateX(-.5rem);
}
}
// Chart info overlay
.chart-info-overlay {
position: absolute;
top: 0;
left: 5%;
max-width: 350px;
padding: 20px;
z-index: 1;
}

View File

@ -0,0 +1,34 @@
//
// Close
//
.close {
@if $enable-transitions {
transition: $transition-base;
}
&>span:not(.sr-only) {
background-color: $close-bg;
color: $close-color;
line-height: 17px;
height: 1.25rem;
width: 1.25rem;
border-radius: 50%;
font-size: 1.25rem;
display: block;
@if $enable-transitions {
transition: $transition-base;
}
}
&:hover,
&:focus {
background-color: $close-hover-bg;
color: $close-hover-color;
outline: none;
span:not(.sr-only) {
background-color: $close-hover-bg;
}
}
}

View File

@ -0,0 +1,37 @@
//
// Custom checkbox
//
.custom-checkbox {
.custom-control-input ~ .custom-control-label {
cursor: pointer;
font-size: $font-size-sm;
}
.custom-control-input {
&:checked {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-checked-border-color;
}
&::after {
background-image: $custom-checkbox-indicator-icon-checked;
}
}
}
&:disabled {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-disabled-bg;
}
}
&:checked {
&::before {
border-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
}
}

View File

@ -0,0 +1,51 @@
//
// Custom control
// additional styles for custom checkboxes, radios and other
//
.custom-control-label {
// Background-color and (when enabled) gradient
&::before {
border: $custom-control-indicator-border-width solid $custom-control-indicator-border-color;
@if $enable-transitions {
transition: $input-transition;
}
}
span {
position: relative;
top: 2px;
}
}
.custom-control-label {
margin-bottom: 0;
}
// Alternative style
.custom-control-alternative {
.custom-control-label {
// Background-color and (when enabled) gradient
&::before {
border: 0;
box-shadow: $input-alternative-box-shadow;
}
}
.custom-control-input {
&:checked {
~ .custom-control-label {
&::before {
box-shadow: $input-focus-alternative-box-shadow;
}
}
}
&:active~.custom-control-label::before,
&:focus~.custom-control-label::before {
box-shadow: $input-alternative-box-shadow;
}
}
}

View File

@ -0,0 +1,37 @@
//
// Custom checkbox
//
.custom-checkbox {
.custom-control-input ~ .custom-control-label {
cursor: pointer;
font-size: $font-size-sm;
}
.custom-control-input {
&:checked {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-checked-border-color;
}
&::after {
background-image: $custom-checkbox-indicator-icon-checked;
}
}
}
&:disabled {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-disabled-bg;
}
}
&:checked {
&::before {
border-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
}
}

View File

@ -0,0 +1,37 @@
//
// Custom radio
//
.custom-radio {
.custom-control-input ~ .custom-control-label {
cursor: pointer;
font-size: $font-size-sm;
}
.custom-control-input {
&:checked {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-checked-border-color;
}
&::after {
background-image: $custom-radio-indicator-icon-checked;
}
}
}
&:disabled {
~ .custom-control-label {
&::before {
border-color: $custom-control-indicator-disabled-bg;
}
}
&:checked {
&::before {
border-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
}
}

View File

@ -0,0 +1,66 @@
//
// Custom toggle
//
.custom-toggle {
position: relative;
display: inline-block;
width: $custom-toggle-width;
height: 1.5rem;
input {
display: none;
&:checked {
+ .custom-toggle-slider {
border: $custom-control-indicator-border-width solid $custom-control-indicator-checked-border-color;
&:before {
background: $custom-toggle-checked-bg;
transform: translateX(1.625rem);
}
}
}
&:disabled {
+ .custom-toggle-slider {
border: $custom-control-indicator-border-width solid $custom-control-indicator-disabled-bg;
}
&:checked {
+ .custom-toggle-slider {
border: $custom-control-indicator-border-width solid $custom-control-indicator-disabled-bg;
&:before {
background-color: lighten($custom-control-indicator-checked-bg, 10%);
}
}
}
}
}
}
.custom-toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
border: $custom-control-indicator-border-width solid $input-border-color;
border-radius: 34px !important;
background-color: transparent;
&:before {
position: absolute;
content: "";
height: 18px;
width: 18px;
left: 2px;
bottom: 2px;
border-radius: 50% !important;
background-color: $custom-toggle-slider-bg;
transition: $input-transition;
}
}

View File

@ -0,0 +1,79 @@
//
// Dropdown
//
// General styles
.dropdown,
.dropup,
.dropright,
.dropleft {
display: inline-block;
}
.dropdown-menu {
min-width: 12rem;
.dropdown-item {
padding: .5rem 1rem;
font-size: $font-size-sm;
> i,
> svg {
margin-right: 1rem;
font-size: 1rem;
vertical-align: -17%;
}
}
}
.dropdown-header {
padding-left: 1rem;
padding-right: 1rem;
color: $gray-100;
font-size: .625rem;
text-transform: uppercase;
font-weight: 700;
}
// Media components inside dropdown link
.dropdown-menu {
a.media {
> div {
&:first-child {
line-height: 1;
}
}
p {
color: $gray-600;
}
&:hover {
.heading,
p {
color: theme-color("default") !important;
}
}
}
}
// Size variations
.dropdown-menu-sm {
min-width: 100px;
border: $border-radius-lg;
}
.dropdown-menu-lg {
min-width: 260px;
border-radius: $border-radius-lg;
}
.dropdown-menu-xl {
min-width: 450px;
border-radius: $border-radius-lg;
}

View File

@ -0,0 +1,98 @@
//
// Footer
//
// General styles
.footer {
background: $footer-bg;
padding: $footer-padding-y $footer-padding-x;
.col-footer {
.heading {
color: $footer-heading-color;
letter-spacing: 0;
font-size: $footer-heading-font-size;
text-transform: uppercase;
font-weight: $font-weight-bold;
margin-bottom: 1rem;
}
}
.nav .nav-item .nav-link,
.footer-link {
color: $footer-link-color !important;
&:hover {
color: $footer-link-hover-color !important;
}
}
.list-unstyled li a {
display: inline-block;
padding: .125rem 0;
color: $footer-link-color;
font-size: $footer-link-font-size;
&:hover {
color: $footer-link-hover-color;
}
}
.copyright {
font-size: $font-size-sm;
}
}
// Dark footer
.footer-dark {
.col-footer .heading {
color: $white;
}
}
// Footer nav used for copyright and some links, but not limited to this
.nav-footer {
.nav-link {
font-size: $font-size-sm;
}
.nav-item:last-child {
.nav-link {
padding-right: 0;
}
}
}
// Footer with cards over
.footer.has-cards {
overflow: hidden;
padding-top: 500px;
margin-top: -420px;
position: relative;
background: transparent;
pointer-events: none;
&:before {
content: "";
position: absolute;
left: 0;
right: 0;
top: 600px;
height: 2000px;
background: theme-color("secondary");
transform: skew(0,-8deg);
}
.container {
pointer-events: auto;
position: relative;
}
}

View File

@ -0,0 +1,71 @@
//
// Form validation
//
// Validation
.has-success,
.has-danger {
position: relative;
&:after, {
width: 19px;
height: 19px;
line-height: 19px;
text-align: center;
font-family: 'NucleoIcons';
display: inline-block;
position: absolute;
right: 15px;
top: 2px;
transform: translateY(50%);
border-radius: 50%;
font-size: 9px;
opacity: 1;
}
}
.has-success {
&:after {
content: "\ea26";
color: daken($form-feedback-valid-color, 18%);
background-color: $form-feedback-valid-bg;
}
.form-control {
background-color: $input-focus-bg;
&:focus {
border-color: $input-focus-border-color;
}
// Placeholder
&::placeholder {
color: $form-feedback-valid-color;
}
}
}
.has-danger {
&:after {
content: "\ea53";
color: daken($form-feedback-invalid-color, 18%);
background-color: $form-feedback-invalid-bg;
}
.form-control {
background-color: $input-focus-bg;
&:focus {
border-color: $input-focus-border-color;
}
// Placeholder
&::placeholder {
color: $form-feedback-invalid-color;
}
}
}

View File

@ -0,0 +1,78 @@
//
// Forms
//
// Labels
.form-control-label {
color: $gray-700;
font-size: $font-size-sm;
font-weight: $font-weight-bold;
}
// Text inputs
.form-control {
font-size: $input-btn-font-size;
&:focus {
&::placeholder {
color: $input-focus-placeholder-color;
}
}
}
// Textarea
textarea[resize="none"] {
resize: none!important;
}
textarea[resize="both"] {
resize: both!important;
}
textarea[resize="vertical"] {
resize: vertical!important;
}
textarea[resize="horizontal"] {
resize: horizontal!important;
}
// Form input variations
// Muted input
.form-control-muted {
background-color: $input-muted-bg;
border-color: $input-muted-bg;
box-shadow: none;
&:focus {
background-color: $input-focus-muted-bg;
}
}
// Alternative input
.form-control-alternative {
box-shadow: $input-alternative-box-shadow;
border: 0;
transition: box-shadow .15s ease;
&:focus {
box-shadow: $input-focus-alternative-box-shadow;
}
}
// Size variations: Fixes to the bootstrap defaults
.form-control-lg {
font-size: $font-size-base;
}

View File

@ -0,0 +1,70 @@
//
// Input group
//
.input-group {
box-shadow: $input-box-shadow;
border-radius: $input-border-radius;
transition: $transition-base;
.form-control {
box-shadow: none;
&:not(:first-child) {
border-left: 0;
padding-left: 0;
}
&:not(:last-child) {
border-right: 0;
padding-right: 0;
}
&:focus {
box-shadow: none;
}
}
}
.input-group-text {
transition: $input-transition;
}
// Alternative input groups related to .form-control-alternative
.input-group-alternative {
box-shadow: $input-alternative-box-shadow;
border: 0;
transition: box-shadow .15s ease;
.form-control,
.input-group-text {
border: 0;
box-shadow: none;
}
}
.focused {
.input-group-alternative {
box-shadow: $input-focus-alternative-box-shadow !important;
}
}
// .focus class is applied dinamycally from theme.js
.focused {
.input-group {
box-shadow: $input-focus-box-shadow;
}
.input-group-text {
color: $input-group-addon-focus-color;
background-color: $input-group-addon-focus-bg;
border-color: $input-group-addon-focus-border-color;
}
.form-control {
border-color: $input-group-addon-focus-border-color;
}
}

View File

@ -0,0 +1,7 @@
//
// Header
//
.header {
position: relative;
}

View File

@ -0,0 +1,42 @@
//
// Icon shape
//
.icon-shape {
padding: 12px;
text-align: center;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 50%;
i, svg {
font-size: 1.25rem;
}
&.icon-lg {
i, svg {
font-size: 1.625rem;
}
}
&.icon-sm {
i, svg {
font-size: .875rem;
}
}
svg {
width: 30px;
height: 30px;
}
}
@each $color, $value in $theme-colors {
.icon-shape-#{$color} {
@include icon-shape-variant(theme-color($color));
}
}

Some files were not shown because too many files have changed in this diff Show More