mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
Merge branch '1319-email-optin' of https://github.com/gradido/gradido into 1319-email-optin
This commit is contained in:
commit
00a1ed9e11
64
.github/workflows/test.yml
vendored
64
.github/workflows/test.yml
vendored
@ -185,7 +185,7 @@ jobs:
|
||||
##########################################################################
|
||||
# LOCALES FRONTEND #######################################################
|
||||
##########################################################################
|
||||
- name: frontend | Locales
|
||||
- name: Frontend | Locales
|
||||
run: docker run --rm gradido/frontend:test yarn run locales
|
||||
|
||||
##############################################################################
|
||||
@ -214,9 +214,38 @@ jobs:
|
||||
##########################################################################
|
||||
# LINT FRONTEND ##########################################################
|
||||
##########################################################################
|
||||
- name: frontend | Lint
|
||||
- name: Frontend | Lint
|
||||
run: docker run --rm gradido/frontend:test yarn run lint
|
||||
|
||||
##############################################################################
|
||||
# JOB: STYLELINT FRONTEND ####################################################
|
||||
##############################################################################
|
||||
stylelint_frontend:
|
||||
name: Stylelint - Frontend
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build_test_frontend]
|
||||
steps:
|
||||
##########################################################################
|
||||
# CHECKOUT CODE ##########################################################
|
||||
##########################################################################
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
##########################################################################
|
||||
# DOWNLOAD DOCKER IMAGE ##################################################
|
||||
##########################################################################
|
||||
- name: Download Docker Image (Frontend)
|
||||
uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: docker-frontend-test
|
||||
path: /tmp
|
||||
- name: Load Docker Image
|
||||
run: docker load < /tmp/frontend.tar
|
||||
##########################################################################
|
||||
# STYLELINT FRONTEND #####################################################
|
||||
##########################################################################
|
||||
- name: Frontend | Stylelint
|
||||
run: docker run --rm gradido/frontend:test yarn run stylelint
|
||||
|
||||
##############################################################################
|
||||
# JOB: LINT ADMIN INTERFACE ##################################################
|
||||
##############################################################################
|
||||
@ -247,7 +276,36 @@ jobs:
|
||||
run: docker run --rm gradido/admin:test yarn run lint
|
||||
|
||||
##############################################################################
|
||||
# JOB: LOCALES ADMIN ######################################################
|
||||
# JOB: STYLELINT ADMIN INTERFACE ##############################################
|
||||
##############################################################################
|
||||
stylelint_admin:
|
||||
name: Stylelint - Admin Interface
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build_test_admin]
|
||||
steps:
|
||||
##########################################################################
|
||||
# CHECKOUT CODE ##########################################################
|
||||
##########################################################################
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
##########################################################################
|
||||
# DOWNLOAD DOCKER IMAGE ##################################################
|
||||
##########################################################################
|
||||
- name: Download Docker Image (Admin Interface)
|
||||
uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: docker-admin-test
|
||||
path: /tmp
|
||||
- name: Load Docker Image
|
||||
run: docker load < /tmp/admin.tar
|
||||
##########################################################################
|
||||
# STYLELINT ADMIN INTERFACE ##############################################
|
||||
##########################################################################
|
||||
- name: Admin Interface | Stylelint
|
||||
run: docker run --rm gradido/admin:test yarn run stylelint
|
||||
|
||||
##############################################################################
|
||||
# JOB: LOCALES ADMIN #########################################################
|
||||
##############################################################################
|
||||
locales_admin:
|
||||
name: Locales - Admin
|
||||
|
||||
@ -16,6 +16,12 @@ module.exports = {
|
||||
'no-console': ['error'],
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
||||
'vue/component-name-in-template-casing': ['error', 'kebab-case'],
|
||||
'vue/no-static-inline-styles': [
|
||||
'error',
|
||||
{
|
||||
allowBinding: false,
|
||||
},
|
||||
],
|
||||
'prettier/prettier': [
|
||||
'error',
|
||||
{
|
||||
|
||||
18
admin/.stylelintrc.js
Normal file
18
admin/.stylelintrc.js
Normal file
@ -0,0 +1,18 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
extends: ["stylelint-config-standard-scss", "stylelint-config-recommended-vue"],
|
||||
overrides: [
|
||||
{
|
||||
files: "**/*.{scss}",
|
||||
customSyntax: "postcss-scss",
|
||||
extends: ["stylelint-config-standard-scss"],
|
||||
},
|
||||
{
|
||||
files: "**/*.vue",
|
||||
customSyntax: "postcss-html",
|
||||
extends: ["stylelint-config-recommended-vue"],
|
||||
}
|
||||
]
|
||||
|
||||
};
|
||||
@ -9,9 +9,12 @@
|
||||
"scripts": {
|
||||
"start": "node run/server.js",
|
||||
"serve": "vue-cli-service serve --open",
|
||||
"dev": "yarn run serve",
|
||||
"build": "vue-cli-service build",
|
||||
"dev": "yarn run serve",
|
||||
"analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json",
|
||||
"lint": "eslint --max-warnings=0 --ext .js,.vue .",
|
||||
"stylelint": "stylelint --max-warnings=0 '**/*.{scss,vue}'",
|
||||
"i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'",
|
||||
"test": "TZ=UTC jest --coverage",
|
||||
"locales": "scripts/missing-keys.sh && scripts/sort.sh"
|
||||
},
|
||||
@ -65,6 +68,13 @@
|
||||
"eslint-plugin-promise": "^5.1.1",
|
||||
"eslint-plugin-vue": "^7.20.0",
|
||||
"jest-environment-jsdom-sixteen": "^2.0.0",
|
||||
"postcss": "^8.4.8",
|
||||
"postcss-html": "^1.3.0",
|
||||
"postcss-scss": "^4.0.3",
|
||||
"stylelint": "^14.5.3",
|
||||
"stylelint-config-recommended-vue": "^1.3.0",
|
||||
"stylelint-config-standard-scss": "^3.0.0",
|
||||
"vue-cli-plugin-i18n": "^2.3.1",
|
||||
"vue-template-compiler": "^2.6.11"
|
||||
},
|
||||
"browserslist": [
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="user-search">
|
||||
<div style="text-align: right">
|
||||
<div class="user-search-first-div">
|
||||
<b-button class="unconfirmedRegisterMails" variant="light" @click="unconfirmedRegisterMails">
|
||||
<b-icon icon="envelope" variant="danger"></b-icon>
|
||||
{{ filterCheckedEmails ? $t('all_emails') : $t('unregistered_emails') }}
|
||||
@ -136,3 +136,8 @@ export default {
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.user-search-first-div {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
594
admin/yarn.lock
594
admin/yarn.lock
File diff suppressed because it is too large
Load Diff
@ -20,8 +20,10 @@ export enum RIGHTS {
|
||||
UPDATE_USER_INFOS = 'UPDATE_USER_INFOS',
|
||||
HAS_ELOPAGE = 'HAS_ELOPAGE',
|
||||
CREATE_TRANSACTION_LINK = 'CREATE_TRANSACTION_LINK',
|
||||
DELETE_TRANSACTION_LINK = 'DELETE_TRANSACTION_LINK',
|
||||
QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK',
|
||||
|
||||
REDEEM_TRANSACTION_LINK = 'REDEEM_TRANSACTION_LINK',
|
||||
LIST_TRANSACTION_LINKS = 'LIST_TRANSACTION_LINKS',
|
||||
// Admin
|
||||
SEARCH_USERS = 'SEARCH_USERS',
|
||||
CREATE_PENDING_CREATION = 'CREATE_PENDING_CREATION',
|
||||
|
||||
@ -19,6 +19,9 @@ export const ROLE_USER = new Role('user', [
|
||||
RIGHTS.UPDATE_USER_INFOS,
|
||||
RIGHTS.HAS_ELOPAGE,
|
||||
RIGHTS.CREATE_TRANSACTION_LINK,
|
||||
RIGHTS.DELETE_TRANSACTION_LINK,
|
||||
RIGHTS.REDEEM_TRANSACTION_LINK,
|
||||
RIGHTS.LIST_TRANSACTION_LINKS,
|
||||
])
|
||||
export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ Decimal.set({
|
||||
})
|
||||
|
||||
const constants = {
|
||||
DB_VERSION: '0030-transaction_link',
|
||||
DB_VERSION: '0032-add-transaction-link-to-transaction',
|
||||
DECAY_START_TIME: new Date('2021-05-13 17:46:31'), // GMT+0
|
||||
}
|
||||
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
import { ArgsType, Field, Int } from 'type-graphql'
|
||||
|
||||
@ArgsType()
|
||||
export default class QueryTransactionLinkArgs {
|
||||
@Field(() => String)
|
||||
code: string
|
||||
|
||||
@Field(() => Int, { nullable: true })
|
||||
redeemUserId?: number
|
||||
}
|
||||
@ -8,7 +8,4 @@ export default class TransactionLinkArgs {
|
||||
|
||||
@Field(() => String)
|
||||
memo: string
|
||||
|
||||
@Field(() => Boolean, { nullable: true })
|
||||
showEmail?: boolean
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@ export enum TransactionTypeId {
|
||||
RECEIVE = 3,
|
||||
// This is a virtual property, never occurring on the database
|
||||
DECAY = 4,
|
||||
TRANSACTION_LINK = 5,
|
||||
}
|
||||
|
||||
registerEnumType(TransactionTypeId, {
|
||||
|
||||
@ -30,6 +30,7 @@ export class Transaction {
|
||||
this.creationDate = transaction.creationDate
|
||||
this.linkedUser = linkedUser
|
||||
this.linkedTransactionId = transaction.linkedTransactionId
|
||||
this.transactionLinkId = transaction.transactionLinkId
|
||||
}
|
||||
|
||||
@Field(() => Number)
|
||||
@ -67,4 +68,8 @@ export class Transaction {
|
||||
|
||||
@Field(() => Number, { nullable: true })
|
||||
linkedTransactionId?: number | null
|
||||
|
||||
// Links to the TransactionLink when transaction was created by a link
|
||||
@Field(() => Number, { nullable: true })
|
||||
transactionLinkId?: number | null
|
||||
}
|
||||
|
||||
@ -14,7 +14,6 @@ export class TransactionLink {
|
||||
this.code = transactionLink.code
|
||||
this.createdAt = transactionLink.createdAt
|
||||
this.validUntil = transactionLink.validUntil
|
||||
this.showEmail = transactionLink.showEmail
|
||||
this.deletedAt = transactionLink.deletedAt
|
||||
this.redeemedAt = transactionLink.redeemedAt
|
||||
this.redeemedBy = redeemedBy
|
||||
@ -47,9 +46,6 @@ export class TransactionLink {
|
||||
@Field(() => Date)
|
||||
validUntil: Date
|
||||
|
||||
@Field(() => Boolean)
|
||||
showEmail: boolean
|
||||
|
||||
@Field(() => Date, { nullable: true })
|
||||
redeemedAt: Date | null
|
||||
|
||||
|
||||
@ -1,18 +1,21 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||
|
||||
import { Resolver, Args, Authorized, Ctx, Mutation, Query } from 'type-graphql'
|
||||
import { Resolver, Args, Arg, Authorized, Ctx, Mutation, Query } from 'type-graphql'
|
||||
import { getCustomRepository } from '@dbTools/typeorm'
|
||||
import { TransactionLink } from '@model/TransactionLink'
|
||||
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
|
||||
import TransactionLinkArgs from '@arg/TransactionLinkArgs'
|
||||
import QueryTransactionLinkArgs from '@arg/QueryTransactionLinkArgs'
|
||||
import { User as dbUser } from '@entity/User'
|
||||
import { UserRepository } from '@repository/User'
|
||||
import TransactionLinkArgs from '@arg/TransactionLinkArgs'
|
||||
import Paginated from '@arg/Paginated'
|
||||
import { calculateBalance } from '@/util/validate'
|
||||
import { RIGHTS } from '@/auth/RIGHTS'
|
||||
import { randomBytes } from 'crypto'
|
||||
import { User } from '@model/User'
|
||||
import { calculateDecay } from '@/util/decay'
|
||||
import { executeTransaction } from './TransactionResolver'
|
||||
import { Order } from '@enum/Order'
|
||||
|
||||
// TODO: do not export, test it inside the resolver
|
||||
export const transactionLinkCode = (date: Date): string => {
|
||||
@ -36,7 +39,7 @@ export class TransactionLinkResolver {
|
||||
@Authorized([RIGHTS.CREATE_TRANSACTION_LINK])
|
||||
@Mutation(() => TransactionLink)
|
||||
async createTransactionLink(
|
||||
@Args() { amount, memo, showEmail = false }: TransactionLinkArgs,
|
||||
@Args() { amount, memo }: TransactionLinkArgs,
|
||||
@Ctx() context: any,
|
||||
): Promise<TransactionLink> {
|
||||
const userRepository = getCustomRepository(UserRepository)
|
||||
@ -61,7 +64,6 @@ export class TransactionLinkResolver {
|
||||
transactionLink.code = transactionLinkCode(createdDate)
|
||||
transactionLink.createdAt = createdDate
|
||||
transactionLink.validUntil = validUntil
|
||||
transactionLink.showEmail = showEmail
|
||||
await dbTransactionLink.save(transactionLink).catch(() => {
|
||||
throw new Error('Unable to save transaction link')
|
||||
})
|
||||
@ -69,32 +71,99 @@ export class TransactionLinkResolver {
|
||||
return new TransactionLink(transactionLink, new User(user))
|
||||
}
|
||||
|
||||
@Authorized([RIGHTS.DELETE_TRANSACTION_LINK])
|
||||
@Mutation(() => Boolean)
|
||||
async deleteTransactionLink(@Arg('id') id: number, @Ctx() context: any): Promise<boolean> {
|
||||
const userRepository = getCustomRepository(UserRepository)
|
||||
const user = await userRepository.findByPubkeyHex(context.pubKey)
|
||||
|
||||
const transactionLink = await dbTransactionLink.findOne({ id })
|
||||
if (!transactionLink) {
|
||||
throw new Error('Transaction Link not found!')
|
||||
}
|
||||
|
||||
if (transactionLink.userId !== user.id) {
|
||||
throw new Error('Transaction Link cannot be deleted!')
|
||||
}
|
||||
|
||||
if (transactionLink.redeemedBy) {
|
||||
throw new Error('Transaction Link already redeemed!')
|
||||
}
|
||||
|
||||
await transactionLink.softRemove().catch(() => {
|
||||
throw new Error('Transaction Link could not be deleted!')
|
||||
})
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@Authorized([RIGHTS.QUERY_TRANSACTION_LINK])
|
||||
@Query(() => TransactionLink)
|
||||
async queryTransactionLink(
|
||||
@Args() { code, redeemUserId }: QueryTransactionLinkArgs,
|
||||
): Promise<TransactionLink> {
|
||||
async queryTransactionLink(@Arg('code') code: string): Promise<TransactionLink> {
|
||||
const transactionLink = await dbTransactionLink.findOneOrFail({ code })
|
||||
const userRepository = getCustomRepository(UserRepository)
|
||||
const user = await userRepository.findOneOrFail({ id: transactionLink.userId })
|
||||
let userRedeem = null
|
||||
if (redeemUserId && !transactionLink.redeemedBy) {
|
||||
const redeemedByUser = await userRepository.findOne({ id: redeemUserId })
|
||||
if (!redeemedByUser) {
|
||||
throw new Error('Unable to find user that redeem the link')
|
||||
}
|
||||
userRedeem = new User(redeemedByUser)
|
||||
transactionLink.redeemedBy = userRedeem.id
|
||||
await dbTransactionLink.save(transactionLink).catch(() => {
|
||||
throw new Error('Unable to save transaction link')
|
||||
})
|
||||
} else if (transactionLink.redeemedBy) {
|
||||
const redeemedByUser = await userRepository.findOne({ id: redeemUserId })
|
||||
if (!redeemedByUser) {
|
||||
throw new Error('Unable to find user that has redeemed the link')
|
||||
}
|
||||
userRedeem = new User(redeemedByUser)
|
||||
const user = await dbUser.findOneOrFail({ id: transactionLink.userId })
|
||||
let redeemedBy: User | null = null
|
||||
if (transactionLink && transactionLink.redeemedBy) {
|
||||
redeemedBy = new User(await dbUser.findOneOrFail({ id: transactionLink.redeemedBy }))
|
||||
}
|
||||
return new TransactionLink(transactionLink, new User(user), userRedeem)
|
||||
return new TransactionLink(transactionLink, new User(user), redeemedBy)
|
||||
}
|
||||
|
||||
@Authorized([RIGHTS.LIST_TRANSACTION_LINKS])
|
||||
@Query(() => [TransactionLink])
|
||||
async listTransactionLinks(
|
||||
@Args()
|
||||
{ currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated,
|
||||
@Ctx() context: any,
|
||||
): Promise<TransactionLink[]> {
|
||||
const userRepository = getCustomRepository(UserRepository)
|
||||
const user = await userRepository.findByPubkeyHex(context.pubKey)
|
||||
// const now = new Date()
|
||||
const transactionLinks = await dbTransactionLink.find({
|
||||
where: {
|
||||
userId: user.id,
|
||||
redeemedBy: null,
|
||||
// validUntil: MoreThan(now),
|
||||
},
|
||||
order: {
|
||||
createdAt: order,
|
||||
},
|
||||
skip: (currentPage - 1) * pageSize,
|
||||
take: pageSize,
|
||||
})
|
||||
return transactionLinks.map((tl) => new TransactionLink(tl, new User(user)))
|
||||
}
|
||||
|
||||
@Authorized([RIGHTS.REDEEM_TRANSACTION_LINK])
|
||||
@Mutation(() => Boolean)
|
||||
async redeemTransactionLink(@Arg('id') id: number, @Ctx() context: any): Promise<boolean> {
|
||||
const userRepository = getCustomRepository(UserRepository)
|
||||
const user = await userRepository.findByPubkeyHex(context.pubKey)
|
||||
const transactionLink = await dbTransactionLink.findOneOrFail({ id })
|
||||
const linkedUser = await dbUser.findOneOrFail({ id: transactionLink.userId })
|
||||
|
||||
const now = new Date()
|
||||
|
||||
if (user.id === linkedUser.id) {
|
||||
throw new Error('Cannot redeem own transaction link.')
|
||||
}
|
||||
|
||||
if (transactionLink.validUntil.getTime() < now.getTime()) {
|
||||
throw new Error('Transaction Link is not valid anymore.')
|
||||
}
|
||||
|
||||
if (transactionLink.redeemedBy) {
|
||||
throw new Error('Transaction Link already redeemed.')
|
||||
}
|
||||
|
||||
await executeTransaction(
|
||||
transactionLink.amount,
|
||||
transactionLink.memo,
|
||||
linkedUser,
|
||||
user,
|
||||
transactionLink,
|
||||
)
|
||||
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,6 +23,7 @@ import { TransactionLinkRepository } from '@repository/TransactionLink'
|
||||
|
||||
import { User as dbUser } from '@entity/User'
|
||||
import { Transaction as dbTransaction } from '@entity/Transaction'
|
||||
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
|
||||
|
||||
import { apiPost } from '@/apis/HttpRequest'
|
||||
import { TransactionTypeId } from '@enum/TransactionTypeId'
|
||||
@ -30,10 +31,100 @@ import { calculateBalance, isHexPublicKey } from '@/util/validate'
|
||||
import { RIGHTS } from '@/auth/RIGHTS'
|
||||
import { User } from '@model/User'
|
||||
import { communityUser } from '@/util/communityUser'
|
||||
import { virtualDecayTransaction } from '@/util/virtualDecayTransaction'
|
||||
import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualTransactions'
|
||||
import Decimal from 'decimal.js-light'
|
||||
import { calculateDecay } from '@/util/decay'
|
||||
|
||||
export const executeTransaction = async (
|
||||
amount: Decimal,
|
||||
memo: string,
|
||||
sender: dbUser,
|
||||
recipient: dbUser,
|
||||
transactionLink?: dbTransactionLink | null,
|
||||
): Promise<boolean> => {
|
||||
if (sender.id === recipient.id) {
|
||||
throw new Error('Sender and Recipient are the same.')
|
||||
}
|
||||
|
||||
// validate amount
|
||||
const receivedCallDate = new Date()
|
||||
const sendBalance = await calculateBalance(sender.id, amount.mul(-1), receivedCallDate)
|
||||
if (!sendBalance) {
|
||||
throw new Error("user hasn't enough GDD or amount is < 0")
|
||||
}
|
||||
|
||||
const queryRunner = getConnection().createQueryRunner()
|
||||
await queryRunner.connect()
|
||||
await queryRunner.startTransaction('READ UNCOMMITTED')
|
||||
try {
|
||||
// transaction
|
||||
const transactionSend = new dbTransaction()
|
||||
transactionSend.typeId = TransactionTypeId.SEND
|
||||
transactionSend.memo = memo
|
||||
transactionSend.userId = sender.id
|
||||
transactionSend.linkedUserId = recipient.id
|
||||
transactionSend.amount = amount.mul(-1)
|
||||
transactionSend.balance = sendBalance.balance
|
||||
transactionSend.balanceDate = receivedCallDate
|
||||
transactionSend.decay = sendBalance.decay.decay
|
||||
transactionSend.decayStart = sendBalance.decay.start
|
||||
transactionSend.previous = sendBalance.lastTransactionId
|
||||
transactionSend.transactionLinkId = transactionLink ? transactionLink.id : null
|
||||
await queryRunner.manager.insert(dbTransaction, transactionSend)
|
||||
|
||||
const transactionReceive = new dbTransaction()
|
||||
transactionReceive.typeId = TransactionTypeId.RECEIVE
|
||||
transactionReceive.memo = memo
|
||||
transactionReceive.userId = recipient.id
|
||||
transactionReceive.linkedUserId = sender.id
|
||||
transactionReceive.amount = amount
|
||||
const receiveBalance = await calculateBalance(recipient.id, amount, receivedCallDate)
|
||||
transactionReceive.balance = receiveBalance ? receiveBalance.balance : amount
|
||||
transactionReceive.balanceDate = receivedCallDate
|
||||
transactionReceive.decay = receiveBalance ? receiveBalance.decay.decay : new Decimal(0)
|
||||
transactionReceive.decayStart = receiveBalance ? receiveBalance.decay.start : null
|
||||
transactionReceive.previous = receiveBalance ? receiveBalance.lastTransactionId : null
|
||||
transactionReceive.linkedTransactionId = transactionSend.id
|
||||
transactionReceive.transactionLinkId = transactionLink ? transactionLink.id : null
|
||||
await queryRunner.manager.insert(dbTransaction, transactionReceive)
|
||||
|
||||
// Save linked transaction id for send
|
||||
transactionSend.linkedTransactionId = transactionReceive.id
|
||||
await queryRunner.manager.update(dbTransaction, { id: transactionSend.id }, transactionSend)
|
||||
|
||||
if (transactionLink) {
|
||||
transactionLink.redeemedAt = receivedCallDate
|
||||
transactionLink.redeemedBy = recipient.id
|
||||
await queryRunner.manager.update(
|
||||
dbTransactionLink,
|
||||
{ id: transactionLink.id },
|
||||
transactionLink,
|
||||
)
|
||||
}
|
||||
|
||||
await queryRunner.commitTransaction()
|
||||
} catch (e) {
|
||||
await queryRunner.rollbackTransaction()
|
||||
throw new Error(`Transaction was not successful: ${e}`)
|
||||
} finally {
|
||||
await queryRunner.release()
|
||||
}
|
||||
|
||||
// send notification email
|
||||
// TODO: translate
|
||||
await sendTransactionReceivedEmail({
|
||||
senderFirstName: sender.firstName,
|
||||
senderLastName: sender.lastName,
|
||||
recipientFirstName: recipient.firstName,
|
||||
recipientLastName: recipient.lastName,
|
||||
email: recipient.email,
|
||||
amount,
|
||||
memo,
|
||||
})
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@Resolver()
|
||||
export class TransactionResolver {
|
||||
@Authorized([RIGHTS.TRANSACTION_LIST])
|
||||
@ -112,11 +203,29 @@ export class TransactionResolver {
|
||||
const self = new User(user)
|
||||
const transactions: Transaction[] = []
|
||||
|
||||
// decay transaction
|
||||
const transactionLinkRepository = getCustomRepository(TransactionLinkRepository)
|
||||
const { sumHoldAvailableAmount, sumAmount, lastDate, firstDate } =
|
||||
await transactionLinkRepository.summary(user.id, now)
|
||||
|
||||
// decay & link transactions
|
||||
if (!onlyCreations && currentPage === 1 && order === Order.DESC) {
|
||||
transactions.push(
|
||||
virtualDecayTransaction(lastTransaction.balance, lastTransaction.balanceDate, now, self),
|
||||
)
|
||||
// virtual transaction for pending transaction-links sum
|
||||
if (sumHoldAvailableAmount.greaterThan(0)) {
|
||||
transactions.push(
|
||||
virtualLinkTransaction(
|
||||
lastTransaction.balance.minus(sumHoldAvailableAmount.toString()),
|
||||
sumAmount,
|
||||
sumHoldAvailableAmount,
|
||||
sumHoldAvailableAmount.minus(sumAmount.toString()),
|
||||
firstDate || now,
|
||||
lastDate || now,
|
||||
self,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// transactions
|
||||
@ -128,13 +237,10 @@ export class TransactionResolver {
|
||||
transactions.push(new Transaction(userTransaction, self, linkedUser))
|
||||
})
|
||||
|
||||
const transactionLinkRepository = getCustomRepository(TransactionLinkRepository)
|
||||
const toHoldAvailable = await transactionLinkRepository.sumAmountToHoldAvailable(user.id, now)
|
||||
|
||||
// Construct Result
|
||||
return new TransactionList(
|
||||
calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, now).balance.minus(
|
||||
toHoldAvailable.toString(),
|
||||
sumHoldAvailableAmount.toString(),
|
||||
),
|
||||
transactions,
|
||||
userTransactionsCount,
|
||||
@ -154,12 +260,6 @@ export class TransactionResolver {
|
||||
if (senderUser.pubKey.length !== 32) {
|
||||
throw new Error('invalid sender public key')
|
||||
}
|
||||
// validate amount
|
||||
const receivedCallDate = new Date()
|
||||
const sendBalance = await calculateBalance(senderUser.id, amount.mul(-1), receivedCallDate)
|
||||
if (!sendBalance) {
|
||||
throw new Error("user hasn't enough GDD or amount is < 0")
|
||||
}
|
||||
|
||||
// validate recipient user
|
||||
const recipientUser = await dbUser.findOne({ email: email }, { withDeleted: true })
|
||||
@ -173,62 +273,7 @@ export class TransactionResolver {
|
||||
throw new Error('invalid recipient public key')
|
||||
}
|
||||
|
||||
const queryRunner = getConnection().createQueryRunner()
|
||||
await queryRunner.connect()
|
||||
await queryRunner.startTransaction('READ UNCOMMITTED')
|
||||
try {
|
||||
// transaction
|
||||
const transactionSend = new dbTransaction()
|
||||
transactionSend.typeId = TransactionTypeId.SEND
|
||||
transactionSend.memo = memo
|
||||
transactionSend.userId = senderUser.id
|
||||
transactionSend.linkedUserId = recipientUser.id
|
||||
transactionSend.amount = amount.mul(-1)
|
||||
transactionSend.balance = sendBalance.balance
|
||||
transactionSend.balanceDate = receivedCallDate
|
||||
transactionSend.decay = sendBalance.decay.decay
|
||||
transactionSend.decayStart = sendBalance.decay.start
|
||||
transactionSend.previous = sendBalance.lastTransactionId
|
||||
await queryRunner.manager.insert(dbTransaction, transactionSend)
|
||||
|
||||
const transactionReceive = new dbTransaction()
|
||||
transactionReceive.typeId = TransactionTypeId.RECEIVE
|
||||
transactionReceive.memo = memo
|
||||
transactionReceive.userId = recipientUser.id
|
||||
transactionReceive.linkedUserId = senderUser.id
|
||||
transactionReceive.amount = amount
|
||||
const receiveBalance = await calculateBalance(recipientUser.id, amount, receivedCallDate)
|
||||
transactionReceive.balance = receiveBalance ? receiveBalance.balance : amount
|
||||
transactionReceive.balanceDate = receivedCallDate
|
||||
transactionReceive.decay = receiveBalance ? receiveBalance.decay.decay : new Decimal(0)
|
||||
transactionReceive.decayStart = receiveBalance ? receiveBalance.decay.start : null
|
||||
transactionReceive.previous = receiveBalance ? receiveBalance.lastTransactionId : null
|
||||
transactionReceive.linkedTransactionId = transactionSend.id
|
||||
await queryRunner.manager.insert(dbTransaction, transactionReceive)
|
||||
|
||||
// Save linked transaction id for send
|
||||
transactionSend.linkedTransactionId = transactionReceive.id
|
||||
await queryRunner.manager.update(dbTransaction, { id: transactionSend.id }, transactionSend)
|
||||
|
||||
await queryRunner.commitTransaction()
|
||||
} catch (e) {
|
||||
await queryRunner.rollbackTransaction()
|
||||
throw new Error(`Transaction was not successful: ${e}`)
|
||||
} finally {
|
||||
await queryRunner.release()
|
||||
}
|
||||
|
||||
// send notification email
|
||||
// TODO: translate
|
||||
await sendTransactionReceivedEmail({
|
||||
senderFirstName: senderUser.firstName,
|
||||
senderLastName: senderUser.lastName,
|
||||
recipientFirstName: recipientUser.firstName,
|
||||
recipientLastName: recipientUser.lastName,
|
||||
email: recipientUser.email,
|
||||
amount,
|
||||
memo,
|
||||
})
|
||||
await executeTransaction(amount, memo, senderUser, recipientUser)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@ -4,13 +4,33 @@ import Decimal from 'decimal.js-light'
|
||||
|
||||
@EntityRepository(dbTransactionLink)
|
||||
export class TransactionLinkRepository extends Repository<dbTransactionLink> {
|
||||
async sumAmountToHoldAvailable(userId: number, date: Date): Promise<Decimal> {
|
||||
const { sum } = await this.createQueryBuilder('transactionLinks')
|
||||
.select('SUM(transactionLinks.holdAvailableAmount)', 'sum')
|
||||
.where('transactionLinks.userId = :userId', { userId })
|
||||
.andWhere('transactionLinks.redeemedAt is NULL')
|
||||
.andWhere('transactionLinks.validUntil > :date', { date })
|
||||
.getRawOne()
|
||||
return sum ? new Decimal(sum) : new Decimal(0)
|
||||
async summary(
|
||||
userId: number,
|
||||
date: Date,
|
||||
): Promise<{
|
||||
sumHoldAvailableAmount: Decimal
|
||||
sumAmount: Decimal
|
||||
lastDate: Date | null
|
||||
firstDate: Date | null
|
||||
}> {
|
||||
const { sumHoldAvailableAmount, sumAmount, lastDate, firstDate } =
|
||||
await this.createQueryBuilder('transactionLinks')
|
||||
.select('SUM(transactionLinks.holdAvailableAmount)', 'sumHoldAvailableAmount')
|
||||
.addSelect('SUM(transactionLinks.amount)', 'sumAmount')
|
||||
.addSelect('MAX(transactionLinks.validUntil)', 'lastDate')
|
||||
.addSelect('MIN(transactionLinks.createdAt)', 'firstDate')
|
||||
.where('transactionLinks.userId = :userId', { userId })
|
||||
.andWhere('transactionLinks.redeemedAt is NULL')
|
||||
.andWhere('transactionLinks.validUntil > :date', { date })
|
||||
.orderBy('transactionLinks.createdAt', 'DESC')
|
||||
.getRawOne()
|
||||
return {
|
||||
sumHoldAvailableAmount: sumHoldAvailableAmount
|
||||
? new Decimal(sumHoldAvailableAmount)
|
||||
: new Decimal(0),
|
||||
sumAmount: sumAmount ? new Decimal(sumAmount) : new Decimal(0),
|
||||
lastDate: lastDate || null,
|
||||
firstDate: firstDate || null,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,9 +30,9 @@ async function calculateBalance(
|
||||
// TODO why we have to use toString() here?
|
||||
const balance = decay.balance.add(amount.toString())
|
||||
const transactionLinkRepository = getCustomRepository(TransactionLinkRepository)
|
||||
const toHoldAvailable = await transactionLinkRepository.sumAmountToHoldAvailable(userId, time)
|
||||
const { sumHoldAvailableAmount } = await transactionLinkRepository.summary(userId, time)
|
||||
|
||||
if (balance.minus(toHoldAvailable.toString()).lessThan(0)) {
|
||||
if (balance.minus(sumHoldAvailableAmount.toString()).lessThan(0)) {
|
||||
return null
|
||||
}
|
||||
return { balance, lastTransactionId: lastTransaction.id, decay }
|
||||
|
||||
@ -1,52 +0,0 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import Decimal from 'decimal.js-light'
|
||||
import { SaveOptions, RemoveOptions } from '@dbTools/typeorm'
|
||||
import { Transaction as dbTransaction } from '@entity/Transaction'
|
||||
import { calculateDecay } from './decay'
|
||||
import { TransactionTypeId } from '@enum/TransactionTypeId'
|
||||
import { Transaction } from '@model/Transaction'
|
||||
import { User } from '@model/User'
|
||||
|
||||
const virtualDecayTransaction = (
|
||||
balance: Decimal,
|
||||
balanceDate: Date,
|
||||
time: Date = new Date(),
|
||||
user: User,
|
||||
): Transaction => {
|
||||
const decay = calculateDecay(balance, balanceDate, time)
|
||||
// const balance = decay.balance.minus(lastTransaction.balance)
|
||||
const decayDbTransaction: dbTransaction = {
|
||||
id: -1,
|
||||
userId: -1,
|
||||
previous: -1,
|
||||
typeId: TransactionTypeId.DECAY,
|
||||
amount: decay.decay ? decay.decay : new Decimal(0), // new Decimal(0), // this kinda is wrong, but helps with the frontend query
|
||||
balance: decay.balance,
|
||||
balanceDate: time,
|
||||
decay: decay.decay ? decay.decay : new Decimal(0),
|
||||
decayStart: decay.start,
|
||||
memo: '',
|
||||
creationDate: null,
|
||||
hasId: function (): boolean {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
save: function (options?: SaveOptions): Promise<dbTransaction> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
remove: function (options?: RemoveOptions): Promise<dbTransaction> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
softRemove: function (options?: SaveOptions): Promise<dbTransaction> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
recover: function (options?: SaveOptions): Promise<dbTransaction> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
reload: function (): Promise<void> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
}
|
||||
return new Transaction(decayDbTransaction, user)
|
||||
}
|
||||
|
||||
export { virtualDecayTransaction }
|
||||
82
backend/src/util/virtualTransactions.ts
Normal file
82
backend/src/util/virtualTransactions.ts
Normal file
@ -0,0 +1,82 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { Transaction } from '@model/Transaction'
|
||||
import { SaveOptions, RemoveOptions } from '@dbTools/typeorm'
|
||||
import { Transaction as dbTransaction } from '@entity/Transaction'
|
||||
import { TransactionTypeId } from '@enum/TransactionTypeId'
|
||||
import { calculateDecay } from './decay'
|
||||
import { User } from '@model/User'
|
||||
import Decimal from 'decimal.js-light'
|
||||
|
||||
const defaultModelFunctions = {
|
||||
hasId: function (): boolean {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
save: function (options?: SaveOptions): Promise<dbTransaction> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
remove: function (options?: RemoveOptions): Promise<dbTransaction> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
softRemove: function (options?: SaveOptions): Promise<dbTransaction> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
recover: function (options?: SaveOptions): Promise<dbTransaction> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
reload: function (): Promise<void> {
|
||||
throw new Error('Function not implemented.')
|
||||
},
|
||||
}
|
||||
|
||||
const virtualLinkTransaction = (
|
||||
balance: Decimal,
|
||||
amount: Decimal,
|
||||
holdAvailableAmount: Decimal,
|
||||
decay: Decimal,
|
||||
createdAt: Date,
|
||||
validUntil: Date,
|
||||
user: User,
|
||||
): Transaction => {
|
||||
const linkDbTransaction: dbTransaction = {
|
||||
id: -2,
|
||||
userId: -1,
|
||||
previous: -1,
|
||||
typeId: TransactionTypeId.TRANSACTION_LINK,
|
||||
amount: amount,
|
||||
balance: balance,
|
||||
balanceDate: validUntil,
|
||||
decayStart: createdAt,
|
||||
decay: decay,
|
||||
memo: '',
|
||||
creationDate: null,
|
||||
...defaultModelFunctions,
|
||||
}
|
||||
return new Transaction(linkDbTransaction, user)
|
||||
}
|
||||
|
||||
const virtualDecayTransaction = (
|
||||
balance: Decimal,
|
||||
balanceDate: Date,
|
||||
time: Date = new Date(),
|
||||
user: User,
|
||||
): Transaction => {
|
||||
const decay = calculateDecay(balance, balanceDate, time)
|
||||
// const balance = decay.balance.minus(lastTransaction.balance)
|
||||
const decayDbTransaction: dbTransaction = {
|
||||
id: -1,
|
||||
userId: -1,
|
||||
previous: -1,
|
||||
typeId: TransactionTypeId.DECAY,
|
||||
amount: decay.decay ? decay.decay : new Decimal(0), // new Decimal(0), // this kinda is wrong, but helps with the frontend query
|
||||
balance: decay.balance,
|
||||
balanceDate: time,
|
||||
decay: decay.decay ? decay.decay : new Decimal(0),
|
||||
decayStart: decay.start,
|
||||
memo: '',
|
||||
creationDate: null,
|
||||
...defaultModelFunctions,
|
||||
}
|
||||
return new Transaction(decayDbTransaction, user)
|
||||
}
|
||||
|
||||
export { virtualLinkTransaction, virtualDecayTransaction }
|
||||
@ -0,0 +1,61 @@
|
||||
import Decimal from 'decimal.js-light'
|
||||
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, DeleteDateColumn } from 'typeorm'
|
||||
import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer'
|
||||
|
||||
@Entity('transaction_links')
|
||||
export class TransactionLink extends BaseEntity {
|
||||
@PrimaryGeneratedColumn('increment', { unsigned: true })
|
||||
id: number
|
||||
|
||||
@Column({ unsigned: true, nullable: false })
|
||||
userId: number
|
||||
|
||||
@Column({
|
||||
type: 'decimal',
|
||||
precision: 40,
|
||||
scale: 20,
|
||||
nullable: false,
|
||||
transformer: DecimalTransformer,
|
||||
})
|
||||
amount: Decimal
|
||||
|
||||
@Column({
|
||||
type: 'decimal',
|
||||
name: 'hold_available_amount',
|
||||
precision: 40,
|
||||
scale: 20,
|
||||
nullable: false,
|
||||
transformer: DecimalTransformer,
|
||||
})
|
||||
holdAvailableAmount: Decimal
|
||||
|
||||
@Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' })
|
||||
memo: string
|
||||
|
||||
@Column({ length: 24, nullable: false, collation: 'utf8mb4_unicode_ci' })
|
||||
code: string
|
||||
|
||||
@Column({
|
||||
type: 'datetime',
|
||||
nullable: false,
|
||||
})
|
||||
createdAt: Date
|
||||
|
||||
@DeleteDateColumn()
|
||||
deletedAt: Date | null
|
||||
|
||||
@Column({
|
||||
type: 'datetime',
|
||||
nullable: false,
|
||||
})
|
||||
validUntil: Date
|
||||
|
||||
@Column({
|
||||
type: 'datetime',
|
||||
nullable: true,
|
||||
})
|
||||
redeemedAt: Date | null
|
||||
|
||||
@Column({ type: 'int', unsigned: true, nullable: true })
|
||||
redeemedBy: number | null
|
||||
}
|
||||
@ -0,0 +1,94 @@
|
||||
import Decimal from 'decimal.js-light'
|
||||
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
|
||||
import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer'
|
||||
|
||||
@Entity('transactions')
|
||||
export class Transaction extends BaseEntity {
|
||||
@PrimaryGeneratedColumn('increment', { unsigned: true })
|
||||
id: number
|
||||
|
||||
@Column({ name: 'user_id', unsigned: true, nullable: false })
|
||||
userId: number
|
||||
|
||||
@Column({ type: 'int', unsigned: true, nullable: true, default: null })
|
||||
previous: number | null
|
||||
|
||||
@Column({ name: 'type_id', unsigned: true, nullable: false })
|
||||
typeId: number
|
||||
|
||||
@Column({
|
||||
type: 'decimal',
|
||||
precision: 40,
|
||||
scale: 20,
|
||||
nullable: false,
|
||||
transformer: DecimalTransformer,
|
||||
})
|
||||
amount: Decimal
|
||||
|
||||
@Column({
|
||||
type: 'decimal',
|
||||
precision: 40,
|
||||
scale: 20,
|
||||
nullable: false,
|
||||
transformer: DecimalTransformer,
|
||||
})
|
||||
balance: Decimal
|
||||
|
||||
@Column({
|
||||
name: 'balance_date',
|
||||
type: 'datetime',
|
||||
default: () => 'CURRENT_TIMESTAMP',
|
||||
nullable: false,
|
||||
})
|
||||
balanceDate: Date
|
||||
|
||||
@Column({
|
||||
type: 'decimal',
|
||||
precision: 40,
|
||||
scale: 20,
|
||||
nullable: false,
|
||||
transformer: DecimalTransformer,
|
||||
})
|
||||
decay: Decimal
|
||||
|
||||
@Column({
|
||||
name: 'decay_start',
|
||||
type: 'datetime',
|
||||
nullable: true,
|
||||
default: null,
|
||||
})
|
||||
decayStart: Date | null
|
||||
|
||||
@Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' })
|
||||
memo: string
|
||||
|
||||
@Column({ name: 'creation_date', type: 'datetime', nullable: true, default: null })
|
||||
creationDate: Date | null
|
||||
|
||||
@Column({
|
||||
name: 'linked_user_id',
|
||||
type: 'int',
|
||||
unsigned: true,
|
||||
nullable: true,
|
||||
default: null,
|
||||
})
|
||||
linkedUserId?: number | null
|
||||
|
||||
@Column({
|
||||
name: 'linked_transaction_id',
|
||||
type: 'int',
|
||||
unsigned: true,
|
||||
nullable: true,
|
||||
default: null,
|
||||
})
|
||||
linkedTransactionId?: number | null
|
||||
|
||||
@Column({
|
||||
name: 'transaction_link_id',
|
||||
type: 'int',
|
||||
unsigned: true,
|
||||
nullable: true,
|
||||
default: null,
|
||||
})
|
||||
transactionLinkId?: number | null
|
||||
}
|
||||
@ -1 +1 @@
|
||||
export { Transaction } from './0029-clean_transaction_table/Transaction'
|
||||
export { Transaction } from './0032-add-transaction-link-to-transaction/Transaction'
|
||||
|
||||
@ -1 +1 @@
|
||||
export { TransactionLink } from './0030-transaction_link/TransactionLink'
|
||||
export { TransactionLink } from './0031-remove_sendEmail_from_transaction_link/TransactionLink'
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
/* MIGRATION TO REMOVE sendEmail FIELD FROM TRANSACTION_LINK TABLE */
|
||||
|
||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
|
||||
export async function upgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
|
||||
await queryFn('ALTER TABLE `transaction_links` DROP COLUMN `showEmail`;')
|
||||
}
|
||||
|
||||
export async function downgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
|
||||
await queryFn(
|
||||
'ALTER TABLE `transaction_links` ADD COLUMN `showEmail` boolean NOT NULL DEFAULT false AFTER `validUntil`;',
|
||||
)
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
/* MIGRATION TO ADD transactionLinkId FIELDTO TRANSACTION */
|
||||
|
||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
|
||||
export async function upgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
|
||||
await queryFn(
|
||||
'ALTER TABLE `transactions` ADD COLUMN `transaction_link_id` int UNSIGNED DEFAULT NULL AFTER `linked_transaction_id`;',
|
||||
)
|
||||
}
|
||||
|
||||
export async function downgrade(queryFn: (query: string, values?: any[]) => Promise<Array<any>>) {
|
||||
await queryFn('ALTER TABLE `transactions` DROP COLUMN `transaction_link_id`;')
|
||||
}
|
||||
@ -47,6 +47,15 @@ KLICKTIPP_APIKEY_EN=
|
||||
GRAPHQL_URI=https://stage1.gradido.net/graphql
|
||||
ADMIN_AUTH_URL=https://stage1.gradido.net/admin/authenticate?token={token}
|
||||
|
||||
META_URL=http://localhost
|
||||
META_TITLE_DE="Gradido – Dein Dankbarkeitskonto"
|
||||
META_TITLE_EN="Gradido - Your gratitude account"
|
||||
META_DESCRIPTION_DE="Dankbarkeit ist die Währung der neuen Zeit. Immer mehr Menschen entfalten ihr Potenzial und gestalten eine gute Zukunft für alle."
|
||||
META_DESCRIPTION_EN="Gratitude is the currency of the new age. More and more people are unleashing their potential and shaping a good future for all."
|
||||
META_KEYWORDS_DE="Grundeinkommen, Währung, Dankbarkeit, Schenk-Ökonomie, Natürliche Ökonomie des Lebens, Ökonomie, Ökologie, Potenzialentfaltung, Schenken und Danken, Kreislauf des Lebens, Geldsystem"
|
||||
META_KEYWORDS_EN="Basic Income, Currency, Gratitude, Gift Economy, Natural Economy of Life, Economy, Ecology, Potential Development, Giving and Thanking, Cycle of Life, Monetary System"
|
||||
META_AUTHOR="Bernd Hückstädt - Gradido-Akademie"
|
||||
|
||||
# admin
|
||||
WALLET_AUTH_URL=https://stage1.gradido.net/authenticate?token={token}
|
||||
WALLET_URL=https://stage1.gradido.net/login
|
||||
@ -1,3 +1,11 @@
|
||||
META_URL=http://localhost
|
||||
META_TITLE_DE="Gradido – Dein Dankbarkeitskonto"
|
||||
META_TITLE_EN="Gradido - Your gratitude account"
|
||||
META_DESCRIPTION_DE="Dankbarkeit ist die Währung der neuen Zeit. Immer mehr Menschen entfalten ihr Potenzial und gestalten eine gute Zukunft für alle."
|
||||
META_DESCRIPTION_EN="Gratitude is the currency of the new age. More and more people are unleashing their potential and shaping a good future for all."
|
||||
META_KEYWORDS_DE="Grundeinkommen, Währung, Dankbarkeit, Schenk-Ökonomie, Natürliche Ökonomie des Lebens, Ökonomie, Ökologie, Potenzialentfaltung, Schenken und Danken, Kreislauf des Lebens, Geldsystem"
|
||||
META_KEYWORDS_EN="Basic Income, Currency, Gratitude, Gift Economy, Natural Economy of Life, Economy, Ecology, Potential Development, Giving and Thanking, Cycle of Life, Monetary System"
|
||||
META_AUTHOR="Bernd Hückstädt - Gradido-Akademie"
|
||||
GRAPHQL_URI=http://localhost/graphql
|
||||
DEFAULT_PUBLISHER_ID=2896
|
||||
ADMIN_AUTH_URL=http://localhost/admin/authenticate?token={token}
|
||||
@ -1,3 +1,11 @@
|
||||
META_URL=$META_URL
|
||||
META_TITLE_DE=$META_TITLE_DE
|
||||
META_TITLE_EN=$META_TITLE_EN
|
||||
META_DESCRIPTION_DE=$META_DESCRIPTION_DE
|
||||
META_DESCRIPTION_EN=$META_DESCRIPTION_EN
|
||||
META_KEYWORDS_DE=$META_KEYWORDS_DE
|
||||
META_KEYWORDS_EN=$META_KEYWORDS_EN
|
||||
META_AUTHOR=$META_AUTHOR
|
||||
GRAPHQL_URI=$GRAPHQL_URI
|
||||
DEFAULT_PUBLISHER_ID=2896
|
||||
ADMIN_AUTH_URL=$ADMIN_AUTH_URL
|
||||
@ -16,6 +16,12 @@ module.exports = {
|
||||
'no-console': ['error'],
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
||||
'vue/component-name-in-template-casing': ['error', 'kebab-case'],
|
||||
'vue/no-static-inline-styles': [
|
||||
'error',
|
||||
{
|
||||
allowBinding: false,
|
||||
},
|
||||
],
|
||||
'prettier/prettier': [
|
||||
'error',
|
||||
{
|
||||
|
||||
18
frontend/.stylelintrc.js
Normal file
18
frontend/.stylelintrc.js
Normal file
@ -0,0 +1,18 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
extends: ["stylelint-config-standard-scss", "stylelint-config-recommended-vue"],
|
||||
overrides: [
|
||||
{
|
||||
files: "**/*.{scss}",
|
||||
customSyntax: "postcss-scss",
|
||||
extends: ["stylelint-config-standard-scss"],
|
||||
},
|
||||
{
|
||||
files: "**/*.vue",
|
||||
customSyntax: "postcss-html",
|
||||
extends: ["stylelint-config-recommended-vue"],
|
||||
}
|
||||
]
|
||||
|
||||
};
|
||||
@ -1,7 +1,7 @@
|
||||
##################################################################################
|
||||
# BASE ###########################################################################
|
||||
##################################################################################
|
||||
FROM node:12.19.0-alpine3.10 as base
|
||||
FROM node:16-alpine3.14 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
|
||||
@ -31,8 +31,8 @@ LABEL org.label-schema.schema-version="1.0"
|
||||
LABEL maintainer="support@ogradido.net"
|
||||
|
||||
# Install Additional Software
|
||||
## install: git
|
||||
#RUN apk --no-cache add git
|
||||
## install: node-gyp dependencies
|
||||
RUN apk --no-cache add g++ make python3
|
||||
|
||||
# Settings
|
||||
## Expose Container Port
|
||||
|
||||
@ -6,9 +6,10 @@
|
||||
"start": "node run/server.js",
|
||||
"serve": "vue-cli-service serve --open",
|
||||
"build": "vue-cli-service build",
|
||||
"dev": "yarn run serve",
|
||||
"analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json",
|
||||
"lint": "eslint --max-warnings=0 --ext .js,.vue .",
|
||||
"dev": "yarn run serve",
|
||||
"stylelint": "stylelint --max-warnings=0 '**/*.{scss,vue}'",
|
||||
"i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'",
|
||||
"test": "TZ=UTC jest --coverage",
|
||||
"locales": "scripts/missing-keys.sh && scripts/sort.sh"
|
||||
@ -52,7 +53,6 @@
|
||||
"vee-validate": "^3.4.5",
|
||||
"vue": "2.6.12",
|
||||
"vue-apollo": "^3.0.7",
|
||||
"vue-cli-plugin-i18n": "^1.0.1",
|
||||
"vue-flatpickr-component": "^8.1.2",
|
||||
"vue-focus": "^2.1.0",
|
||||
"vue-i18n": "^8.22.4",
|
||||
@ -75,9 +75,17 @@
|
||||
"babel-plugin-component": "^1.1.0",
|
||||
"babel-plugin-transform-require-context": "^0.1.1",
|
||||
"dotenv-webpack": "^7.0.3",
|
||||
"node-sass": "^6.0.1",
|
||||
"postcss": "^8.4.8",
|
||||
"postcss-html": "^1.3.0",
|
||||
"postcss-scss": "^4.0.3",
|
||||
"sass": "1.32.13",
|
||||
"sass-loader": "^10",
|
||||
"stats-webpack-plugin": "^0.7.0",
|
||||
"stylelint": "^14.5.3",
|
||||
"stylelint-config-recommended-vue": "^1.3.0",
|
||||
"stylelint-config-standard-scss": "^3.0.0",
|
||||
"vue-cli-plugin-i18n": "^1.0.1",
|
||||
"vue-html-webpack-plugin": "^3.2.2",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
"webpack-bundle-analyzer": "^4.5.0"
|
||||
},
|
||||
|
||||
BIN
frontend/public/img/gradido-wallet-650-400.jpg
Normal file
BIN
frontend/public/img/gradido-wallet-650-400.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 71 KiB |
@ -1,7 +1,7 @@
|
||||
<!--
|
||||
|
||||
=========================================================
|
||||
* Gradido Konto - v0.0.1
|
||||
* Gradido Konto - v1.6.1
|
||||
=========================================================
|
||||
|
||||
* Product Page: https://www.gradido.net
|
||||
@ -17,16 +17,39 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="title" lang="de" content="<%= htmlWebpackPlugin.options.meta.title_de %>">
|
||||
<meta name="title" lang="en" content="<%= htmlWebpackPlugin.options.meta.title_en %>">
|
||||
<meta name="description" lang="de" content="<%= htmlWebpackPlugin.options.meta.description_de %>">
|
||||
<meta name="description" lang="en" content="<%= htmlWebpackPlugin.options.meta.description_en %>">
|
||||
<meta name="keywords" lang="de" content="<%= htmlWebpackPlugin.options.meta.keywords_de %>">
|
||||
<meta name="keywords" lang="en" content="<%= htmlWebpackPlugin.options.meta.keywords_en %>">
|
||||
<meta name="author" content="<%= htmlWebpackPlugin.options.meta.author %>">
|
||||
<meta name="url" content="<%= htmlWebpackPlugin.options.meta.url %>">
|
||||
<meta name="identifier-URL" content="<%= htmlWebpackPlugin.options.meta.url %>">
|
||||
<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 Account</title>
|
||||
<meta name="robots" content="index,follow">
|
||||
<link rel='canonical' href='<%= htmlWebpackPlugin.options.meta.url %>'>
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="./favicon.png">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<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">
|
||||
|
||||
<meta property="og:title" content="<%= htmlWebpackPlugin.options.meta.title_de %>" />
|
||||
<meta property="og:description" content="<%= htmlWebpackPlugin.options.meta.description_de %>" />
|
||||
<meta property="og:type" content="Website" />
|
||||
<meta property="og:url" content="<%= htmlWebpackPlugin.options.meta.url %>" />
|
||||
<meta property="og:image" content="<%= htmlWebpackPlugin.options.meta.url %>/img/gradido-wallet-650-400.jpg" />
|
||||
|
||||
<meta lang="de" name="twitter:title" content="<%= htmlWebpackPlugin.options.meta.title_de %>">
|
||||
<meta lang="en" name="twitter:title" content="<%= htmlWebpackPlugin.options.meta.title_en %>">
|
||||
<meta lang="de" name="twitter:description" content="<%= htmlWebpackPlugin.options.meta.description_de %>">
|
||||
<meta lang="en" name="twitter:description" content="<%= htmlWebpackPlugin.options.meta.description_en %>">
|
||||
<meta name="twitter:image" content="<%= htmlWebpackPlugin.options.meta.url %>/img/gradido-wallet-650-400.jpg">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper" id="app">
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -3,8 +3,6 @@
|
||||
$alert-padding-y: 1rem !default;
|
||||
$alert-padding-x: 1.5rem !default;
|
||||
$alert-border-radius: $border-radius !default;
|
||||
|
||||
$alert-bg-level: -2 !default;
|
||||
$alert-border-level: -2 !default;
|
||||
$alert-color-level: 0 !default;
|
||||
|
||||
|
||||
@ -1,14 +1,11 @@
|
||||
|
||||
// Badges
|
||||
|
||||
$badge-font-size: 66% !default;
|
||||
$badge-font-weight: $font-weight-bold !default;
|
||||
$badge-padding-y: .35rem !default;
|
||||
$badge-padding-x: .375rem !default;
|
||||
$badge-border-radius: $border-radius !default;
|
||||
$badge-text-transfom: uppercase;
|
||||
|
||||
$badge-pill-padding-x: .875em !default;
|
||||
$badge-pill-border-radius: 10rem !default;
|
||||
|
||||
$badge-circle-size: 2rem !default;
|
||||
$badge-font-size: 66% !default;
|
||||
$badge-font-weight: $font-weight-bold !default;
|
||||
$badge-padding-y: 0.35rem !default;
|
||||
$badge-padding-x: 0.375rem !default;
|
||||
$badge-border-radius: $border-radius !default;
|
||||
$badge-text-transfom: uppercase;
|
||||
$badge-pill-padding-x: 0.875em !default;
|
||||
$badge-pill-border-radius: 10rem !default;
|
||||
$badge-circle-size: 2rem !default;
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
// Body
|
||||
|
||||
|
||||
$body-bg: #f8f9fe !default;
|
||||
$body-color: $gray-700 !default;
|
||||
|
||||
@ -1,23 +1,18 @@
|
||||
// Buttons + Forms
|
||||
|
||||
$input-btn-padding-y: .625rem !default;
|
||||
$input-btn-padding-x: .75rem !default;
|
||||
$input-btn-line-height: $shape-height-base !default;
|
||||
|
||||
$input-btn-focus-width: 0 !default;
|
||||
$input-btn-focus-color: rgba($component-active-bg, 1) !default;
|
||||
$input-btn-focus-box-shadow: none !default;
|
||||
|
||||
$input-btn-padding-y-sm: .25rem !default;
|
||||
$input-btn-padding-x-sm: .5rem !default;
|
||||
$input-btn-line-height-sm: $shape-height-sm !default;
|
||||
|
||||
$input-btn-padding-y-lg: .875rem !default;
|
||||
$input-btn-padding-x-lg: 1rem !default;
|
||||
$input-btn-line-height-lg: $shape-height-lg !default;
|
||||
|
||||
$input-btn-border-width: 1px !default;
|
||||
|
||||
$input-btn-font-size-sm: .75rem !default;
|
||||
$input-btn-font-size: .875rem !default;
|
||||
$input-btn-font-size-lg: .875rem !default;
|
||||
$input-btn-padding-y: 0.625rem !default;
|
||||
$input-btn-padding-x: 0.75rem !default;
|
||||
$input-btn-line-height: $shape-height-base !default;
|
||||
$input-btn-focus-width: 0 !default;
|
||||
$input-btn-focus-color: rgba($component-active-bg, 1) !default;
|
||||
$input-btn-focus-box-shadow: none !default;
|
||||
$input-btn-padding-y-sm: 0.25rem !default;
|
||||
$input-btn-padding-x-sm: 0.5rem !default;
|
||||
$input-btn-line-height-sm: $shape-height-sm !default;
|
||||
$input-btn-padding-y-lg: 0.875rem !default;
|
||||
$input-btn-padding-x-lg: 1rem !default;
|
||||
$input-btn-line-height-lg: $shape-height-lg !default;
|
||||
$input-btn-border-width: 1px !default;
|
||||
$input-btn-font-size-sm: 0.75rem !default;
|
||||
$input-btn-font-size: 0.875rem !default;
|
||||
$input-btn-font-size-lg: 0.875rem !default;
|
||||
|
||||
@ -1,35 +1,25 @@
|
||||
// Buttons
|
||||
|
||||
$btn-padding-y: $input-btn-padding-y !default;
|
||||
$btn-padding-x: $input-btn-padding-x + 0.5 !default;
|
||||
$btn-line-height: $input-btn-line-height !default;
|
||||
|
||||
$btn-padding-y-sm: $input-btn-padding-y-sm !default;
|
||||
$btn-padding-x-sm: $input-btn-padding-x-sm !default;
|
||||
$btn-line-height-sm: $input-btn-line-height-sm !default;
|
||||
|
||||
$btn-padding-y-lg: $input-btn-padding-y-lg !default;
|
||||
$btn-padding-x-lg: $input-btn-padding-x-lg !default;
|
||||
$btn-line-height-lg: $input-btn-line-height-lg !default;
|
||||
|
||||
$btn-border-width: $input-btn-border-width !default;
|
||||
|
||||
$btn-font-weight: 600 !default;
|
||||
|
||||
$btn-text-transform: none !default;
|
||||
|
||||
|
||||
$btn-letter-spacing: .025em !default;
|
||||
$btn-box-shadow: 0 4px 6px rgba(50,50,93,.11), 0 1px 3px rgba(0,0,0,.08) !default;
|
||||
$btn-hover-box-shadow: 0 7px 14px rgba(50,50,93,.1), 0 3px 6px rgba(0,0,0,.08) !default;
|
||||
$btn-focus-box-shadow: $btn-hover-box-shadow !default;
|
||||
$btn-focus-width: $input-btn-focus-width !default;
|
||||
$btn-active-box-shadow: none !default;
|
||||
|
||||
$btn-hover-translate-y: -1px !default;
|
||||
|
||||
|
||||
$btn-padding-y: $input-btn-padding-y !default;
|
||||
$btn-padding-x: $input-btn-padding-x + 0.5 !default;
|
||||
$btn-line-height: $input-btn-line-height !default;
|
||||
$btn-padding-y-sm: $input-btn-padding-y-sm !default;
|
||||
$btn-padding-x-sm: $input-btn-padding-x-sm !default;
|
||||
$btn-line-height-sm: $input-btn-line-height-sm !default;
|
||||
$btn-padding-y-lg: $input-btn-padding-y-lg !default;
|
||||
$btn-padding-x-lg: $input-btn-padding-x-lg !default;
|
||||
$btn-line-height-lg: $input-btn-line-height-lg !default;
|
||||
$btn-border-width: $input-btn-border-width !default;
|
||||
$btn-font-weight: 600 !default;
|
||||
$btn-text-transform: none !default;
|
||||
$btn-letter-spacing: 0.025em !default;
|
||||
$btn-box-shadow: 0 4px 6px rgb(50 50 93 / 11%), 0 1px 3px rgb(0 0 0 / 8%) !default;
|
||||
$btn-hover-box-shadow: 0 7px 14px rgb(50 50 93 / 10%), 0 3px 6px rgb(0 0 0 / 8%) !default;
|
||||
$btn-focus-box-shadow: $btn-hover-box-shadow !default;
|
||||
$btn-focus-width: $input-btn-focus-width !default;
|
||||
$btn-active-box-shadow: none !default;
|
||||
$btn-hover-translate-y: -1px !default;
|
||||
|
||||
.btn-outline-secondary {
|
||||
color: #4385b1 !important;
|
||||
}
|
||||
color: #4385b1 !important;
|
||||
}
|
||||
|
||||
@ -1,19 +1,18 @@
|
||||
// Cards
|
||||
|
||||
$card-spacer-y: 1.25rem !default;
|
||||
$card-spacer-x: 1.5rem !default;
|
||||
$card-border-width: $border-width !default;
|
||||
$card-border-radius: $border-radius !default;
|
||||
$card-border-color: rgba($black, .05) !default;
|
||||
$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;
|
||||
$card-cap-bg: $white !default;
|
||||
$card-bg: $white !default;
|
||||
$card-spacer-y: 1.25rem !default;
|
||||
$card-spacer-x: 1.5rem !default;
|
||||
$card-border-width: $border-width !default;
|
||||
$card-border-radius: $border-radius !default;
|
||||
$card-border-color: rgba($black, 0.05) !default;
|
||||
$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;
|
||||
$card-cap-bg: $white !default;
|
||||
$card-bg: $white !default;
|
||||
$card-img-overlay-padding: 1.25rem !default;
|
||||
|
||||
$card-img-overlay-padding: 1.25rem !default;
|
||||
// $card-group-margin: ($grid-gutter-width / 2);
|
||||
// $card-deck-margin: $card-group-margin !default;
|
||||
|
||||
//$card-group-margin: ($grid-gutter-width / 2);
|
||||
//$card-deck-margin: $card-group-margin !default;
|
||||
|
||||
$card-columns-count: 3 !default;
|
||||
$card-columns-gap: 1.25rem !default;
|
||||
$card-columns-margin: $card-spacer-y !default;
|
||||
$card-columns-count: 3 !default;
|
||||
$card-columns-gap: 1.25rem !default;
|
||||
$card-columns-margin: $card-spacer-y !default;
|
||||
|
||||
@ -2,7 +2,6 @@
|
||||
|
||||
$chart-height: 350px !default;
|
||||
$chart-height-sm: 230px !default;
|
||||
|
||||
$chart-legend-margin-top: 2.5rem !default;
|
||||
$chart-legend-font-size: $font-size-sm !default;
|
||||
$chart-legend-color: $text-muted !default;
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
// Close
|
||||
|
||||
$close-font-size: $font-size-base * 1.5 !default;
|
||||
$close-font-weight: $font-weight-bold !default;
|
||||
$close-bg: transparent !default;
|
||||
$close-hover-bg: transparent !default;
|
||||
$close-color: rgba(0, 0, 0, .6) !default !default;
|
||||
$close-hover-color: rgba(0, 0, 0, .9) !default;
|
||||
$close-text-shadow: none !default;
|
||||
$close-font-size: $font-size-base * 1.5 !default;
|
||||
$close-font-weight: $font-weight-bold !default;
|
||||
$close-bg: transparent !default;
|
||||
$close-hover-bg: transparent !default;
|
||||
$close-color: rgb(0 0 0 / 60%) !default !default;
|
||||
$close-hover-color: rgb(0 0 0 / 90%) !default;
|
||||
$close-text-shadow: none !default;
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
|
||||
|
||||
// Color system
|
||||
@use "sass:map";
|
||||
@use "sass:color";
|
||||
|
||||
$white: #fff !default;
|
||||
$white: #fff !default;
|
||||
$gray-100: #f6f9fc !default;
|
||||
$gray-200: #e9ecef !default;
|
||||
$gray-300: #dee2e6 !default;
|
||||
@ -12,177 +12,190 @@ $gray-600: #8898aa !default; // Line footer color
|
||||
$gray-700: #525f7f !default; // Line p color
|
||||
$gray-800: #32325d !default; // Line heading color
|
||||
$gray-900: #212529 !default;
|
||||
$black: #000 !default;
|
||||
|
||||
$black: #000 !default;
|
||||
$grays: () !default;
|
||||
$grays: map-merge((
|
||||
"100": $gray-100,
|
||||
"200": $gray-200,
|
||||
"300": $gray-300,
|
||||
"400": $gray-400,
|
||||
"500": $gray-500,
|
||||
"600": $gray-600,
|
||||
"700": $gray-700,
|
||||
"800": $gray-800,
|
||||
"900": $gray-900
|
||||
), $grays);
|
||||
|
||||
$blue: #5e72e4 !default;
|
||||
$indigo: #5603ad !default;
|
||||
$purple: #8965e0 !default;
|
||||
$pink: #f3a4b5 !default;
|
||||
$red: #f5365c !default;
|
||||
$orange: #fb6340 !default;
|
||||
$yellow: #ffd600 !default;
|
||||
$green: #2dce89 !default;
|
||||
$teal: #11cdef !default;
|
||||
$cyan: #2bffc6 !default;
|
||||
|
||||
$grays: map.merge(
|
||||
(
|
||||
"100": $gray-100,
|
||||
"200": $gray-200,
|
||||
"300": $gray-300,
|
||||
"400": $gray-400,
|
||||
"500": $gray-500,
|
||||
"600": $gray-600,
|
||||
"700": $gray-700,
|
||||
"800": $gray-800,
|
||||
"900": $gray-900
|
||||
),
|
||||
$grays
|
||||
);
|
||||
$blue: #5e72e4 !default;
|
||||
$indigo: #5603ad !default;
|
||||
$purple: #8965e0 !default;
|
||||
$pink: #f3a4b5 !default;
|
||||
$red: #f5365c !default;
|
||||
$orange: #fb6340 !default;
|
||||
$yellow: #ffd600 !default;
|
||||
$green: #2dce89 !default;
|
||||
$teal: #11cdef !default;
|
||||
$cyan: #2bffc6 !default;
|
||||
$colors: () !default;
|
||||
$colors: map-merge((
|
||||
"blue": $blue,
|
||||
"indigo": $indigo,
|
||||
"purple": $purple,
|
||||
"pink": $pink,
|
||||
"red": $red,
|
||||
"orange": $orange,
|
||||
"yellow": $yellow,
|
||||
"green": $green,
|
||||
"teal": $teal,
|
||||
"cyan": $cyan,
|
||||
"white": $white,
|
||||
"gray": $gray-600,
|
||||
"light": $gray-400,
|
||||
"lighter": $gray-200,
|
||||
"gray-dark": $gray-800
|
||||
), $colors);
|
||||
|
||||
$default: #172b4d !default;
|
||||
$primary: #5e72e4 !default;
|
||||
$secondary: #f7fafc !default;
|
||||
$success: $green !default;
|
||||
$info: $teal !default;
|
||||
$warning: $orange !default;
|
||||
$danger: $red !default;
|
||||
$light: $gray-500 !default;
|
||||
$dark: $gray-900 !default;
|
||||
$darker: darken($gray-900, 15%) !default;
|
||||
|
||||
$facebook: #3b5999 !default;
|
||||
$twitter: #1da1f2 !default;
|
||||
$google-plus: #dd4b39 !default;
|
||||
$instagram: #e4405f !default;
|
||||
$pinterest: #bd081c !default;
|
||||
$youtube: #cd201f !default;
|
||||
$slack: #3aaf85 !default;
|
||||
$dribbble: #ea4c89 !default;
|
||||
$github: #222222 !default;
|
||||
|
||||
$colors: map.merge(
|
||||
(
|
||||
"blue": $blue,
|
||||
"indigo": $indigo,
|
||||
"purple": $purple,
|
||||
"pink": $pink,
|
||||
"red": $red,
|
||||
"orange": $orange,
|
||||
"yellow": $yellow,
|
||||
"green": $green,
|
||||
"teal": $teal,
|
||||
"cyan": $cyan,
|
||||
"white": $white,
|
||||
"gray": $gray-600,
|
||||
"light": $gray-400,
|
||||
"lighter": $gray-200,
|
||||
"gray-dark": $gray-800
|
||||
),
|
||||
$colors
|
||||
);
|
||||
$default: #172b4d !default;
|
||||
$primary: #5e72e4 !default;
|
||||
$secondary: #f7fafc !default;
|
||||
$success: $green !default;
|
||||
$info: $teal !default;
|
||||
$warning: $orange !default;
|
||||
$danger: $red !default;
|
||||
$light: $gray-500 !default;
|
||||
$dark: $gray-900 !default;
|
||||
$darker: color.adjust($gray-900, $lightness: -15%) !default;
|
||||
$facebook: #3b5999 !default;
|
||||
$twitter: #1da1f2 !default;
|
||||
$google-plus: #dd4b39 !default;
|
||||
$instagram: #e4405f !default;
|
||||
$pinterest: #bd081c !default;
|
||||
$youtube: #cd201f !default;
|
||||
$slack: #3aaf85 !default;
|
||||
$dribbble: #ea4c89 !default;
|
||||
$github: #222 !default;
|
||||
$theme-colors: () !default;
|
||||
$theme-colors: map-merge((
|
||||
"default": $default,
|
||||
"primary": $primary,
|
||||
"secondary": $secondary,
|
||||
"success": $success,
|
||||
"info": $info,
|
||||
"warning": $warning,
|
||||
"danger": $danger,
|
||||
"white": $white,
|
||||
"neutral": $white,
|
||||
"dark": $dark,
|
||||
"darker": $darker
|
||||
), $theme-colors);
|
||||
|
||||
$theme-colors: map.merge(
|
||||
(
|
||||
"default": $default,
|
||||
"primary": $primary,
|
||||
"secondary": $secondary,
|
||||
"success": $success,
|
||||
"info": $info,
|
||||
"warning": $warning,
|
||||
"danger": $danger,
|
||||
"white": $white,
|
||||
"neutral": $white,
|
||||
"dark": $dark,
|
||||
"darker": $darker
|
||||
),
|
||||
$theme-colors
|
||||
);
|
||||
$brand-colors: () !default;
|
||||
$brand-colors: map-merge((
|
||||
"facebook": $facebook,
|
||||
"twitter": $twitter,
|
||||
"google-plus": $google-plus,
|
||||
"instagram": $instagram,
|
||||
"pinterest": $pinterest,
|
||||
"youtube": $youtube,
|
||||
"slack": $slack,
|
||||
"dribbble": $dribbble,
|
||||
"github": $github
|
||||
), $brand-colors);
|
||||
|
||||
$brand-colors: map.merge(
|
||||
(
|
||||
"facebook": $facebook,
|
||||
"twitter": $twitter,
|
||||
"google-plus": $google-plus,
|
||||
"instagram": $instagram,
|
||||
"pinterest": $pinterest,
|
||||
"youtube": $youtube,
|
||||
"slack": $slack,
|
||||
"dribbble": $dribbble,
|
||||
"github": $github
|
||||
),
|
||||
$brand-colors
|
||||
);
|
||||
$shape-colors: () !default;
|
||||
$shape-colors: map-merge((
|
||||
"default": #32325d,
|
||||
"primary": #5533ff,
|
||||
"secondary": #24b47e,
|
||||
"neutral": #e9ecef,
|
||||
"blue-gray": #b2cbe1,
|
||||
|
||||
), $shape-colors);
|
||||
|
||||
$shape-colors: map.merge(
|
||||
(
|
||||
"default": #32325d,
|
||||
"primary": #53f,
|
||||
"secondary": #24b47e,
|
||||
"neutral": #e9ecef,
|
||||
"blue-gray": #b2cbe1,
|
||||
),
|
||||
$shape-colors
|
||||
);
|
||||
$shapes-primary-colors: () !default;
|
||||
$shapes-primary-colors: map-merge((
|
||||
"step-1-gradient-bg": #281483,
|
||||
"step-2-gradient-bg": #8f6ed5,
|
||||
"step-3-gradient-bg": #d782d9,
|
||||
"span-1-bg": #53f,
|
||||
"span-2-bg": #4553ff,
|
||||
"span-3-bg": #4f40ff,
|
||||
"span-4-bg": #25ddf5,
|
||||
"span-5-bg": #1fa2ff
|
||||
), $shapes-primary-colors);
|
||||
|
||||
$shapes-primary-colors: map.merge(
|
||||
(
|
||||
"step-1-gradient-bg": #281483,
|
||||
"step-2-gradient-bg": #8f6ed5,
|
||||
"step-3-gradient-bg": #d782d9,
|
||||
"span-1-bg": #53f,
|
||||
"span-2-bg": #4553ff,
|
||||
"span-3-bg": #4f40ff,
|
||||
"span-4-bg": #25ddf5,
|
||||
"span-5-bg": #1fa2ff
|
||||
),
|
||||
$shapes-primary-colors
|
||||
);
|
||||
$shapes-default-colors: () !default;
|
||||
$shapes-default-colors: map-merge((
|
||||
"step-1-gradient-bg": #7795f8,
|
||||
"step-2-gradient-bg": #6772e5,
|
||||
"step-3-gradient-bg": #555abf,
|
||||
"span-1-bg": #7795f8,
|
||||
"span-2-bg": #7b9aff,
|
||||
"span-3-bg": #6f8ff8,
|
||||
"span-4-bg": #76eea7,
|
||||
"span-5-bg": #6adaff
|
||||
), $shapes-default-colors);
|
||||
|
||||
$shapes-default-colors: map.merge(
|
||||
(
|
||||
"step-1-gradient-bg": #7795f8,
|
||||
"step-2-gradient-bg": #6772e5,
|
||||
"step-3-gradient-bg": #555abf,
|
||||
"span-1-bg": #7795f8,
|
||||
"span-2-bg": #7b9aff,
|
||||
"span-3-bg": #6f8ff8,
|
||||
"span-4-bg": #76eea7,
|
||||
"span-5-bg": #6adaff
|
||||
),
|
||||
$shapes-default-colors
|
||||
);
|
||||
$shapes-light-colors: () !default;
|
||||
$shapes-light-colors: map-merge((
|
||||
"step-1-gradient-bg": #b2cbe1,
|
||||
"step-2-gradient-bg": #f6f9fc,
|
||||
"step-3-gradient-bg": #f6f9fc,
|
||||
"span-1-bg": #b4cce1,
|
||||
"span-2-bg": #c5dbef,
|
||||
"span-3-bg": #b9d5ed,
|
||||
"span-4-bg": #74e4a2,
|
||||
"span-5-bg": #008169
|
||||
), $shapes-light-colors);
|
||||
|
||||
$shapes-light-colors: map.merge(
|
||||
(
|
||||
"step-1-gradient-bg": #b2cbe1,
|
||||
"step-2-gradient-bg": #f6f9fc,
|
||||
"step-3-gradient-bg": #f6f9fc,
|
||||
"span-1-bg": #b4cce1,
|
||||
"span-2-bg": #c5dbef,
|
||||
"span-3-bg": #b9d5ed,
|
||||
"span-4-bg": #74e4a2,
|
||||
"span-5-bg": #008169
|
||||
),
|
||||
$shapes-light-colors
|
||||
);
|
||||
$shapes-dark-colors: () !default;
|
||||
$shapes-dark-colors: map-merge((
|
||||
"step-1-gradient-bg": #32325d,
|
||||
"step-2-gradient-bg": #32325d,
|
||||
"step-3-gradient-bg": #32325d,
|
||||
"span-1-bg": #2e2e57,
|
||||
"span-2-bg": #2b2b58,
|
||||
"span-3-bg": #25254d,
|
||||
"span-4-bg": #d782d9,
|
||||
"span-5-bg": #008169
|
||||
), $shapes-dark-colors);
|
||||
|
||||
$shapes-dark-colors: map.merge(
|
||||
(
|
||||
"step-1-gradient-bg": #32325d,
|
||||
"step-2-gradient-bg": #32325d,
|
||||
"step-3-gradient-bg": #32325d,
|
||||
"span-1-bg": #2e2e57,
|
||||
"span-2-bg": #2b2b58,
|
||||
"span-3-bg": #25254d,
|
||||
"span-4-bg": #d782d9,
|
||||
"span-5-bg": #008169
|
||||
),
|
||||
$shapes-dark-colors
|
||||
);
|
||||
|
||||
// Translucent color variations
|
||||
$translucent-color-opacity: .6 !default;
|
||||
$translucent-color-opacity: 0.6 !default;
|
||||
|
||||
// Set a specific jump point for requesting color jumps
|
||||
$theme-color-interval: 8% !default;
|
||||
$theme-color-interval: 8% !default;
|
||||
|
||||
// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255.
|
||||
$yiq-contrasted-threshold: 200 !default;
|
||||
// The yiq lightness value that determines when the lightness of color changes
|
||||
// from "dark" to "light". Acceptable values are between 0 and 255.
|
||||
$yiq-contrasted-threshold: 200 !default;
|
||||
|
||||
// Customize the light and dark text colors for use in our YIQ color contrast function.
|
||||
$yiq-text-dark: $gray-900 !default;
|
||||
$yiq-text-light: $white !default;
|
||||
$yiq-text-dark: $gray-900 !default;
|
||||
$yiq-text-light: $white !default;
|
||||
|
||||
// Action colors
|
||||
|
||||
$star-rating-color: $gray-400 !default;
|
||||
$star-rating-color-active: $yellow !default;
|
||||
|
||||
$favorite-color: $yellow !default;
|
||||
$like-color: $blue !default;
|
||||
$love-color: $red !default;
|
||||
|
||||
@ -1,31 +1,24 @@
|
||||
// Components
|
||||
|
||||
$shape-height-xl: 1.5 !default;
|
||||
$shape-height-lg: 1.5 !default;
|
||||
$shape-height-sm: 1.5 !default;
|
||||
|
||||
$border-width: 1px !default;
|
||||
$border-color: $gray-200 !default;
|
||||
|
||||
$border-radius: .375rem !default;
|
||||
$border-radius-xl: .5rem !default;
|
||||
$border-radius-lg: .4375rem !default;
|
||||
$border-radius-sm: .25rem !default;
|
||||
|
||||
$box-shadow-sm: 0 0 .5rem rgba($gray-600, .075) !default;
|
||||
$box-shadow: 0 0 2rem 0 rgba($gray-600, .15) !default;
|
||||
$box-shadow-lg: 0 0 3rem rgba($gray-600, .175) !default;
|
||||
|
||||
$component-active-color: $white !default;
|
||||
$component-active-bg: theme-color("primary") !default;
|
||||
$shape-height-xl: 1.5 !default;
|
||||
$shape-height-lg: 1.5 !default;
|
||||
$shape-height-sm: 1.5 !default;
|
||||
$border-width: 1px !default;
|
||||
$border-color: $gray-200 !default;
|
||||
$border-radius: 0.375rem !default;
|
||||
$border-radius-xl: 0.5rem !default;
|
||||
$border-radius-lg: 0.4375rem !default;
|
||||
$border-radius-sm: 0.25rem !default;
|
||||
$box-shadow-sm: 0 0 0.5rem rgba($gray-600, 0.075) !default;
|
||||
$box-shadow: 0 0 2rem 0 rgba($gray-600, 0.15) !default;
|
||||
$box-shadow-lg: 0 0 3rem rgba($gray-600, 0.175) !default;
|
||||
$component-active-color: $white !default;
|
||||
$component-active-bg: theme-color("primary") !default;
|
||||
$component-active-border-color: theme-color("primary") !default;
|
||||
|
||||
$component-hover-color: $gray-300 !default;
|
||||
$component-hover-bg: $gray-300 !default;
|
||||
$component-hover-color: $gray-300 !default;
|
||||
$component-hover-bg: $gray-300 !default;
|
||||
$component-hover-border-color: $gray-300 !default;
|
||||
|
||||
$caret-width: .3em !default;
|
||||
|
||||
$transition-base: all .15s ease !default;
|
||||
$transition-fade: opacity .15s linear !default;
|
||||
$transition-collapse: height .35s ease !default;
|
||||
$caret-width: 0.3em !default;
|
||||
$transition-base: all 0.15s ease !default;
|
||||
$transition-fade: opacity 0.15s linear !default;
|
||||
$transition-collapse: height 0.35s ease !default;
|
||||
|
||||
@ -1,33 +1,29 @@
|
||||
// Custom forms
|
||||
|
||||
$custom-control-gutter: 1.75rem !default;
|
||||
$custom-control-spacer-x: 1rem !default;
|
||||
$custom-control-indicator-size: 1.25rem !default;
|
||||
|
||||
$custom-control-indicator-bg: $input-bg !default;
|
||||
$custom-control-indicator-border-width: 1px !default;
|
||||
$custom-control-indicator-border-color: $input-border-color !default;
|
||||
$custom-control-indicator-box-shadow: none !default;
|
||||
|
||||
$custom-control-indicator-focus-box-shadow: $custom-control-indicator-box-shadow !default;
|
||||
|
||||
$custom-control-indicator-hover-color: $component-hover-color !default;
|
||||
$custom-control-indicator-hover-bg: $component-hover-bg !default;
|
||||
$custom-control-indicator-hover-border-color: $component-hover-border-color !default;
|
||||
|
||||
$custom-control-indicator-active-color: $component-active-color !default;
|
||||
$custom-control-indicator-active-bg: $component-active-bg !default;
|
||||
$custom-control-indicator-active-border-color: $component-active-border-color !default;
|
||||
$custom-control-indicator-active-box-shadow: $custom-control-indicator-box-shadow !default;
|
||||
|
||||
$custom-control-indicator-checked-color: $component-active-color !default;
|
||||
$custom-control-indicator-checked-bg: $component-active-bg !default;
|
||||
$custom-control-gutter: 1.75rem !default;
|
||||
$custom-control-spacer-x: 1rem !default;
|
||||
$custom-control-indicator-size: 1.25rem !default;
|
||||
$custom-control-indicator-bg: $input-bg !default;
|
||||
$custom-control-indicator-border-width: 1px !default;
|
||||
$custom-control-indicator-border-color: $input-border-color !default;
|
||||
$custom-control-indicator-box-shadow: none !default;
|
||||
$custom-control-indicator-focus-box-shadow: $custom-control-indicator-box-shadow !default;
|
||||
$custom-control-indicator-hover-color: $component-hover-color !default;
|
||||
$custom-control-indicator-hover-bg: $component-hover-bg !default;
|
||||
$custom-control-indicator-hover-border-color: $component-hover-border-color !default;
|
||||
$custom-control-indicator-active-color: $component-active-color !default;
|
||||
$custom-control-indicator-active-bg: $component-active-bg !default;
|
||||
$custom-control-indicator-active-border-color: $component-active-border-color !default;
|
||||
$custom-control-indicator-active-box-shadow: $custom-control-indicator-box-shadow !default;
|
||||
$custom-control-indicator-checked-color: $component-active-color !default;
|
||||
$custom-control-indicator-checked-bg: $component-active-bg !default;
|
||||
$custom-control-indicator-checked-border-color: $component-active-border-color !default;
|
||||
$custom-control-indicator-checked-box-shadow: $custom-control-indicator-box-shadow !default;
|
||||
$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default;
|
||||
$custom-control-indicator-checked-box-shadow: $custom-control-indicator-box-shadow !default;
|
||||
|
||||
$custom-control-indicator-disabled-bg: $gray-200 !default;
|
||||
$custom-control-label-disabled-color: $gray-600 !default;
|
||||
// $custom-control-indicator-checked-disabled-bg: rgb(theme-color("primary") 0.5) !default;
|
||||
$custom-control-indicator-checked-disabled-bg: theme-color("primary") !default;
|
||||
$custom-control-indicator-disabled-bg: $gray-200 !default;
|
||||
$custom-control-label-disabled-color: $gray-600 !default;
|
||||
$custom-checkbox-indicator-border-radius: $border-radius-sm !default;
|
||||
|
||||
$custom-checkbox-indicator-border-radius: $border-radius-sm !default;
|
||||
//$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml !default;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||
// $custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml !default;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
// Custom toggle
|
||||
|
||||
$custom-toggle-width: 50px !default;
|
||||
$custom-toggle-slider-bg: $gray-200 !default;
|
||||
$custom-toggle-checked-bg: theme-color("primary") !default;
|
||||
$custom-toggle-width: 50px !default;
|
||||
$custom-toggle-slider-bg: $gray-200 !default;
|
||||
$custom-toggle-checked-bg: theme-color("primary") !default;
|
||||
|
||||
@ -1,28 +1,23 @@
|
||||
// Datepicker
|
||||
@use "sass:color";
|
||||
|
||||
$datepicker-border-radius: $card-border-radius !default;
|
||||
$datepicker-dropdown-padding: 20px 22px !default;
|
||||
|
||||
$datepicker-cell-transition: $transition-base !default;
|
||||
$datepicker-cell-hover-background: lighten($gray-400, 55%);
|
||||
$datepicker-cell-hover-background: color.adjust($gray-400, $lightness: 55%);
|
||||
$datepicker-cell-border-radius: 50% !default;
|
||||
$datepicker-cell-width: 36px !default;
|
||||
$datepicker-cell-height: 36px !default;
|
||||
|
||||
$datepicker-disabled-cell-color: $gray-300 !default;
|
||||
$datepicker-disabled-old-new-color: $gray-500 !default;
|
||||
|
||||
$datepicker-header-cell-border-radius: $border-radius !default;
|
||||
|
||||
$datepicker-active-color: $white !default;
|
||||
$datepicker-active-background: theme-color("primary") !default;
|
||||
$datepicker-active-box-shadow: none !default;
|
||||
|
||||
$datepicker-active-box-shadow: none !default;
|
||||
$datepicker-range-background: theme-color("primary") !default;
|
||||
$datepicker-range-cell-focused-background: darken($datepicker-range-background, 5%);
|
||||
$datepicker-range-cell-focused-background: color.adjust($datepicker-range-background, $lightness: -5%);
|
||||
$datepicker-range-color: $white !default;
|
||||
$datepicker-range-highlighted-bg: $gray-200 !default;
|
||||
|
||||
$datepicker-dropdown-border: lighten($gray-400, 40%);
|
||||
$datepicker-dropdown-border: color.adjust($gray-400, $lightness: 40%);
|
||||
$datepicker-dropdown-bg: $white !default;
|
||||
$datepicker-highlighted-bg: $datepicker-active-background !default;
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
// Dropdown
|
||||
|
||||
$dropdown-bg: $white !default;
|
||||
$dropdown-border-width: 0 !default;
|
||||
$dropdown-border-color: rgba($black, .15) !default;
|
||||
$dropdown-border-radius: $border-radius-lg !default;
|
||||
$dropdown-box-shadow: 0 50px 100px rgba(50, 50, 93, .1), 0 15px 35px rgba(50, 50, 93, .15), 0 5px 15px rgba(0, 0, 0, .1) !default;
|
||||
$dropdown-bg: $white !default;
|
||||
$dropdown-border-width: 0 !default;
|
||||
$dropdown-border-color: rgba($black, 0.15) !default;
|
||||
$dropdown-border-radius: $border-radius-lg !default;
|
||||
$dropdown-box-shadow: 0 50px 100px rgb(50 50 93 / 10%),
|
||||
0 15px 35px rgb(50 50 93 / 15%),
|
||||
0 5px 15px rgb(0 0 0 / 10%) !default;
|
||||
|
||||
@ -1,88 +1,63 @@
|
||||
|
||||
// Fonts
|
||||
|
||||
$font-family-sans-serif: Open Sans, sans-serif !default;
|
||||
$font-family-sans-serif: open sans, sans-serif !default;
|
||||
$font-family-base: $font-family-sans-serif !default;
|
||||
|
||||
$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
|
||||
$font-size-xl: ($font-size-base * 1.5);
|
||||
$font-size-lg: ($font-size-base * 1.25);
|
||||
$font-size-sm: ($font-size-base * .875);
|
||||
$font-size-xs: ($font-size-base * .75);
|
||||
|
||||
$font-weight-light: 300 !default;
|
||||
$font-weight-normal: 400 !default;
|
||||
$font-weight-bold: 600 !default;
|
||||
$font-weight-extra-bold: 700 !default;
|
||||
|
||||
$font-weight-base: $font-weight-normal !default;
|
||||
$line-height-base: 1.5 !default;
|
||||
$shape-height-base: 1.5 !default;
|
||||
|
||||
|
||||
$h1-font-size: $font-size-base * 1.625 !default;
|
||||
$h2-font-size: $font-size-base * 1.25 !default;
|
||||
$h3-font-size: $font-size-base * 1.0625 !default;
|
||||
$h4-font-size: $font-size-base * .9375 !default;
|
||||
$h5-font-size: $font-size-base * .8125 !default;
|
||||
$h6-font-size: $font-size-base * .625 !default;
|
||||
|
||||
|
||||
$headings-margin-bottom: ($spacer / 2);
|
||||
$headings-font-family: inherit !default;
|
||||
$headings-font-weight: $font-weight-bold !default;
|
||||
$headings-line-height: 1.5 !default;
|
||||
$headings-color: $gray-800 !default;
|
||||
|
||||
$heading-letter-spacing: .025em !default;
|
||||
$heading-font-size: .95rem !default;
|
||||
$heading-text-transform: uppercase !default;
|
||||
$heading-font-weight: $headings-font-weight !default;
|
||||
|
||||
$heading-title-letter-spacing: .025em !default;
|
||||
$heading-title-font-size: 1.375rem !default;
|
||||
$heading-title-font-weight: $font-weight-bold !default;
|
||||
$heading-title-text-transform: uppercase !default;
|
||||
|
||||
$heading-section-letter-spacing: .025em !default;
|
||||
$heading-section-font-size: 1.375rem !default;
|
||||
$heading-section-font-weight: $font-weight-bold !default;
|
||||
$heading-section-text-transform: uppercase !default;
|
||||
|
||||
$display1-size: 3.3rem !default;
|
||||
$display2-size: 2.75rem !default;
|
||||
$display3-size: 2.1875rem !default;
|
||||
$display4-size: 1.6275rem !default;
|
||||
|
||||
$display1-weight: $font-weight-bold !default;
|
||||
$display2-weight: $font-weight-bold !default;
|
||||
$display3-weight: $font-weight-bold !default;
|
||||
$display4-weight: $font-weight-bold !default;
|
||||
$display-line-height: $headings-line-height !default;
|
||||
|
||||
$paragraph-font-size: 1rem !default;
|
||||
$paragraph-font-weight: 300 !default;
|
||||
$paragraph-line-height: 1.7 !default;
|
||||
|
||||
$lead-font-size: ($paragraph-font-size * 1.25) !default;
|
||||
$lead-font-weight: 300 !default;
|
||||
|
||||
$small-font-size: 80% !default;
|
||||
|
||||
$text-muted: $gray-600 !default;
|
||||
|
||||
$blockquote-small-color: $gray-600 !default;
|
||||
$blockquote-font-size: ($font-size-base * 1.25) !default;
|
||||
|
||||
$hr-border-color: rgba($black, .1);
|
||||
$hr-border-width: $border-width !default;
|
||||
|
||||
$mark-padding: .2em !default;
|
||||
|
||||
$dt-font-weight: $font-weight-bold !default;
|
||||
|
||||
$list-inline-padding: .5rem !default;
|
||||
|
||||
$mark-bg: #fcf8e3 !default;
|
||||
|
||||
$hr-margin-y: $spacer * 2 !default;
|
||||
$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
|
||||
$font-size-xl: ($font-size-base * 1.5);
|
||||
$font-size-lg: ($font-size-base * 1.25);
|
||||
$font-size-sm: ($font-size-base * 0.875);
|
||||
$font-size-xs: ($font-size-base * 0.75);
|
||||
$font-weight-light: 300 !default;
|
||||
$font-weight-normal: 400 !default;
|
||||
$font-weight-bold: 600 !default;
|
||||
$font-weight-extra-bold: 700 !default;
|
||||
$font-weight-base: $font-weight-normal !default;
|
||||
$line-height-base: 1.5 !default;
|
||||
$shape-height-base: 1.5 !default;
|
||||
$h1-font-size: $font-size-base * 1.625 !default;
|
||||
$h2-font-size: $font-size-base * 1.25 !default;
|
||||
$h3-font-size: $font-size-base * 1.0625 !default;
|
||||
$h4-font-size: $font-size-base * 0.9375 !default;
|
||||
$h5-font-size: $font-size-base * 0.8125 !default;
|
||||
$h6-font-size: $font-size-base * 0.625 !default;
|
||||
$headings-margin-bottom: ($spacer / 2);
|
||||
$headings-font-family: inherit !default;
|
||||
$headings-font-weight: $font-weight-bold !default;
|
||||
$headings-line-height: 1.5 !default;
|
||||
$headings-color: $gray-800 !default;
|
||||
$heading-letter-spacing: 0.025em !default;
|
||||
$heading-font-size: 0.95rem !default;
|
||||
$heading-text-transform: uppercase !default;
|
||||
$heading-font-weight: $headings-font-weight !default;
|
||||
$heading-title-letter-spacing: 0.025em !default;
|
||||
$heading-title-font-size: 1.375rem !default;
|
||||
$heading-title-font-weight: $font-weight-bold !default;
|
||||
$heading-title-text-transform: uppercase !default;
|
||||
$heading-section-letter-spacing: 0.025em !default;
|
||||
$heading-section-font-size: 1.375rem !default;
|
||||
$heading-section-font-weight: $font-weight-bold !default;
|
||||
$heading-section-text-transform: uppercase !default;
|
||||
$display1-size: 3.3rem !default;
|
||||
$display2-size: 2.75rem !default;
|
||||
$display3-size: 2.1875rem !default;
|
||||
$display4-size: 1.6275rem !default;
|
||||
$display1-weight: $font-weight-bold !default;
|
||||
$display2-weight: $font-weight-bold !default;
|
||||
$display3-weight: $font-weight-bold !default;
|
||||
$display4-weight: $font-weight-bold !default;
|
||||
$display-line-height: $headings-line-height !default;
|
||||
$paragraph-font-size: 1rem !default;
|
||||
$paragraph-font-weight: 300 !default;
|
||||
$paragraph-line-height: 1.7 !default;
|
||||
$lead-font-size: ($paragraph-font-size * 1.25) !default;
|
||||
$lead-font-weight: 300 !default;
|
||||
$small-font-size: 80% !default;
|
||||
$text-muted: $gray-600 !default;
|
||||
$blockquote-small-color: $gray-600 !default;
|
||||
$blockquote-font-size: ($font-size-base * 1.25) !default;
|
||||
$hr-border-color: rgba($black, 0.1);
|
||||
$hr-border-width: $border-width !default;
|
||||
$mark-padding: 0.2em !default;
|
||||
$dt-font-weight: $font-weight-bold !default;
|
||||
$list-inline-padding: 0.5rem !default;
|
||||
$mark-bg: #fcf8e3 !default;
|
||||
$hr-margin-y: $spacer * 2 !default;
|
||||
|
||||
@ -1,13 +1,11 @@
|
||||
// Footer
|
||||
|
||||
$footer-padding-y: 2.5rem;
|
||||
$footer-padding-x: 0;
|
||||
|
||||
|
||||
$footer-link-font-size: .85rem !default;
|
||||
$footer-padding-y: 2.5rem;
|
||||
$footer-padding-x: 0;
|
||||
$footer-link-font-size: 0.85rem !default;
|
||||
$footer-bg: theme-color("secondary") !default;
|
||||
$footer-color: $gray-600 !default;
|
||||
$footer-link-color: $gray-600 !default;
|
||||
$footer-link-hover-color: $gray-700 !default;
|
||||
$footer-heading-color: $gray-600 !default;
|
||||
$footer-heading-font-size: $font-size-sm !default;
|
||||
$footer-heading-font-size: $font-size-sm !default;
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
// Form group
|
||||
|
||||
$form-group-margin-bottom: 1.5rem !default;
|
||||
$form-group-margin-bottom: 1.5rem !default;
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
// Form validation
|
||||
@use "sass:color";
|
||||
|
||||
$form-feedback-valid-bg: lighten($success, 15%) !default;
|
||||
$form-feedback-valid-color: theme-color("success") !default;
|
||||
$form-feedback-invalid-bg: lighten($warning, 15%) !default;
|
||||
$form-feedback-invalid-color: theme-color("warning") !default;
|
||||
$form-feedback-valid-bg: color.adjust($success, $lightness: 15%) !default;
|
||||
$form-feedback-valid-color: theme-color("success") !default;
|
||||
$form-feedback-invalid-bg: color.adjust($warning, $lightness: 15%) !default;
|
||||
$form-feedback-invalid-color: theme-color("warning") !default;
|
||||
|
||||
@ -0,0 +1 @@
|
||||
// empty
|
||||
@ -1,11 +1,9 @@
|
||||
|
||||
// Global settings
|
||||
|
||||
$enable-caret: true !default;
|
||||
$enable-rounded: true !default;
|
||||
$enable-shadows: true !default;
|
||||
$enable-gradients: false !default;
|
||||
$enable-transitions: true !default;
|
||||
$enable-grid-classes: true !default;
|
||||
$enable-print-styles: true !default;
|
||||
|
||||
$enable-caret: true !default;
|
||||
$enable-rounded: true !default;
|
||||
$enable-shadows: true !default;
|
||||
$enable-gradients: false !default;
|
||||
$enable-transitions: true !default;
|
||||
$enable-grid-classes: true !default;
|
||||
$enable-print-styles: true !default;
|
||||
|
||||
@ -11,7 +11,6 @@ $grid-breakpoints: (
|
||||
@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
|
||||
@include _assert-starts-at-zero($grid-breakpoints);
|
||||
|
||||
|
||||
// Grid containers
|
||||
//
|
||||
|
||||
// Define the maximum width of `.container` for different screen sizes.
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
|
||||
// Icons
|
||||
|
||||
$icon-size: 3rem !default;
|
||||
$icon-size-xl: 5rem !default;
|
||||
$icon-size-lg: 4rem !default;
|
||||
$icon-size-sm: 2rem !default;
|
||||
$icon-size-sm: 2rem !default;
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
// Input groups
|
||||
|
||||
$input-group-addon-color: $input-placeholder-color !default;
|
||||
$input-group-addon-bg: $input-bg !default;
|
||||
$input-group-addon-border-color: $input-border-color !default;
|
||||
|
||||
$input-group-addon-focus-color: $input-focus-color !default;
|
||||
$input-group-addon-focus-bg: $input-focus-bg !default;
|
||||
$input-group-addon-focus-border-color: $input-focus-border-color !default;
|
||||
$input-group-addon-color: $input-placeholder-color !default;
|
||||
$input-group-addon-bg: $input-bg !default;
|
||||
$input-group-addon-border-color: $input-border-color !default;
|
||||
$input-group-addon-focus-color: $input-focus-color !default;
|
||||
$input-group-addon-focus-bg: $input-focus-bg !default;
|
||||
$input-group-addon-focus-border-color: $input-focus-border-color !default;
|
||||
|
||||
@ -1,45 +1,37 @@
|
||||
// Input
|
||||
@use "sass:color";
|
||||
|
||||
$input-padding-y: $input-btn-padding-y !default;
|
||||
$input-padding-x: $input-btn-padding-x !default;
|
||||
$input-line-height: $input-btn-line-height !default;
|
||||
$input-padding-y: $input-btn-padding-y !default;
|
||||
$input-padding-x: $input-btn-padding-x !default;
|
||||
$input-line-height: $input-btn-line-height !default;
|
||||
$input-padding-y-sm: $input-btn-padding-y-sm !default;
|
||||
$input-padding-x-sm: $input-btn-padding-x-sm !default;
|
||||
$input-line-height-sm: $input-btn-line-height-sm !default;
|
||||
$input-padding-y-lg: $input-btn-padding-y-lg !default;
|
||||
$input-padding-x-lg: $input-btn-padding-x-lg !default;
|
||||
$input-line-height-lg: $input-btn-line-height-lg !default;
|
||||
$input-border-radius: $border-radius !default;
|
||||
$input-border-radius-xl: $border-radius-xl !default;
|
||||
$input-border-radius-lg: $border-radius-lg !default;
|
||||
$input-border-radius-sm: $border-radius-sm !default;
|
||||
$input-bg: $white !default;
|
||||
$input-disabled-bg: $gray-200 !default;
|
||||
$input-muted-bg: #f7fafe !default;
|
||||
$input-focus-muted-bg: color.adjust($input-muted-bg, $lightness: 1%) !default;
|
||||
$input-alternative-box-shadow: 0 1px 3px rgb(50 50 93 / 15%), 0 1px 0 rgb(0 0 0 / 2%) !default;
|
||||
$input-focus-alternative-box-shadow: 0 4px 6px rgb(50 50 93 / 11%),0 1px 3px rgb(0 0 0 / 8%) !default;
|
||||
$input-color: $gray-600 !default;
|
||||
$input-border-color: #cad1d7 !default;
|
||||
$input-border-width: $input-btn-border-width !default;
|
||||
$input-box-shadow: none !default; // 0 1px 3px 0 $gray-400 !default;
|
||||
|
||||
$input-padding-y-sm: $input-btn-padding-y-sm !default;
|
||||
$input-padding-x-sm: $input-btn-padding-x-sm !default;
|
||||
$input-line-height-sm: $input-btn-line-height-sm !default;
|
||||
$input-focus-bg: $white !default;
|
||||
$input-focus-border-color: rgb(50 151 211 / 25%) !default;
|
||||
$input-focus-color: $input-color !default;
|
||||
$input-focus-width: 0 !default;
|
||||
$input-focus-box-shadow: none !default; // 0 1px 3px 0 $gray-500 !default;
|
||||
|
||||
$input-padding-y-lg: $input-btn-padding-y-lg !default;
|
||||
$input-padding-x-lg: $input-btn-padding-x-lg !default;
|
||||
$input-line-height-lg: $input-btn-line-height-lg !default;
|
||||
|
||||
$input-border-radius: $border-radius !default;
|
||||
$input-border-radius-xl: $border-radius-xl !default;
|
||||
$input-border-radius-lg: $border-radius-lg !default;
|
||||
$input-border-radius-sm: $border-radius-sm !default;
|
||||
|
||||
$input-bg: $white !default;
|
||||
$input-disabled-bg: $gray-200 !default;
|
||||
|
||||
$input-muted-bg: #F7FAFE !default;
|
||||
$input-focus-muted-bg: lighten($input-muted-bg, 1%) !default;
|
||||
|
||||
$input-alternative-box-shadow: 0 1px 3px rgba(50,50,93,.15), 0 1px 0 rgba(0,0,0,.02) !default;
|
||||
$input-focus-alternative-box-shadow: 0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08) !default;
|
||||
|
||||
$input-color: $gray-600 !default;
|
||||
$input-border-color: #cad1d7 !default;
|
||||
$input-border-width: $input-btn-border-width !default;
|
||||
$input-box-shadow: none !default; // 0 1px 3px 0 $gray-400 !default;
|
||||
|
||||
$input-focus-bg: $white !default;
|
||||
$input-focus-border-color: rgba(50,151,211,.25) !default;
|
||||
$input-focus-color: $input-color !default;
|
||||
$input-focus-width: 0 !default;
|
||||
$input-focus-box-shadow: none !default; //0 1px 3px 0 $gray-500 !default;
|
||||
|
||||
$input-placeholder-color: $gray-500 !default;
|
||||
$input-focus-placeholder-color: $gray-500 !default;
|
||||
|
||||
$input-height-border: $input-border-width * 2 !default;
|
||||
|
||||
$input-transition: all .2s cubic-bezier(0.68, -0.55, 0.265, 1.55) !default;
|
||||
$input-placeholder-color: $gray-500 !default;
|
||||
$input-focus-placeholder-color: $gray-500 !default;
|
||||
$input-height-border: $input-border-width * 2 !default;
|
||||
$input-transition: all 0.2s cubic-bezier(0.68, -0.55, 0.265, 1.55) !default;
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
// Links
|
||||
@use "sass:color";
|
||||
|
||||
$link-color: $primary !default;
|
||||
$link-decoration: none !default;
|
||||
$link-hover-color: darken($link-color, 15%) !default;
|
||||
$link-hover-decoration: none !default;
|
||||
$link-color: $primary !default;
|
||||
$link-decoration: none !default;
|
||||
$link-hover-color: color.adjust($link-color, $lightness: -15%) !default;
|
||||
$link-hover-decoration: none !default;
|
||||
|
||||
@ -1,23 +1,18 @@
|
||||
// List group
|
||||
|
||||
$list-group-bg: $white !default;
|
||||
$list-group-border-color: $border-color !default; //rgba($black, .125);
|
||||
$list-group-border-width: $border-width !default;
|
||||
$list-group-border-radius: $border-radius !default;
|
||||
|
||||
$list-group-item-padding-y: 1rem !default;
|
||||
$list-group-item-padding-x: 1rem !default;
|
||||
|
||||
$list-group-hover-bg: $gray-100 !default;
|
||||
$list-group-active-color: $component-active-color !default;
|
||||
$list-group-active-bg: $component-active-bg !default;
|
||||
$list-group-active-border-color: $list-group-active-bg !default;
|
||||
|
||||
$list-group-disabled-color: $gray-600 !default;
|
||||
$list-group-disabled-bg: $list-group-bg !default;
|
||||
|
||||
$list-group-action-color: $gray-700 !default;
|
||||
$list-group-action-hover-color: $list-group-action-color !default;
|
||||
|
||||
$list-group-action-active-color: $list-group-action-color !default;
|
||||
$list-group-action-active-bg: $gray-200 !default;
|
||||
$list-group-bg: $white !default;
|
||||
$list-group-border-color: $border-color !default; // rgba($black, .125);
|
||||
$list-group-border-width: $border-width !default;
|
||||
$list-group-border-radius: $border-radius !default;
|
||||
$list-group-item-padding-y: 1rem !default;
|
||||
$list-group-item-padding-x: 1rem !default;
|
||||
$list-group-hover-bg: $gray-100 !default;
|
||||
$list-group-active-color: $component-active-color !default;
|
||||
$list-group-active-bg: $component-active-bg !default;
|
||||
$list-group-active-border-color: $list-group-active-bg !default;
|
||||
$list-group-disabled-color: $gray-600 !default;
|
||||
$list-group-disabled-bg: $list-group-bg !default;
|
||||
$list-group-action-color: $gray-700 !default;
|
||||
$list-group-action-hover-color: $list-group-action-color !default;
|
||||
$list-group-action-active-color: $list-group-action-color !default;
|
||||
$list-group-action-active-bg: $gray-200 !default;
|
||||
|
||||
@ -1,24 +1,20 @@
|
||||
// Modals
|
||||
|
||||
$modal-inner-padding: 1.5rem !default;
|
||||
|
||||
$modal-lg: 800px !default;
|
||||
$modal-md: 500px !default;
|
||||
$modal-sm: 380px !default;
|
||||
|
||||
$modal-title-line-height: 1.1;
|
||||
|
||||
$modal-content-bg: $white !default;
|
||||
$modal-content-border-color: rgba($black, .2) !default;
|
||||
$modal-content-border-width: 0 !default;
|
||||
$modal-content-border-radius: $border-radius-lg !default;
|
||||
$modal-content-box-shadow-xs: 0 15px 35px rgba(50,50,93,.2), 0 5px 15px rgba(0,0,0,.17);
|
||||
$modal-content-box-shadow-sm-up: 0 15px 35px rgba(50,50,93,.2), 0 5px 15px rgba(0,0,0,.17);
|
||||
|
||||
$modal-backdrop-bg: $black !default;
|
||||
$modal-backdrop-opacity: .16 !default;
|
||||
$modal-header-border-color: $gray-200 !default;
|
||||
$modal-footer-border-color: $modal-header-border-color !default;
|
||||
$modal-header-border-width: $modal-content-border-width !default;
|
||||
$modal-footer-border-width: $modal-header-border-width !default;
|
||||
$modal-header-padding: 1.25rem !default;
|
||||
$modal-inner-padding: 1.5rem !default;
|
||||
$modal-lg: 800px !default;
|
||||
$modal-md: 500px !default;
|
||||
$modal-sm: 380px !default;
|
||||
$modal-title-line-height: 1.1;
|
||||
$modal-content-bg: $white !default;
|
||||
$modal-content-border-color: rgba($black, 0.2) !default;
|
||||
$modal-content-border-width: 0 !default;
|
||||
$modal-content-border-radius: $border-radius-lg !default;
|
||||
$modal-content-box-shadow-xs: 0 15px 35px rgb(50 50 93 / 20%), 0 5px 15px rgb(0 0 0 / 17%);
|
||||
$modal-content-box-shadow-sm-up: 0 15px 35px rgb(50 50 93 / 20%), 0 5px 15px rgb(0 0 0 / 17%);
|
||||
$modal-backdrop-bg: $black !default;
|
||||
$modal-backdrop-opacity: 0.16 !default;
|
||||
$modal-header-border-color: $gray-200 !default;
|
||||
$modal-footer-border-color: $modal-header-border-color !default;
|
||||
$modal-header-border-width: $modal-content-border-width !default;
|
||||
$modal-footer-border-width: $modal-header-border-width !default;
|
||||
$modal-header-padding: 1.25rem !default;
|
||||
|
||||
@ -1,49 +1,41 @@
|
||||
// Navbar
|
||||
|
||||
$navbar-transition: all .15s linear !default;
|
||||
$navbar-padding-y: 1rem !default;
|
||||
$navbar-padding-x: 1rem !default;
|
||||
|
||||
$navbar-nav-link-padding-x: 1rem !default;
|
||||
$navbar-nav-link-padding-y: 1rem !default;
|
||||
|
||||
$navbar-nav-link-font-size: .9rem !default;
|
||||
$navbar-nav-link-font-weight: 400 !default;
|
||||
$navbar-nav-link-text-transform: normal !default;
|
||||
$navbar-nav-link-letter-spacing: 0 !default;
|
||||
$navbar-nav-link-border-radius: $border-radius !default;
|
||||
|
||||
$navbar-search-width: 270px !default;
|
||||
$navbar-search-bg: transparent !default;
|
||||
|
||||
$navbar-search-border-radius: 2rem !default;
|
||||
$navbar-search-border-width: 2px !default;
|
||||
|
||||
$navbar-dark-bg: transparent !default;
|
||||
$navbar-dark-hover-bg: rgba(255, 255, 255, .1) !default;
|
||||
$navbar-dark-active-bg: rgba(255, 255, 255, .1) !default;
|
||||
$navbar-dark-color: rgba($white, .95) !default;
|
||||
$navbar-dark-hover-color: rgba($white, .65) !default;
|
||||
$navbar-dark-active-color: rgba($white, .65) !default;
|
||||
$navbar-dark-disabled-color: rgba($white, .25) !default;
|
||||
$navbar-dark-toggler-border-color: transparent !default;
|
||||
|
||||
$navbar-search-dark-border-color: rgba(255, 255, 255, .6) !default;
|
||||
$navbar-search-dark-color: rgba(255, 255, 255, .6) !default;
|
||||
$navbar-search-dark-focus-border-color: rgba(255, 255, 255, .9) !default;
|
||||
$navbar-search-dark-focus-color: rgba(255, 255, 255, .9) !default;
|
||||
|
||||
$navbar-light-bg: transparent !default;
|
||||
$navbar-light-hover-bg: rgba(0, 0, 0, .1) !default;
|
||||
$navbar-light-active-bg: rgba(0, 0, 0, .1) !default;
|
||||
$navbar-light-border-color: $gray-100 !default;
|
||||
$navbar-light-color: rgba($black, .5) !default;
|
||||
$navbar-light-hover-color: rgba($black, .7) !default;
|
||||
$navbar-light-active-color: rgba($black, .9) !default;
|
||||
$navbar-light-disabled-color: rgba($black, .3) !default;
|
||||
$navbar-transition: all 0.15s linear !default;
|
||||
$navbar-padding-y: 1rem !default;
|
||||
$navbar-padding-x: 1rem !default;
|
||||
$navbar-nav-link-padding-x: 1rem !default;
|
||||
$navbar-nav-link-padding-y: 1rem !default;
|
||||
$navbar-nav-link-font-size: 0.9rem !default;
|
||||
$navbar-nav-link-font-weight: 400 !default;
|
||||
$navbar-nav-link-text-transform: normal !default;
|
||||
$navbar-nav-link-letter-spacing: 0 !default;
|
||||
$navbar-nav-link-border-radius: $border-radius !default;
|
||||
$navbar-search-width: 270px !default;
|
||||
$navbar-search-bg: transparent !default;
|
||||
$navbar-search-border-radius: 2rem !default;
|
||||
$navbar-search-border-width: 2px !default;
|
||||
$navbar-dark-bg: transparent !default;
|
||||
$navbar-dark-hover-bg: rgb(255 255 255 / 10%) !default;
|
||||
$navbar-dark-active-bg: rgb(255 255 255 / 10%) !default;
|
||||
$navbar-dark-color: rgba($white, 0.95) !default;
|
||||
$navbar-dark-hover-color: rgba($white, 0.65) !default;
|
||||
$navbar-dark-active-color: rgba($white, 0.65) !default;
|
||||
$navbar-dark-disabled-color: rgba($white, 0.25) !default;
|
||||
$navbar-dark-toggler-border-color: transparent !default;
|
||||
$navbar-search-dark-border-color: rgb(255 255 255 / 60%) !default;
|
||||
$navbar-search-dark-color: rgb(255 255 255 / 60%) !default;
|
||||
$navbar-search-dark-focus-border-color: rgb(255 255 255 / 90%) !default;
|
||||
$navbar-search-dark-focus-color: rgb(255 255 255 / 90%) !default;
|
||||
$navbar-light-bg: transparent !default;
|
||||
$navbar-light-hover-bg: rgb(0 0 0 / 10%) !default;
|
||||
$navbar-light-active-bg: rgb(0 0 0 / 10%) !default;
|
||||
$navbar-light-border-color: $gray-100 !default;
|
||||
$navbar-light-color: rgba($black, 0.5) !default;
|
||||
$navbar-light-hover-color: rgba($black, 0.7) !default;
|
||||
$navbar-light-active-color: rgba($black, 0.9) !default;
|
||||
$navbar-light-disabled-color: rgba($black, 0.3) !default;
|
||||
$navbar-light-toggler-border-color: transparent !default;
|
||||
|
||||
$navbar-search-light-border-color: rgba(0, 0, 0, .6) !default;
|
||||
$navbar-search-light-color: rgba(0, 0, 0, .6) !default;
|
||||
$navbar-search-light-focus-border-color: rgba(0, 0, 0, .9) !default;
|
||||
$navbar-search-light-focus-color: rgba(0, 0, 0, .9) !default;
|
||||
$navbar-search-light-border-color: rgb(0 0 0 / 60%) !default;
|
||||
$navbar-search-light-color: rgb(0 0 0 / 60%) !default;
|
||||
$navbar-search-light-focus-border-color: rgb(0 0 0 / 90%) !default;
|
||||
$navbar-search-light-focus-color: rgb(0 0 0 / 90%) !default;
|
||||
|
||||
@ -1,23 +1,20 @@
|
||||
// Navs
|
||||
@use "sass:color";
|
||||
|
||||
$nav-link-padding-y: .25rem !default;
|
||||
$nav-link-padding-x: .75rem !default;
|
||||
$nav-link-color: $gray-700 !default;
|
||||
$nav-link-hover-color: theme-color("primary") !default;
|
||||
$nav-link-disabled-color: $gray-600 !default;
|
||||
|
||||
$nav-pills-padding-y: .75rem !default;
|
||||
$nav-pills-padding-x: 1rem !default;
|
||||
|
||||
$nav-pills-space-x: 1rem !default;
|
||||
|
||||
$nav-pills-bg: $white !default;
|
||||
$nav-pills-border-width: 1px !default;
|
||||
$nav-pills-border-color: theme-color("primary") !default;
|
||||
$nav-pills-border-radius: $border-radius !default;
|
||||
|
||||
$nav-pills-link-color: theme-color("primary") !default;
|
||||
$nav-pills-link-hover-color: darken(theme-color("primary"), 5%) !default;
|
||||
$nav-pills-link-active-color: color-yiq(theme-color("primary")) !default;
|
||||
$nav-pills-link-active-bg: theme-color("primary") !default;
|
||||
$nav-pills-box-shadow: $btn-box-shadow !default;
|
||||
$nav-link-padding-y: 0.25rem !default;
|
||||
$nav-link-padding-x: 0.75rem !default;
|
||||
$nav-link-color: $gray-700 !default;
|
||||
$nav-link-hover-color: theme-color("primary") !default;
|
||||
$nav-link-disabled-color: $gray-600 !default;
|
||||
$nav-pills-padding-y: 0.75rem !default;
|
||||
$nav-pills-padding-x: 1rem !default;
|
||||
$nav-pills-space-x: 1rem !default;
|
||||
$nav-pills-bg: $white !default;
|
||||
$nav-pills-border-width: 1px !default;
|
||||
$nav-pills-border-color: theme-color("primary") !default;
|
||||
$nav-pills-border-radius: $border-radius !default;
|
||||
$nav-pills-link-color: theme-color("primary") !default;
|
||||
$nav-pills-link-hover-color: color.adjust(theme-color("primary"), $lightness: -5%) !default;
|
||||
$nav-pills-link-active-color: color-yiq(theme-color("primary")) !default;
|
||||
$nav-pills-link-active-bg: theme-color("primary") !default;
|
||||
$nav-pills-box-shadow: $btn-box-shadow !default;
|
||||
|
||||
@ -1,17 +1,14 @@
|
||||
// No UI Slider
|
||||
|
||||
$noui-target-bg: #eceeef !default;
|
||||
$noui-target-thickness: 5px !default;
|
||||
$noui-target-border-radius: 5px !default;
|
||||
$noui-target-border-color: 0 !default;
|
||||
$noui-target-box-shadow: inset 0 1px 2px rgba(90,97,105,.1) !default;
|
||||
|
||||
$noui-slider-connect-bg: $primary !default;
|
||||
$noui-target-bg: #eceeef !default;
|
||||
$noui-target-thickness: 5px !default;
|
||||
$noui-target-border-radius: 5px !default;
|
||||
$noui-target-border-color: 0 !default;
|
||||
$noui-target-box-shadow: inset 0 1px 2px rgb(90 97 105 / 10%) !default;
|
||||
$noui-slider-connect-bg: $primary !default;
|
||||
$noui-slider-connect-disabled-bg: #b2b2b2 !default;
|
||||
|
||||
$noui-handle-width: 15px !default;
|
||||
$noui-handle-bg: theme-color("primary") !default;
|
||||
$noui-handle-border: 0 !default;
|
||||
$noui-handle-border-radius: 100% !default;
|
||||
|
||||
$noui-origin-border-radius: 2px !default;
|
||||
$noui-handle-width: 15px !default;
|
||||
$noui-handle-bg: theme-color("primary") !default;
|
||||
$noui-handle-border: 0 !default;
|
||||
$noui-handle-border-radius: 100% !default;
|
||||
$noui-origin-border-radius: 2px !default;
|
||||
|
||||
@ -8,22 +8,20 @@
|
||||
// $pagination-padding-x-lg: 1.5rem !default;
|
||||
// $pagination-line-height: 1.25 !default;
|
||||
|
||||
$pagination-color: $gray-600 !default;
|
||||
$pagination-bg: $white !default;
|
||||
$pagination-border-width: $border-width !default;
|
||||
$pagination-border-color: $gray-300 !default;
|
||||
$pagination-color: $gray-600 !default;
|
||||
$pagination-bg: $white !default;
|
||||
$pagination-border-width: $border-width !default;
|
||||
$pagination-border-color: $gray-300 !default;
|
||||
|
||||
//$pagination-focus-box-shadow: $btn-hover-box-shadow !default;
|
||||
// $pagination-focus-box-shadow: $btn-hover-box-shadow !default;
|
||||
|
||||
$pagination-hover-color: $gray-600 !default;
|
||||
$pagination-hover-bg: $gray-300 !default;
|
||||
$pagination-hover-border-color: $gray-300 !default;
|
||||
|
||||
$pagination-active-color: $component-active-color !default;
|
||||
$pagination-active-bg: $component-active-bg !default;
|
||||
$pagination-active-border-color: $pagination-active-bg !default;
|
||||
$pagination-active-box-shadow: $btn-hover-box-shadow !default;
|
||||
|
||||
$pagination-disabled-color: $gray-600 !default;
|
||||
$pagination-disabled-bg: $white !default;
|
||||
$pagination-disabled-border-color: $gray-300 !default;
|
||||
$pagination-hover-color: $gray-600 !default;
|
||||
$pagination-hover-bg: $gray-300 !default;
|
||||
$pagination-hover-border-color: $gray-300 !default;
|
||||
$pagination-active-color: $component-active-color !default;
|
||||
$pagination-active-bg: $component-active-bg !default;
|
||||
$pagination-active-border-color: $pagination-active-bg !default;
|
||||
$pagination-active-box-shadow: $btn-hover-box-shadow !default;
|
||||
$pagination-disabled-color: $gray-600 !default;
|
||||
$pagination-disabled-bg: $white !default;
|
||||
$pagination-disabled-border-color: $gray-300 !default;
|
||||
|
||||
@ -1,24 +1,20 @@
|
||||
// Popovers
|
||||
|
||||
$popover-font-size: $font-size-sm !default;
|
||||
$popover-bg: $white !default;
|
||||
$popover-max-width: 276px !default;
|
||||
$popover-border-width: 1px !default;
|
||||
$popover-border-color: rgba($black, .05) !default;
|
||||
$popover-border-radius: $border-radius-lg !default;
|
||||
$popover-box-shadow: 0px .5rem 2rem 0px rgba($black, .2) !default;
|
||||
|
||||
$popover-header-bg: $popover-bg !default;
|
||||
$popover-header-color: $headings-color !default;
|
||||
$popover-header-padding-y: .5rem !default;
|
||||
$popover-header-padding-x: .95rem !default;
|
||||
|
||||
$popover-body-color: $body-color !default;
|
||||
$popover-body-padding-y: $popover-header-padding-y !default;
|
||||
$popover-body-padding-x: $popover-header-padding-x !default;
|
||||
|
||||
$popover-arrow-width: 1.5rem !default;
|
||||
$popover-arrow-height: .75rem !default;
|
||||
$popover-arrow-color: $popover-bg !default;
|
||||
|
||||
$popover-arrow-outer-color: transparent !default;
|
||||
$popover-font-size: $font-size-sm !default;
|
||||
$popover-bg: $white !default;
|
||||
$popover-max-width: 276px !default;
|
||||
$popover-border-width: 1px !default;
|
||||
$popover-border-color: rgba($black, 0.05) !default;
|
||||
$popover-border-radius: $border-radius-lg !default;
|
||||
$popover-box-shadow: 0 0.5rem 2rem 0 rgba($black, 0.2) !default;
|
||||
$popover-header-bg: $popover-bg !default;
|
||||
$popover-header-color: $headings-color !default;
|
||||
$popover-header-padding-y: 0.5rem !default;
|
||||
$popover-header-padding-x: 0.95rem !default;
|
||||
$popover-body-color: $body-color !default;
|
||||
$popover-body-padding-y: $popover-header-padding-y !default;
|
||||
$popover-body-padding-x: $popover-header-padding-x !default;
|
||||
$popover-arrow-width: 1.5rem !default;
|
||||
$popover-arrow-height: 0.75rem !default;
|
||||
$popover-arrow-color: $popover-bg !default;
|
||||
$popover-arrow-outer-color: transparent !default;
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
// Body
|
||||
|
||||
|
||||
$body-bg: #f8f9fe !default;
|
||||
$body-color: $gray-700 !default;
|
||||
|
||||
@ -1,37 +1,42 @@
|
||||
|
||||
// Spacing
|
||||
@use "sass:map";
|
||||
|
||||
$spacer: 1rem !default;
|
||||
$spacers: () !default;
|
||||
$spacers: map-merge((
|
||||
-9: -($spacer * 10),
|
||||
-8: -($spacer * 8),
|
||||
-7: -($spacer * 6),
|
||||
-6: -($spacer * 4.5),
|
||||
-5: -($spacer * 3),
|
||||
-4: -($spacer * 1.5),
|
||||
-3: -$spacer,
|
||||
-2: -($spacer * .5),
|
||||
-1: -($spacer * .25),
|
||||
0: 0,
|
||||
1: ($spacer * .25),
|
||||
2: ($spacer * .5),
|
||||
3: $spacer,
|
||||
4: ($spacer * 1.5),
|
||||
5: ($spacer * 3),
|
||||
6: ($spacer * 4.5),
|
||||
7: ($spacer * 6),
|
||||
8: ($spacer * 8),
|
||||
9: ($spacer * 10)
|
||||
), $spacers);
|
||||
|
||||
$spacers: map.merge(
|
||||
(
|
||||
-9: - ($spacer * 10),
|
||||
-8: - ($spacer * 8),
|
||||
-7: - ($spacer * 6),
|
||||
-6: - ($spacer * 4.5),
|
||||
-5: - ($spacer * 3),
|
||||
-4: - ($spacer * 1.5),
|
||||
-3: - $spacer,
|
||||
-2: - ($spacer * 0.5),
|
||||
-1: - ($spacer * 0.25),
|
||||
0: 0,
|
||||
1: ($spacer * 0.25),
|
||||
2: ($spacer * 0.5),
|
||||
3: $spacer,
|
||||
4: ($spacer * 1.5),
|
||||
5: ($spacer * 3),
|
||||
6: ($spacer * 4.5),
|
||||
7: ($spacer * 6),
|
||||
8: ($spacer * 8),
|
||||
9: ($spacer * 10)
|
||||
),
|
||||
$spacers
|
||||
);
|
||||
|
||||
// This variable affects the `.h-*` and `.w-*` classes.
|
||||
|
||||
$sizes: () !default;
|
||||
$sizes: map-merge((
|
||||
25: 25%,
|
||||
50: 50%,
|
||||
75: 75%,
|
||||
100: 100%
|
||||
), $sizes);
|
||||
$sizes: map.merge(
|
||||
(
|
||||
25: 25%,
|
||||
50: 50%,
|
||||
75: 75%,
|
||||
100: 100%
|
||||
),
|
||||
$sizes
|
||||
);
|
||||
|
||||
@ -1,32 +1,26 @@
|
||||
// Tables
|
||||
@use "sass:color";
|
||||
|
||||
$table-cell-padding: 1rem !default;
|
||||
$table-cell-padding-sm: .5rem !default;
|
||||
|
||||
$table-bg: transparent !default;
|
||||
$table-accent-bg: rgba($black, .05) !default;
|
||||
$table-hover-bg: $gray-100 !default;
|
||||
$table-active-bg: $table-hover-bg !default;
|
||||
|
||||
$table-border-width: $border-width !default;
|
||||
$table-border-color: $gray-200 !default;
|
||||
|
||||
$table-head-bg: $gray-100 !default;
|
||||
$table-head-color: $gray-600 !default;
|
||||
$table-head-spacer-y: .75rem !default;
|
||||
|
||||
$table-head-font-size: .65rem !default;
|
||||
$table-head-font-weight: $font-weight-bold !default;
|
||||
$table-head-text-transform: uppercase !default;
|
||||
$table-head-letter-spacing: 1px !default;
|
||||
|
||||
$table-body-font-size: .8125rem !default;
|
||||
|
||||
$table-dark-bg: theme-color("default") !default;
|
||||
$table-dark-accent-bg: rgba($white, .05) !default;
|
||||
$table-dark-hover-bg: rgba($white, .075) !default;
|
||||
$table-dark-border-color: lighten(theme-color("default"), 7%) !default;
|
||||
$table-dark-color: $body-bg !default;
|
||||
|
||||
$table-dark-head-bg: lighten(theme-color("default"), 4%) !default;
|
||||
$table-dark-head-color: lighten(theme-color("default"), 35%) !default;
|
||||
$table-cell-padding: 1rem !default;
|
||||
$table-cell-padding-sm: 0.5rem !default;
|
||||
$table-bg: transparent !default;
|
||||
$table-accent-bg: rgba($black, 0.05) !default;
|
||||
$table-hover-bg: $gray-100 !default;
|
||||
$table-active-bg: $table-hover-bg !default;
|
||||
$table-border-width: $border-width !default;
|
||||
$table-border-color: $gray-200 !default;
|
||||
$table-head-bg: $gray-100 !default;
|
||||
$table-head-color: $gray-600 !default;
|
||||
$table-head-spacer-y: 0.75rem !default;
|
||||
$table-head-font-size: 0.65rem !default;
|
||||
$table-head-font-weight: $font-weight-bold !default;
|
||||
$table-head-text-transform: uppercase !default;
|
||||
$table-head-letter-spacing: 1px !default;
|
||||
$table-body-font-size: 0.8125rem !default;
|
||||
$table-dark-bg: theme-color("default") !default;
|
||||
$table-dark-accent-bg: rgba($white, 0.05) !default;
|
||||
$table-dark-hover-bg: rgba($white, 0.075) !default;
|
||||
$table-dark-border-color: color.adjust(theme-color("default"), $lightness: 7%) !default;
|
||||
$table-dark-color: $body-bg !default;
|
||||
$table-dark-head-bg: color.adjust(theme-color("default"), $lightness: 4%) !default;
|
||||
$table-dark-head-color: color.adjust(theme-color("default"), $lightness: 35%) !default;
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
// Tooltips
|
||||
|
||||
$tooltip-font-size: $font-size-sm !default;
|
||||
$tooltip-font-size: $font-size-sm !default;
|
||||
|
||||
@ -1,15 +1,12 @@
|
||||
// Vertical navbar
|
||||
|
||||
$navbar-vertical-box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15) !important;
|
||||
$navbar-vertical-box-shadow: 0 0 2rem 0 rgb(136 152 170 / 15%) !important;
|
||||
$navbar-vertical-width: 250px !default;
|
||||
$navbar-vertical-padding-x: 1.5rem !default;
|
||||
$navbar-vertical-nav-link-padding-x: 1.5rem !default;
|
||||
$navbar-vertical-nav-link-padding-y: .65rem !default;
|
||||
|
||||
$navbar-vertical-nav-link-padding-x: 1.5rem !default;
|
||||
$navbar-vertical-nav-link-padding-y: 0.65rem !default;
|
||||
$navbar-icon-min-width: 2.25rem !default;
|
||||
|
||||
$navbar-breadcrumb-padding-y: $nav-link-padding-y !default;
|
||||
$navbar-breadcrumb-padding-x: 0 !default;
|
||||
|
||||
$navbar-light-bg: $white !default;
|
||||
$navbar-light-border-color: $border-color !default;
|
||||
|
||||
@ -1,14 +1,13 @@
|
||||
|
||||
// Bootstrap (4.5.3) functions
|
||||
|
||||
@import "~bootstrap/scss/functions";
|
||||
|
||||
@import "custom/variables";
|
||||
// @import "~bootstrap/scss/variables"; wird am
|
||||
|
||||
// @import "~bootstrap/scss/variables"; wird am
|
||||
// ende der custom/variables angehangen
|
||||
|
||||
|
||||
// Bootstrap (4.5.3) mixins
|
||||
@import "~bootstrap/scss/mixins";
|
||||
@import "~bootstrap/scss/mixins";
|
||||
|
||||
// Bootstrap (4.5.3) components
|
||||
|
||||
@ -22,13 +21,16 @@
|
||||
@import "~bootstrap/scss/close";
|
||||
@import "~bootstrap/scss/code";
|
||||
@import "~bootstrap/scss/custom-forms";
|
||||
@import "~bootstrap/scss/dropdown";
|
||||
|
||||
// @import "~bootstrap/scss/dropdown";
|
||||
@import "~bootstrap/scss/forms";
|
||||
@import "~bootstrap/scss/functions";
|
||||
|
||||
// @import "~bootstrap/scss/functions";
|
||||
@import "~bootstrap/scss/grid";
|
||||
@import "~bootstrap/scss/input-group";
|
||||
@import "~bootstrap/scss/list-group";
|
||||
@import "~bootstrap/scss/mixins";
|
||||
|
||||
// @import "~bootstrap/scss/mixins";
|
||||
@import "~bootstrap/scss/modal";
|
||||
@import "~bootstrap/scss/nav";
|
||||
@import "~bootstrap/scss/navbar";
|
||||
@ -48,94 +50,161 @@
|
||||
@import "~bootstrap/scss/bootstrap";
|
||||
|
||||
// Bootstrap-vue (2.21.1) scss
|
||||
@import '~bootstrap-vue/src/index.scss';
|
||||
|
||||
@import "~bootstrap-vue/src/index";
|
||||
|
||||
.alert-success {
|
||||
color: #155724;
|
||||
background-color: #d4edda;
|
||||
border-color: #c3e6cb;
|
||||
}
|
||||
.alert-danger {
|
||||
color: #721c24;
|
||||
background-color: #f8d7da;
|
||||
border-color: #f5c6cb;
|
||||
color: #155724;
|
||||
background-color: #d4edda;
|
||||
border-color: #c3e6cb;
|
||||
}
|
||||
|
||||
.alert-danger {
|
||||
color: #721c24;
|
||||
background-color: #f8d7da;
|
||||
border-color: #f5c6cb;
|
||||
}
|
||||
|
||||
.b-toast-danger .toast .toast-header {
|
||||
color: #721c24;
|
||||
background-color: rgba(248,215,218,.85);
|
||||
border-bottom-color: rgba(245,198,203,.85);
|
||||
color: #721c24;
|
||||
background-color: rgb(248 215 218 / 85%);
|
||||
border-bottom-color: rgb(245 198 203 / 85%);
|
||||
}
|
||||
.b-toast-danger .toast .toast-body{
|
||||
background-color: rgba(252,237,238,.85);
|
||||
border-color: rgba(245,198,203,.85);
|
||||
color: #721c24;
|
||||
|
||||
.b-toast-danger .toast .toast-body {
|
||||
background-color: rgb(252 237 238 / 85%);
|
||||
border-color: rgb(245 198 203 / 85%);
|
||||
color: #721c24;
|
||||
}
|
||||
|
||||
.b-toast-success .toast .toast-header {
|
||||
color: #155724;
|
||||
background-color: rgba(212,237,218,.58);
|
||||
border-bottom-color: rgba(195,230,203,.85);
|
||||
}
|
||||
.b-toast-success .toast .toast-body{
|
||||
color: #155724;
|
||||
background-color: rgba(212,237,218,.85);
|
||||
border-bottom-color: rgba(195,230,203,.85);
|
||||
color: #155724;
|
||||
background-color: rgb(212 237 218 / 58%);
|
||||
border-bottom-color: rgb(195 230 203 / 85%);
|
||||
}
|
||||
|
||||
.b-toast-success .toast .toast-body {
|
||||
color: #155724;
|
||||
background-color: rgb(212 237 218 / 85%);
|
||||
border-bottom-color: rgb(195 230 203 / 85%);
|
||||
}
|
||||
|
||||
.btn-primary pim {
|
||||
background-color: #5a7b02;
|
||||
border-color: #5e72e4;
|
||||
}
|
||||
a,
|
||||
.copyright {
|
||||
color: #5a7b02;
|
||||
}
|
||||
.font1_2em {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
.font2em {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
.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;
|
||||
}
|
||||
.gradido-global-color-gray {
|
||||
color: #858383;
|
||||
}
|
||||
// .btn-primary pim {
|
||||
.btn-primary {
|
||||
background-color: #5a7b02;
|
||||
border-color: #5e72e4;
|
||||
}
|
||||
|
||||
a,
|
||||
.copyright {
|
||||
color: #5a7b02;
|
||||
}
|
||||
|
||||
.font12em {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.font2em {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
.gradido-global-color-gray {
|
||||
color: #858383;
|
||||
}
|
||||
|
||||
.gradido-custom-background {
|
||||
background-color: #ebebeba3 !important;
|
||||
}
|
||||
|
||||
.gradido-max-width {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.gradido-width-300 {
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
.gradido-absolute {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.gradido-width-95-absolute {
|
||||
width: 95%;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.gradido-width-96-absolute {
|
||||
width: 96%;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.gradido-no-border-radius {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.gradido-no-border {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.gradido-background-f1 {
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
|
||||
.gradido-background-white {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.gradido-font-large {
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
.gradido-font-15rem {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="decayinformation-decay">
|
||||
<div class="d-flex">
|
||||
<div style="width: 100%" class="text-center pb-3">
|
||||
<div class="text-center pb-3 gradido-max-width">
|
||||
<b-icon icon="droplet-half" height="12" class="mb-2" />
|
||||
<b>{{ $t('decay.calculation_decay') }}</b>
|
||||
</div>
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="decayinformation-long">
|
||||
<div class="d-flex">
|
||||
<div style="width: 100%" class="text-center pb-3">
|
||||
<div class="text-center pb-3 gradido-max-width">
|
||||
<b-icon icon="droplet-half" height="12" class="mb-2" />
|
||||
<b>{{ $t('decay.calculation_decay') }}</b>
|
||||
</div>
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
<template>
|
||||
<div class="decay-information-box">
|
||||
<decay-information-before-startblock v-if="decay.start === null" />
|
||||
<decay-information-decay-startblock
|
||||
v-else-if="isStartBlock"
|
||||
:amount="amount"
|
||||
:decay="decay"
|
||||
:typeId="typeId"
|
||||
/>
|
||||
<decay-information-long v-else :amount="amount" :decay="decay" :typeId="typeId" />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import DecayInformationLong from '../DecayInformations/DecayInformation-Long'
|
||||
import DecayInformationBeforeStartblock from '../DecayInformations/DecayInformation-BeforeStartblock'
|
||||
import DecayInformationDecayStartblock from '../DecayInformations/DecayInformation-DecayStartblock'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
DecayInformationLong,
|
||||
DecayInformationBeforeStartblock,
|
||||
DecayInformationDecayStartblock,
|
||||
},
|
||||
props: {
|
||||
amount: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
decay: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
typeId: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
decayStartBlock: {
|
||||
type: Date,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
isStartBlock() {
|
||||
return new Date(this.decay.start).getTime() === this.decayStartBlock.getTime()
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<b-row class="transaction-form">
|
||||
<b-col xl="12" md="12" class="p-0">
|
||||
<b-card class="p-0 m-0" style="background-color: #ebebeba3 !important">
|
||||
<b-card class="p-0 m-0 gradido-custom-background">
|
||||
<!-- -<QrCode @set-transaction="setTransaction"></QrCode> -->
|
||||
<validation-observer v-slot="{ handleSubmit }" ref="formValidator">
|
||||
<b-form role="form" @submit.prevent="handleSubmit(onSubmit)" @reset="onReset">
|
||||
@ -39,8 +39,7 @@
|
||||
@blur="normalizeEmail()"
|
||||
type="email"
|
||||
placeholder="E-Mail"
|
||||
style="font-size: large"
|
||||
class="pl-3"
|
||||
class="pl-3 gradido-font-large"
|
||||
:disabled="isBalanceDisabled"
|
||||
></b-form-input>
|
||||
</b-input-group>
|
||||
@ -75,8 +74,7 @@
|
||||
@focus="amountFocused = true"
|
||||
@blur="normalizeAmount(valid)"
|
||||
:placeholder="$n(0.01)"
|
||||
style="font-size: large"
|
||||
class="pl-3"
|
||||
class="pl-3 gradido-font-large"
|
||||
:disabled="isBalanceDisabled"
|
||||
></b-form-input>
|
||||
</b-input-group>
|
||||
@ -105,8 +103,7 @@
|
||||
id="input-3"
|
||||
rows="3"
|
||||
v-model="form.memo"
|
||||
class="pl-3"
|
||||
style="font-size: large"
|
||||
class="pl-3 gradido-font-large"
|
||||
:disabled="isBalanceDisabled"
|
||||
></b-form-textarea>
|
||||
</b-input-group>
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
<b-container>
|
||||
<b-row v-if="error">
|
||||
<b-col>
|
||||
<b-card class="p-0" style="background-color: #ebebeba3 !important">
|
||||
<div class="p-4" style="font-size: 1.5rem">
|
||||
<b-card class="p-0 gradido-custom-background">
|
||||
<div class="p-4 gradido-font-15rem">
|
||||
<div>{{ $t('form.sorry') }}</div>
|
||||
<hr />
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
</b-row>
|
||||
<b-row v-if="!error">
|
||||
<b-col>
|
||||
<b-card class="p-0" style="background-color: #ebebeba3 !important">
|
||||
<b-card class="p-0 gradido-custom-background">
|
||||
<div class="p-4">
|
||||
{{ $t('form.thx') }}
|
||||
<hr />
|
||||
|
||||
@ -256,7 +256,7 @@ describe('GddTransactionList', () => {
|
||||
|
||||
it('shows the date of the transaction', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-date').at(0).text()).toContain(
|
||||
'Mon Feb 28 2022 13:55:47 GMT+0000 (Coordinated Universal Time)',
|
||||
'Mon Feb 28 2022 13:55:47',
|
||||
)
|
||||
})
|
||||
|
||||
@ -286,18 +286,23 @@ describe('GddTransactionList', () => {
|
||||
it('has a bi-gift icon', () => {
|
||||
expect(transaction.findAll('svg').at(1).classes()).toEqual([
|
||||
'bi-gift',
|
||||
'gradido-global-color-accent',
|
||||
'm-mb-1',
|
||||
'font2em',
|
||||
'b-icon',
|
||||
'bi',
|
||||
'gradido-global-color-accent',
|
||||
])
|
||||
})
|
||||
|
||||
it('has gradido-global-color-accent color', () => {
|
||||
expect(transaction.findAll('svg').at(1).classes()).toContain(
|
||||
expect(transaction.findAll('svg').at(1).classes()).toEqual([
|
||||
'bi-gift',
|
||||
'm-mb-1',
|
||||
'font2em',
|
||||
'b-icon',
|
||||
'bi',
|
||||
'gradido-global-color-accent',
|
||||
)
|
||||
])
|
||||
})
|
||||
|
||||
// operators are renderd by GDD filter
|
||||
@ -321,7 +326,7 @@ describe('GddTransactionList', () => {
|
||||
|
||||
it('shows the date of the transaction', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-date').at(0).text()).toContain(
|
||||
'Fri Feb 25 2022 07:29:26 GMT+0000 (Coordinated Universal Time)',
|
||||
'Fri Feb 25 2022 07:29:26',
|
||||
)
|
||||
})
|
||||
})
|
||||
@ -348,11 +353,11 @@ describe('GddTransactionList', () => {
|
||||
it('has gradido-global-color-accent color', () => {
|
||||
expect(transaction.findAll('svg').at(1).classes()).toEqual([
|
||||
'bi-arrow-right-circle',
|
||||
'gradido-global-color-accent',
|
||||
'm-mb-1',
|
||||
'font2em',
|
||||
'b-icon',
|
||||
'bi',
|
||||
'gradido-global-color-accent',
|
||||
])
|
||||
})
|
||||
|
||||
@ -383,7 +388,7 @@ describe('GddTransactionList', () => {
|
||||
|
||||
it('shows the date of the transaction', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-date').at(0).text()).toContain(
|
||||
'Wed Feb 23 2022 10:55:30 GMT+0000 (Coordinated Universal Time)',
|
||||
'Wed Feb 23 2022 10:55:30',
|
||||
)
|
||||
})
|
||||
|
||||
@ -400,6 +405,7 @@ describe('GddTransactionList', () => {
|
||||
return {
|
||||
amount: '3.14',
|
||||
balanceDate: '2021-04-29T17:26:40+00:00',
|
||||
decay: {},
|
||||
memo: 'Kreiszahl PI',
|
||||
linkedUser: {
|
||||
firstName: 'Bibi',
|
||||
@ -418,6 +424,7 @@ describe('GddTransactionList', () => {
|
||||
transactions,
|
||||
transactionCount: 42,
|
||||
showPagination: true,
|
||||
decayStartBlock: new Date(),
|
||||
})
|
||||
paginationButtons = wrapper.find('div.pagination-buttons')
|
||||
})
|
||||
|
||||
@ -108,6 +108,10 @@ export default {
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
collaps-icon {
|
||||
width: 95%;
|
||||
position: absolute;
|
||||
}
|
||||
.el-table .cell {
|
||||
padding-left: 0px;
|
||||
padding-right: 0px;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="component-navbar" style="background-color: #fff">
|
||||
<div class="component-navbar gradido-background-white">
|
||||
<b-navbar toggleable="lg" type="light" variant="faded">
|
||||
<div class="navbar-brand">
|
||||
<b-navbar-nav @click="$emit('set-visible', false)">
|
||||
|
||||
@ -53,8 +53,8 @@ export default {
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
#component-sidebar .active,
|
||||
.component-navbar .active {
|
||||
.component-navbar .active,
|
||||
#component-sidebar .active {
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -3,12 +3,12 @@
|
||||
<div class="list-group">
|
||||
<div class="list-group-item gdt-transaction-list-item" v-b-toggle="collapseId">
|
||||
<!-- icon -->
|
||||
<div class="text-right" style="position: absolute">
|
||||
<div class="text-right gradido-absolute">
|
||||
<b-icon :icon="getLinesByType.icon" :class="getLinesByType.iconclasses"></b-icon>
|
||||
</div>
|
||||
|
||||
<!-- collaps Button -->
|
||||
<div class="text-right" style="width: 96%; position: absolute">
|
||||
<div class="text-right gradido-width-96-absolute">
|
||||
<b-icon
|
||||
:icon="getCollapseState(id) ? 'caret-up-square' : 'caret-down-square'"
|
||||
:class="getCollapseState(id) ? 'text-black' : 'text-muted'"
|
||||
|
||||
@ -1,8 +1,5 @@
|
||||
<template>
|
||||
<div
|
||||
class="gdt-transaction-collapse p-2 pt-4 pb-4 mb-4"
|
||||
style="border: 0px; background-color: #f1f1f1"
|
||||
>
|
||||
<div class="gdt-transaction-collapse p-2 pt-4 pb-4 mb-4 gradido-no-border gradido-background-f1">
|
||||
<b-row class="gdt-list-collapse-header-text text-center pb-3">
|
||||
<b-col class="collapse-headline">
|
||||
<b>{{ getLinesByType.headline }}</b>
|
||||
|
||||
44
frontend/src/components/TransactionRows/AmountAndNameRow.vue
Normal file
44
frontend/src/components/TransactionRows/AmountAndNameRow.vue
Normal file
@ -0,0 +1,44 @@
|
||||
<template>
|
||||
<div class="amount-and-name-row">
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<span class="gdd-transaction-list-item-amount">
|
||||
{{ amount | GDD }}
|
||||
</span>
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-name">
|
||||
{{ itemText }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'AmountAndNameRow',
|
||||
props: {
|
||||
amount: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
linkedUser: {
|
||||
type: Object,
|
||||
required: false,
|
||||
},
|
||||
text: {
|
||||
type: String,
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
itemText() {
|
||||
return this.linkedUser
|
||||
? this.linkedUser.firstName + ' ' + this.linkedUser.lastName
|
||||
: this.text
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
19
frontend/src/components/TransactionRows/CollapseIcon.vue
Normal file
19
frontend/src/components/TransactionRows/CollapseIcon.vue
Normal file
@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<div class="collapse-icon">
|
||||
<b-icon
|
||||
:icon="visible ? 'caret-up-square' : 'caret-down-square'"
|
||||
:class="visible ? 'text-black' : 'text-muted'"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'CollapseIcon',
|
||||
props: {
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
26
frontend/src/components/TransactionRows/DateRow.vue
Normal file
26
frontend/src/components/TransactionRows/DateRow.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<div class="date-row">
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">{{ $t('form.date') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-date">
|
||||
{{ $d(new Date(balanceDate), 'long') }}
|
||||
{{ $i18n.locale === 'de' ? 'Uhr' : '' }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'DateRow',
|
||||
props: {
|
||||
balanceDate: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
31
frontend/src/components/TransactionRows/DecayRow.vue
Normal file
31
frontend/src/components/TransactionRows/DecayRow.vue
Normal file
@ -0,0 +1,31 @@
|
||||
<template>
|
||||
<div class="decay-row">
|
||||
<b-row v-if="decay">
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<b-icon icon="droplet-half" height="15" class="mb-1" />
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-decay">
|
||||
<decay-information-short decaytyp="short" :decay="decay" />
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import DecayInformationShort from '../DecayInformations/DecayInformation-Short'
|
||||
export default {
|
||||
name: 'DecayRow',
|
||||
components: {
|
||||
DecayInformationShort,
|
||||
},
|
||||
props: {
|
||||
decay: {
|
||||
type: Object,
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
23
frontend/src/components/TransactionRows/MemoRow.vue
Normal file
23
frontend/src/components/TransactionRows/MemoRow.vue
Normal file
@ -0,0 +1,23 @@
|
||||
<template>
|
||||
<div class="memo-row">
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">{{ $t('form.memo') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-message">{{ memo }}</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'MemoRow',
|
||||
props: {
|
||||
memo: {
|
||||
type: String,
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
22
frontend/src/components/TransactionRows/TypeIcon.vue
Normal file
22
frontend/src/components/TransactionRows/TypeIcon.vue
Normal file
@ -0,0 +1,22 @@
|
||||
<template>
|
||||
<div class="type-icon">
|
||||
<div class="gdd-transaction-list-item-icon">
|
||||
<b-icon :icon="icon" :class="color" class="m-mb-1 font2em" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
name: 'TypeIcon',
|
||||
props: {
|
||||
icon: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
color: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -2,105 +2,60 @@
|
||||
<div class="transaction-slot-creation">
|
||||
<div @click="visible = !visible">
|
||||
<!-- Collaps Icon -->
|
||||
<div class="text-right" style="width: 95%; position: absolute">
|
||||
<b-icon
|
||||
:icon="visible ? 'caret-up-square' : 'caret-down-square'"
|
||||
:class="visible ? 'text-black' : 'text-muted'"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<collapse-icon class="text-right" :visible="visible" />
|
||||
<div>
|
||||
<b-row>
|
||||
<!-- ICON -->
|
||||
<b-col cols="1">
|
||||
<div class="gdd-transaction-list-item-icon">
|
||||
<b-icon icon="gift" class="gradido-global-color-accent m-mb-1 font2em" />
|
||||
</div>
|
||||
<type-icon color="gradido-global-color-accent" icon="gift" />
|
||||
</b-col>
|
||||
|
||||
<b-col cols="11">
|
||||
<!-- Betrag / Name Email -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<span class="gdd-transaction-list-item-amount">
|
||||
{{ amount | GDD }}
|
||||
</span>
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-name">
|
||||
{{ linkedUser.firstName + ' ' + linkedUser.lastName }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<!-- Amount / Name || Text -->
|
||||
<amount-and-name-row :amount="amount" :linkedUser="linkedUser" />
|
||||
|
||||
<!-- Nachricht Memo -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">{{ $t('form.memo') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-message">{{ memo }}</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<memo-row :memo="memo" />
|
||||
|
||||
<!-- Datum -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">{{ $t('form.date') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-date">
|
||||
{{ $d(new Date(balanceDate), 'long') }}
|
||||
{{ $i18n.locale === 'de' ? 'Uhr' : '' }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<date-row :balanceDate="balanceDate" />
|
||||
|
||||
<!-- Decay -->
|
||||
<b-row v-if="decay">
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<b-icon icon="droplet-half" height="15" class="mb-1" />
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-decay">
|
||||
<decay-information-short decaytyp="short" :decay="decay" />
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<decay-row :decay="decay" />
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
|
||||
<b-collapse :class="visible ? 'bg-secondary' : ''" class="pb-4 pt-5" v-model="visible">
|
||||
<decay-information-before-startblock v-if="decay.start === null" />
|
||||
<decay-information-decay-startblock
|
||||
v-else-if="isStartBlock"
|
||||
:amount="amount"
|
||||
:decay="decay"
|
||||
<decay-information
|
||||
:typeId="typeId"
|
||||
:decay="decay"
|
||||
:amount="amount"
|
||||
:decayStartBlock="decayStartBlock"
|
||||
/>
|
||||
<decay-information-long v-else :amount="amount" :decay="decay" :typeId="typeId" />
|
||||
</b-collapse>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import DecayInformationShort from '../DecayInformations/DecayInformation-Short'
|
||||
import DecayInformationLong from '../DecayInformations/DecayInformation-Long'
|
||||
import DecayInformationBeforeStartblock from '../DecayInformations/DecayInformation-BeforeStartblock'
|
||||
import DecayInformationDecayStartblock from '../DecayInformations/DecayInformation-DecayStartblock'
|
||||
import CollapseIcon from '../TransactionRows/CollapseIcon'
|
||||
import TypeIcon from '../TransactionRows/TypeIcon'
|
||||
import AmountAndNameRow from '../TransactionRows/AmountAndNameRow'
|
||||
import MemoRow from '../TransactionRows/MemoRow'
|
||||
import DateRow from '../TransactionRows/DateRow'
|
||||
import DecayRow from '../TransactionRows/DecayRow'
|
||||
import DecayInformation from '../DecayInformations/DecayInformation'
|
||||
|
||||
export default {
|
||||
name: 'slot-creation',
|
||||
components: {
|
||||
DecayInformationShort,
|
||||
DecayInformationLong,
|
||||
DecayInformationBeforeStartblock,
|
||||
DecayInformationDecayStartblock,
|
||||
CollapseIcon,
|
||||
TypeIcon,
|
||||
AmountAndNameRow,
|
||||
MemoRow,
|
||||
DateRow,
|
||||
DecayRow,
|
||||
DecayInformation,
|
||||
},
|
||||
props: {
|
||||
amount: {
|
||||
|
||||
@ -2,38 +2,20 @@
|
||||
<div class="transaction-slot-decay">
|
||||
<div @click="visible = !visible">
|
||||
<!-- Collaps Icon -->
|
||||
<div class="text-right" style="width: 95%; position: absolute">
|
||||
<b-icon
|
||||
:icon="visible ? 'caret-up-square' : 'caret-down-square'"
|
||||
:class="visible ? 'text-black' : 'text-muted'"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<collapse-icon class="text-right" :visible="visible" />
|
||||
<div>
|
||||
<b-row>
|
||||
<!-- ICON -->
|
||||
<b-col cols="1">
|
||||
<div class="gdd-transaction-list-item-icon">
|
||||
<b-icon icon="droplet-half" class="gradido-global-color-gray m-mb-1 font2em" />
|
||||
</div>
|
||||
<type-icon color="gradido-global-color-gray" icon="droplet-half" />
|
||||
</b-col>
|
||||
|
||||
<b-col cols="11">
|
||||
<!-- Betrag / Name Email -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<span class="gdd-transaction-list-item-amount">
|
||||
{{ amount | GDD }}
|
||||
</span>
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-name">
|
||||
{{ $t('decay.decay_since_last_transaction') }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<!-- Amount / Name || Text -->
|
||||
<amount-and-name-row
|
||||
:amount="amount"
|
||||
:text="$t('decay.decay_since_last_transaction')"
|
||||
/>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
@ -45,11 +27,17 @@
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import CollapseIcon from '../TransactionRows/CollapseIcon'
|
||||
import TypeIcon from '../TransactionRows/TypeIcon'
|
||||
import AmountAndNameRow from '../TransactionRows/AmountAndNameRow'
|
||||
import DecayInformationDecay from '../DecayInformations/DecayInformation-Decay'
|
||||
|
||||
export default {
|
||||
name: 'slot-decay',
|
||||
components: {
|
||||
CollapseIcon,
|
||||
TypeIcon,
|
||||
AmountAndNameRow,
|
||||
DecayInformationDecay,
|
||||
},
|
||||
props: {
|
||||
@ -59,18 +47,9 @@ export default {
|
||||
balance: {
|
||||
type: String,
|
||||
},
|
||||
balanceDate: {
|
||||
type: String,
|
||||
},
|
||||
decay: {
|
||||
type: Object,
|
||||
},
|
||||
id: {
|
||||
type: Number,
|
||||
},
|
||||
typeId: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@ -2,108 +2,61 @@
|
||||
<div class="transaction-slot-receive">
|
||||
<div @click="visible = !visible">
|
||||
<!-- Collaps Icon -->
|
||||
<div class="text-right" style="width: 95%; position: absolute">
|
||||
<b-icon
|
||||
:icon="visible ? 'caret-up-square' : 'caret-down-square'"
|
||||
:class="visible ? 'text-black' : 'text-muted'"
|
||||
/>
|
||||
</div>
|
||||
<collapse-icon class="text-right" :visible="visible" />
|
||||
|
||||
<div>
|
||||
<b-row>
|
||||
<!-- ICON -->
|
||||
<b-col cols="1">
|
||||
<div class="gdd-transaction-list-item-icon">
|
||||
<b-icon
|
||||
icon="arrow-right-circle"
|
||||
class="gradido-global-color-accent m-mb-1 font2em"
|
||||
/>
|
||||
</div>
|
||||
<type-icon color="gradido-global-color-accent" icon="arrow-right-circle" />
|
||||
</b-col>
|
||||
|
||||
<b-col cols="11">
|
||||
<!-- Betrag / Name Email -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<span class="gdd-transaction-list-item-amount">
|
||||
{{ amount | GDD }}
|
||||
</span>
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-name">
|
||||
{{ linkedUser.firstName + ' ' + linkedUser.lastName }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<!-- Amount / Name || Text -->
|
||||
<amount-and-name-row :amount="amount" :linkedUser="linkedUser" />
|
||||
|
||||
<!-- Nachricht Memo -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">{{ $t('form.memo') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-message">{{ memo }}</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<memo-row :memo="memo" />
|
||||
|
||||
<!-- Datum -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">{{ $t('form.date') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-date">
|
||||
{{ $d(new Date(balanceDate), 'long') }}
|
||||
{{ $i18n.locale === 'de' ? 'Uhr' : '' }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<date-row :balanceDate="balanceDate" />
|
||||
|
||||
<!-- Decay -->
|
||||
<b-row v-if="decay">
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<b-icon icon="droplet-half" height="15" class="mb-1" />
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-decay">
|
||||
<decay-information-short decaytyp="short" :decay="decay" />
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<decay-row :decay="decay" />
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
|
||||
<b-collapse :class="visible ? 'bg-secondary' : ''" class="pb-4 pt-5" v-model="visible">
|
||||
<decay-information-before-startblock v-if="decay.start === null" />
|
||||
<decay-information-decay-startblock
|
||||
v-else-if="isStartBlock"
|
||||
:amount="amount"
|
||||
:decay="decay"
|
||||
<decay-information
|
||||
:typeId="typeId"
|
||||
:decay="decay"
|
||||
:amount="amount"
|
||||
:decayStartBlock="decayStartBlock"
|
||||
/>
|
||||
<decay-information-long v-else :amount="amount" :decay="decay" :typeId="typeId" />
|
||||
</b-collapse>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import DecayInformationShort from '../DecayInformations/DecayInformation-Short'
|
||||
import DecayInformationLong from '../DecayInformations/DecayInformation-Long'
|
||||
import DecayInformationBeforeStartblock from '../DecayInformations/DecayInformation-BeforeStartblock'
|
||||
import DecayInformationDecayStartblock from '../DecayInformations/DecayInformation-DecayStartblock'
|
||||
import CollapseIcon from '../TransactionRows/CollapseIcon'
|
||||
import TypeIcon from '../TransactionRows/TypeIcon'
|
||||
import AmountAndNameRow from '../TransactionRows/AmountAndNameRow'
|
||||
import MemoRow from '../TransactionRows/MemoRow'
|
||||
import DateRow from '../TransactionRows/DateRow'
|
||||
import DecayRow from '../TransactionRows/DecayRow'
|
||||
import DecayInformation from '../DecayInformations/DecayInformation'
|
||||
|
||||
export default {
|
||||
name: 'slot-receive',
|
||||
components: {
|
||||
DecayInformationShort,
|
||||
DecayInformationLong,
|
||||
DecayInformationBeforeStartblock,
|
||||
DecayInformationDecayStartblock,
|
||||
CollapseIcon,
|
||||
TypeIcon,
|
||||
AmountAndNameRow,
|
||||
MemoRow,
|
||||
DateRow,
|
||||
DecayRow,
|
||||
DecayInformation,
|
||||
},
|
||||
props: {
|
||||
amount: {
|
||||
|
||||
@ -2,104 +2,61 @@
|
||||
<div class="transaction-slot-send">
|
||||
<div @click="visible = !visible">
|
||||
<!-- Collaps Icon -->
|
||||
<div class="text-right" style="width: 95%; position: absolute">
|
||||
<b-icon
|
||||
:icon="visible ? 'caret-up-square' : 'caret-down-square'"
|
||||
:class="visible ? 'text-black' : 'text-muted'"
|
||||
/>
|
||||
</div>
|
||||
<collapse-icon class="text-right" :visible="visible" />
|
||||
|
||||
<div>
|
||||
<b-row>
|
||||
<!-- ICON -->
|
||||
<b-col cols="1">
|
||||
<div class="gdd-transaction-list-item-icon">
|
||||
<b-icon icon="arrow-left-circle" class="text-danger m-mb-1 font2em" />
|
||||
</div>
|
||||
<type-icon color="text-danger" icon="arrow-left-circle" />
|
||||
</b-col>
|
||||
|
||||
<b-col cols="11">
|
||||
<!-- Betrag / Name Email -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<span class="gdd-transaction-list-item-amount">
|
||||
{{ amount | GDD }}
|
||||
</span>
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-name">
|
||||
{{ linkedUser.firstName + ' ' + linkedUser.lastName }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<!-- Amount / Name -->
|
||||
<amount-and-name-row :amount="amount" :linkedUser="linkedUser" />
|
||||
|
||||
<!-- Nachricht Memo -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">{{ $t('form.memo') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-message">{{ memo }}</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<!-- Memo -->
|
||||
<memo-row :memo="memo" />
|
||||
|
||||
<!-- Datum -->
|
||||
<b-row>
|
||||
<b-col cols="5">
|
||||
<div class="text-right">{{ $t('form.date') }}</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-date">
|
||||
{{ $d(new Date(balanceDate), 'long') }}
|
||||
{{ $i18n.locale === 'de' ? 'Uhr' : '' }}
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<date-row :balanceDate="balanceDate" />
|
||||
|
||||
<!-- Decay -->
|
||||
<b-row v-if="decay">
|
||||
<b-col cols="5">
|
||||
<div class="text-right">
|
||||
<b-icon icon="droplet-half" height="15" class="mb-1" />
|
||||
</div>
|
||||
</b-col>
|
||||
<b-col cols="7">
|
||||
<div class="gdd-transaction-list-item-decay">
|
||||
<decay-information-short decaytyp="short" :decay="decay" />
|
||||
</div>
|
||||
</b-col>
|
||||
</b-row>
|
||||
<decay-row :decay="decay" />
|
||||
</b-col>
|
||||
</b-row>
|
||||
</div>
|
||||
|
||||
<b-collapse :class="visible ? 'bg-secondary' : ''" class="pb-4 pt-5" v-model="visible">
|
||||
<decay-information-before-startblock v-if="decay.start === null" />
|
||||
<decay-information-decay-startblock
|
||||
v-else-if="isStartBlock"
|
||||
:amount="amount"
|
||||
:decay="decay"
|
||||
<decay-information
|
||||
:typeId="typeId"
|
||||
:decay="decay"
|
||||
:amount="amount"
|
||||
:decayStartBlock="decayStartBlock"
|
||||
/>
|
||||
<decay-information-long v-else :amount="amount" :decay="decay" :typeId="typeId" />
|
||||
</b-collapse>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import DecayInformationShort from '../DecayInformations/DecayInformation-Short'
|
||||
import DecayInformationLong from '../DecayInformations/DecayInformation-Long'
|
||||
import DecayInformationBeforeStartblock from '../DecayInformations/DecayInformation-BeforeStartblock'
|
||||
import DecayInformationDecayStartblock from '../DecayInformations/DecayInformation-DecayStartblock'
|
||||
import CollapseIcon from '../TransactionRows/CollapseIcon'
|
||||
import TypeIcon from '../TransactionRows/TypeIcon'
|
||||
import AmountAndNameRow from '../TransactionRows/AmountAndNameRow'
|
||||
import MemoRow from '../TransactionRows/MemoRow'
|
||||
import DateRow from '../TransactionRows/DateRow'
|
||||
import DecayRow from '../TransactionRows/DecayRow'
|
||||
import DecayInformation from '../DecayInformations/DecayInformation'
|
||||
|
||||
export default {
|
||||
name: 'slot-send',
|
||||
components: {
|
||||
DecayInformationShort,
|
||||
DecayInformationLong,
|
||||
DecayInformationBeforeStartblock,
|
||||
DecayInformationDecayStartblock,
|
||||
CollapseIcon,
|
||||
TypeIcon,
|
||||
AmountAndNameRow,
|
||||
MemoRow,
|
||||
DateRow,
|
||||
DecayRow,
|
||||
DecayInformation,
|
||||
},
|
||||
props: {
|
||||
amount: {
|
||||
@ -133,10 +90,5 @@ export default {
|
||||
visible: false,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
isStartBlock() {
|
||||
return new Date(this.decay.start).getTime() === this.decayStartBlock.getTime()
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@ -50,4 +50,3 @@ export default {
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style></style>
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<b-card id="formusermail" class="bg-transparent" style="background-color: #ebebeba3 !important">
|
||||
<b-card id="formusermail" class="bg-transparent gradido-custom-background">
|
||||
<b-container>
|
||||
<b-row class="mb-4 text-right">
|
||||
<b-col class="text-right">
|
||||
@ -61,4 +61,3 @@ export default {
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style></style>
|
||||
|
||||
@ -1,8 +1,7 @@
|
||||
<template>
|
||||
<b-card
|
||||
id="formusercoinanimation"
|
||||
class="bg-transparent"
|
||||
style="background-color: #ebebeba3 !important; border-radius: 0px"
|
||||
class="bg-transparent gradido-custom-background gradido-no-border-radius"
|
||||
>
|
||||
<div>
|
||||
<b-row class="mb-3">
|
||||
|
||||
@ -18,6 +18,25 @@ const environment = {
|
||||
DEFAULT_PUBLISHER_ID: process.env.DEFAULT_PUBLISHER_ID || 2896,
|
||||
}
|
||||
|
||||
// const meta = {
|
||||
// META_URL: process.env.META_URL || 'http://localhost',
|
||||
// META_TITLE_DE: process.env.META_TITLE_DE || 'Gradido – Dein Dankbarkeitskonto',
|
||||
// META_TITLE_EN: process.env.META_TITLE_EN || 'Gradido - Your gratitude account',
|
||||
// META_DESCRIPTION_DE:
|
||||
// process.env.META_DESCRIPTION_DE ||
|
||||
// 'Dankbarkeit ist die Währung der neuen Zeit. Immer mehr Menschen entfalten ihr Potenzial und gestalten eine gute Zukunft für alle.',
|
||||
// META_DESCRIPTION_EN:
|
||||
// process.env.META_DESCRIPTION_EN ||
|
||||
// 'Gratitude is the currency of the new age. More and more people are unleashing their potential and shaping a good future for all.',
|
||||
// META_KEYWORDS_DE:
|
||||
// process.env.META_KEYWORDS_DE ||
|
||||
// 'Grundeinkommen, Währung, Dankbarkeit, Schenk-Ökonomie, Natürliche Ökonomie des Lebens, Ökonomie, Ökologie, Potenzialentfaltung, Schenken und Danken, Kreislauf des Lebens, Geldsystem',
|
||||
// META_KEYWORDS_EN:
|
||||
// process.env.META_KEYWORDS_EN ||
|
||||
// 'Basic Income, Currency, Gratitude, Gift Economy, Natural Economy of Life, Economy, Ecology, Potential Development, Giving and Thanking, Cycle of Life, Monetary System',
|
||||
// META_AUTHOR: process.env.META_AUTHOR || 'Bernd Hückstädt - Gradido-Akademie',
|
||||
// }
|
||||
|
||||
const endpoints = {
|
||||
GRAPHQL_URI: process.env.GRAPHQL_URI || 'http://localhost/graphql',
|
||||
ADMIN_AUTH_URL: process.env.ADMIN_AUTH_URL || 'http://localhost/admin/authenticate?token={token}',
|
||||
|
||||
@ -72,4 +72,3 @@ export default {
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style></style>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user