-
+
+
diff --git a/backend/src/main/resources/graphiql/renderExample.js b/backend/src/main/resources/graphiql/renderExample.js
index 728b570bf..b229e3665 100644
--- a/backend/src/main/resources/graphiql/renderExample.js
+++ b/backend/src/main/resources/graphiql/renderExample.js
@@ -1,149 +1,84 @@
+/* global React, ReactDOM, GraphiQL, GraphQLVersion */
+
/**
- * This GraphiQL example illustrates how to use some of GraphiQL's props
- * in order to enable reading and updating the URL parameters, making
- * link sharing of queries a little bit easier.
+ * UMD GraphiQL Example
+ *
+ * This is a simple example that provides a primitive query string parser on top of GraphiQL props
+ * It assumes a global umd GraphiQL, which would be provided by an index.html in the default example
*
- * This is only one example of this kind of feature, GraphiQL exposes
- * various React params to enable interesting integrations.
+ * It is used by:
+ * - the netlify demo
+ * - end to end tests
+ * - webpack dev server
*/
// Parse the search string to get url parameters.
-var search = window.location.search;
-var parameters = {};
-search
- .substr(1)
- .split('&')
- .forEach(function (entry) {
- var eq = entry.indexOf('=');
- if (eq >= 0) {
- parameters[decodeURIComponent(entry.slice(0, eq))] = decodeURIComponent(
- entry.slice(eq + 1),
- );
- }
- });
-
-// If variables was provided, try to format it.
-if (parameters.variables) {
- try {
- parameters.variables = JSON.stringify(
- JSON.parse(parameters.variables),
- null,
- 2,
- );
- } catch (e) {
- // Do nothing, we want to display the invalid JSON as a string, rather
- // than present an error.
- }
-}
-
-// If headers was provided, try to format it.
-if (parameters.headers) {
- try {
- parameters.headers = JSON.stringify(
- JSON.parse(parameters.headers),
- null,
- 2,
- );
- } catch (e) {
- // Do nothing, we want to display the invalid JSON as a string, rather
- // than present an error.
- }
+const parameters = {};
+for (const entry of window.location.search.slice(1).split("&")) {
+ const eq = entry.indexOf("=");
+ if (eq >= 0) {
+ parameters[decodeURIComponent(entry.slice(0, eq))] = decodeURIComponent(
+ entry.slice(eq + 1)
+ );
+ }
}
// When the query and variables string is edited, update the URL bar so
// that it can be easily shared.
function onEditQuery(newQuery) {
- parameters.query = newQuery;
- updateURL();
+ parameters.query = newQuery;
+ updateURL();
}
function onEditVariables(newVariables) {
- parameters.variables = newVariables;
- updateURL();
+ parameters.variables = newVariables;
+ updateURL();
}
function onEditHeaders(newHeaders) {
- parameters.headers = newHeaders;
- updateURL();
+ parameters.headers = newHeaders;
+ updateURL();
}
-function onEditOperationName(newOperationName) {
- parameters.operationName = newOperationName;
- updateURL();
+function onTabChange(tabsState) {
+ const activeTab = tabsState.tabs[tabsState.activeTabIndex];
+ parameters.query = activeTab.query;
+ parameters.variables = activeTab.variables;
+ parameters.headers = activeTab.headers;
+ updateURL();
}
function updateURL() {
- var newSearch =
- '?' +
- Object.keys(parameters)
- .filter(function (key) {
- return Boolean(parameters[key]);
- })
- .map(function (key) {
- return (
- encodeURIComponent(key) + '=' + encodeURIComponent(parameters[key])
- );
- })
- .join('&');
- history.replaceState(null, null, newSearch);
-}
-
-// Defines a GraphQL fetcher using the fetch API. You're not required to
-// use fetch, and could instead implement graphQLFetcher however you like,
-// as long as it returns a Promise or Observable.
-function graphQLFetcher(graphQLParams, opts = { headers: {} }) {
- // When working locally, the example expects a GraphQL server at the path /graphql.
- // In a PR preview, it connects to the Star Wars API externally.
- // Change this to point wherever you host your GraphQL server.
- const isDev = window.location.hostname.match(/localhost$/);
- const api = '/';
- let headers = opts.headers;
- // Convert headers to an object.
- if (typeof headers === 'string') {
- headers = JSON.parse(opts.headers);
- }
-
- return fetch(api, {
- method: 'post',
- headers: Object.assign(
- {
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- },
- headers,
- ),
- body: JSON.stringify(graphQLParams),
- credentials: 'omit',
- })
- .then(function (response) {
- return response.text();
- })
- .then(function (responseBody) {
- try {
- return JSON.parse(responseBody);
- } catch (error) {
- return responseBody;
- }
- });
+ const newSearch = Object.entries(parameters)
+ .filter(([_key, value]) => value)
+ .map(
+ ([key, value]) =>
+ encodeURIComponent(key) + "=" + encodeURIComponent(value)
+ )
+ .join("&");
+ history.replaceState(null, null, `?${newSearch}`);
}
// Render into the body.
// See the README in the top level of this module to learn more about
// how you can customize GraphiQL by providing different values or
// additional child elements.
-ReactDOM.render(
+const root = ReactDOM.createRoot(document.getElementById("graphiql"));
+
+root.render(
React.createElement(GraphiQL, {
- fetcher: graphQLFetcher,
- query: parameters.query,
- variables: parameters.variables,
- headers: parameters.headers,
- operationName: parameters.operationName,
- onEditQuery: onEditQuery,
- onEditVariables: onEditVariables,
- onEditHeaders: onEditHeaders,
- defaultSecondaryEditorOpen: true,
- onEditOperationName: onEditOperationName,
- headerEditorEnabled: true,
- }),
- document.getElementById('graphiql'),
+ fetcher: GraphiQL.createFetcher({ url: "/" }),
+ query: parameters.query,
+ variables: parameters.variables,
+ headers: parameters.headers,
+ defaultHeaders: parameters.defaultHeaders,
+ onEditQuery,
+ onEditVariables,
+ onEditHeaders,
+ defaultEditorToolsVisibility: true,
+ isHeadersEditorEnabled: true,
+ shouldPersistHeaders: true,
+ inputValueDeprecation: GraphQLVersion.includes("15.5") ? undefined : true,
+ onTabChange,
+ })
);
diff --git a/frontend/ios/fastlane/metadata/bayern/release_notes.txt b/frontend/ios/fastlane/metadata/bayern/release_notes.txt
new file mode 100644
index 000000000..98e92315e
--- /dev/null
+++ b/frontend/ios/fastlane/metadata/bayern/release_notes.txt
@@ -0,0 +1 @@
+Wir haben die App weiter für Sie verbessert und einige Fehler entfernt. Helfen Sie mit die App zu verbessern, indem Sie uns Feedback geben.
\ No newline at end of file
diff --git a/frontend/ios/fastlane/metadata/nuernberg/release_notes.txt b/frontend/ios/fastlane/metadata/nuernberg/release_notes.txt
new file mode 100644
index 000000000..98e92315e
--- /dev/null
+++ b/frontend/ios/fastlane/metadata/nuernberg/release_notes.txt
@@ -0,0 +1 @@
+Wir haben die App weiter für Sie verbessert und einige Fehler entfernt. Helfen Sie mit die App zu verbessern, indem Sie uns Feedback geben.
\ No newline at end of file
diff --git a/frontend/lib/search/filter_bar.dart b/frontend/lib/search/filter_bar.dart
index 44445736f..1601e3608 100644
--- a/frontend/lib/search/filter_bar.dart
+++ b/frontend/lib/search/filter_bar.dart
@@ -14,9 +14,11 @@ class FilterBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final t = context.t;
- final sortedCategories = [...categoryAssets(context)];
- sortedCategories.removeWhere((category) => category.id == 9);
+
+ final sortedCategories = [...categoryAssets(context).where((category) => category.id != 9)];
sortedCategories.sort((a, b) => a.shortName.length.compareTo(b.shortName.length));
+ sortedCategories.add(categoryAssets(context).where((category) => category.id == 9).single);
+
final filteredCategories = sortedCategories.where((element) => buildConfig.categories.contains(element.id));
return SliverToBoxAdapter(