Merge branch '1319-email-optin' of https://github.com/gradido/gradido into 1319-email-optin

This commit is contained in:
elweyn 2022-03-14 12:34:13 +01:00
commit 00a1ed9e11
109 changed files with 3107 additions and 1747 deletions

View File

@ -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

View File

@ -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
View 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"],
}
]
};

View File

@ -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": [

View File

@ -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>

File diff suppressed because it is too large Load Diff

View File

@ -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',

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -8,7 +8,4 @@ export default class TransactionLinkArgs {
@Field(() => String)
memo: string
@Field(() => Boolean, { nullable: true })
showEmail?: boolean
}

View File

@ -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, {

View File

@ -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
}

View File

@ -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

View File

@ -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
}
}

View File

@ -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
}

View File

@ -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,
}
}
}

View File

@ -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 }

View File

@ -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 }

View 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 }

View File

@ -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
}

View File

@ -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
}

View File

@ -1 +1 @@
export { Transaction } from './0029-clean_transaction_table/Transaction'
export { Transaction } from './0032-add-transaction-link-to-transaction/Transaction'

View File

@ -1 +1 @@
export { TransactionLink } from './0030-transaction_link/TransactionLink'
export { TransactionLink } from './0031-remove_sendEmail_from_transaction_link/TransactionLink'

View File

@ -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`;',
)
}

View File

@ -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`;')
}

View File

@ -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

View File

@ -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}

View File

@ -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

View File

@ -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
View 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"],
}
]
};

View File

@ -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

View File

@ -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"
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -1,5 +1,4 @@
// Body
$body-bg: #f8f9fe !default;
$body-color: $gray-700 !default;

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -1,3 +1,3 @@
// Form group
$form-group-margin-bottom: 1.5rem !default;
$form-group-margin-bottom: 1.5rem !default;

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -1,5 +1,4 @@
// Body
$body-bg: #f8f9fe !default;
$body-color: $gray-700 !default;

View File

@ -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
);

View File

@ -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;

View File

@ -1,3 +1,3 @@
// Tooltips
$tooltip-font-size: $font-size-sm !default;
$tooltip-font-size: $font-size-sm !default;

View File

@ -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;

View File

@ -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;
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 />

View File

@ -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')
})

View File

@ -108,6 +108,10 @@ export default {
}
</script>
<style>
collaps-icon {
width: 95%;
position: absolute;
}
.el-table .cell {
padding-left: 0px;
padding-right: 0px;

View File

@ -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)">

View File

@ -53,8 +53,8 @@ export default {
}
</script>
<style>
#component-sidebar .active,
.component-navbar .active {
.component-navbar .active,
#component-sidebar .active {
font-weight: bold;
}
</style>

View File

@ -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'"

View File

@ -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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@ -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: {

View File

@ -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 {

View File

@ -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: {

View File

@ -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>

View File

@ -50,4 +50,3 @@ export default {
},
}
</script>
<style></style>

View File

@ -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>

View File

@ -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">

View File

@ -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}',

View File

@ -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