diff --git a/features/item_select_from_given_corpus.feature b/features/item_select_from_given_corpus.feature new file mode 100644 index 00000000..d6276de1 --- /dev/null +++ b/features/item_select_from_given_corpus.feature @@ -0,0 +1,23 @@ +#language: fr + +Fonctionnalité: (Dé)sélectionner les items d'un ou de plusieurs corpus + + +Scénario: L'utilisateur désélectionne un corpus parmi plusieurs + + Soit un portfolio ouvert + Et tous les corpus sont sélectionnés + Et "SJ 020" un des items affichés + Et "AXN 009" un des items affichés + Quand l'utilisateur désélectionne le corpus "corpus : Vitraux - Bénel" + Alors l'item "AXN 009" est affiché + Mais l'item "SJ 020" est caché + +Scénario: L'utilisateur sélectionne plusieurs corpus + + Soit un portfolio ouvert + Et aucun des corpus n'est sélectionné + Et aucun item n'est affiché + Quand l'utilisateur sélectionne les corpus "corpus : Vitraux - Bénel" et "corpus : Vitraux - Dr. Krieger" + Alors l'item "SJ 020" est affiché + Et l'item "PSM 002" est affiché diff --git a/features/step_definitions/context.rb b/features/step_definitions/context.rb index d1d46e72..baae012a 100644 --- a/features/step_definitions/context.rb +++ b/features/step_definitions/context.rb @@ -85,3 +85,18 @@ page.current_window.resize_to(320, 480) end +Soit("tous les corpus sont sélectionnés") do + find(:css, ".corpus_checkbox[value='corpus : Vitraux - Bénel']").set(true) + find(:css, ".corpus_checkbox[value='corpus : Vitraux - Dr. Krieger']").set(true) + find(:css, ".corpus_checkbox[value='corpus : Vitraux - Recensement']").set(true) +end + +Soit("aucun des corpus n'est sélectionné") do + find(".corpus_checkbox[value='corpus : Vitraux - Bénel']").set(false) + find(".corpus_checkbox[value='corpus : Vitraux - Dr. Krieger']").set(false) + find(".corpus_checkbox[value='corpus : Vitraux - Recensement']").set(false) +end + +Soit("aucun item n'est affiché") do + expect(page).not_to have_selector ".Item" +end diff --git a/features/step_definitions/event.rb b/features/step_definitions/event.rb index 1e4f5ce1..e7402a50 100644 --- a/features/step_definitions/event.rb +++ b/features/step_definitions/event.rb @@ -37,7 +37,7 @@ Quand("l'utilisateur indique {string} comme valeur de l'attribut {string}") do |value, attribute| within '.Attributes' do fill_in placeholder: 'Ajouter un attribut et une valeur...', with: "#{attribute}:#{value}" - click_on class: 'ValidateButton' + click_on class: 'ValidateButton' end end @@ -96,3 +96,11 @@ end end +Quand("l'utilisateur désélectionne le corpus {string}") do |corpus| + find(".corpus_checkbox[value='#{corpus}']").set(false) +end + +Quand("l'utilisateur sélectionne les corpus {string} et {string}") do |corpus1, corpus2| + find(".corpus_checkbox[value='#{corpus1}']").set(true) + find(".corpus_checkbox[value='#{corpus2}']").set(true) +end diff --git a/src/Selection.js b/src/Selection.js index efb2a4be..9a7ae530 100644 --- a/src/Selection.js +++ b/src/Selection.js @@ -154,6 +154,49 @@ export default class Selection { clause.type = (clause.type === 'intersection') ? 'union' : 'intersection'; } + addCorpus = (corpusId) => { + const existing = this.selectionJSON.data.some(e => + e.selection.find(corpus => corpus === corpusId) + || e.exclusion.find(corpus => corpus === corpusId) + ); + if (!existing) { + this.selectionJSON.data = []; + this.selectionJSON.data.push({type: 'intersection', selection: [], exclusion: [corpusId]}); + } + } + + toggleCorpus = (corpusId) => { + const existingClause = this.selectionJSON.data.find(s => { + const allTopics = [...s.selection, ...s.exclusion]; + if (allTopics.length === 0) { + return false; + } + return true; + }); + if (existingClause) { + this.testSwitchPlace(existingClause, corpusId, false, true); + if ([...existingClause.selection, ...existingClause.exclusion].length === 0) + this.selectionJSON.data.splice(this.selectionJSON.data.indexOf(existingClause), 1); + } else { + this.addCorpus(corpusId); + } + } + + testSwitchPlace = (clause, criterion, toDelete, threeState) => { + let index; + if ((index = clause.selection.indexOf(criterion)) > -1) { + clause.selection.splice(index, 1); + if (!toDelete) + clause.exclusion.push(criterion); + } else if ((index = clause.exclusion.indexOf(criterion)) > -1) { + clause.exclusion.splice(index, 1); + if (!toDelete && !threeState) + clause.selection.push(criterion); + } else { + clause.exclusion.push(criterion); + } + }; + getClauses = () => this.selectionJSON.data; getMainClause = () => this.selectionJSON; diff --git a/src/components/portfolioPage/Badge.jsx b/src/components/portfolioPage/Badge.jsx index 177b2ee3..5eb51766 100644 --- a/src/components/portfolioPage/Badge.jsx +++ b/src/components/portfolioPage/Badge.jsx @@ -14,7 +14,7 @@ class Badge extends Component { {this.props.name}