Add 'frontend/' from commit 'd820caba3ffcf0e94e3740ee7a25e583176d6df0'
git-subtree-dir: frontend git-subtree-mainline: a866d737678d48a6a32d93a12c166f882626e87d git-subtree-split: d820caba3ffcf0e94e3740ee7a25e583176d6df0
3
frontend/.dockerignore
Normal file
@ -0,0 +1,3 @@
|
||||
node_modules
|
||||
.git
|
||||
.gitignore
|
||||
9
frontend/.editorconfig
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -0,0 +1,2 @@
|
||||
## [1.0.0] - 2020-07-27
|
||||
### Initial Release
|
||||
108
frontend/Dockerfile
Normal 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"]
|
||||
9
frontend/ISSUE_TEMPLATE.md
Normal 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
@ -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
@ -0,0 +1,14 @@
|
||||
module.exports = {
|
||||
"presets": [
|
||||
"@vue/app"
|
||||
],
|
||||
"plugins": [
|
||||
[
|
||||
"component",
|
||||
{
|
||||
"libraryName": "element-ui",
|
||||
"styleLibraryName": "theme-chalk"
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
12
frontend/intelij.webpack.js
Normal 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
@ -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
|
After Width: | Height: | Size: 10 KiB |
BIN
frontend/public/img/brand/Gradido-Coin_300_120dpi.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
frontend/public/img/brand/Gradido-Coin_300_120dpi_comic.png
Normal file
|
After Width: | Height: | Size: 175 KiB |
BIN
frontend/public/img/brand/Gradido-Coin_300_120dpi_cubeb.png
Normal file
|
After Width: | Height: | Size: 406 KiB |
BIN
frontend/public/img/brand/Gradido-Coin_300_120dpi_sw.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
frontend/public/img/brand/Gradido-Coin_500_175dpi.png
Normal file
|
After Width: | Height: | Size: 371 KiB |
BIN
frontend/public/img/brand/cube.webm
Normal file
BIN
frontend/public/img/brand/favicon.png
Executable file
|
After Width: | Height: | Size: 10 KiB |
BIN
frontend/public/img/brand/green.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
frontend/public/img/brand/white.png
Executable file
|
After Width: | Height: | Size: 20 KiB |
BIN
frontend/public/img/icons/cards/bitcoin.png
Executable file
|
After Width: | Height: | Size: 763 B |
BIN
frontend/public/img/icons/cards/mastercard.png
Executable file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
frontend/public/img/icons/cards/paypal.png
Executable file
|
After Width: | Height: | Size: 766 B |
BIN
frontend/public/img/icons/cards/visa.png
Executable file
|
After Width: | Height: | Size: 737 B |
12
frontend/public/img/icons/common/github.svg
Normal 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 |
17
frontend/public/img/icons/common/google.svg
Normal 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 |
BIN
frontend/public/img/icons/flags/DE.png
Executable file
|
After Width: | Height: | Size: 316 B |
BIN
frontend/public/img/icons/flags/GB.png
Executable file
|
After Width: | Height: | Size: 620 B |
BIN
frontend/public/img/icons/flags/US.png
Executable file
|
After Width: | Height: | Size: 426 B |
BIN
frontend/public/img/icons/gradido/minus-low.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
frontend/public/img/icons/gradido/minus.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
frontend/public/img/icons/gradido/my_gradido.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
frontend/public/img/icons/gradido/plus-low.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
frontend/public/img/icons/gradido/plus.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
frontend/public/img/icons/gradido/qr-make.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
frontend/public/img/icons/gradido/qr-scan-pure.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
frontend/public/img/icons/gradido/qr-scan.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
frontend/public/img/theme/angular.jpg
Executable file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
frontend/public/img/theme/bootstrap.jpg
Executable file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
frontend/public/img/theme/img-1-1000x600.jpg
Executable file
|
After Width: | Height: | Size: 117 KiB |
BIN
frontend/public/img/theme/img-1-1000x900.jpg
Executable file
|
After Width: | Height: | Size: 92 KiB |
BIN
frontend/public/img/theme/landing-1.png
Executable file
|
After Width: | Height: | Size: 36 KiB |
BIN
frontend/public/img/theme/landing-2.png
Executable file
|
After Width: | Height: | Size: 27 KiB |
BIN
frontend/public/img/theme/landing-3.png
Executable file
|
After Width: | Height: | Size: 39 KiB |
BIN
frontend/public/img/theme/profile-cover.jpg
Executable file
|
After Width: | Height: | Size: 533 KiB |
BIN
frontend/public/img/theme/react.jpg
Executable file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
frontend/public/img/theme/sketch.jpg
Executable file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
frontend/public/img/theme/team-1.jpg
Executable file
|
After Width: | Height: | Size: 85 KiB |
BIN
frontend/public/img/theme/team-2.jpg
Executable file
|
After Width: | Height: | Size: 187 KiB |
BIN
frontend/public/img/theme/team-3.jpg
Executable file
|
After Width: | Height: | Size: 109 KiB |
BIN
frontend/public/img/theme/team-4.jpg
Executable file
|
After Width: | Height: | Size: 79 KiB |
BIN
frontend/public/img/theme/team-5.jpg
Executable file
|
After Width: | Height: | Size: 85 KiB |
BIN
frontend/public/img/theme/vue.jpg
Executable file
|
After Width: | Height: | Size: 3.1 KiB |
38
frontend/public/index.html
Normal 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>
|
||||
36
frontend/public/json-example/admin_card_statistic.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
64
frontend/public/json-example/admin_charts_statistic.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
19
frontend/public/json-example/admin_community_statistic.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
61
frontend/public/json-example/admin_transaction_list.json
Normal 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
|
||||
}
|
||||
49
frontend/public/json-example/admin_transience_list.json
Normal 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
|
||||
}
|
||||
52
frontend/public/json-example/admin_userlist.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
0
frontend/public/json-example/example.json
Normal file
19
frontend/public/json-example/userdata.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
45
frontend/public/json-example/userparticipation.json
Normal 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
|
||||
}
|
||||
61
frontend/public/json-example/usertransactions.json
Normal 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
@ -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
@ -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>
|
||||
BIN
frontend/src/assets/logo.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
69
frontend/src/assets/scss/argon.scss
Normal 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";
|
||||
|
||||
|
||||
39
frontend/src/assets/scss/core/alerts/_alert-dismissible.scss
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
46
frontend/src/assets/scss/core/alerts/_alert.scss
Normal 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);
|
||||
}
|
||||
}
|
||||
22
frontend/src/assets/scss/core/avatars/_avatar-group.scss
Normal 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;
|
||||
|
||||
}
|
||||
}
|
||||
42
frontend/src/assets/scss/core/avatars/_avatar.scss
Normal 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;
|
||||
}
|
||||
17
frontend/src/assets/scss/core/badges/_badge-circle.scss
Normal 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;
|
||||
}
|
||||
42
frontend/src/assets/scss/core/badges/_badge-dot.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
55
frontend/src/assets/scss/core/badges/_badge.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
12
frontend/src/assets/scss/core/buttons/_button-brand.scss
Normal file
@ -0,0 +1,12 @@
|
||||
//
|
||||
// Brand buttons
|
||||
//
|
||||
|
||||
|
||||
// Color variations
|
||||
|
||||
@each $color, $value in $brand-colors {
|
||||
.btn-#{$color} {
|
||||
@include button-variant($value, $value);
|
||||
}
|
||||
}
|
||||
92
frontend/src/assets/scss/core/buttons/_button-icon.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
91
frontend/src/assets/scss/core/buttons/_button.scss
Normal 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");
|
||||
}
|
||||
10
frontend/src/assets/scss/core/cards/_card-animations.scss
Normal file
@ -0,0 +1,10 @@
|
||||
//
|
||||
// Card with hover animations
|
||||
//
|
||||
|
||||
.card-lift--hover {
|
||||
&:hover {
|
||||
transform: translateY(-20px);
|
||||
@include transition($transition-base);
|
||||
}
|
||||
}
|
||||
17
frontend/src/assets/scss/core/cards/_card-blockquote.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
49
frontend/src/assets/scss/core/cards/_card-profile.scss
Normal 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;
|
||||
}
|
||||
16
frontend/src/assets/scss/core/cards/_card-stats.scss
Normal 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%);
|
||||
}
|
||||
}
|
||||
8
frontend/src/assets/scss/core/cards/_card.scss
Normal file
@ -0,0 +1,8 @@
|
||||
//
|
||||
// Card
|
||||
//
|
||||
|
||||
|
||||
.card-translucent {
|
||||
background-color: rgba(18, 91, 152, 0.08);
|
||||
}
|
||||
69
frontend/src/assets/scss/core/charts/_chart.scss
Normal 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;
|
||||
}
|
||||
34
frontend/src/assets/scss/core/close/_close.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
37
frontend/src/assets/scss/core/custom-forms/_custom-form.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
79
frontend/src/assets/scss/core/dropdowns/_dropdown.scss
Normal 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;
|
||||
}
|
||||
98
frontend/src/assets/scss/core/footers/_footer.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
71
frontend/src/assets/scss/core/forms/_form-validation.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
78
frontend/src/assets/scss/core/forms/_form.scss
Normal 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;
|
||||
}
|
||||
70
frontend/src/assets/scss/core/forms/_input-group.scss
Normal 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;
|
||||
}
|
||||
}
|
||||
7
frontend/src/assets/scss/core/headers/_header.scss
Normal file
@ -0,0 +1,7 @@
|
||||
//
|
||||
// Header
|
||||
//
|
||||
|
||||
.header {
|
||||
position: relative;
|
||||
}
|
||||
42
frontend/src/assets/scss/core/icons/_icon-shape.scss
Normal 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));
|
||||
}
|
||||
}
|
||||