From 3075b83963026746751e6413f7c89db77d27a195 Mon Sep 17 00:00:00 2001 From: Mael Thomas Date: Tue, 15 Nov 2016 19:46:17 +0100 Subject: [PATCH] =?UTF-8?q?Nettoyage=20d'automne;=20premi=C3=A8re=20brique?= =?UTF-8?q?,=20la=20recherche=20de=20cotisations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IDEES.ms | 11 -- actions.js | 19 -- containers/Analyse.css | 3 - containers/Analyse.js | 35 ---- containers/App.css | 145 --------------- containers/Explorer.js | 41 ----- containers/Layout.js | 10 - index.html | 2 +- model.js | 83 --------- package.json | 2 +- reducers.js | 35 ---- periods.md => règles/recherche/periods.md | 0 .../rémunération-travail/cdd/CDD.md | 0 selectors/selectors.js | 57 ------ selectors/traversalGuide.js | 111 ----------- selectors/usedVariables.js | 174 ------------------ .babelrc => source/.babelrc | 0 .eslintrc => source/.eslintrc | 0 DevTools.js => source/DevTools.js | 0 source/actions.js | 0 .../components}/SelectedVariable.css | 0 .../components}/SelectedVariable.js | 0 {components => source/components}/TagMap.js | 0 .../components}/TagNavigation.js | 0 .../components}/Variables.js | 0 .../components}/variable-colors.yaml | 0 {containers => source/containers}/App.dev.js | 2 - {containers => source/containers}/App.js | 0 {containers => source/containers}/App.prod.js | 3 - source/containers/Home.css | 58 ++++++ source/containers/Home.js | 22 +++ source/containers/Layout.css | 3 + source/containers/Layout.js | 15 ++ entry.js => source/entry.js | 1 + source/images/logo.png | Bin 0 -> 12939 bytes .../load-parameters.js | 0 source/reducers.js | 8 + routes.js => source/routes.js | 7 +- sagas.js => source/sagas.js | 1 + server.js => source/server.js | 0 {utils => source/utils}/remove-diacritics.js | 0 webpack.config.js => source/webpack.config.js | 2 +- 42 files changed, 113 insertions(+), 737 deletions(-) delete mode 100644 IDEES.ms delete mode 100644 actions.js delete mode 100644 containers/Analyse.css delete mode 100644 containers/Analyse.js delete mode 100644 containers/App.css delete mode 100644 containers/Explorer.js delete mode 100644 containers/Layout.js delete mode 100644 model.js delete mode 100644 reducers.js rename periods.md => règles/recherche/periods.md (100%) rename CDD.md => règles/rémunération-travail/cdd/CDD.md (100%) delete mode 100644 selectors/selectors.js delete mode 100644 selectors/traversalGuide.js delete mode 100644 selectors/usedVariables.js rename .babelrc => source/.babelrc (100%) rename .eslintrc => source/.eslintrc (100%) rename DevTools.js => source/DevTools.js (100%) create mode 100644 source/actions.js rename {components => source/components}/SelectedVariable.css (100%) rename {components => source/components}/SelectedVariable.js (100%) rename {components => source/components}/TagMap.js (100%) rename {components => source/components}/TagNavigation.js (100%) rename {components => source/components}/Variables.js (100%) rename {components => source/components}/variable-colors.yaml (100%) rename {containers => source/containers}/App.dev.js (95%) rename {containers => source/containers}/App.js (100%) rename {containers => source/containers}/App.prod.js (94%) create mode 100644 source/containers/Home.css create mode 100644 source/containers/Home.js create mode 100644 source/containers/Layout.css create mode 100644 source/containers/Layout.js rename entry.js => source/entry.js (95%) create mode 100644 source/images/logo.png rename load-parameters.js => source/load-parameters.js (100%) create mode 100644 source/reducers.js rename routes.js => source/routes.js (52%) rename sagas.js => source/sagas.js (91%) rename server.js => source/server.js (100%) rename {utils => source/utils}/remove-diacritics.js (100%) rename webpack.config.js => source/webpack.config.js (97%) diff --git a/IDEES.ms b/IDEES.ms deleted file mode 100644 index 671a0d085..000000000 --- a/IDEES.ms +++ /dev/null @@ -1,11 +0,0 @@ -Prochaine étape : -- mettre les données dans le state : ce qu'on veut c'est la liste de variables fusionnées. -- en déduire, à partir de la liste des sélections user elle aussi dans le state, la liste des variables à afficher - - - - - -- Afficher du YAML simplifié -En fonction des valeurs des variables de la simulation, ou des choix de l'utilisateur dans les étiquettes, le parser YAML doit être capable de nous donner une vue simplifiée de la variable. -Ex. en choisissant 'salarié cadre', je dois pouvoir calculer l'AGFF mais surtout obtenir une description du calcul, qui peut être dans un premier temps un bout de YAML "résolu", cad où tout ce qui ne concerne pas les cadre a été enlevé. diff --git a/actions.js b/actions.js deleted file mode 100644 index 5856a1a0d..000000000 --- a/actions.js +++ /dev/null @@ -1,19 +0,0 @@ -/* TAGS */ -export let SELECT_TAG = 'SELECT_TAG' - -export function selectTag(tagName, tagValue) { - return {type: SELECT_TAG, tagName, tagValue} -} - -export let RESET_TAGS = 'RESET_TAGS' - -export function resetTags() { - return {type: RESET_TAGS} -} - -/* VARIBALES */ -export let SELECT_VARIABLE = 'SELECT_VARIABLE' - -export function selectVariable(name) { - return {type: SELECT_VARIABLE, name} -} diff --git a/containers/Analyse.css b/containers/Analyse.css deleted file mode 100644 index edf42969c..000000000 --- a/containers/Analyse.css +++ /dev/null @@ -1,3 +0,0 @@ -#top-input-variables { - text-align: center; -} diff --git a/containers/Analyse.js b/containers/Analyse.js deleted file mode 100644 index a461f9fcc..000000000 --- a/containers/Analyse.js +++ /dev/null @@ -1,35 +0,0 @@ -import React, { Component } from 'react' -import {connect} from 'react-redux' -import {usedVariables} from '../selectors/usedVariables' -import './Analyse.css' - -let mapStateToProps = state => ( - { - usedVariables: usedVariables(state) - } -) - - -@connect(mapStateToProps) -export default class Analyse extends Component { - state = {variableStats: null} - render() { - let {variableStats} = this.state - return ( -
- {variableStats ? - - :
En attente...
} -
- ) - } - componentDidMount(){ - this.props.usedVariables.then( - variables => this.setState({variableStats: variables}) - ) - } -} diff --git a/containers/App.css b/containers/App.css deleted file mode 100644 index 26e4e3e3a..000000000 --- a/containers/App.css +++ /dev/null @@ -1,145 +0,0 @@ -body { - font-family: Open Sans; - color: #333; -} - -#header { - text-align: center; - background: blue; - color: red; - font-weight: 600; - margin-bottom: 2em; -} - -h1 { - text-align: center; - font-weight: 200; - font-size: 215%; -} - -ul { - list-style: none; - padding: 0; - margin: 0; -} - -li { - margin: 0; -} - -#tag-navigation { - font-size: 130%; - font-weight: 300; - width: 20%; - padding: 1em; - display: inline-block; -} -#tag-navigation h2 { - font-size: 120%; - font-weight: 300; - margin-top: 0; - opacity: .65; - padding-bottom: .3em; - border-bottom: 1px solid #ccc; - margin-bottom: 0 -} -#tag-navigation .content { - padding-top: 1.5em; - border-right: 1px solid #ccc; - -} - -#to-select > li { - margin-bottom: 1.5em; -} - -.choices { - margin-top: .6em; -} -.tag-value { - font-size: 75%; - font-weight: 400; - display: inline-block; - text-align: right; - margin-right: 1em; - color: #2980b9; - border: 1px solid #2980b9; - padding: .05em .6em; - cursor: pointer; - border-radius: .1em -} -#to-select span.nb { - font-size: 60%; - margin-left: 2em; -} - -#selected { - border-bottom: 1px solid #ccc; - padding-bottom: 1em; - margin-bottom: 1em; - font-weight: 500; - color: #16a085; -} - -.tag-map .tag-value { - margin-left: 1em; - background: #16a085; - border: none; - color: white; - margin-bottom: .5em; - cursor: default; -} - -#selected button { - background: none; - border: none; - float: right; - cursor: pointer; - color: #16a085; -} - -#variables { - width: 70%; - display: inline-block; - padding: 3%; - position: absolute; -} - -.variable { - width: 8em; - min-height: 7em; - display: inline-block; - vertical-align: middle; - margin-bottom: 1em; - margin-right: 1em; - padding: 1em 2em; - text-align: center; -} -.variable h3 { - font-weight: 400; - font-size: 120%; - text-transform: capitalize; -} - -.variable ul { - padding-left: .6em -} - -#selected-variable { - width: 70%; - display: inline-block; - position: absolute; -} - -#selected-variable h1 { - text-transform: capitalize; - font-size: 180%; -} - -#selected-variable p { - width: 50%; - margin: 0 auto; - border: 1px solid #ddd; - border-left: 2px solid #ddd; - padding: 1em 2em; -} diff --git a/containers/Explorer.js b/containers/Explorer.js deleted file mode 100644 index bba5563a2..000000000 --- a/containers/Explorer.js +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react' -import {connect} from 'react-redux' -import TagNavigation from '../components/TagNavigation' -import Variables from '../components/Variables' -import * as actions from '../actions' -import {bindActionCreators} from 'redux' -import {tagsToSelectSelector, variablesSelector} from '../selectors/selectors' - - -class Explorer extends React.Component { - render() { - let {variables, selectedTags, selectedVariable, tagsToSelect, actions: {selectTag, resetTags, selectVariable}} = this.props - return ( -
-

Les prélèvements sociaux sur les salaires

- - -
- ) - } -} - - -const mapStateToProps = state => ( - { - selectedTags: state.selectedTags, - tagsToSelect: tagsToSelectSelector(state), - variables: variablesSelector(state), - selectedVariable: state.selectedVariable - } -) - -const actionsToProps = dispatch => ({ - actions: bindActionCreators(actions, dispatch) -}) - -const VariableExplorer = connect(mapStateToProps, actionsToProps)(Explorer) - -export default VariableExplorer diff --git a/containers/Layout.js b/containers/Layout.js deleted file mode 100644 index 9d51e0b62..000000000 --- a/containers/Layout.js +++ /dev/null @@ -1,10 +0,0 @@ -import React, { Component } from 'react' - -export default class Layout extends Component { - render() { - return (
- - {this.props.children} -
) - } -} diff --git a/index.html b/index.html index 687b8fb8e..6958d6203 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ prel2 - + diff --git a/model.js b/model.js deleted file mode 100644 index 785ae2c96..000000000 --- a/model.js +++ /dev/null @@ -1,83 +0,0 @@ -import parameters from './load-parameters' -import deepAssign from 'deep-assign' -import R from 'ramda' - -/* Fonctions utiles */ -let - hasHistoryProp = R.pipe(JSON.stringify, R.contains('"historique":')), - itemHasHistoricProp = (item, prop) => R.has(prop)(item) && hasHistoryProp(item[prop]), - itemIsCalculable = item => false - || itemHasHistoricProp(item, 'linear') - || itemHasHistoricProp(item, 'marginalRateTaxScale') - || item['+'] || item['-'] - || item['logique'] || item['logique numérique'] - , - - /* - L'attribut tags est une hash map, - ou une liste - - de clés, qui sont un moyen courant d'exprimer [clef]: oui - - de hash maps. - Cette fonction fusionne tout ceci dans un objet - - */ - handleHybridTags = R.when(R.isArrayLike, - R.reduce((final, tag) => - R.merge(final, R.is(Object, tag) ? tag : {[tag]: 'oui'}) - , {}) - ), - - tagsConflict = (tags1, tags2) => - R.compose( - R.any(R.identity), - R.values, - R.mapObjIndexed((tagValue, tag) => tags2[tag] != undefined && tags2[tag] !== tagValue) - )(tags1) - -let - groupedItemsByVariable = R.pipe( - // Desugar tags - R.map(p => R.merge(p, {tags: handleHybridTags(p.tags) || {}})), - R.groupBy(R.prop('variable')) - )(parameters), - mergedItemsByVariable = - R.mapObjIndexed((variableItems, name) => { - /* Les items sont des fragments de variables. - Les premiers fragments vont être fusionnés dans les suivants, - sauf s'ils provoquent l'écrasement d'un tag */ - let mergedVariableItems = R.tail(variableItems) // Le premier ne peut être étendu - .reduce((mergedItems, item) => - [ ...mergedItems, - mergedItems.reduce((final, higherLevelItem) => { - let oups = tagsConflict(higherLevelItem.tags, item.tags) - return oups ? item : deepAssign({}, item, higherLevelItem) - }, item) - ], R.of(R.head(variableItems))) - - return { - name, - // La variable de haut niveau, contenant la plupart du temps une description, etc. - first: R.head(variableItems), - // Tous les tags qui peuvent être trouvés dans les items de cette variable - tags: R.pipe( - R.pluck('tags'), - R.map(R.map(R.of)), - R.reduce(R.mergeWith(R.union), {}) - )(variableItems), - // Gardons seulement les variables ayant une implémentation : capable de faire un calcul - calculable: R.filter(itemIsCalculable)(mergedVariableItems) - }} - )(groupedItemsByVariable), - mergedItems = R.values(mergedItemsByVariable), - calculableItems = - R.pipe( - R.values, - R.pluck('calculable'), - R.unnest - )(mergedItemsByVariable) - -export { - groupedItemsByVariable, - calculableItems, - mergedItems -} diff --git a/package.json b/package.json index 6c15bf674..5b93e19c5 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,6 @@ "yaml-loader": "^0.2.0" }, "scripts": { - "start": "node server.js" + "start": "node source/server.js" } } diff --git a/reducers.js b/reducers.js deleted file mode 100644 index b856107ff..000000000 --- a/reducers.js +++ /dev/null @@ -1,35 +0,0 @@ - -import { combineReducers } from 'redux' -import { SELECT_TAG, SELECT_VARIABLE, RESET_TAGS} from './actions' - -function selectedTags(state = [], {type, tagName, tagValue}) { - switch (type) { - case SELECT_TAG: - return [...state, [tagName, tagValue]] - case RESET_TAGS: - return [] - default: - return state - } -} - -function selectedVariable(state = null, {type, name}) { - switch (type) { - case SELECT_VARIABLE: - return name - default: - return state - } -} - -function rootVariables(state = ['cout du travail']) { - return state -} - - - -export default combineReducers({ - selectedTags, - selectedVariable, - rootVariables -}) diff --git a/periods.md b/règles/recherche/periods.md similarity index 100% rename from periods.md rename to règles/recherche/periods.md diff --git a/CDD.md b/règles/rémunération-travail/cdd/CDD.md similarity index 100% rename from CDD.md rename to règles/rémunération-travail/cdd/CDD.md diff --git a/selectors/selectors.js b/selectors/selectors.js deleted file mode 100644 index 7379036b3..000000000 --- a/selectors/selectors.js +++ /dev/null @@ -1,57 +0,0 @@ -import { createSelector } from 'reselect' -import {calculableItems, higherOrderVariables, mergedItems} from '../model' -import R from 'ramda' - -let - // variableHasTagValue = variable => ([tag, value]) => console.log('tv', variable.tags, tag, value), - variableHasTagValue = variable => ([osef, [tag, value]]) => R.pathEq(['tags', tag], value)(variable), - variableHasSelectedTags = variable => R.compose( - R.all(variableHasTagValue(variable)), - R.toPairs - ), - filterVariables = variables => tags => R.filter(item => variableHasSelectedTags(item)(tags))(variables) - -export const finalVariablesSelector = createSelector( - [state => state.selectedTags], - filterVariables(calculableItems) -) - -/* Tag names, values, and number of variables per tag */ -const unorderedTagStats = finalVariables => - finalVariables - .reduce((stats, variable) => { - Object.keys(variable.tags).map( - k => { - stats[k] = stats[k] || {number: 0, choices: new Set()} - stats[k].number = stats[k].number + 1 - stats[k].choices.add(variable.tags[k]) - } - ) - return stats - }, {}), - - tagStats = stats => - Object.keys(stats) - .reduce((acc, n) => ([...acc, {name: n, ...stats[n]}]), []) - .sort((a, b) => b.number - a.number) - -let tagStatsSelector = createSelector( - [finalVariablesSelector], - variables => tagStats(unorderedTagStats(variables)) -) - -export let tagsToSelectSelector = createSelector( - [state => state.selectedTags, tagStatsSelector], - (selectedTags, availableTags) => - availableTags.filter(t => !selectedTags.find(([name]) => t.name === name)) -) - -export let variablesSelector = createSelector( - [state => state.selectedTags], - selectedTags => R.filter( - ({tags}) => - R.all( - ([tag, value]) => tags[tag] && R.contains(value, tags[tag]), - )(selectedTags) - )(mergedItems) -) diff --git a/selectors/traversalGuide.js b/selectors/traversalGuide.js deleted file mode 100644 index ab46a49a4..000000000 --- a/selectors/traversalGuide.js +++ /dev/null @@ -1,111 +0,0 @@ -import R from 'ramda' -// used to aseptise all yaml text, to avoid doing regexps on accents... -import removeDiacritics from '../utils/remove-diacritics' - -/* When you encounter a variable, it may have a calculable key. -This file provides an object with these mappings : - calculable-key -> extract variables called by the calculation value */ - -let scalarMult = value => { - value = removeDiacritics(value) - // 4 * assiette cotisations sociales - let match = /(?:([0-9])*\s\*\s)?((?:[a-z0-9]|\s|_)+)/g.exec(value) - if (match) return match[2] -} - -let logicalCondition = value => { - value = removeDiacritics(value) - let match, variable - // ! ma variable - if (R.contains('!')(value)) { - match = /!((?:[a-z0-9]|\s|_)+)/g.exec(value) - if (match) return match[1] - } - - // département établissement ⊂ [57 67 68] - if (R.contains('⊂')(value)) { - match = /((?:[a-z0-9]|\s|_)+)⊂*/g.exec(value) - if (match) return match[1] - } - - // ma cotisation > 20 - match = /((?:[a-z0-9]|\s|_)+)([<|>]=?)\s+[0-9]+/g.exec(value) - if (match) return match[1] - - // 20 <= ma cotisation - match = /[0-9]+\s+([<|>]=?)((?:[a-z0-9]|\s|_)+)/g.exec(value) - if (match) return match[2] - - // ma variable = xxxx z - match = /((?:[a-z0-9]|\s|_)+)=((?:[a-z0-9]|\s|_)+)/g.exec(value) - if (match) return match[1] - - // ma variable - match = /((?:[a-z0-9]|\s|_)+)/g.exec(value) - if (match) return match[1] - -} - -/* -Ce YAML : -- cond1 -- cond2: - - cond2.1: - - cond2.1.1 - - cond2.1.2 - - cond2.2 - cond2.2.1 -- cond3 - -se traduit en : -cond1 || ( - cond2 && ( - ( - cond2.1 && ( - cond2.1.1 || - cond2.1.2 - ) - ) || cond2.2 - ) -) || cond3 - -(':-D) - -*/ -let logic = list => { // a list is a || - return list.reduce((variables, next) => - typeof next == 'string' ? - [...variables, logicalCondition(next)] : - // it's a single key object -> we're facing a && condition - [...variables, logicalCondition(R.keys(next)[0]), ...logic(R.values(next))] - , []) -} -R.uniq(logic) - - -let plusOrMinus = R.cond([ - [R.is(String), removeDiacritics], - [R.isArrayLike, R.map(plusOrMinus)], - [R.is(Object), R.identity] -]) - -let traversalGuide = { - linear: { - base: scalarMult, - limit: scalarMult, - historique: null - // VAR/case: logic predicate - }, - marginalRateTaxScale: { - base: scalarMult - // VAR/case: logic predicate - }, - concerne: logic, - 'ne concerne pas': logic, - logique: logic, // predicates leading to a boolean, - 'logique numérique': () => null, // predicates leading to a number - '+': plusOrMinus, // It's a string or list of string representing variable calls, that's all we want for now :-) - '-': plusOrMinus // Same :-) -} - -export default traversalGuide diff --git a/selectors/usedVariables.js b/selectors/usedVariables.js deleted file mode 100644 index cc9e96047..000000000 --- a/selectors/usedVariables.js +++ /dev/null @@ -1,174 +0,0 @@ -import R from 'ramda' -import removeDiacritics from '../utils/remove-diacritics' - - -import { createSelector } from 'reselect' -import {variablesSelector} from './selectors' -import traversalGuide from './traversalGuide' - -import dump from 'json!../adhoc-variable-dump/variables.json' - -/* AIM : Parse all the variables and extract their references to other variables. -Rank the results by count. */ - -// Use http://regexr.com/ to understand and write regexps !! -let fetchVariables = false - -let resolveVariable = (variable, name, callback) => { - if (variable == null) return callback('TODO ' + name) - let {formula} = variable - if (formula && formula['input_variables']) { - return callback({calls: formula['input_variables']}) - } else { - return callback(name) - } -} - -let GETAdHocVariable = name => { - let obscureName = name.trim().replace(/\s/g, '_') - if (!fetchVariables){ - return new Promise( - resolve => resolveVariable( - dump.variables.find(v => v.name === obscureName), - name, - resolve) - ) - } - return new Promise(resolve => - window.fetch('https://api.openfisca.fr/api/1/variables/?name=' + obscureName) - .then(res => res.json()) - .then(json => { - let {error, variables} = json - if (error && JSON.stringify(error).indexOf('Variable does not exist') + 1){ - resolveVariable(null, name, resolve) - } - if (variables) { - resolveVariable(variables[0], name, resolve) - } - }) - ) -} - - -async function getAdHocVariables(id) { - let variable = await GETAdHocVariable(id) - if (R.is(String, variable)) - return variable - else - return Promise.all( - variable.calls.map(getAdHocVariables) - ) -} - -// Returns a list of list of used variables -// recursive function -let findUsedVariables = (variables, schema, toAnalyse) => - /*TODO - If instruction of GET call -> return Promise - 1) input var OK return string - 2) call to other variables -> list of promises - */ - R.cond([ - [R.isNil, () => []], - [R.has('adHoc'), ({id}) => getAdHocVariables(id)], - // The traversal of variables has found a parsable variable attribute. - // Parse it to extract variables - [R.is(Function), extractor => - R.pipe( - extractor, - R.unless(R.isArrayLike, R.of), - R.map(R.cond([ - [R.is(String), name => findVariables(variables, name)], - [R.is(Object), tags => findVariables(variables, null, tags)] - ])), - R.unnest, - R.map( - /*TODO - if instruction of GET call findUsedVariables(GET CALL) - */ - R.cond([ - [R.has('adHoc'), adHocSpec => findUsedVariables(variables, adHocSpec)], - [R.is(String), R.identity], - [R.T, found => findUsedVariables(variables, traversalGuide, found)] - ]) - ) - )(toAnalyse) - ], - // Walk the graph using the guiding object until you find a parsable attribute - [R.is(Object), traversalObject => - R.toPairs(traversalObject).reduce( - (res, [key, value]) => { - return toAnalyse[key] != null ? - [...res, ...findUsedVariables(variables, value, toAnalyse[key])] : - res - }, [] - )], - [R.T, () => []] - ])(schema) - - -let calculableVariables = createSelector( - [variablesSelector], - R.pipe(R.pluck('calculable'), R.unnest) -) - -/************************************ - Functions to find variables */ - -let findVariablesByName = name => - R.filter(variable => removeDiacritics(variable.variable) == name) - -let findVariablesByTags = tags => - R.filter(R.pipe( - R.prop('tags'), - R.whereEq(tags) - )) - -let findVariables = (variables, name, tags) => - R.pipe( - variables => R.is(String, name) - ? findVariablesByName(name)(variables) - : variables, - variables => R.is(Object, tags) - ? findVariablesByTags(tags)(variables) - : variables, - R.cond([ - [ R.isEmpty, () => variableNotFound(name)], - [ (variables) => R.is(String, name) && variables.length > 1, - () => variableNameCollision(name, tags)], - [ R.T, - R.identity] - ]), - )(variables) - -let variableNotFound = name => - // Should do a query to openfisca web api - ({adHoc: true, id: name}) - -let variableNameCollision = (name, tags) => - `More than one variable corresponds to this name, tags tuple : ${name}, ${tags}` - -/*****************************************/ - -export let usedVariables = createSelector( - [state => state.rootVariables, calculableVariables], - (roots, variables) => { - // get all variables from these roots, rec ! - return R.compose( - promises => - Promise.all(promises).then( - R.pipe( - R.flatten, - R.countBy(R.identity), - R.toPairs, - R.sortBy(R.last), - R.reverse - ) - ), - R.flatten, - R.map(rootObject => findUsedVariables(variables, traversalGuide, rootObject)), - R.map(root => findVariables(variables, removeDiacritics(root))[0]) - )(roots) - - } -) diff --git a/.babelrc b/source/.babelrc similarity index 100% rename from .babelrc rename to source/.babelrc diff --git a/.eslintrc b/source/.eslintrc similarity index 100% rename from .eslintrc rename to source/.eslintrc diff --git a/DevTools.js b/source/DevTools.js similarity index 100% rename from DevTools.js rename to source/DevTools.js diff --git a/source/actions.js b/source/actions.js new file mode 100644 index 000000000..e69de29bb diff --git a/components/SelectedVariable.css b/source/components/SelectedVariable.css similarity index 100% rename from components/SelectedVariable.css rename to source/components/SelectedVariable.css diff --git a/components/SelectedVariable.js b/source/components/SelectedVariable.js similarity index 100% rename from components/SelectedVariable.js rename to source/components/SelectedVariable.js diff --git a/components/TagMap.js b/source/components/TagMap.js similarity index 100% rename from components/TagMap.js rename to source/components/TagMap.js diff --git a/components/TagNavigation.js b/source/components/TagNavigation.js similarity index 100% rename from components/TagNavigation.js rename to source/components/TagNavigation.js diff --git a/components/Variables.js b/source/components/Variables.js similarity index 100% rename from components/Variables.js rename to source/components/Variables.js diff --git a/components/variable-colors.yaml b/source/components/variable-colors.yaml similarity index 100% rename from components/variable-colors.yaml rename to source/components/variable-colors.yaml diff --git a/containers/App.dev.js b/source/containers/App.dev.js similarity index 95% rename from containers/App.dev.js rename to source/containers/App.dev.js index 040714cda..29dfa9890 100644 --- a/containers/App.dev.js +++ b/source/containers/App.dev.js @@ -5,8 +5,6 @@ import DevTools from '../DevTools' import routes from '../routes' import {Router, browserHistory} from 'react-router' -import './App.css' - export default class App extends Component { render() { const { store } = this.props diff --git a/containers/App.js b/source/containers/App.js similarity index 100% rename from containers/App.js rename to source/containers/App.js diff --git a/containers/App.prod.js b/source/containers/App.prod.js similarity index 94% rename from containers/App.prod.js rename to source/containers/App.prod.js index 4b764f82f..923689092 100644 --- a/containers/App.prod.js +++ b/source/containers/App.prod.js @@ -4,9 +4,6 @@ import { Provider } from 'react-redux' import routes from '../routes' import Router from 'react-router' - -import './App.css' - export default class App extends Component { render() { const { store } = this.props diff --git a/source/containers/Home.css b/source/containers/Home.css new file mode 100644 index 000000000..0a7e584fe --- /dev/null +++ b/source/containers/Home.css @@ -0,0 +1,58 @@ +#home { + height: 400px; + /*display:flex; + justify-content: center; + align-items: center;*/ +} + +#brand { + position: relative; + color: #333350; + width: 160px; + margin: 6em auto; +} + +#brand img { + display: block; + width: 160px; + margin-bottom: .6em; +} + +#brand #name { + font-size: 250%; + line-height: .9em; +} +#brand #version { + font-style: italic; + font-size: 110%; + position: absolute; + bottom: 0; + right: 0; +} + + +#warning { + padding: 1em 0; + background: #8a1c1c; + color: white; + font-style: italic; + position: fixed; + bottom: 0; + left: 0; + width: 100%; + text-align: center; +} + +#search { + width: 400px; + margin: 4em auto; +} + +#search input { + font-weight: 300; + text-align: center; + font-size: 2em; + width: 100%; + border: none; + border-bottom: 1px solid #333350 +} diff --git a/source/containers/Home.js b/source/containers/Home.js new file mode 100644 index 000000000..eef5f3565 --- /dev/null +++ b/source/containers/Home.js @@ -0,0 +1,22 @@ +import React, { Component } from 'react' +import './Home.css' + +export default class Home extends Component { + render() { + return ( +
+
+ + + Système
+ Social +
+ alpha +
+ + +
) + } +} diff --git a/source/containers/Layout.css b/source/containers/Layout.css new file mode 100644 index 000000000..75ffe162a --- /dev/null +++ b/source/containers/Layout.css @@ -0,0 +1,3 @@ +body { + font-family: 'Open Sans'; +} diff --git a/source/containers/Layout.js b/source/containers/Layout.js new file mode 100644 index 000000000..736d67804 --- /dev/null +++ b/source/containers/Layout.js @@ -0,0 +1,15 @@ +import React, { Component } from 'react' +import './Layout.css' + +export default class Layout extends Component { + render() { + return (
+ + {this.props.children} +
+ Attention ! Tout le contenu de ce site est hautement expérimental. +
+
+ ) + } +} diff --git a/entry.js b/source/entry.js similarity index 95% rename from entry.js rename to source/entry.js index d9f2e91cf..e3776fdcc 100644 --- a/entry.js +++ b/source/entry.js @@ -29,6 +29,7 @@ render( anchor ) +// Hot react component reloading. Unstable but helpful. if (module.hot) { module.hot.accept('./containers/App', () => { // If you use Webpack 2 in ES modules mode, you can diff --git a/source/images/logo.png b/source/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d0027454e4f0dba43ad0d716ae55c7b4933c1a65 GIT binary patch literal 12939 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 p#fIOSVDIB)k0yS7=lh$d?3JmGSJTz>z(0 - - - +

On vous a perdu !

} />
) diff --git a/sagas.js b/source/sagas.js similarity index 91% rename from sagas.js rename to source/sagas.js index 55164391f..925d0dfc3 100644 --- a/sagas.js +++ b/source/sagas.js @@ -2,6 +2,7 @@ import { takeEvery} from 'redux-saga' import { call, put} from 'redux-saga/effects' import Promise from 'core-js/fn/promise' +// Nothing happening here ! function* handleSubmitStep() { console.log('salut') diff --git a/server.js b/source/server.js similarity index 100% rename from server.js rename to source/server.js diff --git a/utils/remove-diacritics.js b/source/utils/remove-diacritics.js similarity index 100% rename from utils/remove-diacritics.js rename to source/utils/remove-diacritics.js diff --git a/webpack.config.js b/source/webpack.config.js similarity index 97% rename from webpack.config.js rename to source/webpack.config.js index 8a93520dc..0fd924dc3 100644 --- a/webpack.config.js +++ b/source/webpack.config.js @@ -8,7 +8,7 @@ module.exports = { 'webpack/hot/only-dev-server', 'react-hot-loader/patch', 'babel-polyfill', - './entry.js' + './source/entry.js' ], output: { path: require('path').resolve('./dist/'),