Repository created
This commit is contained in:
commit
7bae734f20
26 changed files with 31200 additions and 0 deletions
6
.babelrc
Normal file
6
.babelrc
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"presets": [
|
||||
"@babel/preset-env",
|
||||
"@babel/preset-react"
|
||||
]
|
||||
}
|
10
.editorconfig
Normal file
10
.editorconfig
Normal file
|
@ -0,0 +1,10 @@
|
|||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
52
.eslintrc.js
Normal file
52
.eslintrc.js
Normal file
|
@ -0,0 +1,52 @@
|
|||
module.exports = {
|
||||
// 'plugins': ['jest'],
|
||||
'env': {
|
||||
'commonjs': true,
|
||||
'es6': true,
|
||||
'node': true,
|
||||
// 'jest/globals': true,
|
||||
},
|
||||
'extends': 'eslint:recommended',
|
||||
'globals': {
|
||||
'Atomics': 'readonly',
|
||||
'SharedArrayBuffer': 'readonly',
|
||||
},
|
||||
'parserOptions': {
|
||||
'ecmaVersion': 2018,
|
||||
'sourceType': 'module',
|
||||
},
|
||||
'rules': {
|
||||
'indent': [
|
||||
'error',
|
||||
2,
|
||||
],
|
||||
'linebreak-style': [
|
||||
'error',
|
||||
'unix',
|
||||
],
|
||||
'quotes': [
|
||||
'error',
|
||||
'single',
|
||||
{ 'avoidEscape': true },
|
||||
],
|
||||
'semi': [
|
||||
'error',
|
||||
'never',
|
||||
],
|
||||
'comma-dangle': [
|
||||
'error',
|
||||
'always-multiline',
|
||||
],
|
||||
'arrow-parens': [
|
||||
'error',
|
||||
'as-needed',
|
||||
],
|
||||
'no-var': [
|
||||
'error',
|
||||
],
|
||||
'prefer-const': ['error', {
|
||||
'destructuring': 'all',
|
||||
'ignoreReadBeforeAssign': true,
|
||||
}],
|
||||
},
|
||||
};
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
.idea
|
||||
|
||||
node_modules/
|
1
.nvmrc
Normal file
1
.nvmrc
Normal file
|
@ -0,0 +1 @@
|
|||
v12.13.1
|
21
README.md
Normal file
21
README.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
# Kaleider tester
|
||||
|
||||
Se trata de una pequeña aplicación que consta de un formulario con diferentes inputs. Una vez remitido, devuelve el resultado en base a los datos de entrada.
|
||||
|
||||
Es sobre todo una pequeña muestra de cómo emplear las bibliotecas mcf-components y mcf-object.
|
||||
|
||||
|
||||
## Instalación
|
||||
|
||||
Una vez descomprimido el archivo que contiene los tres proyectos se deben instalar las dependencias en cada una de las bibliotecas mcf-components y mcf-object ya que van a funcionar como dependencias locales.
|
||||
Esto se realiza con el comando.
|
||||
```shell
|
||||
npm install
|
||||
```
|
||||
|
||||
Después de esto se realiza la misma acción en este proyecto.
|
||||
|
||||
Finalmente se levanta la aplicación en este proyecto mediante el comando
|
||||
```shell
|
||||
npm run start
|
||||
```
|
30596
package-lock.json
generated
Normal file
30596
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
30
package.json
Normal file
30
package.json
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"name": "Kaleider-tester",
|
||||
"version": "0.1.0",
|
||||
"main": "src/index.js",
|
||||
"scripts": {
|
||||
"start": "webpack-dev-server --open --config webpack.dev.js",
|
||||
"dist": "webpack --config webpack.prod.js",
|
||||
"test": "jest",
|
||||
"test:watch": "jest --watch"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.14.6",
|
||||
"@babel/preset-env": "^7.14.7",
|
||||
"@babel/preset-react": "^7.14.5",
|
||||
"babel-loader": "^8.2.2",
|
||||
"css-loader": "^3.6.0",
|
||||
"eslint": "^7.30.0",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"mini-css-extract-plugin": "^0.8.2",
|
||||
"style-loader": "^1.3.0",
|
||||
"webpack": "^4.46.0",
|
||||
"webpack-cli": "^3.3.12",
|
||||
"webpack-dev-server": "^3.11.2",
|
||||
"webpack-merge": "^4.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"mcf-components": "file:../mcf-components/",
|
||||
"mcf-objects": "file:../mcf-objects/"
|
||||
}
|
||||
}
|
53
src/UI.js
Normal file
53
src/UI.js
Normal file
|
@ -0,0 +1,53 @@
|
|||
import { render, remove } from 'mcf-components'
|
||||
|
||||
import { DefinedObject } from 'mcf-objects/src'
|
||||
|
||||
import form from './components/form'
|
||||
import errorsDialog from './components/errorsDialog'
|
||||
|
||||
|
||||
const uiDefinition = {
|
||||
htmlReference: { TYPE: 'string', required: true },
|
||||
|
||||
name: { TYPE: 'string' },
|
||||
book: { TYPE: 'enum', availableValues: ['lor', 'sfi', 'tgr'] },
|
||||
|
||||
imageList: { TYPE: 'array' },
|
||||
activityList: { TYPE: 'array', maxLength: 3 },
|
||||
}
|
||||
const uiInitialValues = {
|
||||
name: '',
|
||||
imageList: [],
|
||||
activityList: [],
|
||||
}
|
||||
|
||||
export default class UI extends DefinedObject {
|
||||
constructor(params, onSubmit) {
|
||||
super({
|
||||
fields: uiDefinition,
|
||||
values: params,
|
||||
})
|
||||
|
||||
this.onSubmit = onSubmit
|
||||
this.setValue(uiInitialValues)
|
||||
}
|
||||
|
||||
checkParams() {
|
||||
const errors = []
|
||||
if (!this.getValue().name) errors.push('Name')
|
||||
if (!this.getValue().book) errors.push('Book')
|
||||
if (this.getValue().imageList.length === 0) errors.push('Image')
|
||||
if (this.getValue().activityList.length === 0) errors.push('Activity')
|
||||
return errors
|
||||
}
|
||||
|
||||
manageErrors(errors) {
|
||||
remove(this.getValue().htmlReference)
|
||||
render(errorsDialog(this, errors), this.getValue().htmlReference)
|
||||
}
|
||||
|
||||
renderPage() {
|
||||
remove(this.getValue().htmlReference)
|
||||
render(form(this), this.getValue().htmlReference)
|
||||
}
|
||||
}
|
26
src/components/activitiesDialog.js
Normal file
26
src/components/activitiesDialog.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
import activityOptions from './activityOptions'
|
||||
|
||||
export default function activityDialog (ui) {
|
||||
return {
|
||||
type: 'dialog',
|
||||
params: {
|
||||
id: 'activities',
|
||||
titleText: 'Activities',
|
||||
contentText: 'Select one activity',
|
||||
openButtonVariant: 'contained',
|
||||
openButtonColor: 'primary',
|
||||
openButtonText: 'Activities',
|
||||
closeButtonVariant: 'contained',
|
||||
closeButtonColor: 'primary',
|
||||
closeButtonText: 'Close',
|
||||
open: false,
|
||||
openListener: function () {},
|
||||
closeListener: function () {},
|
||||
contents: [
|
||||
activityOptions(ui),
|
||||
],
|
||||
actionContents: [],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
31
src/components/activityOptions.js
Normal file
31
src/components/activityOptions.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
export default function activityOptions (ui) {
|
||||
return {
|
||||
type: 'checkboxesGroup',
|
||||
params: {
|
||||
id: 'activitiesOptions',
|
||||
label: 'Funny activities',
|
||||
helperText: 'Which one is for you?',
|
||||
isRow: false,
|
||||
checkboxes: [
|
||||
{
|
||||
id: 'nothing',
|
||||
checked: false,
|
||||
label: 'Do nothing',
|
||||
},
|
||||
{
|
||||
id: 'friends',
|
||||
checked: false,
|
||||
label: 'Enjoy with friends',
|
||||
},
|
||||
{
|
||||
id: 'programming',
|
||||
checked: false,
|
||||
label: 'Programming',
|
||||
},
|
||||
],
|
||||
onChangeListener: (function (id, value) {
|
||||
ui.updateArrayField('activityList', id, value)
|
||||
}),
|
||||
},
|
||||
}
|
||||
}
|
24
src/components/booksSelection.js
Normal file
24
src/components/booksSelection.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
export default function booksSelection (ui) {
|
||||
return {
|
||||
type: 'select',
|
||||
params: {
|
||||
id: 'booksOptions',
|
||||
disabled: false,
|
||||
error: false,
|
||||
required: false,
|
||||
shrink: false,
|
||||
label: 'Books',
|
||||
value: '',
|
||||
displayEmpty: false,
|
||||
autoWidth: false,
|
||||
readOnly: false,
|
||||
helperText: 'Select your favourite',
|
||||
elementsList: [
|
||||
{name: 'Lord of the Rings', value: 'lor'},
|
||||
{name: 'Song of fire and ice', value: 'sfi'},
|
||||
{name: 'Think and Grow Rich', value: 'tgr'},
|
||||
],
|
||||
onSelectListener: function (value) {ui.setValue({book: value})},
|
||||
},
|
||||
}
|
||||
}
|
30
src/components/diversityImageCard.js
Normal file
30
src/components/diversityImageCard.js
Normal file
|
@ -0,0 +1,30 @@
|
|||
export default function diversityImageCard(ui) {
|
||||
return {
|
||||
type: 'mediaCard',
|
||||
params: {
|
||||
id: 'diversityLike',
|
||||
mainText: 'Diversity',
|
||||
secondaryText: 'Click if like',
|
||||
imageURL: 'https://i0.wp.com/www.ampaeb.cat/wp-content/uploads/2017/11/diversidad-funcional.jpg?resize=880%2C360&ssl=1',
|
||||
imageTitle: 'Diversity',
|
||||
imageAlt: 'A paper children circle joined by their hands',
|
||||
contents: [
|
||||
{
|
||||
type: 'button',
|
||||
params: {
|
||||
id: 'diversityButton',
|
||||
text: 'Like',
|
||||
variant: 'contained',
|
||||
color: 'primary',
|
||||
size: 'medium',
|
||||
disabled: false,
|
||||
onClickListener: function () {
|
||||
ui.updateArrayField('imageList', 'diversity', true)
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
33
src/components/errorsDialog.js
Normal file
33
src/components/errorsDialog.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
|
||||
|
||||
export default function errorsDialog (ui, errors) {
|
||||
let errorMessage = 'Please, review the inputs:'
|
||||
for (const error of errors){
|
||||
errorMessage += ' · ' + error
|
||||
}
|
||||
|
||||
return {
|
||||
type: 'dialog',
|
||||
params: {
|
||||
id: 'errors',
|
||||
titleText: 'Check errors',
|
||||
contentText: errorMessage,
|
||||
openButtonVariant: 'text',
|
||||
openButtonColor: 'primary',
|
||||
openButtonText: 'Result',
|
||||
closeButtonVariant: 'contained',
|
||||
closeButtonColor: 'primary',
|
||||
closeButtonText: 'Close',
|
||||
open: true,
|
||||
openListener: function () {
|
||||
},
|
||||
closeListener: function () {
|
||||
ui.renderPage()
|
||||
},
|
||||
contents: [
|
||||
],
|
||||
actionContents: [],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
30
src/components/feminismImageCard.js
Normal file
30
src/components/feminismImageCard.js
Normal file
|
@ -0,0 +1,30 @@
|
|||
export default function feminismImageCard(ui) {
|
||||
return {
|
||||
type: 'mediaCard',
|
||||
params: {
|
||||
id: 'feminismLike',
|
||||
mainText: 'Feminism',
|
||||
secondaryText: 'Click if like',
|
||||
imageURL: 'https://www.conservativewoman.co.uk/wp-content/uploads/2019/03/feminism.jpg',
|
||||
imageTitle: 'Feminism',
|
||||
imageAlt: 'Women hands join in a stack',
|
||||
contents: [
|
||||
{
|
||||
type: 'button',
|
||||
params: {
|
||||
id: 'feminismButton',
|
||||
text: 'Like',
|
||||
variant: 'contained',
|
||||
color: 'primary',
|
||||
size: 'medium',
|
||||
disabled: false,
|
||||
onClickListener: function () {
|
||||
ui.updateArrayField('imageList', 'feminism', true)
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
39
src/components/form.js
Normal file
39
src/components/form.js
Normal file
|
@ -0,0 +1,39 @@
|
|||
import nameText from './nameText'
|
||||
import feminismImageCard from './feminismImageCard'
|
||||
import paperWorkImageCard from './paperWorkImageCard'
|
||||
import submitFormButton from './submitFormButton'
|
||||
import diversityImageCard from './diversityImageCard'
|
||||
import activitiesDialog from './activitiesDialog'
|
||||
import booksSelection from './booksSelection'
|
||||
|
||||
export default function form(ui) {
|
||||
|
||||
return {
|
||||
type: 'card',
|
||||
params: {
|
||||
id: 'mainContainer',
|
||||
mainText: 'Kaleider tester',
|
||||
secondaryText: '',
|
||||
contents: [
|
||||
{
|
||||
type: 'card',
|
||||
params: {
|
||||
id: 'infoContainer',
|
||||
mainText: '',
|
||||
secondaryText: '',
|
||||
contents: [
|
||||
nameText(ui),
|
||||
feminismImageCard(ui),
|
||||
diversityImageCard(ui),
|
||||
paperWorkImageCard(ui),
|
||||
activitiesDialog(ui),
|
||||
booksSelection(ui),
|
||||
],
|
||||
},
|
||||
},
|
||||
{type: 'divider', params: {id: 'submitButtonDivider'}},
|
||||
submitFormButton(ui),
|
||||
],
|
||||
},
|
||||
}
|
||||
}
|
25
src/components/nameText.js
Normal file
25
src/components/nameText.js
Normal file
|
@ -0,0 +1,25 @@
|
|||
export default function nameText(ui) {
|
||||
const onChange = params => {
|
||||
ui.setValue({name: params.value})
|
||||
}
|
||||
|
||||
return {
|
||||
type: 'text',
|
||||
params: {
|
||||
id: 'name',
|
||||
label: 'Name',
|
||||
helperText: 'Write your name',
|
||||
value: ui.getValue().name,
|
||||
margin: 'normal',
|
||||
required: false,
|
||||
error: false,
|
||||
disabled: false,
|
||||
placeholder: 'Site',
|
||||
fullWidth: false,
|
||||
variant: 'standard',
|
||||
type: 'text',
|
||||
shrink: true,
|
||||
onChangeListener: onChange,
|
||||
},
|
||||
}
|
||||
}
|
30
src/components/paperWorkImageCard.js
Normal file
30
src/components/paperWorkImageCard.js
Normal file
|
@ -0,0 +1,30 @@
|
|||
export default function paperWorkImageCard(ui) {
|
||||
return {
|
||||
type: 'mediaCard',
|
||||
params: {
|
||||
id: 'paperWorkLike',
|
||||
mainText: 'Paper work',
|
||||
secondaryText: 'Click if like',
|
||||
imageURL: 'https://hermandadblanca.org/wp-content/uploads/2016/06/hermandadblanca_org_pereza1-620x465.jpg',
|
||||
imageTitle: 'Paper work',
|
||||
imageAlt: 'A person surrounded by paper and a laptop yawning',
|
||||
contents: [
|
||||
{
|
||||
type: 'button',
|
||||
params: {
|
||||
id: 'paperWorkButton',
|
||||
text: 'Like',
|
||||
variant: 'contained',
|
||||
color: 'primary',
|
||||
size: 'medium',
|
||||
disabled: false,
|
||||
onClickListener: function () {
|
||||
ui.updateArrayField('imageList', 'paperWork', true)
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
31
src/components/resultDialog.js
Normal file
31
src/components/resultDialog.js
Normal file
|
@ -0,0 +1,31 @@
|
|||
|
||||
|
||||
export default function resultDialog (ui, isPassed) {
|
||||
const passText = 'You are a kaleider!!'
|
||||
const doNotPassText = "No, you aren't a kaleider"
|
||||
|
||||
return {
|
||||
type: 'dialog',
|
||||
params: {
|
||||
id: 'result',
|
||||
titleText: 'Test result',
|
||||
contentText: 'The test result is: ' + (isPassed ? passText : doNotPassText),
|
||||
openButtonVariant: 'text',
|
||||
openButtonColor: 'primary',
|
||||
openButtonText: 'Result',
|
||||
closeButtonVariant: 'contained',
|
||||
closeButtonColor: 'primary',
|
||||
closeButtonText: 'Close',
|
||||
open: true,
|
||||
openListener: function () {
|
||||
},
|
||||
closeListener: function () {
|
||||
ui.renderPage()
|
||||
},
|
||||
contents: [
|
||||
],
|
||||
actionContents: [],
|
||||
},
|
||||
}
|
||||
}
|
||||
|
19
src/components/submitFormButton.js
Normal file
19
src/components/submitFormButton.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
export default function submitFormButton(ui) {
|
||||
const onClick = function () {
|
||||
const errors = ui.checkParams()
|
||||
errors.length > 0 ? ui.manageErrors(errors) : ui.onSubmit(ui.getValue())
|
||||
}
|
||||
|
||||
return {
|
||||
type: 'button',
|
||||
params: {
|
||||
id: 'submitFormButton',
|
||||
text: 'Check it!',
|
||||
variant: 'contained',
|
||||
color: 'primary',
|
||||
size: 'medium',
|
||||
disabled: false,
|
||||
onClickListener: onClick,
|
||||
},
|
||||
}
|
||||
}
|
14
src/index.html
Normal file
14
src/index.html
Normal file
|
@ -0,0 +1,14 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no">
|
||||
|
||||
<title>Kaleider tester</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
26
src/index.js
Normal file
26
src/index.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
import './styles.css'
|
||||
|
||||
import {remove, render} from 'mcf-components'
|
||||
|
||||
import resultDialog from './components/resultDialog'
|
||||
import UI from './UI'
|
||||
|
||||
|
||||
const htmlReference = 'app'
|
||||
const ui = new UI({htmlReference: htmlReference}, onSubmit)
|
||||
|
||||
function onSubmit(uiOutput) {
|
||||
let result = true
|
||||
|
||||
if (uiOutput.book === 'tgr' || uiOutput.imageList.includes('paperWork') || uiOutput.activityList.includes('nothing')) result = false
|
||||
|
||||
remove(htmlReference)
|
||||
render(resultDialog(ui, result), htmlReference)
|
||||
}
|
||||
|
||||
function initPage() {
|
||||
ui.renderPage()
|
||||
}
|
||||
|
||||
|
||||
initPage()
|
6
src/styles.css
Normal file
6
src/styles.css
Normal file
|
@ -0,0 +1,6 @@
|
|||
html {
|
||||
background-color: #dcb4df;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
44
webpack.common.js
Normal file
44
webpack.common.js
Normal file
|
@ -0,0 +1,44 @@
|
|||
const path = require('path');
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||
|
||||
module.exports = {
|
||||
entry: './src/index.js',
|
||||
output: {
|
||||
filename: 'index.js',
|
||||
path: path.resolve(__dirname, 'dist'),
|
||||
// library: 'smartClientSocket',
|
||||
// libraryTarget: 'umd'
|
||||
},
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
template: './src/index.html',
|
||||
filename: path.resolve(__dirname, 'dist', 'index.html'),
|
||||
}),
|
||||
new MiniCssExtractPlugin({
|
||||
filename: '[name].css',
|
||||
chunkFilename: '[id].css',
|
||||
}),
|
||||
],
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.(js|jsx)$/,
|
||||
exclude: /node_modules/,
|
||||
use: {
|
||||
loader: 'babel-loader',
|
||||
},
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
use: [
|
||||
{
|
||||
loader: MiniCssExtractPlugin.loader,
|
||||
},
|
||||
'css-loader',
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
};
|
13
webpack.dev.js
Normal file
13
webpack.dev.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
const path = require('path');
|
||||
const merge = require('webpack-merge');
|
||||
const common = require('./webpack.common.js');
|
||||
|
||||
module.exports = merge(common, {
|
||||
mode: 'development',
|
||||
devtool: 'inline-source-map',
|
||||
devServer: {
|
||||
contentBase: path.join(__dirname, 'dist'),
|
||||
port: 9000,
|
||||
historyApiFallback: true,
|
||||
},
|
||||
});
|
7
webpack.prod.js
Normal file
7
webpack.prod.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
const merge = require('webpack-merge');
|
||||
const common = require('./webpack.common.js');
|
||||
|
||||
module.exports = merge(common, {
|
||||
mode: 'production',
|
||||
devtool: 'source-map',
|
||||
});
|
Loading…
Reference in a new issue