mirror of
https://github.com/getredash/redash.git
synced 2026-03-21 16:00:09 -04:00
* Migrate router and <app-view> to React: skeleton * Update layout on route change * Start moving page routes from angular to react * Move page routes to react except of public dashboard and visualization embed) * Move public dashboard and visualization embed routes to React * Replace $route/$routeParams usages * Some cleanup * Replace AngularJS $location service with implementation based on history library * Minor fix to how ApplicationView handles route change * Explicitly use global layout for each page instead of handling related stuff in ApplicationArea component * Error handling * Remove AngularJS and related dependencies * Move Parameter factory method to a separate file * Fix CSS (replace custom components with classes) * Fix: keep other url parts when updating location partially; refine code * Fix tests * Make router work in multi-org mode (respect <base> tag) * Optimzation: don't resolve route if path didn't change * Fix search input in header; error handling improvement (handle more errors in pages; global error handler for unhandled errors; dialog dismiss 'unhandled rejection' errors) * Fix page keys; fix navigateTo calls (third parameter not available) * Use relative links * Router: ignore location REPLACE events, resolve only on PUSH/POP * Fix tests * Remove unused jQuery reference * Show error from backend when creating Destination * Remove route.resolve where not necessary (used constant values) * New Query page: keep state on saving, reload when creating another new query * Use currentRoute.key instead of hard-coded keys for page components * Tidy up Router * Tidy up location service * Fix tests * Don't add parameters changes to browser's history * Fix test (improved fix) Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
import { defaults } from "lodash";
|
|
import { clientConfig } from "@/services/auth";
|
|
import location from "@/services/location";
|
|
import { parse as parseOrderBy, compile as compileOrderBy } from "./Sorter";
|
|
|
|
export class StateStorage {
|
|
constructor(state = {}) {
|
|
this._state = { ...state };
|
|
}
|
|
|
|
getState() {
|
|
return defaults(this._state, {
|
|
page: 1,
|
|
itemsPerPage: clientConfig.pageSize,
|
|
orderByField: "created_at",
|
|
orderByReverse: false,
|
|
searchTerm: "",
|
|
tags: [],
|
|
});
|
|
}
|
|
|
|
// eslint-disable-next-line class-methods-use-this
|
|
setState() {}
|
|
}
|
|
|
|
export class UrlStateStorage extends StateStorage {
|
|
getState() {
|
|
const defaultState = super.getState();
|
|
const params = location.search;
|
|
|
|
const searchTerm = params.q || "";
|
|
|
|
// in search mode order by should be explicitly specified in url, otherwise use default
|
|
const defaultOrderBy =
|
|
searchTerm !== "" ? "" : compileOrderBy(defaultState.orderByField, defaultState.orderByReverse);
|
|
|
|
const { field: orderByField, reverse: orderByReverse } = parseOrderBy(params.order || defaultOrderBy);
|
|
|
|
return {
|
|
page: parseInt(params.page, 10) || defaultState.page,
|
|
itemsPerPage: parseInt(params.page_size, 10) || defaultState.itemsPerPage,
|
|
orderByField,
|
|
orderByReverse,
|
|
searchTerm,
|
|
};
|
|
}
|
|
|
|
// eslint-disable-next-line class-methods-use-this
|
|
setState({ page, itemsPerPage, orderByField, orderByReverse, searchTerm }) {
|
|
location.setSearch(
|
|
{
|
|
page,
|
|
page_size: itemsPerPage,
|
|
order: compileOrderBy(orderByField, orderByReverse),
|
|
q: searchTerm !== "" ? searchTerm : null,
|
|
},
|
|
true
|
|
);
|
|
}
|
|
}
|