imio.smartweb.core 1.2.47__py3-none-any.whl → 1.2.48__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- imio/smartweb/core/contents/sections/events/view.py +2 -1
- imio/smartweb/core/contents/sections/news/view.py +2 -1
- imio/smartweb/core/contents/sections/text/views.py +2 -0
- imio/smartweb/core/contents/sections/views.py +2 -0
- imio/smartweb/core/tests/resources/json_rest_events.json +4 -1
- imio/smartweb/core/tests/test_rest.py +4 -1
- imio/smartweb/core/tests/test_section_events.py +9 -8
- imio/smartweb/core/tests/test_section_news.py +6 -6
- imio/smartweb/core/tests/test_vocabularies.py +2 -2
- imio/smartweb/core/utils.py +1 -1
- imio/smartweb/core/viewlets/footer.pt +5 -0
- imio/smartweb/core/viewlets/footer.py +5 -0
- imio/smartweb/core/vocabularies.py +2 -2
- imio/smartweb/core/webcomponents/build/css/373.smartweb-webcomponents-compiled.css +1 -1
- imio/smartweb/core/webcomponents/build/css/486.smartweb-webcomponents-compiled.css +1 -1
- imio/smartweb/core/webcomponents/build/css/884.smartweb-webcomponents-compiled.css +1 -0
- imio/smartweb/core/webcomponents/build/css/smartweb-webcomponents-compiled.css +1 -1
- imio/smartweb/core/webcomponents/build/js/218.smartweb-webcomponents-compiled.js +1 -1
- imio/smartweb/core/webcomponents/build/js/218.smartweb-webcomponents-compiled.js.LICENSE.txt +5 -0
- imio/smartweb/core/webcomponents/build/js/373.smartweb-webcomponents-compiled.js +1 -1
- imio/smartweb/core/webcomponents/build/js/486.smartweb-webcomponents-compiled.js +1 -1
- imio/smartweb/core/webcomponents/build/js/736.smartweb-webcomponents-compiled.js +1 -1
- imio/smartweb/core/webcomponents/build/js/736.smartweb-webcomponents-compiled.js.LICENSE.txt +3 -3
- imio/smartweb/core/webcomponents/build/js/884.smartweb-webcomponents-compiled.js +1 -0
- imio/smartweb/core/webcomponents/build/js/919.smartweb-webcomponents-compiled.js +1 -1
- imio/smartweb/core/webcomponents/build/js/smartweb-webcomponents-compiled.js +1 -1
- imio/smartweb/core/webcomponents/src/components/Annuaire/Annuaire.jsx +101 -74
- imio/smartweb/core/webcomponents/src/components/Annuaire/Annuaire.scss +4 -22
- imio/smartweb/core/webcomponents/src/components/Annuaire/ContactCard/ContactCard.jsx +22 -18
- imio/smartweb/core/webcomponents/src/components/Annuaire/ContactContent/ContactContent.jsx +4 -2
- imio/smartweb/core/webcomponents/src/components/Annuaire/ContactList/ContactList.jsx +7 -2
- imio/smartweb/core/webcomponents/src/components/Annuaire/Filters/Filter.jsx +211 -98
- imio/smartweb/core/webcomponents/src/components/Events/EventContent/EventContent.jsx +506 -378
- imio/smartweb/core/webcomponents/src/components/Events/EventList/EventList.jsx +13 -4
- imio/smartweb/core/webcomponents/src/components/Events/Events.jsx +117 -82
- imio/smartweb/core/webcomponents/src/components/Events/Events.scss +52 -28
- imio/smartweb/core/webcomponents/src/components/Events/Filters/Filter.jsx +257 -90
- imio/smartweb/core/webcomponents/src/components/Filters/DateFilter.jsx +62 -54
- imio/smartweb/core/webcomponents/src/components/Filters/DateFilter.scss +60 -12
- imio/smartweb/core/webcomponents/src/components/Filters/IamData.jsx +42 -0
- imio/smartweb/core/webcomponents/src/components/Filters/MainFilter.scss +217 -0
- imio/smartweb/core/webcomponents/src/components/Filters/PublicTargetData.jsx +94 -0
- imio/smartweb/core/webcomponents/src/components/Filters/SelectStyles.js +58 -0
- imio/smartweb/core/webcomponents/src/components/Filters/TaxonomyFilter.jsx +149 -0
- imio/smartweb/core/webcomponents/src/components/Filters/TaxonomyFilter.scss +70 -0
- imio/smartweb/core/webcomponents/src/components/News/Filters/Filter.jsx +127 -82
- imio/smartweb/core/webcomponents/src/components/News/News.jsx +86 -53
- imio/smartweb/core/webcomponents/src/components/News/News.scss +29 -9
- imio/smartweb/core/webcomponents/src/components/News/NewsCard/NewsCard.jsx +34 -31
- imio/smartweb/core/webcomponents/src/components/News/NewsContent/NewsContent.jsx +264 -244
- imio/smartweb/core/webcomponents/src/components/News/NewsList/NewsList.jsx +13 -8
- imio/smartweb/core/webcomponents/src/components/Search/ContactResult/ContactResult.jsx +23 -12
- imio/smartweb/core/webcomponents/src/components/Search/EventsResult/EventsResult.jsx +23 -12
- imio/smartweb/core/webcomponents/src/components/Search/Filters/Filter.jsx +5 -5
- imio/smartweb/core/webcomponents/src/components/Search/NewsResult/NewsResult.jsx +23 -12
- imio/smartweb/core/webcomponents/src/components/Search/Search.jsx +4 -4
- imio/smartweb/core/webcomponents/src/components/Search/WebResult/WebResult.jsx +13 -4
- imio/smartweb/core/webcomponents/src/index.jsx +3 -3
- imio/smartweb/core/webcomponents/src/index.scss +11 -65
- imio/smartweb/core/webcomponents/src/utils/Map.jsx +18 -9
- imio/smartweb/core/webcomponents/src/utils/translation.js +18 -0
- imio.smartweb.core-1.2.48-py3.10-nspkg.pth +3 -0
- {imio.smartweb.core-1.2.47.dist-info → imio.smartweb.core-1.2.48.dist-info}/METADATA +22 -3
- {imio.smartweb.core-1.2.47.dist-info → imio.smartweb.core-1.2.48.dist-info}/RECORD +69 -63
- {imio.smartweb.core-1.2.47.dist-info → imio.smartweb.core-1.2.48.dist-info}/WHEEL +1 -1
- imio/smartweb/core/webcomponents/build/css/686.smartweb-webcomponents-compiled.css +0 -1
- imio/smartweb/core/webcomponents/build/js/686.smartweb-webcomponents-compiled.js +0 -1
- imio.smartweb.core-1.2.47-py3.8-nspkg.pth +0 -2
- {imio.smartweb.core-1.2.47.dist-info → imio.smartweb.core-1.2.48.dist-info}/LICENSE.GPL +0 -0
- {imio.smartweb.core-1.2.47.dist-info → imio.smartweb.core-1.2.48.dist-info}/LICENSE.rst +0 -0
- {imio.smartweb.core-1.2.47.dist-info → imio.smartweb.core-1.2.48.dist-info}/namespace_packages.txt +0 -0
- {imio.smartweb.core-1.2.47.dist-info → imio.smartweb.core-1.2.48.dist-info}/top_level.txt +0 -0
@@ -2,20 +2,21 @@ import React, { useEffect, useRef, useCallback, useState } from "react";
|
|
2
2
|
import Select from "react-select";
|
3
3
|
import { useNavigate } from "react-router-dom";
|
4
4
|
import useAxios from "../../../hooks/useAxios";
|
5
|
-
import { Translator } from "react-translated";
|
5
|
+
import { Translator, Translate } from "react-translated";
|
6
6
|
import DateFilter from "../../Filters/DateFilter";
|
7
7
|
import moment from "moment";
|
8
|
-
import queryString from
|
8
|
+
import queryString from "query-string";
|
9
|
+
import { taxonomy_event_public } from "./../../Filters/PublicTargetData";
|
10
|
+
import { iam } from "./../../Filters/IamData";
|
11
|
+
import { menuStyles, moreFilterStyles } from "./../../Filters/SelectStyles";
|
9
12
|
|
10
13
|
function Filters(props) {
|
11
14
|
let navigate = useNavigate();
|
12
15
|
const [inputValues, setInputValues] = useState(props.activeFilter);
|
13
16
|
const [topicsFilter, setTopicsFilter] = useState(null);
|
14
17
|
const [categoryFilter, setCategoryFilter] = useState(null);
|
15
|
-
|
16
|
-
// const [dates, setDates] = useState({ start: moment().format('YYYY-MM-DD'), end: null});
|
18
|
+
const [localsCategoryFilter, setLocalsCategoryFilter] = useState([]);
|
17
19
|
const [dates, setDates] = useState(null);
|
18
|
-
|
19
20
|
// Get data
|
20
21
|
const { response, error, isLoading } = useAxios({
|
21
22
|
method: "get",
|
@@ -25,9 +26,11 @@ function Filters(props) {
|
|
25
26
|
Accept: "application/json",
|
26
27
|
},
|
27
28
|
params: inputValues,
|
28
|
-
paramsSerializer: { indexes: null }
|
29
|
+
paramsSerializer: { indexes: null },
|
29
30
|
});
|
30
31
|
|
32
|
+
|
33
|
+
// set fitlers data to state
|
31
34
|
useEffect(() => {
|
32
35
|
if (response !== null) {
|
33
36
|
const optionsTopics =
|
@@ -41,12 +44,33 @@ function Filters(props) {
|
|
41
44
|
response.category.map((d) => ({
|
42
45
|
value: d.token,
|
43
46
|
label: d.title,
|
47
|
+
queryString: "category",
|
48
|
+
}));
|
49
|
+
const optionsLocalsCategory =
|
50
|
+
response.local_category &&
|
51
|
+
response.local_category.map((d) => ({
|
52
|
+
value: d.token,
|
53
|
+
label: d.title,
|
54
|
+
queryString: "local_category",
|
44
55
|
}));
|
45
56
|
setTopicsFilter(optionsTopics);
|
46
57
|
setCategoryFilter(optionsCategory);
|
58
|
+
setLocalsCategoryFilter(optionsLocalsCategory)
|
47
59
|
}
|
48
60
|
}, [response]);
|
49
61
|
|
62
|
+
// const to group category and local category
|
63
|
+
const groupedOptions = [
|
64
|
+
{
|
65
|
+
label: <Translate text="Catégories locale" />,
|
66
|
+
options: localsCategoryFilter,
|
67
|
+
},
|
68
|
+
{
|
69
|
+
label: <Translate text="Catégories" />,
|
70
|
+
options: categoryFilter,
|
71
|
+
},
|
72
|
+
];
|
73
|
+
|
50
74
|
const onChangeHandler = useCallback(({ target: { name, value } }) => {
|
51
75
|
if (value.length > 2) {
|
52
76
|
setInputValues((state) => ({ ...state, [name]: value }), []);
|
@@ -70,6 +94,29 @@ function Filters(props) {
|
|
70
94
|
});
|
71
95
|
}
|
72
96
|
});
|
97
|
+
// const onChangeCheckbox = useCallback((value, action) => {
|
98
|
+
// if (value.target.checked) {
|
99
|
+
// setInputValues((state) => ({ ...state, free_entry: true }), []);
|
100
|
+
// } else {
|
101
|
+
// setInputValues((state) => {
|
102
|
+
// const newState = { ...state };
|
103
|
+
// delete newState["free_entry"];
|
104
|
+
// return newState;
|
105
|
+
// }, []);
|
106
|
+
// }
|
107
|
+
// });
|
108
|
+
|
109
|
+
const onChangeGroupSelect = useCallback((value, action) => {
|
110
|
+
if (value) {
|
111
|
+
setInputValues((state) => ({ ...state, [value.queryString]: value.value }), []);
|
112
|
+
} else {
|
113
|
+
setInputValues((prevState) => {
|
114
|
+
const state = { ...prevState };
|
115
|
+
const { [action.removedValues[0].queryString]: remove, ...rest } = state;
|
116
|
+
return rest;
|
117
|
+
});
|
118
|
+
}
|
119
|
+
});
|
73
120
|
|
74
121
|
// make to no launch useEffect first time
|
75
122
|
const firstUpdate = useRef(true);
|
@@ -96,111 +143,231 @@ function Filters(props) {
|
|
96
143
|
let actCategory =
|
97
144
|
categoryFilter &&
|
98
145
|
categoryFilter.filter((option) => option.value === props.activeFilter.category);
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
placeholder: (styles) => ({
|
107
|
-
...styles,
|
108
|
-
color: "000",
|
109
|
-
fontWeight: "bold",
|
110
|
-
fontSize: "12px",
|
111
|
-
textTransform: "uppercase",
|
112
|
-
letterSpacing: "1.2px",
|
113
|
-
}),
|
114
|
-
option: (styles, { data, isDisabled, isFocused, isSelected }) => {
|
115
|
-
return {
|
116
|
-
...styles,
|
117
|
-
};
|
118
|
-
},
|
119
|
-
};
|
146
|
+
|
147
|
+
let actTarget =
|
148
|
+
taxonomy_event_public &&
|
149
|
+
taxonomy_event_public.filter((option) => option.value === props.activeFilter.topics);
|
150
|
+
|
151
|
+
let actIam = iam && iam.filter((option) => option.value === props.activeFilter.topics);
|
152
|
+
|
120
153
|
useEffect(() => {
|
121
154
|
if (dates) {
|
122
|
-
setInputValues(prevState => {
|
155
|
+
setInputValues((prevState) => {
|
123
156
|
if (dates["event_dates.query"].length > 1) {
|
124
157
|
const { "event_dates.range": _, ...rest } = dates;
|
125
158
|
const newValue = "min:max";
|
126
159
|
return { ...prevState, ...rest, "event_dates.range": newValue };
|
127
|
-
} else if (dates["event_dates.query"].every(item => item === null)) {
|
128
|
-
return {
|
129
|
-
|
130
|
-
|
160
|
+
} else if (dates["event_dates.query"].every((item) => item === null)) {
|
161
|
+
return {
|
162
|
+
...prevState,
|
163
|
+
"event_dates.query": [moment().format("YYYY-MM-DD")],
|
164
|
+
"event_dates.range": "min",
|
165
|
+
};
|
166
|
+
} else {
|
131
167
|
return { ...prevState, ...dates, "event_dates.range": "min" };
|
132
168
|
}
|
133
169
|
});
|
134
170
|
}
|
135
171
|
}, [dates]);
|
172
|
+
|
136
173
|
return (
|
137
174
|
<React.Fragment>
|
138
|
-
<
|
139
|
-
|
140
|
-
|
175
|
+
<div className="react-filters-menu">
|
176
|
+
<div className="react-filters-container">
|
177
|
+
<form className="r-filter r-filter-search" onSubmit={handleSubmit}>
|
178
|
+
{/* <label>Recherche</label> */}
|
179
|
+
<div className="relative">
|
180
|
+
<Translator>
|
181
|
+
{({ translate }) => (
|
182
|
+
<input
|
183
|
+
className="input-custom-class"
|
184
|
+
name="SearchableText"
|
185
|
+
type="text"
|
186
|
+
value={inputValues.SearchableText}
|
187
|
+
onChange={onChangeHandler}
|
188
|
+
placeholder={translate({
|
189
|
+
text: "Recherche",
|
190
|
+
})}
|
191
|
+
/>
|
192
|
+
)}
|
193
|
+
</Translator>
|
194
|
+
<svg
|
195
|
+
xmlns="http://www.w3.org/2000/svg"
|
196
|
+
fill="none"
|
197
|
+
stroke="#9f9f9f"
|
198
|
+
strokeWidth="4"
|
199
|
+
aria-hidden="true"
|
200
|
+
display="block"
|
201
|
+
overflow="visible"
|
202
|
+
style={{ height: 16, width: 16 }}
|
203
|
+
viewBox="0 0 32 32"
|
204
|
+
>
|
205
|
+
<path d="M13 24a11 11 0 1 0 0-22 11 11 0 0 0 0 22zm8-3 9 9" />
|
206
|
+
</svg>
|
207
|
+
</div>
|
208
|
+
</form>
|
209
|
+
{/* More filter*/}
|
210
|
+
<button
|
211
|
+
className="more-filter-btn collapsed"
|
212
|
+
type="button"
|
213
|
+
data-bs-toggle="collapse"
|
214
|
+
data-bs-target="#collapseOne"
|
215
|
+
aria-expanded="false"
|
216
|
+
aria-controls="collapseOne"
|
217
|
+
>
|
218
|
+
<svg
|
219
|
+
xmlns="http://www.w3.org/2000/svg"
|
220
|
+
viewBox="0 0 32 32"
|
221
|
+
style={{ height: 16, width: 16 }}
|
222
|
+
fill="none"
|
223
|
+
stroke="currentColor"
|
224
|
+
strokeWidth="3"
|
225
|
+
aria-hidden="true"
|
226
|
+
display="block"
|
227
|
+
overflow="visible"
|
228
|
+
>
|
229
|
+
<path d="M7 16H3m26 0H15M29 6h-4m-8 0H3m26 20h-4M7 16a4 4 0 108 0 4 4 0 00-8 0zM17 6a4 4 0 108 0 4 4 0 00-8 0zm0 20a4 4 0 108 0 4 4 0 00-8 0zm0 0H3"></path>
|
230
|
+
</svg>
|
231
|
+
</button>
|
232
|
+
<div className="react-sep-menu"></div>
|
233
|
+
{props.onlyPastEvents === "False" && (
|
234
|
+
<div className="r-filter schedul-Filter">
|
235
|
+
<DateFilter language={props.language} setDates={setDates} />
|
236
|
+
</div>
|
237
|
+
)}
|
238
|
+
<div className="react-sep-menu"></div>
|
239
|
+
|
240
|
+
{/* <div className="r-filter top-filter facilities-Filter">
|
241
|
+
<Translator>
|
242
|
+
{({ translate }) => (
|
243
|
+
<Select
|
244
|
+
styles={menuStyles}
|
245
|
+
name={"category"}
|
246
|
+
className="select-custom-no-border library-facilities"
|
247
|
+
isClearable
|
248
|
+
onChange={onChangeHandlerSelect}
|
249
|
+
options={categoryFilter && categoryFilter}
|
250
|
+
placeholder={translate({
|
251
|
+
text: "Quoi",
|
252
|
+
})}
|
253
|
+
value={actCategory && actCategory[0]}
|
254
|
+
/>
|
255
|
+
)}
|
256
|
+
</Translator>
|
257
|
+
</div> */}
|
258
|
+
|
259
|
+
{/* test */}
|
141
260
|
<Translator>
|
142
261
|
{({ translate }) => (
|
143
|
-
<
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
262
|
+
<div className="r-filter top-filter facilities-Filter">
|
263
|
+
{/* <label>Catégories</label> */}
|
264
|
+
<Select
|
265
|
+
styles={menuStyles}
|
266
|
+
name={"category"}
|
267
|
+
className="select-custom-no-border library-facilities"
|
268
|
+
isClearable
|
269
|
+
onChange={onChangeGroupSelect}
|
270
|
+
options={localsCategoryFilter.length === 0 ? categoryFilter && categoryFilter :groupedOptions}
|
271
|
+
placeholder={translate({
|
272
|
+
text: "Quoi",
|
273
|
+
})}
|
274
|
+
value={actCategory && actCategory[0]}
|
275
|
+
/>
|
276
|
+
</div>
|
153
277
|
)}
|
154
278
|
</Translator>
|
155
|
-
<button type="submit"></button>
|
156
279
|
</div>
|
157
|
-
</form>
|
158
|
-
|
159
|
-
<div className="r-filter topics-Filter">
|
160
|
-
{/* <label>Thématiques</label> */}
|
161
|
-
<Translator>
|
162
|
-
{({ translate }) => (
|
163
|
-
<Select
|
164
|
-
styles={customStyles}
|
165
|
-
name={"topics"}
|
166
|
-
className="select-custom-class library-topics"
|
167
|
-
isClearable
|
168
|
-
onChange={onChangeHandlerSelect}
|
169
|
-
options={topicsFilter && topicsFilter}
|
170
|
-
placeholder={translate({
|
171
|
-
text: 'Thématiques'
|
172
|
-
})}
|
173
|
-
value={actTopi && actTopi[0]}
|
174
|
-
/>
|
175
|
-
)}
|
176
|
-
</Translator>
|
177
|
-
</div>
|
178
|
-
<div className="r-filter facilities-Filter">
|
179
|
-
{/* <label>Catégories</label> */}
|
180
|
-
<Translator>
|
181
|
-
{({ translate }) => (
|
182
|
-
<Select
|
183
|
-
styles={customStyles}
|
184
|
-
name={"category"}
|
185
|
-
className="select-custom-class library-facilities"
|
186
|
-
isClearable
|
187
|
-
onChange={onChangeHandlerSelect}
|
188
|
-
options={categoryFilter && categoryFilter}
|
189
|
-
placeholder={translate({
|
190
|
-
text: 'Catégories'
|
191
|
-
})}
|
192
|
-
value={actCategory && actCategory[0]}
|
193
|
-
/>
|
194
|
-
)}
|
195
|
-
</Translator>
|
196
280
|
</div>
|
197
|
-
|
198
|
-
|
199
|
-
|
281
|
+
|
282
|
+
{/* -------------- More filter -------------- */}
|
283
|
+
|
284
|
+
<div
|
285
|
+
id="collapseOne"
|
286
|
+
className="accordion-collapse collapse more-filter-container "
|
287
|
+
aria-labelledby="headingOne"
|
288
|
+
data-bs-parent="#accordionExample"
|
289
|
+
>
|
290
|
+
<div className="accordion-body">
|
291
|
+
{/* Filtre thématique */}
|
292
|
+
<div className="r-filter collapse-filter topics-Filter">
|
293
|
+
{/* <label>Thématiques</label> */}
|
294
|
+
<Translator>
|
295
|
+
{({ translate }) => (
|
296
|
+
<Select
|
297
|
+
styles={moreFilterStyles}
|
298
|
+
name={"topics"}
|
299
|
+
className="library-topics"
|
300
|
+
isClearable
|
301
|
+
onChange={onChangeHandlerSelect}
|
302
|
+
options={topicsFilter && topicsFilter}
|
303
|
+
placeholder={translate({
|
304
|
+
text: "Thématiques",
|
305
|
+
})}
|
306
|
+
value={actTopi && actTopi[0]}
|
307
|
+
/>
|
308
|
+
)}
|
309
|
+
</Translator>
|
310
|
+
</div>
|
311
|
+
{/* Filtre Public cible */}
|
312
|
+
<div className="r-filter collapse-filter public-target-Filter">
|
313
|
+
{/* <label>Thématiques</label> */}
|
314
|
+
<Translator>
|
315
|
+
{({ translate }) => (
|
316
|
+
<Select
|
317
|
+
styles={moreFilterStyles}
|
318
|
+
name={"taxonomy_event_public"}
|
319
|
+
className="library-topics"
|
320
|
+
isClearable
|
321
|
+
onChange={onChangeHandlerSelect}
|
322
|
+
options={taxonomy_event_public && taxonomy_event_public}
|
323
|
+
placeholder={translate({
|
324
|
+
text: "Public cible",
|
325
|
+
})}
|
326
|
+
value={actTarget && actTarget[0]}
|
327
|
+
/>
|
328
|
+
)}
|
329
|
+
</Translator>
|
330
|
+
</div>
|
331
|
+
|
332
|
+
{/* Filtre iam */}
|
333
|
+
<div className="r-filter collapse-filter iam-Filter">
|
334
|
+
{/* <label>Thématiques</label> */}
|
335
|
+
<Translator>
|
336
|
+
{({ translate }) => (
|
337
|
+
<Select
|
338
|
+
styles={moreFilterStyles}
|
339
|
+
name={"iam"}
|
340
|
+
className="library-topics"
|
341
|
+
isClearable
|
342
|
+
onChange={onChangeHandlerSelect}
|
343
|
+
options={iam && iam}
|
344
|
+
placeholder={translate({
|
345
|
+
text: "Profil",
|
346
|
+
})}
|
347
|
+
value={actIam && actIam[0]}
|
348
|
+
/>
|
349
|
+
)}
|
350
|
+
</Translator>
|
351
|
+
</div>
|
352
|
+
|
353
|
+
{/* Filtre Gratuit */}
|
354
|
+
{/* <div className="r-filter collapse-filter free-Filter">
|
355
|
+
<div className="form-check form-switch">
|
356
|
+
<label className="form-check-label" htmlFor="flexSwitchCheckDefault">
|
357
|
+
Gratuit
|
358
|
+
</label>
|
359
|
+
<input
|
360
|
+
className="form-check-input"
|
361
|
+
onChange={onChangeCheckbox}
|
362
|
+
type="checkbox"
|
363
|
+
id="flexSwitchCheckDefault"
|
364
|
+
/>
|
365
|
+
</div>
|
366
|
+
</div> */}
|
200
367
|
</div>
|
201
|
-
|
368
|
+
</div>
|
202
369
|
</React.Fragment>
|
203
370
|
);
|
204
371
|
}
|
205
372
|
|
206
|
-
export default Filters;
|
373
|
+
export default Filters;
|
@@ -1,13 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
1
|
import React, { useState, useContext } from "react";
|
4
|
-
import DatePicker from
|
5
|
-
import
|
2
|
+
import DatePicker from "react-datepicker";
|
3
|
+
import "react-datepicker/dist/react-datepicker.css";
|
6
4
|
import moment from "moment";
|
7
|
-
import { Dropdown, DropdownButton } from
|
5
|
+
import { Dropdown, DropdownButton } from "react-bootstrap";
|
8
6
|
import { Translate, Translator } from "react-translated";
|
9
|
-
import { nl, fr, enGB, de } from
|
10
|
-
|
7
|
+
import { nl, fr, enGB, de } from "date-fns/locale";
|
8
|
+
|
9
|
+
import "./DateFilter.scss";
|
11
10
|
|
12
11
|
const languageList = {
|
13
12
|
fr: fr,
|
@@ -19,61 +18,61 @@ function DateFilter({ language, setDates }) {
|
|
19
18
|
// const currentLanguage = useContext(LanguageContext);
|
20
19
|
const [dateRange, setDateRange] = useState([null, null]);
|
21
20
|
const [startDate, endDate] = dateRange;
|
22
|
-
const [filter, setFilter] = useState(
|
21
|
+
const [filter, setFilter] = useState(<Translate text="Quand" />);
|
23
22
|
const [languageToLocale, setLanguageToLocale] = useState();
|
24
23
|
|
25
24
|
const handleApply = (e) => {
|
26
25
|
setDateRange(e);
|
27
26
|
const dates = e; // Remplacez ceci par votre tableau de dates
|
28
|
-
const filteredDates = dates.filter(date => date !== null);
|
29
|
-
const formattedDates = filteredDates.map(date => moment(date).format(
|
27
|
+
const filteredDates = dates.filter((date) => date !== null);
|
28
|
+
const formattedDates = filteredDates.map((date) => moment(date).format("YYYY-MM-DD"));
|
30
29
|
setDates({ "event_dates.query": formattedDates });
|
31
|
-
if (e.every(item => item === null)) {
|
30
|
+
if (e.every((item) => item === null)) {
|
32
31
|
setFilter(periodTitle.all);
|
33
32
|
} else {
|
34
33
|
setFilter(periodTitle.custom);
|
35
34
|
}
|
36
35
|
};
|
37
|
-
const today = moment().format(
|
36
|
+
const today = moment().format("YYYY-MM-DD");
|
38
37
|
|
39
38
|
const periodTitle = {
|
40
39
|
all: <Translate text="Toutes les dates" />,
|
41
40
|
today: <Translate text="Aujourd'hui" />,
|
42
|
-
tomorrow: <Translate text=
|
43
|
-
thisWeekEnd: <Translate text=
|
44
|
-
thisWeek: <Translate text=
|
45
|
-
thisMonth: <Translate text=
|
46
|
-
custom: <Translate text=
|
47
|
-
}
|
41
|
+
tomorrow: <Translate text="Demain" />,
|
42
|
+
thisWeekEnd: <Translate text="Ce week-end" />,
|
43
|
+
thisWeek: <Translate text="Cette semaine" />,
|
44
|
+
thisMonth: <Translate text="Ce mois-ci" />,
|
45
|
+
custom: <Translate text="Personnalisé (Du ... au ...)" />,
|
46
|
+
};
|
48
47
|
|
49
48
|
const handleSelect = (eventKey) => {
|
50
49
|
switch (eventKey) {
|
51
|
-
case
|
50
|
+
case "all":
|
52
51
|
setDates({ "event_dates.query": [today] });
|
53
52
|
setFilter(periodTitle.all);
|
54
53
|
break;
|
55
|
-
case
|
54
|
+
case "today":
|
56
55
|
setDates({ "event_dates.query": [today, today] });
|
57
56
|
setFilter(periodTitle.today);
|
58
57
|
break;
|
59
|
-
case
|
60
|
-
const tomorrow = moment().add(1,
|
58
|
+
case "tomorrow":
|
59
|
+
const tomorrow = moment().add(1, "days").format("YYYY-MM-DD");
|
61
60
|
setDates({ "event_dates.query": [tomorrow, tomorrow] });
|
62
61
|
setFilter(periodTitle.tomorrow);
|
63
62
|
break;
|
64
|
-
case
|
65
|
-
const startOfWeekEnd = moment().endOf(
|
66
|
-
const endOfWeekEnd = moment().endOf(
|
63
|
+
case "thisWeekEnd":
|
64
|
+
const startOfWeekEnd = moment().endOf("week").format("YYYY-MM-DD");
|
65
|
+
const endOfWeekEnd = moment().endOf("week").add(1, "days").format("YYYY-MM-DD");
|
67
66
|
setDates({ "event_dates.query": [startOfWeekEnd, endOfWeekEnd] });
|
68
67
|
setFilter(periodTitle.thisWeekEnd);
|
69
68
|
break;
|
70
|
-
case
|
71
|
-
const endOfWeek = moment().endOf(
|
69
|
+
case "thisWeek":
|
70
|
+
const endOfWeek = moment().endOf("week").add(1, "days").format("YYYY-MM-DD");
|
72
71
|
setDates({ "event_dates.query": [today, endOfWeek] });
|
73
72
|
setFilter(periodTitle.thisWeek);
|
74
73
|
break;
|
75
|
-
case
|
76
|
-
const endOfMonth = moment().endOf(
|
74
|
+
case "thisMonth":
|
75
|
+
const endOfMonth = moment().endOf("month").format("YYYY-MM-DD");
|
77
76
|
setDates({ "event_dates.query": [today, endOfMonth] });
|
78
77
|
setFilter(periodTitle.thisMonth);
|
79
78
|
break;
|
@@ -83,13 +82,17 @@ function DateFilter({ language, setDates }) {
|
|
83
82
|
};
|
84
83
|
|
85
84
|
useState(() => {
|
86
|
-
setLanguageToLocale(languageList[language])
|
85
|
+
setLanguageToLocale(languageList[language]);
|
87
86
|
}, []);
|
88
87
|
|
89
88
|
return (
|
90
89
|
<>
|
91
90
|
<div className="period-filter">
|
92
|
-
<DropdownButton
|
91
|
+
<DropdownButton
|
92
|
+
className="period-filter-toggler"
|
93
|
+
onSelect={handleSelect}
|
94
|
+
title={filter}
|
95
|
+
>
|
93
96
|
<Dropdown.Item eventKey="all">{periodTitle.all}</Dropdown.Item>
|
94
97
|
<Dropdown.Item eventKey="today">{periodTitle.today}</Dropdown.Item>
|
95
98
|
<Dropdown.Item eventKey="tomorrow">{periodTitle.tomorrow}</Dropdown.Item>
|
@@ -97,28 +100,33 @@ function DateFilter({ language, setDates }) {
|
|
97
100
|
<Dropdown.Item eventKey="thisWeek">{periodTitle.thisWeek}</Dropdown.Item>
|
98
101
|
<Dropdown.Item eventKey="thisMonth">{periodTitle.thisMonth}</Dropdown.Item>
|
99
102
|
<div className="perdiod-filter-range">
|
100
|
-
{languageToLocale &&
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
103
|
+
{languageToLocale && (
|
104
|
+
<Translator>
|
105
|
+
{({ translate, language }) => (
|
106
|
+
<DatePicker
|
107
|
+
dateFormat="dd/MM/yyyy"
|
108
|
+
placeholderText={translate({
|
109
|
+
text: "Personnalisé (Du ... au ...)",
|
110
|
+
})}
|
111
|
+
selectsRange={true}
|
112
|
+
startDate={startDate}
|
113
|
+
endDate={endDate}
|
114
|
+
minDate={new Date().setDate(new Date().getDate() + 1)}
|
115
|
+
onChange={(update) => {
|
116
|
+
setDateRange(update);
|
117
|
+
if (
|
118
|
+
(update[0] !== null && update[1] !== null) ||
|
119
|
+
(update[0] == null && update[1] == null)
|
120
|
+
) {
|
121
|
+
handleApply(update);
|
122
|
+
}
|
123
|
+
}}
|
124
|
+
isClearable={true}
|
125
|
+
locale={languageToLocale}
|
126
|
+
/>
|
127
|
+
)}
|
128
|
+
</Translator>
|
129
|
+
)}
|
122
130
|
</div>
|
123
131
|
</DropdownButton>
|
124
132
|
</div>
|
@@ -126,4 +134,4 @@ function DateFilter({ language, setDates }) {
|
|
126
134
|
);
|
127
135
|
}
|
128
136
|
|
129
|
-
export default DateFilter;
|
137
|
+
export default DateFilter;
|