diff --git a/README.md b/README.md
index 8e60b13..5f2e813 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-
+
Roadmap |
Presentation |
diff --git a/app/cells/decidim/geo/content_blocks/geo_maps_cell.rb b/app/cells/decidim/geo/content_blocks/geo_maps_cell.rb
index c74066a..62cb075 100644
--- a/app/cells/decidim/geo/content_blocks/geo_maps_cell.rb
+++ b/app/cells/decidim/geo/content_blocks/geo_maps_cell.rb
@@ -42,7 +42,7 @@ def insert_map
images: {
not_geolocated: ActionController::Base.helpers.asset_pack_path("media/images/not-geolocated.svg")
},
- filters: @options[:filters] || [],
+ filters: (@options[:filters] || []).concat([{ timeFilter: { time: "active" } }]),
map_config: {
lat: geo_config[:latitude],
lng: geo_config[:longitude],
@@ -99,8 +99,10 @@ def geo_i18n
"decidim_geo.filters.type.only_assemblies": t("decidim.geo.filters.type.only_assemblies"),
"decidim_geo.filters.type.only_proposals": t("decidim.geo.filters.type.only_proposals"),
"decidim_geo.filters.type.only_meetings": t("decidim.geo.filters.type.only_meetings"),
- "decidim_geo.filters.type.only_debates": t("decidim.geo.filters.type.only_debates")
-
+ "decidim_geo.filters.type.only_debates": t("decidim.geo.filters.type.only_debates"),
+ "decidim_geo.filters.empty_message": t("decidim.geo.filters.empty.message"),
+ "decidim_geo.filters.empty_reset_button": t("decidim.geo.filters.empty.reset_button"),
+ "decidim_geo.actions.view": t("decidim.geo.actions.view")
}
end
diff --git a/app/models/decidim/debates/debate.rb b/app/models/decidim/debates/debate.rb
index 36e8c0f..e34d837 100644
--- a/app/models/decidim/debates/debate.rb
+++ b/app/models/decidim/debates/debate.rb
@@ -25,7 +25,7 @@ class Debate < Debates::ApplicationRecord
include Decidim::Endorsable
include Decidim::Randomable
- if Decidim.version == "0.27.4"
+ if Decidim.version >= "0.27.4"
include Decidim::DownloadYourData
include Decidim::FilterableResource
end
@@ -59,7 +59,7 @@ class Debate < Debates::ApplicationRecord
)
}
- scope_search_multi :with_any_state, [:open, :closed] if Decidim.version == "0.27.4"
+ scope_search_multi :with_any_state, [:open, :closed] if Decidim.version >= "0.27.4"
def self.log_presenter_class_for(_log)
Decidim::Debates::AdminLog::DebatePresenter
diff --git a/app/packs/src/decidim/geo/api/getFirstGeoDataSource.js b/app/packs/src/decidim/geo/api/getFirstGeoDataSource.js
index 3015071..6d2bf22 100644
--- a/app/packs/src/decidim/geo/api/getFirstGeoDataSource.js
+++ b/app/packs/src/decidim/geo/api/getFirstGeoDataSource.js
@@ -1,21 +1,20 @@
-import {_getGeoDataSource, _getGeoDataSourceIds} from "./queries";
+import { _getGeoDataSource, _getGeoDataSourceIds } from "./queries";
-export const getFirstGeoDataSource = async (params = {}, fetchAll = true) => {
- if (!params.variables) {
- params.variables = {};
- }
- const apiQuery = fetchAll ? _getGeoDataSource : _getGeoDataSourceIds;
- let page;
- try {
- page = await apiQuery(params);
- } catch (error) {
- console.error(error);
- throw error;
- }
- if (!page) return { nodes: [], hasMore: false, endCursor: "" };
- const { hasNextPage = false, endCursor = "" } = page?.pageInfo || {};
- return { nodes: page.nodes, hasMore: hasNextPage, after: endCursor };
- };
+export const getFirstGeoDataSource = async (params = {}, fetchComplete = true) => {
+ if (!params.variables) {
+ params.variables = {};
+ }
+ const apiQuery = fetchComplete ? _getGeoDataSource : _getGeoDataSourceIds;
+ let page;
+ try {
+ page = await apiQuery(params);
+ } catch (error) {
+ console.error(error);
+ throw error;
+ }
+ if (!page) return { nodes: [], hasMore: false, endCursor: "" };
+ const { hasNextPage = false, endCursor = "" } = page?.pageInfo || {};
+ return { nodes: page.nodes, hasMore: hasNextPage, after: endCursor };
+};
-
- export default getFirstGeoDataSource;
\ No newline at end of file
+export default getFirstGeoDataSource;
diff --git a/app/packs/src/decidim/geo/api/getGeoDataSource.js b/app/packs/src/decidim/geo/api/getGeoDataSource.js
index 4776317..796bb7c 100644
--- a/app/packs/src/decidim/geo/api/getGeoDataSource.js
+++ b/app/packs/src/decidim/geo/api/getGeoDataSource.js
@@ -1,4 +1,4 @@
-import {_getGeoDataSource, _getGeoDataSourceIds} from "./queries";
+import { _getGeoDataSource, _getGeoDataSourceIds } from "./queries";
const getGeoDataSource = async (params = {}, fetchAll = true) => {
let results = [];
@@ -33,4 +33,4 @@ const getGeoDataSource = async (params = {}, fetchAll = true) => {
return { nodes: results };
};
- export default getGeoDataSource;
\ No newline at end of file
+export default getGeoDataSource;
diff --git a/app/packs/src/decidim/geo/api/gql.js b/app/packs/src/decidim/geo/api/gql.js
index a4d2435..636afc1 100644
--- a/app/packs/src/decidim/geo/api/gql.js
+++ b/app/packs/src/decidim/geo/api/gql.js
@@ -1,6 +1,6 @@
export const geoDatasource = `
query geoDatasourceQuery ($defaultLocale: String!, $locale: String!, $filters: [GeoDatasourceFilter!], $after: String) {
- geoDatasource(filters: $filters, locale: $locale, after: $after, first: 500){
+ geoDatasource(filters: $filters, locale: $locale, after: $after, first: 50){
pageInfo {
hasPreviousPage
startCursor
@@ -45,7 +45,7 @@ export const geoDatasource = `
}`;
export const geoDatasourceIds = `
query geoDatasourceQueryIds ($locale: String!, $filters: [GeoDatasourceFilter!], $after: String) {
- geoDatasource(filters: $filters, locale: $locale, after: $after){
+ geoDatasource(filters: $filters, locale: $locale, after: $after, first: 50){
pageInfo {
hasPreviousPage
startCursor
diff --git a/app/packs/src/decidim/geo/api/index.js b/app/packs/src/decidim/geo/api/index.js
index bdffd5d..e28ce05 100644
--- a/app/packs/src/decidim/geo/api/index.js
+++ b/app/packs/src/decidim/geo/api/index.js
@@ -1,6 +1,4 @@
+export { default as getGeoDataSource } from "./getGeoDataSource";
+export { default as getFirstGeoDataSource } from "./getFirstGeoDataSource";
-export {default as getGeoDataSource, } from './getGeoDataSource'
-export {default as getFirstGeoDataSource, } from './getFirstGeoDataSource'
-
-
-export {getGeoConfig, getGeoScopes} from './queries'
+export { getGeoConfig, getGeoScopes } from "./queries";
diff --git a/app/packs/src/decidim/geo/api/makeQuery.js b/app/packs/src/decidim/geo/api/makeQuery.js
index 4327d4e..76919e7 100644
--- a/app/packs/src/decidim/geo/api/makeQuery.js
+++ b/app/packs/src/decidim/geo/api/makeQuery.js
@@ -13,4 +13,4 @@ const makeQuery =
return response.data[_responseKey];
};
- export default makeQuery
\ No newline at end of file
+export default makeQuery;
diff --git a/app/packs/src/decidim/geo/api/queries.js b/app/packs/src/decidim/geo/api/queries.js
index c3b362a..f99f857 100644
--- a/app/packs/src/decidim/geo/api/queries.js
+++ b/app/packs/src/decidim/geo/api/queries.js
@@ -3,4 +3,4 @@ export const _getGeoDataSource = makeQuery("geoDatasource");
export const _getGeoDataSourceIds = makeQuery("geoDatasourceIds", "geoDatasource");
export const getGeoConfig = makeQuery("geoConfig");
-export const getGeoScopes = makeQuery("geoScope");
\ No newline at end of file
+export const getGeoScopes = makeQuery("geoScope");
diff --git a/app/packs/src/decidim/geo/models/GeoDatasourceNode.js b/app/packs/src/decidim/geo/models/GeoDatasourceNode.js
index 5e2ca66..e6b8a86 100644
--- a/app/packs/src/decidim/geo/models/GeoDatasourceNode.js
+++ b/app/packs/src/decidim/geo/models/GeoDatasourceNode.js
@@ -27,6 +27,7 @@ export default class GeoDatasourceNode {
pinPoint == `${this.data.id}`
) {
this.marker.setStyle(this.selectedState);
+ this.marker.bringToFront();
} else {
this.marker.setStyle(this.staledState);
}
diff --git a/app/packs/src/decidim/geo/models/GeoScope.js b/app/packs/src/decidim/geo/models/GeoScope.js
index 1b2e9c4..f462141 100644
--- a/app/packs/src/decidim/geo/models/GeoScope.js
+++ b/app/packs/src/decidim/geo/models/GeoScope.js
@@ -20,7 +20,7 @@ export default class GeoScope {
}
isEmpty() {
- if(this.data.geom === null) return true
+ if (this.data.geom === null) return true;
const { points } = pointStore.getState();
const currentScopeId = this.id;
return !points.find(({ scopeId }) => `${scopeId}` === `${currentScopeId}`);
@@ -90,7 +90,7 @@ export default class GeoScope {
);
}
scopeClickHandler() {
- this.select("layer")
+ this.select("layer");
}
init() {
const { map } = configStore.getState();
diff --git a/app/packs/src/decidim/geo/stores/dropdownFilterStore.js b/app/packs/src/decidim/geo/stores/dropdownFilterStore.js
index 5b9e45d..a5662ba 100644
--- a/app/packs/src/decidim/geo/stores/dropdownFilterStore.js
+++ b/app/packs/src/decidim/geo/stores/dropdownFilterStore.js
@@ -46,6 +46,7 @@ const store = createStore(
setFilter(name, value) {
set((state) => ({
selectedFilters: {
+ ...state.defaultFilters,
...state.selectedFilters,
[`${name}`]: value || state.defaultFilters[`${name}`]
}
diff --git a/app/packs/src/decidim/geo/stores/filterStore.js b/app/packs/src/decidim/geo/stores/filterStore.js
index 66e42a1..74571a5 100644
--- a/app/packs/src/decidim/geo/stores/filterStore.js
+++ b/app/packs/src/decidim/geo/stores/filterStore.js
@@ -42,7 +42,7 @@ const store = createStore(
const activeFilters = _.sortBy(filters, [sortingIteratee]);
set((state) => {
if (_.isEqual(state.activeFilters, activeFilters)) return {};
- return { activeFilters: activeFilters };
+ return { activeFilters };
});
},
resetFilters: () => {
@@ -84,11 +84,13 @@ const store = createStore(
const timeFilterMatch = filters.find(
({ timeFilter = undefined }) => timeFilter
);
+
if (!timeFilterMatch) return defaultFilters.GeoTimeFilter;
const timeFilter = timeFilterMatch.timeFilter.time;
if (timeFilter === "past") return "only_past";
if (timeFilter === "active") return "only_active";
if (timeFilter === "future") return "only_future";
+ if (timeFilter === "all") return "all";
return defaultFilters.GeoTimeFilter;
case "GeoType":
const typeFilterMatch = filters.find(
diff --git a/app/packs/src/decidim/geo/stores/pointStore.js b/app/packs/src/decidim/geo/stores/pointStore.js
index 64d43ab..3d2dfb4 100644
--- a/app/packs/src/decidim/geo/stores/pointStore.js
+++ b/app/packs/src/decidim/geo/stores/pointStore.js
@@ -27,8 +27,8 @@ const store = createStore(
_lastFilter: "",
_lastResponse: [],
scopeForId: (scopeId) => {
- const scope = get().scopes.find(({ data }) => `${data.id}` === `${scopeId}`);
- if(!scope || scope.isEmpty()) return null;
+ const scope = get().scopes.find(({ data }) => `${data.id}` === `${scopeId}`);
+ if (!scope || scope.isEmpty()) return null;
return scope;
},
clearCache: () => {
@@ -44,16 +44,19 @@ const store = createStore(
fetchAll: async (filters = []) => {
const { points: fetchedPoints } = store.getState();
if (fetchedPoints.length > 0) return;
+
const locale = configStore.getState().locale;
const defaultLocale = configStore.getState().defaultLocale;
set(({ isLoading }) => ({ isLoading: isLoading + 1 }));
+ const filterWithoutTime = filters.filter(
+ (f) => typeof f.timeFilter === "undefined"
+ );
const firstData = await getFirstGeoDataSource(
{
- variables: { filters, locale, defaultLocale }
+ variables: { filters: filterWithoutTime, locale, defaultLocale }
},
true
);
-
set(() => ({ points: firstData.nodes.map(mapNodeToPoint).filter(Boolean) }));
const scopes = await getGeoScopes({
@@ -77,7 +80,11 @@ const store = createStore(
if (firstData.hasMore) {
const data = await getGeoDataSource(
{
- variables: { filters: filters, locale: locale, after: firstData.after }
+ variables: {
+ filters: filterWithoutTime,
+ locale: locale,
+ after: firstData.after
+ }
},
true
);
@@ -122,7 +129,6 @@ const store = createStore(
_lastResponse: filteredPoints,
isLoading: isLoading - 1
}));
- console.log(ids.nodes.length, "LAST RESPONSE", filteredPoints)
return filteredPoints;
}
}))
diff --git a/app/packs/src/decidim/geo/ui/Drawer.js b/app/packs/src/decidim/geo/ui/Drawer.js
index a2fda79..1f81147 100644
--- a/app/packs/src/decidim/geo/ui/Drawer.js
+++ b/app/packs/src/decidim/geo/ui/Drawer.js
@@ -9,165 +9,169 @@ import { meetings as meetingDetails, fallback as fallbackDetails } from "./Drawe
const createSkeletonItem = () => L.DomUtil.create("li", "decidimGeo__drawer__listCard");
export default class Drawer {
- constructor(parent) {
- // View
- this.cardList = null;
- this.loadingDOM = null;
- this.parent = parent
- }
+ constructor(parent) {
+ // View
+ this.cardList = null;
+ this.loadingDOM = null;
+ this.parent = parent;
+ }
- isEmpty() {
- return false;
- }
+ isEmpty() {
+ return false;
+ }
- loadingDom() {
- if (this._loadingDOM) return this._loadingDOM;
- this._loadingDOM = L.DomUtil.create(
- "div",
- createClasses("decidimGeo__drawer__listCardLoader")
- );
- this._loadingDOM.appendChild(createSkeletonItem());
- this._loadingDOM.appendChild(createSkeletonItem());
- this._loadingDOM.appendChild(createSkeletonItem());
- return this._loadingDOM;
- }
+ loadingDom() {
+ if (this._loadingDOM) return this._loadingDOM;
+ this._loadingDOM = L.DomUtil.create(
+ "div",
+ createClasses("decidimGeo__drawer__listCardLoader")
+ );
+ this._loadingDOM.appendChild(createSkeletonItem());
+ this._loadingDOM.appendChild(createSkeletonItem());
+ this._loadingDOM.appendChild(createSkeletonItem());
+ return this._loadingDOM;
+ }
- repaintList(points) {
- points.map(({ menuItem }) => {
- this.cardList.appendChild(menuItem);
- });
- }
- repaintEmpty() {
- const emptyContainer = L.DomUtil.create(
- "li",
- "decidimGeo__emptyDrawer__container",
- this.cardList
- );
- const emptyParagraph = L.DomUtil.create(
- "p",
- "decidimGeo__emptyDrawer__paragraph",
- emptyContainer
- );
- emptyParagraph.textContent = "No data with these filters";
- const emptyAction = L.DomUtil.create(
- "button",
- "decidimGeo__emptyDrawer__button",
- emptyContainer
- );
- emptyAction.textContent = "Reset filter";
- emptyAction.onclick = this.emptyActionHandler.bind(this)
- }
- emptyActionHandler() {
- const { resetFilters } = filterStore.getState();
- const { resetFilters: resetDropdownFilter } = dropdownFilterStore.getState();
- const { selectScope } = geoStore.getState();
- const { space_ids } = configStore.getState();
- const { scopeForId } = pointStore.getState();
+ repaintList(points) {
+ points.map(({ menuItem }) => {
+ this.cardList.appendChild(menuItem);
+ });
+ }
+ repaintEmpty() {
+ const i18n = this.i18n();
+ const emptyContainer = L.DomUtil.create(
+ "li",
+ "decidimGeo__emptyDrawer__container",
+ this.cardList
+ );
+ const emptyParagraph = L.DomUtil.create(
+ "p",
+ "decidimGeo__emptyDrawer__paragraph",
+ emptyContainer
+ );
+ emptyParagraph.textContent = this.i18n()["decidim_geo.filters.empty_message"];
+ const emptyAction = L.DomUtil.create(
+ "button",
+ "decidimGeo__emptyDrawer__button",
+ emptyContainer
+ );
+ emptyAction.textContent = this.i18n()["decidim_geo.filters.empty_reset_button"];
+ emptyAction.onclick = this.emptyActionHandler.bind(this);
+ }
- resetFilters();
- resetDropdownFilter();
- const scopes = space_ids.map((scope) => scopeForId(scope)).filter(Boolean);
- if (scopes.length === 1) {
- const scope = scopeForId(scopes[0]);
- if (scope) {
- selectScope(scope);
- scope.repaint();
- }
- } else {
- selectScope(null);
- }
- this.repaint();
+ i18n() {
+ return this.config().i18n;
+ }
- }
- repaintLoading() {
- const loadingElement = this.loadingDom();
- this.cardList.appendChild(loadingElement);
- }
- repaintDetail({ data: node }) {
- const listCard = L.DomUtil.create(
- "li",
- "decidimGeo__drawer__listCard",
- this.cardList
- );
- listCard.onclick = () => {
- location.href = node.link;
- };;
+ config() {
+ return configStore.getState();
+ }
+ emptyActionHandler() {
+ const { resetFilters } = filterStore.getState();
+ const { resetFilters: resetDropdownFilter } = dropdownFilterStore.getState();
+ const { selectScope } = geoStore.getState();
+ const { space_ids } = configStore.getState();
+ const { scopeForId } = pointStore.getState();
- const info = L.DomUtil.create(
- "div",
- "decidimGeo__drawer__listCardInfo decidimGeo__drawer__listCardInfo--large",
- listCard
- );
- switch (node.type) {
- case "Decidim::Meetings::Meeting":
- meetingDetails(info, node);
- break;
- default:
- fallbackDetails(info, node);
- break;
+ resetFilters();
+ resetDropdownFilter();
+ const scopes = space_ids.map((scope) => scopeForId(scope)).filter(Boolean);
+ if (scopes.length === 1) {
+ const scope = scopeForId(scopes[0]);
+ if (scope) {
+ selectScope(scope);
+ scope.repaint();
}
- const viewBtn = L.DomUtil.create("a", "decidimGeo__drawer__viewBtn", listCard);
- viewBtn.textContent = "View";
- viewBtn.href = node.link;
- return listCard;
+ } else {
+ selectScope(null);
}
- repaint() {
- L.DomUtil.empty(this.cardList);
- const { isLoading, getFilteredPoints } = pointStore.getState();
- const { selectedPoint } = geoStore.getState();
- const pointsInMap = getFilteredPoints();
+ this.repaint();
+ }
+ repaintLoading() {
+ const loadingElement = this.loadingDom();
+ this.cardList.appendChild(loadingElement);
+ }
+ repaintDetail({ data: node }) {
+ const listCard = L.DomUtil.create(
+ "li",
+ "decidimGeo__drawer__listCard",
+ this.cardList
+ );
+ listCard.onclick = () => {
+ location.href = node.link;
+ };
- if (isLoading) {
- return this.repaintLoading();
- }
- if (selectedPoint) {
- return this.repaintDetail(selectedPoint);
- }
+ const info = L.DomUtil.create(
+ "div",
+ "decidimGeo__drawer__listCardInfo decidimGeo__drawer__listCardInfo--large",
+ listCard
+ );
+ switch (node.type) {
+ case "Decidim::Meetings::Meeting":
+ meetingDetails(info, node);
+ break;
+ default:
+ fallbackDetails(info, node);
+ break;
+ }
+ const viewBtn = L.DomUtil.create("a", "decidimGeo__drawer__viewBtn", listCard);
+ viewBtn.textContent = this.i18n()["decidim_geo.actions.view"];
+ viewBtn.href = node.link;
+ return listCard;
+ }
+ repaint() {
+ L.DomUtil.empty(this.cardList);
+ const { isLoading, getFilteredPoints } = pointStore.getState();
+ const { selectedPoint } = geoStore.getState();
+ const pointsInMap = getFilteredPoints();
- if (pointsInMap.length === 0) {
- this.repaintEmpty();
- } else {
- this.repaintList(pointsInMap);
- }
+ if (isLoading) {
+ return this.repaintLoading();
+ }
+ if (selectedPoint) {
+ return this.repaintDetail(selectedPoint);
+ }
- this.cardList.className = createClasses("decidimGeo__drawer__list", [
- isLoading && "loading",
- this.isEmpty() && "empty"
- ]);
+ if (pointsInMap.length === 0) {
+ this.repaintEmpty();
+ } else {
+ this.repaintList(pointsInMap);
}
- onAdd() {
- if (!this.parent )
- throw new Error("no this.parent ");
- const { isLoading } = pointStore.getState();
- this.cardList = L.DomUtil.create(
- "ul",
- createClasses("decidimGeo__drawer__list", [
- isLoading && "loading",
- this.isEmpty() && "empty"
- ]),
- this.parent
- );
- L.DomEvent.disableClickPropagation(this.cardList);
- L.DomEvent.disableScrollPropagation(this.cardList);
+ this.cardList.className = createClasses("decidimGeo__drawer__list", [
+ isLoading && "loading",
+ this.isEmpty() && "empty"
+ ]);
+ }
+ onAdd() {
+ if (!this.parent) throw new Error("no this.parent ");
+ const { isLoading } = pointStore.getState();
+ this.cardList = L.DomUtil.create(
+ "ul",
+ createClasses("decidimGeo__drawer__list", [
+ isLoading && "loading",
+ this.isEmpty() && "empty"
+ ]),
+ this.parent
+ );
+ L.DomEvent.disableClickPropagation(this.cardList);
+ L.DomEvent.disableScrollPropagation(this.cardList);
- geoStore.subscribe(
- (state) => [state.selectedPoint, state.selectedScope],
- () => {
- this.repaint();
- }
- );
+ geoStore.subscribe(
+ (state) => [state.selectedPoint, state.selectedScope],
+ () => {
+ this.repaint();
+ }
+ );
- pointStore.subscribe(
- (state) => [state.isLoading, state._lastResponse, state._lastFilter],
- ([isLoading, lastResponse, lastFilter]) => {
- if(isLoading) return;
- console.log("lastResponse", lastResponse, lastFilter)
- this.repaint();
- }
- );
- this.repaint();
- return this.cardList;
- }
+ pointStore.subscribe(
+ (state) => [state.isLoading, state._lastResponse, state._lastFilter],
+ ([isLoading, lastResponse, lastFilter]) => {
+ if (isLoading) return;
+ this.repaint();
+ }
+ );
+ this.repaint();
+ return this.cardList;
}
-
+}
diff --git a/app/packs/src/decidim/geo/ui/FilterDropdown.js b/app/packs/src/decidim/geo/ui/FilterDropdown.js
index 443ece3..843d56a 100644
--- a/app/packs/src/decidim/geo/ui/FilterDropdown.js
+++ b/app/packs/src/decidim/geo/ui/FilterDropdown.js
@@ -20,7 +20,10 @@ class FilterDropdown {
);
this.title = L.DomUtil.create(
"h6",
- createClasses("decidimGeo__filterDropdown__title", [this.isOpen() && "active", this.isEmpty() && "empty"]),
+ createClasses("decidimGeo__filterDropdown__title", [
+ this.isOpen() && "active",
+ this.isEmpty() && "empty"
+ ]),
this.titleContainer
);
this.countBadge = L.DomUtil.create(
@@ -69,37 +72,33 @@ class FilterDropdown {
);
filterStore.subscribe(
(state) => [state.activeFilters],
- () =>
- this.repaint()
-
+ () => this.repaint()
);
}
titleHandler() {
- if(this.isEmpty()) return;
- this.toggle();
- this.repaint();
+ if (this.isEmpty()) return;
+ this.toggle();
+ this.repaint();
}
- applyBtnHandler(){
- const { nextFilters, toggleOpen, applyNextFilters } =
- dropdownFilterStore.getState();
- this.applyValues(nextFilters);
- applyNextFilters();
- toggleOpen();
- this.repaint();
+ applyBtnHandler() {
+ const { nextFilters, toggleOpen, applyNextFilters } = dropdownFilterStore.getState();
+ this.applyValues(nextFilters);
+ applyNextFilters();
+ toggleOpen();
+ this.repaint();
}
- resetBtnHandler(){
- const {
- resetFilters: resetDropdownFilter,
- toggleOpen,
- defaultFilters
- } = dropdownFilterStore.getState();
- resetDropdownFilter();
- this.applyValues(defaultFilters);
- toggleOpen();
+ resetBtnHandler() {
+ const {
+ resetFilters: resetDropdownFilter,
+ toggleOpen,
+ defaultFilters
+ } = dropdownFilterStore.getState();
+ resetDropdownFilter();
+ this.applyValues(defaultFilters);
+ toggleOpen();
}
isEmpty() {
- const {_lastResponse} = pointStore.getState()
- return _lastResponse.length < 2
+ return false;
}
defaultFilterFor(name) {
const { toFilterOptions, defaultFilters } = filterStore.getState();
@@ -152,87 +151,141 @@ class FilterDropdown {
}
applyValues(filters) {
+ const defaultDropdownValues = {
+ GeoShowFilter: "all",
+ GeoTimeFilter: "only_active",
+ GeoType: "all"
+ };
if (!filters) {
- filters = {
- GeoShowFilter: "all",
- GeoTimeFilter: "all",
- GeoType: "all"
- };
+ filters = defaultDropdownValues;
}
+ filters = { ...defaultDropdownValues, ...filters };
const { setFilters, activeFilters, defaultFilters } = filterStore.getState();
- const newFilters = activeFilters.filter((filter) => {
- const [filterName] = Object.keys(filter);
- return !["resourceTypeFilter", "timeFilter", "geoencodedFilter"].includes(
- filterName
- );
- });
+ let newFilters = [...activeFilters];
+ const withoutGeoShowFilter = (filters) =>
+ filters.filter((f) => {
+ const [filterName] = Object.keys(f);
+ return filterName !== "geoencodedFilter";
+ });
+ const withoutTimeFilter = (filters) =>
+ filters.filter((f) => {
+ const [filterName] = Object.keys(f);
+ return filterName !== "timeFilter";
+ });
+ const withoutTypeFilter = (filters) =>
+ filters.filter((f) => {
+ const [filterName] = Object.keys(f);
+ return filterName !== "resourceTypeFilter";
+ });
switch (filters.GeoShowFilter || defaultFilters.GeoShowFilter) {
case "all":
+ newFilters = withoutGeoShowFilter(newFilters);
break;
case "only_geoencoded":
- newFilters.push({
- geoencodedFilter: { geoencoded: true }
- });
+ newFilters = [
+ ...withoutGeoShowFilter(newFilters),
+ {
+ geoencodedFilter: { geoencoded: true }
+ }
+ ];
break;
case "only_virtual":
- newFilters.push({
- geoencodedFilter: { geoencoded: false }
- });
+ newFilters = [
+ ...withoutGeoShowFilter(newFilters),
+ {
+ geoencodedFilter: { geoencoded: false }
+ }
+ ];
break;
}
+
switch (filters.GeoTimeFilter || defaultFilters.GeoTimeFilter) {
case "all":
- newFilters.push({
- timeFilter: { time: "all" }
- });
+ newFilters = [
+ ...withoutTimeFilter(newFilters),
+ {
+ timeFilter: { time: "all" }
+ }
+ ];
break;
case "only_past":
- newFilters.push({
- timeFilter: { time: "past" }
- });
+ newFilters = [
+ ...withoutTimeFilter(newFilters),
+ {
+ timeFilter: { time: "past" }
+ }
+ ];
break;
case "only_active":
- newFilters.push({
- timeFilter: { time: "active" }
- });
+ newFilters = [
+ ...withoutTimeFilter(newFilters),
+ {
+ timeFilter: { time: "active" }
+ }
+ ];
break;
case "only_future":
- newFilters.push({
- timeFilter: { time: "future" }
- });
+ newFilters = [
+ ...withoutTimeFilter(newFilters),
+ {
+ timeFilter: { time: "future" }
+ }
+ ];
break;
}
switch (filters.GeoType || defaultFilters.GeoType) {
case "all":
- newFilters.push({
- resourceTypeFilter: { resourceType: "all" }
- });
+ newFilters = [
+ ...withoutTypeFilter(newFilters),
+ {
+ resourceTypeFilter: { resourceType: "all" }
+ }
+ ];
break;
case "only_processes":
- newFilters.push({
- resourceTypeFilter: { resourceType: "Decidim::ParticipatoryProcess" }
- });
+ newFilters = [
+ ...withoutTypeFilter(newFilters),
+ {
+ resourceTypeFilter: { resourceType: "Decidim::ParticipatoryProcess" }
+ }
+ ];
break;
case "only_assemblies":
- newFilters.push({ resourceTypeFilter: { resourceType: "Decidim::Assembly" } });
+ newFilters = [
+ ...withoutTypeFilter(newFilters),
+ {
+ resourceTypeFilter: { resourceType: "Decidim::Assembly" }
+ }
+ ];
break;
case "only_proposals":
- newFilters.push({
- resourceTypeFilter: { resourceType: "Decidim::Proposals::Proposal" }
- });
+ newFilters = [
+ ...withoutTypeFilter(newFilters),
+ {
+ resourceTypeFilter: { resourceType: "Decidim::Proposals::Proposal" }
+ }
+ ];
break;
case "only_meetings":
- newFilters.push({
- resourceTypeFilter: { resourceType: "Decidim::Meetings::Meeting" }
- });
+ newFilters = [
+ ...withoutTypeFilter(newFilters),
+ {
+ resourceTypeFilter: { resourceType: "Decidim::Meetings::Meeting" }
+ }
+ ];
+
break;
case "only_debates":
- newFilters.push({
- resourceTypeFilter: { resourceType: "Decidim::Debates::Debate" }
- });
+ newFilters = [
+ ...withoutTypeFilter(newFilters),
+ {
+ resourceTypeFilter: { resourceType: "Decidim::Debates::Debate" }
+ }
+ ];
break;
}
+
setFilters(newFilters);
}
@@ -307,17 +360,14 @@ class FilterDropdown {
const { filterCount } = dropdownFilterStore.getState();
const { isOpen: isScopeOpen } = scopeDropdownStore.getState();
const badgeCount = filterCount();
- this.title.onclick = selectedPoint
- ? () => {}
- : this.titleHandler.bind(this);
+ this.title.onclick = selectedPoint ? () => {} : this.titleHandler.bind(this);
this.countBadge.className = createClasses("decidimGeo__filterDropdown__counter", [
badgeCount === 0 && "hidden"
]);
this.countBadge.textContent = badgeCount;
this.title.className = createClasses("decidimGeo__filterDropdown__title", [
"button",
- this.isOpen() && "active",
-
+ this.isOpen() && "active"
]);
this.titleContainer.className = createClasses(
"decidimGeo__filterDropdown__titleContainer",
diff --git a/app/packs/src/decidim/geo/ui/ScopeDropdown.js b/app/packs/src/decidim/geo/ui/ScopeDropdown.js
index 5b40406..6238286 100644
--- a/app/packs/src/decidim/geo/ui/ScopeDropdown.js
+++ b/app/packs/src/decidim/geo/ui/ScopeDropdown.js
@@ -7,298 +7,312 @@ import FilterDropdown from "./FilterDropdown";
import scopeDropdownStore from "../stores/scopeDropdownStore";
import dropdownFilterStore from "../stores/dropdownFilterStore";
import memoryStore from "../stores/memoryStore";
+import _ from "lodash";
+export default class ScopeDropdown {
+ //View
+ constructor(parent) {
+ this.parent = parent;
+ this.menu = null;
+ this.heading = null;
+ this.toggleDrawer = null;
+ this.filterDropdown = null;
+ this.title = null;
+ this.titleTxt = null;
+ this.dropDownOptions = null;
+ this.resetBtn = null;
+ this.closeOverlay = null;
+ this.repaintResetBtn = null;
-export default class ScopeDropdown {
- //View
- constructor(parent) {
- this.parent = parent
- this.menu = null;
- this.heading = null;
- this.toggleDrawer = null;
- this.filterDropdown = null;
- this.title = null;
- this.titleTxt = null;
- this.dropDownOptions = null;
- this.resetBtn = null;
- this.closeOverlay = null;
- this.repaintResetBtn = null;
+ // Cache
+ this.cachedScopes = null;
+ scopeDropdownStore.subscribe(
+ (state) => [state.isOpen],
+ () => {
+ this.repaint();
+ }
+ );
+ }
- // Cache
- this.cachedScopes = null;
- scopeDropdownStore.subscribe(
- (state) => [state.isOpen],
- () => {
- this.repaint();
- }
- );
+ //Controlers
+ toggleOpen() {
+ scopeDropdownStore.getState().toggleOpen();
+ }
+ scopes() {
+ if (this.cachedScopes !== null) return this.cachedScopes;
+ const { scopeForId, scopes } = pointStore.getState();
+ const { space_ids } = configStore.getState();
+ this.cachedScopes = scopes || [];
+ if (space_ids.length > 0) {
+ this.cachedScopes = space_ids.map((id) => scopeForId(id)).filter(Boolean) || [];
}
+ return this.cachedScopes;
+ }
+ isEmpty() {
+ return this.scopes().length === 0;
+ }
+ hasOneOption() {
+ return this.scopes().length === 1;
+ }
+ activeScope() {
+ return geoStore.getState().selectedScope;
+ }
+ initMenuElements() {
+ const { isLoading } = pointStore.getState();
+ const { isOpen } = scopeDropdownStore.getState();
- //Controlers
- toggleOpen() {
- scopeDropdownStore.getState().toggleOpen();
- }
- scopes() {
- if(this.cachedScopes !== null) return this.cachedScopes;
- const { scopeForId, scopes } = pointStore.getState();
- const { space_ids } = configStore.getState();
- this.cachedScopes = scopes || []
- if (space_ids.length > 0){
- this.cachedScopes = space_ids.map((id) => scopeForId(id)).filter(Boolean) || [];
- }
- return this.cachedScopes;
- }
- isEmpty() {
- return this.scopes().length === 0;
- }
- hasOneOption() {
- return this.scopes().length === 1;
- }
- activeScope() {
- return geoStore.getState().selectedScope;
- }
- initMenuElements() {
- const { isLoading } = pointStore.getState();
- const { isOpen } = scopeDropdownStore.getState();
-
- this.heading = L.DomUtil.create(
- "div",
- createClasses("decidimGeo__scopesDropdown__heading", [!isOpen && "closed"]),
- this.menu
- );
- const firstRow = L.DomUtil.create(
- "div",
- createClasses("decidimGeo__scopesDropdown__headingRow", ["filters"]),
- this.heading
- );
- const secondRow = L.DomUtil.create(
- "div",
- createClasses("decidimGeo__scopesDropdown__headingRow", ["drawer-toggle"]),
- this.heading
- );
- this.title = L.DomUtil.create(
- "h6",
- createClasses("decidimGeo__scopesDropdown__title", [
- isOpen ? "open" : "closed",
- isLoading && "loading",
- this.hasOneOption() && "alone",
- this.isEmpty() && "empty",
- ]),
- firstRow
- );
- this.title.onclick = this.titleClickHandler.bind(this)
- this.titleTxt = L.DomUtil.create(
- "span",
- "decidimGeo__scopesDropdown__titleTxt",
- this.title
- );
- const titleIcn = L.DomUtil.create(
- "span",
- "decidimGeo__scopesDropdown__titleIcn decidimGeo__scopesDropdown__titleIcn--more",
- this.title
- );
- titleIcn.innerHTML = `