mirror of
https://github.com/shlinkio/shlink-web-client.git
synced 2024-12-23 01:20:24 +03:00
Ordered imports alphabetically
This commit is contained in:
parent
2a5480da79
commit
1f41f8da23
259 changed files with 853 additions and 853 deletions
|
@ -1,5 +1,5 @@
|
||||||
import { isInvalidArgumentError } from './utils';
|
|
||||||
import type { ProblemDetailsError } from './types/errors';
|
import type { ProblemDetailsError } from './types/errors';
|
||||||
|
import { isInvalidArgumentError } from './utils';
|
||||||
|
|
||||||
export interface ShlinkApiErrorProps {
|
export interface ShlinkApiErrorProps {
|
||||||
errorData?: ProblemDetailsError;
|
errorData?: ProblemDetailsError;
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
import { isEmpty, isNil, reject } from 'ramda';
|
import { isEmpty, isNil, reject } from 'ramda';
|
||||||
|
import type { HttpClient } from '../../common/services/HttpClient';
|
||||||
import type { ShortUrl, ShortUrlData } from '../../short-urls/data';
|
import type { ShortUrl, ShortUrlData } from '../../short-urls/data';
|
||||||
|
import { orderToString } from '../../utils/helpers/ordering';
|
||||||
|
import { stringifyQuery } from '../../utils/helpers/query';
|
||||||
import type { OptionalString } from '../../utils/utils';
|
import type { OptionalString } from '../../utils/utils';
|
||||||
import type {
|
import type {
|
||||||
|
ShlinkDomainRedirects,
|
||||||
|
ShlinkDomainsResponse,
|
||||||
|
ShlinkEditDomainRedirects,
|
||||||
ShlinkHealth,
|
ShlinkHealth,
|
||||||
ShlinkMercureInfo,
|
ShlinkMercureInfo,
|
||||||
|
ShlinkShortUrlData,
|
||||||
|
ShlinkShortUrlsListNormalizedParams,
|
||||||
|
ShlinkShortUrlsListParams,
|
||||||
ShlinkShortUrlsResponse,
|
ShlinkShortUrlsResponse,
|
||||||
ShlinkTags,
|
ShlinkTags,
|
||||||
ShlinkTagsResponse,
|
ShlinkTagsResponse,
|
||||||
ShlinkVisits,
|
ShlinkVisits,
|
||||||
ShlinkVisitsParams,
|
|
||||||
ShlinkShortUrlData,
|
|
||||||
ShlinkDomainsResponse,
|
|
||||||
ShlinkVisitsOverview,
|
ShlinkVisitsOverview,
|
||||||
ShlinkEditDomainRedirects,
|
ShlinkVisitsParams,
|
||||||
ShlinkDomainRedirects,
|
|
||||||
ShlinkShortUrlsListParams,
|
|
||||||
ShlinkShortUrlsListNormalizedParams,
|
|
||||||
} from '../types';
|
} from '../types';
|
||||||
import { orderToString } from '../../utils/helpers/ordering';
|
|
||||||
import { isRegularNotFound, parseApiError } from '../utils';
|
import { isRegularNotFound, parseApiError } from '../utils';
|
||||||
import { stringifyQuery } from '../../utils/helpers/query';
|
|
||||||
import type { HttpClient } from '../../common/services/HttpClient';
|
|
||||||
|
|
||||||
const buildShlinkBaseUrl = (url: string, version: 2 | 3) => `${url}/rest/v${version}`;
|
const buildShlinkBaseUrl = (url: string, version: 2 | 3) => `${url}/rest/v${version}`;
|
||||||
const rejectNilProps = reject(isNil);
|
const rejectNilProps = reject(isNil);
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
import type { HttpClient } from '../../common/services/HttpClient';
|
||||||
|
import type { GetState } from '../../container/types';
|
||||||
import type { ServerWithId } from '../../servers/data';
|
import type { ServerWithId } from '../../servers/data';
|
||||||
import { hasServerData } from '../../servers/data';
|
import { hasServerData } from '../../servers/data';
|
||||||
import type { GetState } from '../../container/types';
|
|
||||||
import { ShlinkApiClient } from './ShlinkApiClient';
|
import { ShlinkApiClient } from './ShlinkApiClient';
|
||||||
import type { HttpClient } from '../../common/services/HttpClient';
|
|
||||||
|
|
||||||
const apiClients: Record<string, ShlinkApiClient> = {};
|
const apiClients: Record<string, ShlinkApiClient> = {};
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import type { Visit } from '../../visits/types';
|
|
||||||
import type { OptionalString } from '../../utils/utils';
|
|
||||||
import type { ShortUrl, ShortUrlMeta } from '../../short-urls/data';
|
import type { ShortUrl, ShortUrlMeta } from '../../short-urls/data';
|
||||||
import type { Order } from '../../utils/helpers/ordering';
|
import type { Order } from '../../utils/helpers/ordering';
|
||||||
|
import type { OptionalString } from '../../utils/utils';
|
||||||
|
import type { Visit } from '../../visits/types';
|
||||||
|
|
||||||
export interface ShlinkShortUrlsResponse {
|
export interface ShlinkShortUrlsResponse {
|
||||||
data: ShortUrl[];
|
data: ShortUrl[];
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
|
import classNames from 'classnames';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { Route, Routes, useLocation } from 'react-router-dom';
|
import { Route, Routes, useLocation } from 'react-router-dom';
|
||||||
import classNames from 'classnames';
|
import { AppUpdateBanner } from '../common/AppUpdateBanner';
|
||||||
import { NotFound } from '../common/NotFound';
|
import { NotFound } from '../common/NotFound';
|
||||||
import type { ServersMap } from '../servers/data';
|
import type { ServersMap } from '../servers/data';
|
||||||
import type { Settings } from '../settings/reducers/settings';
|
import type { Settings } from '../settings/reducers/settings';
|
||||||
import { changeThemeInMarkup } from '../utils/theme';
|
|
||||||
import { AppUpdateBanner } from '../common/AppUpdateBanner';
|
|
||||||
import { forceUpdate } from '../utils/helpers/sw';
|
import { forceUpdate } from '../utils/helpers/sw';
|
||||||
|
import { changeThemeInMarkup } from '../utils/theme';
|
||||||
import './App.scss';
|
import './App.scss';
|
||||||
|
|
||||||
interface AppProps {
|
interface AppProps {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import type Bottle from 'bottlejs';
|
import type Bottle from 'bottlejs';
|
||||||
import { appUpdateAvailable, resetAppUpdate } from '../reducers/appUpdates';
|
|
||||||
import { App } from '../App';
|
|
||||||
import type { ConnectDecorator } from '../../container/types';
|
import type { ConnectDecorator } from '../../container/types';
|
||||||
|
import { App } from '../App';
|
||||||
|
import { appUpdateAvailable, resetAppUpdate } from '../reducers/appUpdates';
|
||||||
|
|
||||||
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
||||||
// Components
|
// Components
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
import { faSyncAlt as reloadIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import type { FC, MouseEventHandler } from 'react';
|
import type { FC, MouseEventHandler } from 'react';
|
||||||
import { Alert, Button } from 'reactstrap';
|
import { Alert, Button } from 'reactstrap';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faSyncAlt as reloadIcon } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { useToggle } from '../utils/helpers/hooks';
|
import { useToggle } from '../utils/helpers/hooks';
|
||||||
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
import './AppUpdateBanner.scss';
|
import './AppUpdateBanner.scss';
|
||||||
|
|
||||||
interface AppUpdateBannerProps {
|
interface AppUpdateBannerProps {
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
import {
|
import {
|
||||||
faList as listIcon,
|
|
||||||
faLink as createIcon,
|
|
||||||
faTags as tagsIcon,
|
|
||||||
faPen as editIcon,
|
|
||||||
faHome as overviewIcon,
|
|
||||||
faGlobe as domainsIcon,
|
faGlobe as domainsIcon,
|
||||||
|
faHome as overviewIcon,
|
||||||
|
faLink as createIcon,
|
||||||
|
faList as listIcon,
|
||||||
|
faPen as editIcon,
|
||||||
|
faTags as tagsIcon,
|
||||||
} from '@fortawesome/free-solid-svg-icons';
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import classNames from 'classnames';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import type { NavLinkProps } from 'react-router-dom';
|
import type { NavLinkProps } from 'react-router-dom';
|
||||||
import { NavLink, useLocation } from 'react-router-dom';
|
import { NavLink, useLocation } from 'react-router-dom';
|
||||||
import classNames from 'classnames';
|
|
||||||
import type { DeleteServerButtonProps } from '../servers/DeleteServerButton';
|
|
||||||
import type { SelectedServer } from '../servers/data';
|
import type { SelectedServer } from '../servers/data';
|
||||||
import { isServerWithId } from '../servers/data';
|
import { isServerWithId } from '../servers/data';
|
||||||
|
import type { DeleteServerButtonProps } from '../servers/DeleteServerButton';
|
||||||
import './AsideMenu.scss';
|
import './AsideMenu.scss';
|
||||||
|
|
||||||
export interface AsideMenuProps {
|
export interface AsideMenuProps {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { useEffect } from 'react';
|
import { faExternalLinkAlt, faPlus } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import { isEmpty, values } from 'ramda';
|
import { isEmpty, values } from 'ramda';
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
import { ExternalLink } from 'react-external-link';
|
||||||
import { Link, useNavigate } from 'react-router-dom';
|
import { Link, useNavigate } from 'react-router-dom';
|
||||||
import { Card, Row } from 'reactstrap';
|
import { Card, Row } from 'reactstrap';
|
||||||
import { ExternalLink } from 'react-external-link';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faExternalLinkAlt, faPlus } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import { ServersListGroup } from '../servers/ServersListGroup';
|
|
||||||
import type { ServersMap } from '../servers/data';
|
import type { ServersMap } from '../servers/data';
|
||||||
|
import { ServersListGroup } from '../servers/ServersListGroup';
|
||||||
import { ShlinkLogo } from './img/ShlinkLogo';
|
import { ShlinkLogo } from './img/ShlinkLogo';
|
||||||
import './Home.scss';
|
import './Home.scss';
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { faChevronDown as arrowIcon, faCogs as cogsIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faChevronDown as arrowIcon, faCogs as cogsIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import classNames from 'classnames';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { Link, useLocation } from 'react-router-dom';
|
import { Link, useLocation } from 'react-router-dom';
|
||||||
import { Collapse, Nav, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';
|
import { Collapse, Nav, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';
|
||||||
import classNames from 'classnames';
|
|
||||||
import { useToggle } from '../utils/helpers/hooks';
|
import { useToggle } from '../utils/helpers/hooks';
|
||||||
import { ShlinkLogo } from './img/ShlinkLogo';
|
import { ShlinkLogo } from './img/ShlinkLogo';
|
||||||
import './MainHeader.scss';
|
import './MainHeader.scss';
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
import type { FC } from 'react';
|
|
||||||
import { useEffect } from 'react';
|
|
||||||
import { Navigate, Route, Routes, useLocation } from 'react-router-dom';
|
|
||||||
import { faBars as burgerIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faBars as burgerIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { withSelectedServer } from '../servers/helpers/withSelectedServer';
|
import type { FC } from 'react';
|
||||||
import { useSwipeable, useToggle } from '../utils/helpers/hooks';
|
import { useEffect } from 'react';
|
||||||
import { supportsDomainVisits, supportsNonOrphanVisits } from '../utils/helpers/features';
|
import { Navigate, Route, Routes, useLocation } from 'react-router-dom';
|
||||||
import { isReachableServer } from '../servers/data';
|
import { isReachableServer } from '../servers/data';
|
||||||
import { NotFound } from './NotFound';
|
import { withSelectedServer } from '../servers/helpers/withSelectedServer';
|
||||||
|
import { supportsDomainVisits, supportsNonOrphanVisits } from '../utils/helpers/features';
|
||||||
|
import { useSwipeable, useToggle } from '../utils/helpers/hooks';
|
||||||
import type { AsideMenuProps } from './AsideMenu';
|
import type { AsideMenuProps } from './AsideMenu';
|
||||||
|
import { NotFound } from './NotFound';
|
||||||
import './MenuLayout.scss';
|
import './MenuLayout.scss';
|
||||||
|
|
||||||
interface MenuLayoutProps {
|
interface MenuLayoutProps {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { pipe } from 'ramda';
|
import { pipe } from 'ramda';
|
||||||
import { ExternalLink } from 'react-external-link';
|
import { ExternalLink } from 'react-external-link';
|
||||||
import { versionToPrintable, versionToSemVer } from '../utils/helpers/version';
|
|
||||||
import type { SelectedServer } from '../servers/data';
|
import type { SelectedServer } from '../servers/data';
|
||||||
import { isReachableServer } from '../servers/data';
|
import { isReachableServer } from '../servers/data';
|
||||||
|
import { versionToPrintable, versionToSemVer } from '../utils/helpers/version';
|
||||||
|
|
||||||
const SHLINK_WEB_CLIENT_VERSION = '%_VERSION_%';
|
const SHLINK_WEB_CLIENT_VERSION = '%_VERSION_%';
|
||||||
const normalizeVersion = pipe(versionToSemVer(), versionToPrintable);
|
const normalizeVersion = pipe(versionToSemVer(), versionToPrintable);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import type { SelectedServer } from '../servers/data';
|
import type { SelectedServer } from '../servers/data';
|
||||||
import { ShlinkVersions } from './ShlinkVersions';
|
|
||||||
import type { Sidebar } from './reducers/sidebar';
|
import type { Sidebar } from './reducers/sidebar';
|
||||||
|
import { ShlinkVersions } from './ShlinkVersions';
|
||||||
import './ShlinkVersionsContainer.scss';
|
import './ShlinkVersionsContainer.scss';
|
||||||
|
|
||||||
export interface ShlinkVersionsContainerProps {
|
export interface ShlinkVersionsContainerProps {
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import type { FC } from 'react';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
import type { FC } from 'react';
|
||||||
import { Pagination, PaginationItem, PaginationLink } from 'reactstrap';
|
import { Pagination, PaginationItem, PaginationLink } from 'reactstrap';
|
||||||
import type {
|
import type {
|
||||||
NumberOrEllipsis } from '../utils/helpers/pagination';
|
NumberOrEllipsis } from '../utils/helpers/pagination';
|
||||||
import {
|
import {
|
||||||
pageIsEllipsis,
|
|
||||||
keyForPage,
|
keyForPage,
|
||||||
progressivePagination,
|
pageIsEllipsis,
|
||||||
prettifyPageNumber,
|
prettifyPageNumber,
|
||||||
|
progressivePagination,
|
||||||
} from '../utils/helpers/pagination';
|
} from '../utils/helpers/pagination';
|
||||||
import './SimplePaginator.scss';
|
import './SimplePaginator.scss';
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import type { NormalizedVisit } from '../../visits/types';
|
|
||||||
import type { ExportableShortUrl } from '../../short-urls/data';
|
import type { ExportableShortUrl } from '../../short-urls/data';
|
||||||
import { saveCsv } from '../../utils/helpers/files';
|
|
||||||
import type { JsonToCsv } from '../../utils/helpers/csvjson';
|
import type { JsonToCsv } from '../../utils/helpers/csvjson';
|
||||||
|
import { saveCsv } from '../../utils/helpers/files';
|
||||||
|
import type { NormalizedVisit } from '../../visits/types';
|
||||||
|
|
||||||
export class ReportExporter {
|
export class ReportExporter {
|
||||||
public constructor(private readonly window: Window, private readonly jsonToCsv: JsonToCsv) {}
|
public constructor(private readonly window: Window, private readonly jsonToCsv: JsonToCsv) {}
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
import type Bottle from 'bottlejs';
|
import type Bottle from 'bottlejs';
|
||||||
import { ScrollToTop } from '../ScrollToTop';
|
|
||||||
import { MainHeader } from '../MainHeader';
|
|
||||||
import { Home } from '../Home';
|
|
||||||
import { MenuLayout } from '../MenuLayout';
|
|
||||||
import { AsideMenu } from '../AsideMenu';
|
|
||||||
import { ErrorHandler } from '../ErrorHandler';
|
|
||||||
import { ShlinkVersionsContainer } from '../ShlinkVersionsContainer';
|
|
||||||
import type { ConnectDecorator } from '../../container/types';
|
import type { ConnectDecorator } from '../../container/types';
|
||||||
import { withoutSelectedServer } from '../../servers/helpers/withoutSelectedServer';
|
import { withoutSelectedServer } from '../../servers/helpers/withoutSelectedServer';
|
||||||
|
import { AsideMenu } from '../AsideMenu';
|
||||||
|
import { ErrorHandler } from '../ErrorHandler';
|
||||||
|
import { Home } from '../Home';
|
||||||
|
import { MainHeader } from '../MainHeader';
|
||||||
|
import { MenuLayout } from '../MenuLayout';
|
||||||
import { sidebarNotPresent, sidebarPresent } from '../reducers/sidebar';
|
import { sidebarNotPresent, sidebarPresent } from '../reducers/sidebar';
|
||||||
|
import { ScrollToTop } from '../ScrollToTop';
|
||||||
|
import { ShlinkVersionsContainer } from '../ShlinkVersionsContainer';
|
||||||
|
import { HttpClient } from './HttpClient';
|
||||||
import { ImageDownloader } from './ImageDownloader';
|
import { ImageDownloader } from './ImageDownloader';
|
||||||
import { ReportExporter } from './ReportExporter';
|
import { ReportExporter } from './ReportExporter';
|
||||||
import { HttpClient } from './HttpClient';
|
|
||||||
|
|
||||||
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
||||||
// Services
|
// Services
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
import type { IContainer } from 'bottlejs';
|
import type { IContainer } from 'bottlejs';
|
||||||
import Bottle from 'bottlejs';
|
import Bottle from 'bottlejs';
|
||||||
import { connect as reduxConnect } from 'react-redux';
|
|
||||||
import { pick } from 'ramda';
|
import { pick } from 'ramda';
|
||||||
|
import { connect as reduxConnect } from 'react-redux';
|
||||||
import provideApiServices from '../api/services/provideServices';
|
import provideApiServices from '../api/services/provideServices';
|
||||||
|
import provideAppServices from '../app/services/provideServices';
|
||||||
import provideCommonServices from '../common/services/provideServices';
|
import provideCommonServices from '../common/services/provideServices';
|
||||||
import provideShortUrlsServices from '../short-urls/services/provideServices';
|
import provideDomainsServices from '../domains/services/provideServices';
|
||||||
|
import provideMercureServices from '../mercure/services/provideServices';
|
||||||
import provideServersServices from '../servers/services/provideServices';
|
import provideServersServices from '../servers/services/provideServices';
|
||||||
import provideVisitsServices from '../visits/services/provideServices';
|
import provideSettingsServices from '../settings/services/provideServices';
|
||||||
|
import provideShortUrlsServices from '../short-urls/services/provideServices';
|
||||||
import provideTagsServices from '../tags/services/provideServices';
|
import provideTagsServices from '../tags/services/provideServices';
|
||||||
import provideUtilsServices from '../utils/services/provideServices';
|
import provideUtilsServices from '../utils/services/provideServices';
|
||||||
import provideMercureServices from '../mercure/services/provideServices';
|
import provideVisitsServices from '../visits/services/provideServices';
|
||||||
import provideSettingsServices from '../settings/services/provideServices';
|
|
||||||
import provideDomainsServices from '../domains/services/provideServices';
|
|
||||||
import provideAppServices from '../app/services/provideServices';
|
|
||||||
import type { ConnectDecorator } from './types';
|
import type { ConnectDecorator } from './types';
|
||||||
|
|
||||||
type LazyActionMap = Record<string, Function>;
|
type LazyActionMap = Record<string, Function>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
import { configureStore } from '@reduxjs/toolkit';
|
||||||
import type { IContainer } from 'bottlejs';
|
import type { IContainer } from 'bottlejs';
|
||||||
import type { RLSOptions } from 'redux-localstorage-simple';
|
import type { RLSOptions } from 'redux-localstorage-simple';
|
||||||
import { save, load } from 'redux-localstorage-simple';
|
import { load, save } from 'redux-localstorage-simple';
|
||||||
import { configureStore } from '@reduxjs/toolkit';
|
|
||||||
import reducer from '../reducers';
|
import reducer from '../reducers';
|
||||||
import { migrateDeprecatedSettings } from '../settings/helpers';
|
import { migrateDeprecatedSettings } from '../settings/helpers';
|
||||||
import type { ShlinkState } from './types';
|
import type { ShlinkState } from './types';
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
|
import type { Sidebar } from '../common/reducers/sidebar';
|
||||||
|
import type { DomainsList } from '../domains/reducers/domainsList';
|
||||||
import type { MercureInfo } from '../mercure/reducers/mercureInfo';
|
import type { MercureInfo } from '../mercure/reducers/mercureInfo';
|
||||||
import type { SelectedServer, ServersMap } from '../servers/data';
|
import type { SelectedServer, ServersMap } from '../servers/data';
|
||||||
import type { Settings } from '../settings/reducers/settings';
|
import type { Settings } from '../settings/reducers/settings';
|
||||||
import type { ShortUrlCreation } from '../short-urls/reducers/shortUrlCreation';
|
import type { ShortUrlCreation } from '../short-urls/reducers/shortUrlCreation';
|
||||||
import type { ShortUrlDeletion } from '../short-urls/reducers/shortUrlDeletion';
|
import type { ShortUrlDeletion } from '../short-urls/reducers/shortUrlDeletion';
|
||||||
|
import type { ShortUrlDetail } from '../short-urls/reducers/shortUrlDetail';
|
||||||
import type { ShortUrlEdition } from '../short-urls/reducers/shortUrlEdition';
|
import type { ShortUrlEdition } from '../short-urls/reducers/shortUrlEdition';
|
||||||
import type { ShortUrlsList } from '../short-urls/reducers/shortUrlsList';
|
import type { ShortUrlsList } from '../short-urls/reducers/shortUrlsList';
|
||||||
import type { TagDeletion } from '../tags/reducers/tagDelete';
|
import type { TagDeletion } from '../tags/reducers/tagDelete';
|
||||||
import type { TagEdition } from '../tags/reducers/tagEdit';
|
import type { TagEdition } from '../tags/reducers/tagEdit';
|
||||||
import type { TagsList } from '../tags/reducers/tagsList';
|
import type { TagsList } from '../tags/reducers/tagsList';
|
||||||
import type { ShortUrlDetail } from '../short-urls/reducers/shortUrlDetail';
|
import type { DomainVisits } from '../visits/reducers/domainVisits';
|
||||||
import type { ShortUrlVisits } from '../visits/reducers/shortUrlVisits';
|
import type { ShortUrlVisits } from '../visits/reducers/shortUrlVisits';
|
||||||
import type { TagVisits } from '../visits/reducers/tagVisits';
|
import type { TagVisits } from '../visits/reducers/tagVisits';
|
||||||
import type { DomainsList } from '../domains/reducers/domainsList';
|
|
||||||
import type { VisitsOverview } from '../visits/reducers/visitsOverview';
|
|
||||||
import type { Sidebar } from '../common/reducers/sidebar';
|
|
||||||
import type { DomainVisits } from '../visits/reducers/domainVisits';
|
|
||||||
import type { VisitsInfo } from '../visits/reducers/types';
|
import type { VisitsInfo } from '../visits/reducers/types';
|
||||||
|
import type { VisitsOverview } from '../visits/reducers/visitsOverview';
|
||||||
|
|
||||||
export interface ShlinkState {
|
export interface ShlinkState {
|
||||||
servers: ServersMap;
|
servers: ServersMap;
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
|
import { faDotCircle as defaultDomainIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { UncontrolledTooltip } from 'reactstrap';
|
import { UncontrolledTooltip } from 'reactstrap';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faDotCircle as defaultDomainIcon } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import type { ShlinkDomainRedirects } from '../api/types';
|
import type { ShlinkDomainRedirects } from '../api/types';
|
||||||
import type { OptionalString } from '../utils/utils';
|
|
||||||
import type { SelectedServer } from '../servers/data';
|
import type { SelectedServer } from '../servers/data';
|
||||||
|
import type { OptionalString } from '../utils/utils';
|
||||||
import type { Domain } from './data';
|
import type { Domain } from './data';
|
||||||
import { DomainStatusIcon } from './helpers/DomainStatusIcon';
|
|
||||||
import { DomainDropdown } from './helpers/DomainDropdown';
|
import { DomainDropdown } from './helpers/DomainDropdown';
|
||||||
|
import { DomainStatusIcon } from './helpers/DomainStatusIcon';
|
||||||
import type { EditDomainRedirects } from './reducers/domainRedirects';
|
import type { EditDomainRedirects } from './reducers/domainRedirects';
|
||||||
|
|
||||||
interface DomainRowProps {
|
interface DomainRowProps {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
import { faUndo } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import { isEmpty, pipe } from 'ramda';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import type { InputProps } from 'reactstrap';
|
import type { InputProps } from 'reactstrap';
|
||||||
import { Button, DropdownItem, Input, InputGroup, UncontrolledTooltip } from 'reactstrap';
|
import { Button, DropdownItem, Input, InputGroup, UncontrolledTooltip } from 'reactstrap';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faUndo } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import { isEmpty, pipe } from 'ramda';
|
|
||||||
import { DropdownBtn } from '../utils/DropdownBtn';
|
import { DropdownBtn } from '../utils/DropdownBtn';
|
||||||
import { useToggle } from '../utils/helpers/hooks';
|
import { useToggle } from '../utils/helpers/hooks';
|
||||||
import type { DomainsList } from './reducers/domainsList';
|
import type { DomainsList } from './reducers/domainsList';
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
import { ShlinkApiError } from '../api/ShlinkApiError';
|
||||||
|
import type { SelectedServer } from '../servers/data';
|
||||||
import { Message } from '../utils/Message';
|
import { Message } from '../utils/Message';
|
||||||
import { Result } from '../utils/Result';
|
import { Result } from '../utils/Result';
|
||||||
import { ShlinkApiError } from '../api/ShlinkApiError';
|
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { SearchField } from '../utils/SearchField';
|
import { SearchField } from '../utils/SearchField';
|
||||||
import type { EditDomainRedirects } from './reducers/domainRedirects';
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
import type { SelectedServer } from '../servers/data';
|
|
||||||
import type { DomainsList } from './reducers/domainsList';
|
|
||||||
import { DomainRow } from './DomainRow';
|
import { DomainRow } from './DomainRow';
|
||||||
|
import type { EditDomainRedirects } from './reducers/domainRedirects';
|
||||||
|
import type { DomainsList } from './reducers/domainsList';
|
||||||
|
|
||||||
interface ManageDomainsProps {
|
interface ManageDomainsProps {
|
||||||
listDomains: Function;
|
listDomains: Function;
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
import type { FC } from 'react';
|
|
||||||
import { DropdownItem } from 'reactstrap';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import { faChartPie as pieChartIcon, faEdit as editIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faChartPie as pieChartIcon, faEdit as editIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import { useToggle } from '../../utils/helpers/hooks';
|
import type { FC } from 'react';
|
||||||
import { DropdownBtnMenu } from '../../utils/DropdownBtnMenu';
|
import { Link } from 'react-router-dom';
|
||||||
import { EditDomainRedirectsModal } from './EditDomainRedirectsModal';
|
import { DropdownItem } from 'reactstrap';
|
||||||
import type { Domain } from '../data';
|
|
||||||
import type { EditDomainRedirects } from '../reducers/domainRedirects';
|
|
||||||
import { supportsDefaultDomainRedirectsEdition, supportsDomainVisits } from '../../utils/helpers/features';
|
|
||||||
import type { SelectedServer } from '../../servers/data';
|
import type { SelectedServer } from '../../servers/data';
|
||||||
import { getServerId } from '../../servers/data';
|
import { getServerId } from '../../servers/data';
|
||||||
|
import { DropdownBtnMenu } from '../../utils/DropdownBtnMenu';
|
||||||
|
import { supportsDefaultDomainRedirectsEdition, supportsDomainVisits } from '../../utils/helpers/features';
|
||||||
|
import { useToggle } from '../../utils/helpers/hooks';
|
||||||
import { DEFAULT_DOMAIN } from '../../visits/reducers/domainVisits';
|
import { DEFAULT_DOMAIN } from '../../visits/reducers/domainVisits';
|
||||||
|
import type { Domain } from '../data';
|
||||||
|
import type { EditDomainRedirects } from '../reducers/domainRedirects';
|
||||||
|
import { EditDomainRedirectsModal } from './EditDomainRedirectsModal';
|
||||||
|
|
||||||
interface DomainDropdownProps {
|
interface DomainDropdownProps {
|
||||||
domain: Domain;
|
domain: Domain;
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import type { FC } from 'react';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { UncontrolledTooltip } from 'reactstrap';
|
|
||||||
import { ExternalLink } from 'react-external-link';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import {
|
import {
|
||||||
faTimes as invalidIcon,
|
|
||||||
faCheck as checkIcon,
|
faCheck as checkIcon,
|
||||||
faCircleNotch as loadingStatusIcon,
|
faCircleNotch as loadingStatusIcon,
|
||||||
|
faTimes as invalidIcon,
|
||||||
} from '@fortawesome/free-solid-svg-icons';
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import type { FC } from 'react';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { ExternalLink } from 'react-external-link';
|
||||||
|
import { UncontrolledTooltip } from 'reactstrap';
|
||||||
|
import { useElementRef } from '../../utils/helpers/hooks';
|
||||||
import type { MediaMatcher } from '../../utils/types';
|
import type { MediaMatcher } from '../../utils/types';
|
||||||
import type { DomainStatus } from '../data';
|
import type { DomainStatus } from '../data';
|
||||||
import { useElementRef } from '../../utils/helpers/hooks';
|
|
||||||
|
|
||||||
interface DomainStatusIconProps {
|
interface DomainStatusIconProps {
|
||||||
status: DomainStatus;
|
status: DomainStatus;
|
||||||
|
|
|
@ -4,8 +4,8 @@ import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
|
||||||
import type { ShlinkDomain } from '../../api/types';
|
import type { ShlinkDomain } from '../../api/types';
|
||||||
import type { InputFormGroupProps } from '../../utils/forms/InputFormGroup';
|
import type { InputFormGroupProps } from '../../utils/forms/InputFormGroup';
|
||||||
import { InputFormGroup } from '../../utils/forms/InputFormGroup';
|
import { InputFormGroup } from '../../utils/forms/InputFormGroup';
|
||||||
import { handleEventPreventingDefault, nonEmptyValueOrNull } from '../../utils/utils';
|
|
||||||
import { InfoTooltip } from '../../utils/InfoTooltip';
|
import { InfoTooltip } from '../../utils/InfoTooltip';
|
||||||
|
import { handleEventPreventingDefault, nonEmptyValueOrNull } from '../../utils/utils';
|
||||||
import type { EditDomainRedirects } from '../reducers/domainRedirects';
|
import type { EditDomainRedirects } from '../reducers/domainRedirects';
|
||||||
|
|
||||||
interface EditDomainRedirectsModalProps {
|
interface EditDomainRedirectsModalProps {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
import type { ShlinkDomainRedirects } from '../../api/types';
|
import type { ShlinkDomainRedirects } from '../../api/types';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
|
|
||||||
const EDIT_DOMAIN_REDIRECTS = 'shlink/domainRedirects/EDIT_DOMAIN_REDIRECTS';
|
const EDIT_DOMAIN_REDIRECTS = 'shlink/domainRedirects/EDIT_DOMAIN_REDIRECTS';
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import type { SliceCaseReducers, AsyncThunk } from '@reduxjs/toolkit';
|
import type { AsyncThunk, SliceCaseReducers } from '@reduxjs/toolkit';
|
||||||
import { createSlice, createAction } from '@reduxjs/toolkit';
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkDomainRedirects } from '../../api/types';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
import type { Domain, DomainStatus } from '../data';
|
import type { ShlinkDomainRedirects } from '../../api/types';
|
||||||
import { hasServerData } from '../../servers/data';
|
|
||||||
import { replaceAuthorityFromUri } from '../../utils/helpers/uri';
|
|
||||||
import type { ProblemDetailsError } from '../../api/types/errors';
|
import type { ProblemDetailsError } from '../../api/types/errors';
|
||||||
import { parseApiError } from '../../api/utils';
|
import { parseApiError } from '../../api/utils';
|
||||||
|
import { hasServerData } from '../../servers/data';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
|
import { replaceAuthorityFromUri } from '../../utils/helpers/uri';
|
||||||
|
import type { Domain, DomainStatus } from '../data';
|
||||||
import type { EditDomainRedirects } from './domainRedirects';
|
import type { EditDomainRedirects } from './domainRedirects';
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/domainsList';
|
const REDUCER_PREFIX = 'shlink/domainsList';
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { prop } from 'ramda';
|
|
||||||
import type Bottle from 'bottlejs';
|
import type Bottle from 'bottlejs';
|
||||||
|
import { prop } from 'ramda';
|
||||||
import type { ConnectDecorator } from '../../container/types';
|
import type { ConnectDecorator } from '../../container/types';
|
||||||
import { domainsListReducerCreator } from '../reducers/domainsList';
|
|
||||||
import { DomainSelector } from '../DomainSelector';
|
import { DomainSelector } from '../DomainSelector';
|
||||||
import { ManageDomains } from '../ManageDomains';
|
import { ManageDomains } from '../ManageDomains';
|
||||||
import { editDomainRedirects } from '../reducers/domainRedirects';
|
import { editDomainRedirects } from '../reducers/domainRedirects';
|
||||||
|
import { domainsListReducerCreator } from '../reducers/domainsList';
|
||||||
|
|
||||||
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
||||||
// Components
|
// Components
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
|
import 'chart.js/auto'; // TODO Import specific ones to reduce bundle size https://react-chartjs-2.js.org/docs/migration-to-v4/#tree-shaking
|
||||||
import { createRoot } from 'react-dom/client';
|
import { createRoot } from 'react-dom/client';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import { BrowserRouter } from 'react-router-dom';
|
import { BrowserRouter } from 'react-router-dom';
|
||||||
import pack from '../package.json';
|
import pack from '../package.json';
|
||||||
import { container } from './container';
|
import { container } from './container';
|
||||||
import { setUpStore } from './container/store';
|
import { setUpStore } from './container/store';
|
||||||
import { fixLeafletIcons } from './utils/helpers/leaflet';
|
|
||||||
import { register as registerServiceWorker } from './serviceWorkerRegistration';
|
import { register as registerServiceWorker } from './serviceWorkerRegistration';
|
||||||
import 'chart.js/auto'; // TODO Import specific ones to reduce bundle size https://react-chartjs-2.js.org/docs/migration-to-v4/#tree-shaking
|
import { fixLeafletIcons } from './utils/helpers/leaflet';
|
||||||
import 'react-datepicker/dist/react-datepicker.css';
|
|
||||||
import 'leaflet/dist/leaflet.css';
|
|
||||||
import './index.scss';
|
import './index.scss';
|
||||||
|
import 'leaflet/dist/leaflet.css';
|
||||||
|
import 'react-datepicker/dist/react-datepicker.css';
|
||||||
|
|
||||||
// This overwrites icons used for leaflet maps, fixing some issues caused by webpack while processing the CSS
|
// This overwrites icons used for leaflet maps, fixing some issues caused by webpack while processing the CSS
|
||||||
fixLeafletIcons();
|
fixLeafletIcons();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
import { pipe } from 'ramda';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { pipe } from 'ramda';
|
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
import type { CreateVisit } from '../../visits/types';
|
import type { CreateVisit } from '../../visits/types';
|
||||||
import type { MercureInfo } from '../reducers/mercureInfo';
|
import type { MercureInfo } from '../reducers/mercureInfo';
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { createSlice } from '@reduxjs/toolkit';
|
import { createSlice } from '@reduxjs/toolkit';
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkMercureInfo } from '../../api/types';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
|
import type { ShlinkMercureInfo } from '../../api/types';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/mercure';
|
const REDUCER_PREFIX = 'shlink/mercure';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { prop } from 'ramda';
|
|
||||||
import type Bottle from 'bottlejs';
|
import type Bottle from 'bottlejs';
|
||||||
|
import { prop } from 'ramda';
|
||||||
import { mercureInfoReducerCreator } from '../reducers/mercureInfo';
|
import { mercureInfoReducerCreator } from '../reducers/mercureInfo';
|
||||||
|
|
||||||
const provideServices = (bottle: Bottle) => {
|
const provideServices = (bottle: Bottle) => {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { IContainer } from 'bottlejs';
|
|
||||||
import { combineReducers } from '@reduxjs/toolkit';
|
import { combineReducers } from '@reduxjs/toolkit';
|
||||||
import { serversReducer } from '../servers/reducers/servers';
|
import type { IContainer } from 'bottlejs';
|
||||||
import { settingsReducer } from '../settings/reducers/settings';
|
|
||||||
import { appUpdatesReducer } from '../app/reducers/appUpdates';
|
import { appUpdatesReducer } from '../app/reducers/appUpdates';
|
||||||
import { sidebarReducer } from '../common/reducers/sidebar';
|
import { sidebarReducer } from '../common/reducers/sidebar';
|
||||||
import type { ShlinkState } from '../container/types';
|
import type { ShlinkState } from '../container/types';
|
||||||
|
import { serversReducer } from '../servers/reducers/servers';
|
||||||
|
import { settingsReducer } from '../settings/reducers/settings';
|
||||||
|
|
||||||
export default (container: IContainer) => combineReducers<ShlinkState>({
|
export default (container: IContainer) => combineReducers<ShlinkState>({
|
||||||
servers: serversReducer,
|
servers: serversReducer,
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { v4 as uuid } from 'uuid';
|
|
||||||
import { Button } from 'reactstrap';
|
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { Result } from '../utils/Result';
|
import { Button } from 'reactstrap';
|
||||||
|
import { v4 as uuid } from 'uuid';
|
||||||
import { NoMenuLayout } from '../common/NoMenuLayout';
|
import { NoMenuLayout } from '../common/NoMenuLayout';
|
||||||
import type { TimeoutToggle } from '../utils/helpers/hooks';
|
import type { TimeoutToggle } from '../utils/helpers/hooks';
|
||||||
import { useGoBack, useToggle } from '../utils/helpers/hooks';
|
import { useGoBack, useToggle } from '../utils/helpers/hooks';
|
||||||
import { ServerForm } from './helpers/ServerForm';
|
import { Result } from '../utils/Result';
|
||||||
import type { ImportServersBtnProps } from './helpers/ImportServersBtn';
|
|
||||||
import type { ServerData, ServersMap, ServerWithId } from './data';
|
import type { ServerData, ServersMap, ServerWithId } from './data';
|
||||||
import { DuplicatedServersModal } from './helpers/DuplicatedServersModal';
|
import { DuplicatedServersModal } from './helpers/DuplicatedServersModal';
|
||||||
|
import type { ImportServersBtnProps } from './helpers/ImportServersBtn';
|
||||||
|
import { ServerForm } from './helpers/ServerForm';
|
||||||
|
|
||||||
const SHOW_IMPORT_MSG_TIME = 4000;
|
const SHOW_IMPORT_MSG_TIME = 4000;
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import type { FC, PropsWithChildren } from 'react';
|
|
||||||
import { faMinusCircle as deleteIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faMinusCircle as deleteIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import type { FC, PropsWithChildren } from 'react';
|
||||||
import { useToggle } from '../utils/helpers/hooks';
|
import { useToggle } from '../utils/helpers/hooks';
|
||||||
import type { DeleteServerModalProps } from './DeleteServerModal';
|
|
||||||
import type { ServerWithId } from './data';
|
import type { ServerWithId } from './data';
|
||||||
|
import type { DeleteServerModalProps } from './DeleteServerModal';
|
||||||
|
|
||||||
export type DeleteServerButtonProps = PropsWithChildren<{
|
export type DeleteServerButtonProps = PropsWithChildren<{
|
||||||
server: ServerWithId;
|
server: ServerWithId;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useRef } from 'react';
|
import { useRef } from 'react';
|
||||||
import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
|
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
|
||||||
import type { ServerWithId } from './data';
|
import type { ServerWithId } from './data';
|
||||||
|
|
||||||
export interface DeleteServerModalProps {
|
export interface DeleteServerModalProps {
|
||||||
|
|
|
@ -2,10 +2,10 @@ import type { FC } from 'react';
|
||||||
import { Button } from 'reactstrap';
|
import { Button } from 'reactstrap';
|
||||||
import { NoMenuLayout } from '../common/NoMenuLayout';
|
import { NoMenuLayout } from '../common/NoMenuLayout';
|
||||||
import { useGoBack, useParsedQuery } from '../utils/helpers/hooks';
|
import { useGoBack, useParsedQuery } from '../utils/helpers/hooks';
|
||||||
import { ServerForm } from './helpers/ServerForm';
|
|
||||||
import { withSelectedServer } from './helpers/withSelectedServer';
|
|
||||||
import type { ServerData } from './data';
|
import type { ServerData } from './data';
|
||||||
import { isServerWithId } from './data';
|
import { isServerWithId } from './data';
|
||||||
|
import { ServerForm } from './helpers/ServerForm';
|
||||||
|
import { withSelectedServer } from './helpers/withSelectedServer';
|
||||||
|
|
||||||
interface EditServerProps {
|
interface EditServerProps {
|
||||||
editServer: (serverId: string, serverData: ServerData) => void;
|
editServer: (serverId: string, serverData: ServerData) => void;
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import type { FC } from 'react';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { Button, Row } from 'reactstrap';
|
|
||||||
import { faFileDownload as exportIcon, faPlus as plusIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faFileDownload as exportIcon, faPlus as plusIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import type { FC } from 'react';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
import { Button, Row } from 'reactstrap';
|
||||||
import { NoMenuLayout } from '../common/NoMenuLayout';
|
import { NoMenuLayout } from '../common/NoMenuLayout';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { SearchField } from '../utils/SearchField';
|
|
||||||
import { Result } from '../utils/Result';
|
|
||||||
import type { TimeoutToggle } from '../utils/helpers/hooks';
|
import type { TimeoutToggle } from '../utils/helpers/hooks';
|
||||||
import type { ImportServersBtnProps } from './helpers/ImportServersBtn';
|
import { Result } from '../utils/Result';
|
||||||
|
import { SearchField } from '../utils/SearchField';
|
||||||
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
import type { ServersMap } from './data';
|
import type { ServersMap } from './data';
|
||||||
|
import type { ImportServersBtnProps } from './helpers/ImportServersBtn';
|
||||||
import type { ManageServersRowProps } from './ManageServersRow';
|
import type { ManageServersRowProps } from './ManageServersRow';
|
||||||
import type ServersExporter from './services/ServersExporter';
|
import type ServersExporter from './services/ServersExporter';
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import type { FC } from 'react';
|
|
||||||
import { UncontrolledTooltip } from 'reactstrap';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faCheck as checkIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faCheck as checkIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import type { FC } from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { UncontrolledTooltip } from 'reactstrap';
|
||||||
import type { ServerWithId } from './data';
|
import type { ServerWithId } from './data';
|
||||||
import type { ManageServersRowDropdownProps } from './ManageServersRowDropdown';
|
import type { ManageServersRowDropdownProps } from './ManageServersRowDropdown';
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
import type { FC } from 'react';
|
import { faCircle as toggleOnIcon } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { DropdownItem } from 'reactstrap';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import {
|
import {
|
||||||
faBan as toggleOffIcon,
|
faBan as toggleOffIcon,
|
||||||
faEdit as editIcon,
|
faEdit as editIcon,
|
||||||
faMinusCircle as deleteIcon,
|
faMinusCircle as deleteIcon,
|
||||||
faPlug as connectIcon,
|
faPlug as connectIcon,
|
||||||
} from '@fortawesome/free-solid-svg-icons';
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faCircle as toggleOnIcon } from '@fortawesome/free-regular-svg-icons';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import type { FC } from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { DropdownItem } from 'reactstrap';
|
||||||
import { DropdownBtnMenu } from '../utils/DropdownBtnMenu';
|
import { DropdownBtnMenu } from '../utils/DropdownBtnMenu';
|
||||||
import { useToggle } from '../utils/helpers/hooks';
|
import { useToggle } from '../utils/helpers/hooks';
|
||||||
import type { DeleteServerModalProps } from './DeleteServerModal';
|
|
||||||
import type { ServerWithId } from './data';
|
import type { ServerWithId } from './data';
|
||||||
|
import type { DeleteServerModalProps } from './DeleteServerModal';
|
||||||
|
|
||||||
export interface ManageServersRowDropdownProps {
|
export interface ManageServersRowDropdownProps {
|
||||||
server: ServerWithId;
|
server: ServerWithId;
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { Card, CardBody, CardHeader, Row } from 'reactstrap';
|
|
||||||
import { Link, useNavigate } from 'react-router-dom';
|
import { Link, useNavigate } from 'react-router-dom';
|
||||||
|
import { Card, CardBody, CardHeader, Row } from 'reactstrap';
|
||||||
|
import type { ShlinkShortUrlsListParams } from '../api/types';
|
||||||
|
import { boundToMercureHub } from '../mercure/helpers/boundToMercureHub';
|
||||||
|
import { Topics } from '../mercure/helpers/Topics';
|
||||||
|
import type { CreateShortUrlProps } from '../short-urls/CreateShortUrl';
|
||||||
import type { ShortUrlsList as ShortUrlsListState } from '../short-urls/reducers/shortUrlsList';
|
import type { ShortUrlsList as ShortUrlsListState } from '../short-urls/reducers/shortUrlsList';
|
||||||
import { ITEMS_IN_OVERVIEW_PAGE } from '../short-urls/reducers/shortUrlsList';
|
import { ITEMS_IN_OVERVIEW_PAGE } from '../short-urls/reducers/shortUrlsList';
|
||||||
import { prettify } from '../utils/helpers/numbers';
|
|
||||||
import type { TagsList } from '../tags/reducers/tagsList';
|
|
||||||
import type { ShortUrlsTableType } from '../short-urls/ShortUrlsTable';
|
import type { ShortUrlsTableType } from '../short-urls/ShortUrlsTable';
|
||||||
import { boundToMercureHub } from '../mercure/helpers/boundToMercureHub';
|
import type { TagsList } from '../tags/reducers/tagsList';
|
||||||
import type { CreateShortUrlProps } from '../short-urls/CreateShortUrl';
|
|
||||||
import type { VisitsOverview } from '../visits/reducers/visitsOverview';
|
|
||||||
import { Topics } from '../mercure/helpers/Topics';
|
|
||||||
import type { ShlinkShortUrlsListParams } from '../api/types';
|
|
||||||
import { supportsNonOrphanVisits } from '../utils/helpers/features';
|
import { supportsNonOrphanVisits } from '../utils/helpers/features';
|
||||||
|
import { prettify } from '../utils/helpers/numbers';
|
||||||
|
import type { VisitsOverview } from '../visits/reducers/visitsOverview';
|
||||||
import type { SelectedServer } from './data';
|
import type { SelectedServer } from './data';
|
||||||
import { getServerId } from './data';
|
import { getServerId } from './data';
|
||||||
import { HighlightCard } from './helpers/HighlightCard';
|
import { HighlightCard } from './helpers/HighlightCard';
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { isEmpty, values } from 'ramda';
|
|
||||||
import { DropdownItem, DropdownMenu, DropdownToggle, UncontrolledDropdown } from 'reactstrap';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import { faPlus as plusIcon, faServer as serverIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faPlus as plusIcon, faServer as serverIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import { isEmpty, values } from 'ramda';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { DropdownItem, DropdownMenu, DropdownToggle, UncontrolledDropdown } from 'reactstrap';
|
||||||
import type { SelectedServer, ServersMap } from './data';
|
import type { SelectedServer, ServersMap } from './data';
|
||||||
import { getServerId } from './data';
|
import { getServerId } from './data';
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import type { FC, PropsWithChildren } from 'react';
|
|
||||||
import { ListGroup, ListGroupItem } from 'reactstrap';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import classNames from 'classnames';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faChevronRight as chevronIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faChevronRight as chevronIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
import type { FC, PropsWithChildren } from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { ListGroup, ListGroupItem } from 'reactstrap';
|
||||||
import type { ServerWithId } from './data';
|
import type { ServerWithId } from './data';
|
||||||
import './ServersListGroup.scss';
|
import './ServersListGroup.scss';
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import type { FC, PropsWithChildren } from 'react';
|
|
||||||
import { Card, CardText, CardTitle } from 'reactstrap';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import { faArrowAltCircleRight as linkIcon } from '@fortawesome/free-regular-svg-icons';
|
import { faArrowAltCircleRight as linkIcon } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import type { FC, PropsWithChildren } from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
import { Card, CardText, CardTitle } from 'reactstrap';
|
||||||
import './HighlightCard.scss';
|
import './HighlightCard.scss';
|
||||||
|
|
||||||
export type HighlightCardProps = PropsWithChildren<{
|
export type HighlightCardProps = PropsWithChildren<{
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import type { ChangeEvent, FC, PropsWithChildren } from 'react';
|
|
||||||
import { useState, useEffect } from 'react';
|
|
||||||
import { Button, UncontrolledTooltip } from 'reactstrap';
|
|
||||||
import { complement, pipe } from 'ramda';
|
|
||||||
import { faFileUpload as importIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faFileUpload as importIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import { complement, pipe } from 'ramda';
|
||||||
|
import type { ChangeEvent, FC, PropsWithChildren } from 'react';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { Button, UncontrolledTooltip } from 'reactstrap';
|
||||||
import { useElementRef, useToggle } from '../../utils/helpers/hooks';
|
import { useElementRef, useToggle } from '../../utils/helpers/hooks';
|
||||||
import type { ServersImporter } from '../services/ServersImporter';
|
|
||||||
import type { ServerData, ServersMap } from '../data';
|
import type { ServerData, ServersMap } from '../data';
|
||||||
|
import type { ServersImporter } from '../services/ServersImporter';
|
||||||
import { DuplicatedServersModal } from './DuplicatedServersModal';
|
import { DuplicatedServersModal } from './DuplicatedServersModal';
|
||||||
import './ImportServersBtn.scss';
|
import './ImportServersBtn.scss';
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
import { NoMenuLayout } from '../../common/NoMenuLayout';
|
||||||
import { Message } from '../../utils/Message';
|
import { Message } from '../../utils/Message';
|
||||||
import { ServersListGroup } from '../ServersListGroup';
|
|
||||||
import type { DeleteServerButtonProps } from '../DeleteServerButton';
|
|
||||||
import type { SelectedServer, ServersMap } from '../data';
|
import type { SelectedServer, ServersMap } from '../data';
|
||||||
import { isServerWithId } from '../data';
|
import { isServerWithId } from '../data';
|
||||||
import { NoMenuLayout } from '../../common/NoMenuLayout';
|
import type { DeleteServerButtonProps } from '../DeleteServerButton';
|
||||||
|
import { ServersListGroup } from '../ServersListGroup';
|
||||||
import './ServerError.scss';
|
import './ServerError.scss';
|
||||||
|
|
||||||
interface ServerErrorProps {
|
interface ServerErrorProps {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import type { FC, PropsWithChildren, ReactNode } from 'react';
|
import type { FC, PropsWithChildren, ReactNode } from 'react';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { InputFormGroup } from '../../utils/forms/InputFormGroup';
|
import { InputFormGroup } from '../../utils/forms/InputFormGroup';
|
||||||
|
import { SimpleCard } from '../../utils/SimpleCard';
|
||||||
import { handleEventPreventingDefault } from '../../utils/utils';
|
import { handleEventPreventingDefault } from '../../utils/utils';
|
||||||
import type { ServerData } from '../data';
|
import type { ServerData } from '../data';
|
||||||
import { SimpleCard } from '../../utils/SimpleCard';
|
|
||||||
|
|
||||||
type ServerFormProps = PropsWithChildren<{
|
type ServerFormProps = PropsWithChildren<{
|
||||||
onSubmit: (server: ServerData) => void;
|
onSubmit: (server: ServerData) => void;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
|
import { NoMenuLayout } from '../../common/NoMenuLayout';
|
||||||
import { Message } from '../../utils/Message';
|
import { Message } from '../../utils/Message';
|
||||||
import type { SelectedServer } from '../data';
|
import type { SelectedServer } from '../data';
|
||||||
import { isNotFoundServer } from '../data';
|
import { isNotFoundServer } from '../data';
|
||||||
import { NoMenuLayout } from '../../common/NoMenuLayout';
|
|
||||||
|
|
||||||
interface WithSelectedServerProps {
|
interface WithSelectedServerProps {
|
||||||
selectServer: (serverId: string) => void;
|
selectServer: (serverId: string) => void;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import pack from '../../../package.json';
|
import pack from '../../../package.json';
|
||||||
|
import type { HttpClient } from '../../common/services/HttpClient';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
import type { ServerData } from '../data';
|
import type { ServerData } from '../data';
|
||||||
import { hasServerData } from '../data';
|
import { hasServerData } from '../data';
|
||||||
import { createServers } from './servers';
|
import { createServers } from './servers';
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { HttpClient } from '../../common/services/HttpClient';
|
|
||||||
|
|
||||||
const responseToServersList = (data: any): ServerData[] => (Array.isArray(data) ? data.filter(hasServerData) : []);
|
const responseToServersList = (data: any): ServerData[] => (Array.isArray(data) ? data.filter(hasServerData) : []);
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import type { PayloadAction } from '@reduxjs/toolkit';
|
import type { PayloadAction } from '@reduxjs/toolkit';
|
||||||
import { createAction, createListenerMiddleware, createSlice } from '@reduxjs/toolkit';
|
import { createAction, createListenerMiddleware, createSlice } from '@reduxjs/toolkit';
|
||||||
import { memoizeWith, pipe } from 'ramda';
|
import { memoizeWith, pipe } from 'ramda';
|
||||||
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
|
import type { ShlinkHealth } from '../../api/types';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
import { versionToPrintable, versionToSemVer as toSemVer } from '../../utils/helpers/version';
|
import { versionToPrintable, versionToSemVer as toSemVer } from '../../utils/helpers/version';
|
||||||
import type { SelectedServer, ServerWithId } from '../data';
|
import type { SelectedServer, ServerWithId } from '../data';
|
||||||
import { isReachableServer } from '../data';
|
import { isReachableServer } from '../data';
|
||||||
import type { ShlinkHealth } from '../../api/types';
|
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/selectedServer';
|
const REDUCER_PREFIX = 'shlink/selectedServer';
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import { values } from 'ramda';
|
import { values } from 'ramda';
|
||||||
|
import type { JsonToCsv } from '../../utils/helpers/csvjson';
|
||||||
|
import { saveCsv } from '../../utils/helpers/files';
|
||||||
import type { LocalStorage } from '../../utils/services/LocalStorage';
|
import type { LocalStorage } from '../../utils/services/LocalStorage';
|
||||||
import type { ServersMap } from '../data';
|
import type { ServersMap } from '../data';
|
||||||
import { serverWithIdToServerData } from '../data';
|
import { serverWithIdToServerData } from '../data';
|
||||||
import { saveCsv } from '../../utils/helpers/files';
|
|
||||||
import type { JsonToCsv } from '../../utils/helpers/csvjson';
|
|
||||||
|
|
||||||
const SERVERS_FILENAME = 'shlink-servers.csv';
|
const SERVERS_FILENAME = 'shlink-servers.csv';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { ServerData } from '../data';
|
|
||||||
import type { CsvToJson } from '../../utils/helpers/csvjson';
|
import type { CsvToJson } from '../../utils/helpers/csvjson';
|
||||||
|
import type { ServerData } from '../data';
|
||||||
|
|
||||||
const validateServer = (server: any): server is ServerData =>
|
const validateServer = (server: any): server is ServerData =>
|
||||||
typeof server.url === 'string' && typeof server.apiKey === 'string' && typeof server.name === 'string';
|
typeof server.url === 'string' && typeof server.apiKey === 'string' && typeof server.name === 'string';
|
||||||
|
|
|
@ -1,11 +1,18 @@
|
||||||
import { prop } from 'ramda';
|
|
||||||
import type Bottle from 'bottlejs';
|
import type Bottle from 'bottlejs';
|
||||||
|
import { prop } from 'ramda';
|
||||||
|
import type { ConnectDecorator } from '../../container/types';
|
||||||
import { CreateServer } from '../CreateServer';
|
import { CreateServer } from '../CreateServer';
|
||||||
import { ServersDropdown } from '../ServersDropdown';
|
|
||||||
import { DeleteServerModal } from '../DeleteServerModal';
|
|
||||||
import { DeleteServerButton } from '../DeleteServerButton';
|
import { DeleteServerButton } from '../DeleteServerButton';
|
||||||
|
import { DeleteServerModal } from '../DeleteServerModal';
|
||||||
import { EditServer } from '../EditServer';
|
import { EditServer } from '../EditServer';
|
||||||
import { ImportServersBtn } from '../helpers/ImportServersBtn';
|
import { ImportServersBtn } from '../helpers/ImportServersBtn';
|
||||||
|
import { ServerError } from '../helpers/ServerError';
|
||||||
|
import { withoutSelectedServer } from '../helpers/withoutSelectedServer';
|
||||||
|
import { ManageServers } from '../ManageServers';
|
||||||
|
import { ManageServersRow } from '../ManageServersRow';
|
||||||
|
import { ManageServersRowDropdown } from '../ManageServersRowDropdown';
|
||||||
|
import { Overview } from '../Overview';
|
||||||
|
import { fetchServers } from '../reducers/remoteServers';
|
||||||
import {
|
import {
|
||||||
resetSelectedServer,
|
resetSelectedServer,
|
||||||
selectedServerReducerCreator,
|
selectedServerReducerCreator,
|
||||||
|
@ -13,16 +20,9 @@ import {
|
||||||
selectServerListener,
|
selectServerListener,
|
||||||
} from '../reducers/selectedServer';
|
} from '../reducers/selectedServer';
|
||||||
import { createServers, deleteServer, editServer, setAutoConnect } from '../reducers/servers';
|
import { createServers, deleteServer, editServer, setAutoConnect } from '../reducers/servers';
|
||||||
import { fetchServers } from '../reducers/remoteServers';
|
import { ServersDropdown } from '../ServersDropdown';
|
||||||
import { ServerError } from '../helpers/ServerError';
|
|
||||||
import type { ConnectDecorator } from '../../container/types';
|
|
||||||
import { withoutSelectedServer } from '../helpers/withoutSelectedServer';
|
|
||||||
import { Overview } from '../Overview';
|
|
||||||
import { ManageServers } from '../ManageServers';
|
|
||||||
import { ManageServersRow } from '../ManageServersRow';
|
|
||||||
import { ManageServersRowDropdown } from '../ManageServersRowDropdown';
|
|
||||||
import { ServersImporter } from './ServersImporter';
|
|
||||||
import ServersExporter from './ServersExporter';
|
import ServersExporter from './ServersExporter';
|
||||||
|
import { ServersImporter } from './ServersImporter';
|
||||||
|
|
||||||
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
||||||
// Components
|
// Components
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import { FormGroup, Input } from 'reactstrap';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { ToggleSwitch } from '../utils/ToggleSwitch';
|
import { FormGroup, Input } from 'reactstrap';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { FormText } from '../utils/forms/FormText';
|
import { FormText } from '../utils/forms/FormText';
|
||||||
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
||||||
import type { Settings } from './reducers/settings';
|
|
||||||
import { useDomId } from '../utils/helpers/hooks';
|
import { useDomId } from '../utils/helpers/hooks';
|
||||||
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
|
import { ToggleSwitch } from '../utils/ToggleSwitch';
|
||||||
|
import type { Settings } from './reducers/settings';
|
||||||
|
|
||||||
interface RealTimeUpdatesProps {
|
interface RealTimeUpdatesProps {
|
||||||
settings: Settings;
|
settings: Settings;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { FC, ReactNode } from 'react';
|
import type { FC, ReactNode } from 'react';
|
||||||
import { Navigate, Routes, Route } from 'react-router-dom';
|
import { Navigate, Route, Routes } from 'react-router-dom';
|
||||||
import { NoMenuLayout } from '../common/NoMenuLayout';
|
import { NoMenuLayout } from '../common/NoMenuLayout';
|
||||||
import { NavPillItem, NavPills } from '../utils/NavPills';
|
import { NavPillItem, NavPills } from '../utils/NavPills';
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { FC, ReactNode } from 'react';
|
import type { FC, ReactNode } from 'react';
|
||||||
import { DropdownItem, FormGroup } from 'reactstrap';
|
import { DropdownItem, FormGroup } from 'reactstrap';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { ToggleSwitch } from '../utils/ToggleSwitch';
|
|
||||||
import { DropdownBtn } from '../utils/DropdownBtn';
|
import { DropdownBtn } from '../utils/DropdownBtn';
|
||||||
import { FormText } from '../utils/forms/FormText';
|
import { FormText } from '../utils/forms/FormText';
|
||||||
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
||||||
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
|
import { ToggleSwitch } from '../utils/ToggleSwitch';
|
||||||
import type { Settings, ShortUrlCreationSettings as ShortUrlsSettings, TagFilteringMode } from './reducers/settings';
|
import type { Settings, ShortUrlCreationSettings as ShortUrlsSettings, TagFilteringMode } from './reducers/settings';
|
||||||
|
|
||||||
interface ShortUrlCreationProps {
|
interface ShortUrlCreationProps {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { OrderingDropdown } from '../utils/OrderingDropdown';
|
|
||||||
import { SHORT_URLS_ORDERABLE_FIELDS } from '../short-urls/data';
|
import { SHORT_URLS_ORDERABLE_FIELDS } from '../short-urls/data';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
||||||
|
import { OrderingDropdown } from '../utils/OrderingDropdown';
|
||||||
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
import type { Settings, ShortUrlsListSettings as ShortUrlsSettings } from './reducers/settings';
|
import type { Settings, ShortUrlsListSettings as ShortUrlsSettings } from './reducers/settings';
|
||||||
import { DEFAULT_SHORT_URLS_ORDERING } from './reducers/settings';
|
import { DEFAULT_SHORT_URLS_ORDERING } from './reducers/settings';
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { OrderingDropdown } from '../utils/OrderingDropdown';
|
|
||||||
import { TAGS_ORDERABLE_FIELDS } from '../tags/data/TagsListChildrenProps';
|
import { TAGS_ORDERABLE_FIELDS } from '../tags/data/TagsListChildrenProps';
|
||||||
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
||||||
|
import { OrderingDropdown } from '../utils/OrderingDropdown';
|
||||||
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
import type { Settings, TagsSettings as TagsSettingsOptions } from './reducers/settings';
|
import type { Settings, TagsSettings as TagsSettingsOptions } from './reducers/settings';
|
||||||
|
|
||||||
interface TagsProps {
|
interface TagsProps {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { FC } from 'react';
|
import { faMoon, faSun } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import { faSun, faMoon } from '@fortawesome/free-solid-svg-icons';
|
import type { FC } from 'react';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
import { ToggleSwitch } from '../utils/ToggleSwitch';
|
|
||||||
import type { Theme } from '../utils/theme';
|
import type { Theme } from '../utils/theme';
|
||||||
import { changeThemeInMarkup } from '../utils/theme';
|
import { changeThemeInMarkup } from '../utils/theme';
|
||||||
|
import { ToggleSwitch } from '../utils/ToggleSwitch';
|
||||||
import type { Settings, UiSettings } from './reducers/settings';
|
import type { Settings, UiSettings } from './reducers/settings';
|
||||||
import './UserInterfaceSettings.scss';
|
import './UserInterfaceSettings.scss';
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { FormGroup } from 'reactstrap';
|
import { FormGroup } from 'reactstrap';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { DateIntervalSelector } from '../utils/dates/DateIntervalSelector';
|
import { DateIntervalSelector } from '../utils/dates/DateIntervalSelector';
|
||||||
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
|
||||||
import type { Settings, VisitsSettings as VisitsSettingsConfig } from './reducers/settings';
|
|
||||||
import { ToggleSwitch } from '../utils/ToggleSwitch';
|
|
||||||
import { FormText } from '../utils/forms/FormText';
|
import { FormText } from '../utils/forms/FormText';
|
||||||
|
import { LabeledFormGroup } from '../utils/forms/LabeledFormGroup';
|
||||||
import type { DateInterval } from '../utils/helpers/dateIntervals';
|
import type { DateInterval } from '../utils/helpers/dateIntervals';
|
||||||
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
|
import { ToggleSwitch } from '../utils/ToggleSwitch';
|
||||||
|
import type { Settings, VisitsSettings as VisitsSettingsConfig } from './reducers/settings';
|
||||||
|
|
||||||
interface VisitsProps {
|
interface VisitsProps {
|
||||||
settings: Settings;
|
settings: Settings;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { PayloadAction, PrepareAction } from '@reduxjs/toolkit';
|
import type { PayloadAction, PrepareAction } from '@reduxjs/toolkit';
|
||||||
import { createSlice } from '@reduxjs/toolkit';
|
import { createSlice } from '@reduxjs/toolkit';
|
||||||
import { mergeDeepRight } from 'ramda';
|
import { mergeDeepRight } from 'ramda';
|
||||||
import type { Theme } from '../../utils/theme';
|
|
||||||
import type { DateInterval } from '../../utils/helpers/dateIntervals';
|
|
||||||
import type { TagsOrder } from '../../tags/data/TagsListChildrenProps';
|
|
||||||
import type { ShortUrlsOrder } from '../../short-urls/data';
|
import type { ShortUrlsOrder } from '../../short-urls/data';
|
||||||
|
import type { TagsOrder } from '../../tags/data/TagsListChildrenProps';
|
||||||
|
import type { DateInterval } from '../../utils/helpers/dateIntervals';
|
||||||
|
import type { Theme } from '../../utils/theme';
|
||||||
|
|
||||||
export const DEFAULT_SHORT_URLS_ORDERING: ShortUrlsOrder = {
|
export const DEFAULT_SHORT_URLS_ORDERING: ShortUrlsOrder = {
|
||||||
field: 'dateCreated',
|
field: 'dateCreated',
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import type Bottle from 'bottlejs';
|
import type Bottle from 'bottlejs';
|
||||||
|
import type { ConnectDecorator } from '../../container/types';
|
||||||
|
import { withoutSelectedServer } from '../../servers/helpers/withoutSelectedServer';
|
||||||
import { RealTimeUpdatesSettings } from '../RealTimeUpdatesSettings';
|
import { RealTimeUpdatesSettings } from '../RealTimeUpdatesSettings';
|
||||||
import { Settings } from '../Settings';
|
|
||||||
import {
|
import {
|
||||||
setRealTimeUpdatesInterval,
|
setRealTimeUpdatesInterval,
|
||||||
setShortUrlCreationSettings,
|
setShortUrlCreationSettings,
|
||||||
|
@ -10,13 +11,12 @@ import {
|
||||||
setVisitsSettings,
|
setVisitsSettings,
|
||||||
toggleRealTimeUpdates,
|
toggleRealTimeUpdates,
|
||||||
} from '../reducers/settings';
|
} from '../reducers/settings';
|
||||||
import type { ConnectDecorator } from '../../container/types';
|
import { Settings } from '../Settings';
|
||||||
import { withoutSelectedServer } from '../../servers/helpers/withoutSelectedServer';
|
|
||||||
import { ShortUrlCreationSettings } from '../ShortUrlCreationSettings';
|
import { ShortUrlCreationSettings } from '../ShortUrlCreationSettings';
|
||||||
|
import { ShortUrlsListSettings } from '../ShortUrlsListSettings';
|
||||||
|
import { TagsSettings } from '../TagsSettings';
|
||||||
import { UserInterfaceSettings } from '../UserInterfaceSettings';
|
import { UserInterfaceSettings } from '../UserInterfaceSettings';
|
||||||
import { VisitsSettings } from '../VisitsSettings';
|
import { VisitsSettings } from '../VisitsSettings';
|
||||||
import { TagsSettings } from '../TagsSettings';
|
|
||||||
import { ShortUrlsListSettings } from '../ShortUrlsListSettings';
|
|
||||||
|
|
||||||
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
||||||
// Components
|
// Components
|
||||||
|
|
|
@ -3,8 +3,8 @@ import { useMemo } from 'react';
|
||||||
import type { SelectedServer } from '../servers/data';
|
import type { SelectedServer } from '../servers/data';
|
||||||
import type { Settings, ShortUrlCreationSettings } from '../settings/reducers/settings';
|
import type { Settings, ShortUrlCreationSettings } from '../settings/reducers/settings';
|
||||||
import type { ShortUrlData } from './data';
|
import type { ShortUrlData } from './data';
|
||||||
import type { ShortUrlCreation } from './reducers/shortUrlCreation';
|
|
||||||
import type { CreateShortUrlResultProps } from './helpers/CreateShortUrlResult';
|
import type { CreateShortUrlResultProps } from './helpers/CreateShortUrlResult';
|
||||||
|
import type { ShortUrlCreation } from './reducers/shortUrlCreation';
|
||||||
import type { ShortUrlFormProps } from './ShortUrlForm';
|
import type { ShortUrlFormProps } from './ShortUrlForm';
|
||||||
|
|
||||||
export interface CreateShortUrlProps {
|
export interface CreateShortUrlProps {
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
|
import { faArrowLeft } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect, useMemo } from 'react';
|
import { useEffect, useMemo } from 'react';
|
||||||
import { Button, Card } from 'reactstrap';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faArrowLeft } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import { ExternalLink } from 'react-external-link';
|
import { ExternalLink } from 'react-external-link';
|
||||||
import { useLocation, useParams } from 'react-router-dom';
|
import { useLocation, useParams } from 'react-router-dom';
|
||||||
|
import { Button, Card } from 'reactstrap';
|
||||||
|
import { ShlinkApiError } from '../api/ShlinkApiError';
|
||||||
import type { SelectedServer } from '../servers/data';
|
import type { SelectedServer } from '../servers/data';
|
||||||
import type { Settings } from '../settings/reducers/settings';
|
import type { Settings } from '../settings/reducers/settings';
|
||||||
import type { ShortUrlIdentifier } from './data';
|
import { useGoBack } from '../utils/helpers/hooks';
|
||||||
import { parseQuery } from '../utils/helpers/query';
|
import { parseQuery } from '../utils/helpers/query';
|
||||||
import { Message } from '../utils/Message';
|
import { Message } from '../utils/Message';
|
||||||
import { Result } from '../utils/Result';
|
import { Result } from '../utils/Result';
|
||||||
import { ShlinkApiError } from '../api/ShlinkApiError';
|
import type { ShortUrlIdentifier } from './data';
|
||||||
import { useGoBack } from '../utils/helpers/hooks';
|
import { shortUrlDataFromShortUrl, urlDecodeShortCode } from './helpers';
|
||||||
import type { ShortUrlFormProps } from './ShortUrlForm';
|
|
||||||
import type { ShortUrlDetail } from './reducers/shortUrlDetail';
|
import type { ShortUrlDetail } from './reducers/shortUrlDetail';
|
||||||
import type { EditShortUrl as EditShortUrlInfo, ShortUrlEdition } from './reducers/shortUrlEdition';
|
import type { EditShortUrl as EditShortUrlInfo, ShortUrlEdition } from './reducers/shortUrlEdition';
|
||||||
import { shortUrlDataFromShortUrl, urlDecodeShortCode } from './helpers';
|
import type { ShortUrlFormProps } from './ShortUrlForm';
|
||||||
|
|
||||||
interface EditShortUrlConnectProps {
|
interface EditShortUrlConnectProps {
|
||||||
settings: Settings;
|
settings: Settings;
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { Pagination, PaginationItem, PaginationLink } from 'reactstrap';
|
import { Pagination, PaginationItem, PaginationLink } from 'reactstrap';
|
||||||
|
import type { ShlinkPaginator } from '../api/types';
|
||||||
import type {
|
import type {
|
||||||
NumberOrEllipsis } from '../utils/helpers/pagination';
|
NumberOrEllipsis } from '../utils/helpers/pagination';
|
||||||
import {
|
import {
|
||||||
pageIsEllipsis,
|
|
||||||
keyForPage,
|
keyForPage,
|
||||||
progressivePagination,
|
pageIsEllipsis,
|
||||||
prettifyPageNumber,
|
prettifyPageNumber,
|
||||||
|
progressivePagination,
|
||||||
} from '../utils/helpers/pagination';
|
} from '../utils/helpers/pagination';
|
||||||
import type { ShlinkPaginator } from '../api/types';
|
|
||||||
|
|
||||||
interface PaginatorProps {
|
interface PaginatorProps {
|
||||||
paginator?: ShlinkPaginator;
|
paginator?: ShlinkPaginator;
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
|
import { parseISO } from 'date-fns';
|
||||||
|
import { cond, isEmpty, pipe, replace, T, trim } from 'ramda';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import type { InputType } from 'reactstrap/types/lib/Input';
|
|
||||||
import { Button, FormGroup, Input, Row } from 'reactstrap';
|
import { Button, FormGroup, Input, Row } from 'reactstrap';
|
||||||
import { cond, isEmpty, pipe, replace, trim, T } from 'ramda';
|
import type { InputType } from 'reactstrap/types/lib/Input';
|
||||||
import { parseISO } from 'date-fns';
|
import type { DomainSelectorProps } from '../domains/DomainSelector';
|
||||||
|
import type { SelectedServer } from '../servers/data';
|
||||||
|
import type { TagsSelectorProps } from '../tags/helpers/TagsSelector';
|
||||||
|
import { Checkbox } from '../utils/Checkbox';
|
||||||
import type { DateTimeInputProps } from '../utils/dates/DateTimeInput';
|
import type { DateTimeInputProps } from '../utils/dates/DateTimeInput';
|
||||||
import { DateTimeInput } from '../utils/dates/DateTimeInput';
|
import { DateTimeInput } from '../utils/dates/DateTimeInput';
|
||||||
|
import { formatIsoDate } from '../utils/helpers/date';
|
||||||
import { supportsForwardQuery } from '../utils/helpers/features';
|
import { supportsForwardQuery } from '../utils/helpers/features';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
import type { OptionalString } from '../utils/utils';
|
import type { OptionalString } from '../utils/utils';
|
||||||
import { handleEventPreventingDefault, hasValue } from '../utils/utils';
|
import { handleEventPreventingDefault, hasValue } from '../utils/utils';
|
||||||
import { Checkbox } from '../utils/Checkbox';
|
|
||||||
import type { SelectedServer } from '../servers/data';
|
|
||||||
import type { TagsSelectorProps } from '../tags/helpers/TagsSelector';
|
|
||||||
import type { DomainSelectorProps } from '../domains/DomainSelector';
|
|
||||||
import { formatIsoDate } from '../utils/helpers/date';
|
|
||||||
import { UseExistingIfFoundInfoIcon } from './UseExistingIfFoundInfoIcon';
|
|
||||||
import type { ShortUrlData } from './data';
|
import type { ShortUrlData } from './data';
|
||||||
import { ShortUrlFormCheckboxGroup } from './helpers/ShortUrlFormCheckboxGroup';
|
import { ShortUrlFormCheckboxGroup } from './helpers/ShortUrlFormCheckboxGroup';
|
||||||
|
import { UseExistingIfFoundInfoIcon } from './UseExistingIfFoundInfoIcon';
|
||||||
import './ShortUrlForm.scss';
|
import './ShortUrlForm.scss';
|
||||||
|
|
||||||
export type Mode = 'create' | 'create-basic' | 'edit';
|
export type Mode = 'create' | 'create-basic' | 'edit';
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
import type { FC } from 'react';
|
|
||||||
import { isEmpty, pipe } from 'ramda';
|
|
||||||
import { Button, InputGroup, Row, UncontrolledTooltip } from 'reactstrap';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faTag, faTags } from '@fortawesome/free-solid-svg-icons';
|
import { faTag, faTags } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { SearchField } from '../utils/SearchField';
|
import { isEmpty, pipe } from 'ramda';
|
||||||
|
import type { FC } from 'react';
|
||||||
|
import { Button, InputGroup, Row, UncontrolledTooltip } from 'reactstrap';
|
||||||
|
import type { SelectedServer } from '../servers/data';
|
||||||
|
import type { Settings } from '../settings/reducers/settings';
|
||||||
|
import type { TagsSelectorProps } from '../tags/helpers/TagsSelector';
|
||||||
import { DateRangeSelector } from '../utils/dates/DateRangeSelector';
|
import { DateRangeSelector } from '../utils/dates/DateRangeSelector';
|
||||||
import { formatIsoDate } from '../utils/helpers/date';
|
import { formatIsoDate } from '../utils/helpers/date';
|
||||||
import type { DateRange } from '../utils/helpers/dateIntervals';
|
import type { DateRange } from '../utils/helpers/dateIntervals';
|
||||||
import { datesToDateRange } from '../utils/helpers/dateIntervals';
|
import { datesToDateRange } from '../utils/helpers/dateIntervals';
|
||||||
import { supportsAllTagsFiltering, supportsFilterDisabledUrls } from '../utils/helpers/features';
|
import { supportsAllTagsFiltering, supportsFilterDisabledUrls } from '../utils/helpers/features';
|
||||||
import type { SelectedServer } from '../servers/data';
|
|
||||||
import type { OrderDir } from '../utils/helpers/ordering';
|
import type { OrderDir } from '../utils/helpers/ordering';
|
||||||
import { OrderingDropdown } from '../utils/OrderingDropdown';
|
import { OrderingDropdown } from '../utils/OrderingDropdown';
|
||||||
import { useShortUrlsQuery } from './helpers/hooks';
|
import { SearchField } from '../utils/SearchField';
|
||||||
import type { ShortUrlsOrder, ShortUrlsOrderableFields } from './data';
|
import type { ShortUrlsOrder, ShortUrlsOrderableFields } from './data';
|
||||||
import { SHORT_URLS_ORDERABLE_FIELDS } from './data';
|
import { SHORT_URLS_ORDERABLE_FIELDS } from './data';
|
||||||
import type { ExportShortUrlsBtnProps } from './helpers/ExportShortUrlsBtn';
|
import type { ExportShortUrlsBtnProps } from './helpers/ExportShortUrlsBtn';
|
||||||
import type { TagsSelectorProps } from '../tags/helpers/TagsSelector';
|
import { useShortUrlsQuery } from './helpers/hooks';
|
||||||
import { ShortUrlsFilterDropdown } from './helpers/ShortUrlsFilterDropdown';
|
import { ShortUrlsFilterDropdown } from './helpers/ShortUrlsFilterDropdown';
|
||||||
import type { Settings } from '../settings/reducers/settings';
|
|
||||||
import './ShortUrlsFilteringBar.scss';
|
import './ShortUrlsFilteringBar.scss';
|
||||||
|
|
||||||
interface ShortUrlsFilteringProps {
|
interface ShortUrlsFilteringProps {
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
import { pipe } from 'ramda';
|
import { pipe } from 'ramda';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { Card } from 'reactstrap';
|
|
||||||
import { useLocation, useParams } from 'react-router-dom';
|
import { useLocation, useParams } from 'react-router-dom';
|
||||||
import type { OrderDir } from '../utils/helpers/ordering';
|
import { Card } from 'reactstrap';
|
||||||
import { determineOrderDir } from '../utils/helpers/ordering';
|
import type { ShlinkShortUrlsListParams, ShlinkShortUrlsOrder } from '../api/types';
|
||||||
import type { SelectedServer } from '../servers/data';
|
|
||||||
import { getServerId } from '../servers/data';
|
|
||||||
import { boundToMercureHub } from '../mercure/helpers/boundToMercureHub';
|
import { boundToMercureHub } from '../mercure/helpers/boundToMercureHub';
|
||||||
import { Topics } from '../mercure/helpers/Topics';
|
import { Topics } from '../mercure/helpers/Topics';
|
||||||
import { TableOrderIcon } from '../utils/table/TableOrderIcon';
|
import type { SelectedServer } from '../servers/data';
|
||||||
import type { ShlinkShortUrlsListParams, ShlinkShortUrlsOrder } from '../api/types';
|
import { getServerId } from '../servers/data';
|
||||||
import type { Settings } from '../settings/reducers/settings';
|
import type { Settings } from '../settings/reducers/settings';
|
||||||
import { DEFAULT_SHORT_URLS_ORDERING } from '../settings/reducers/settings';
|
import { DEFAULT_SHORT_URLS_ORDERING } from '../settings/reducers/settings';
|
||||||
import type { ShortUrlsList as ShortUrlsListState } from './reducers/shortUrlsList';
|
|
||||||
import type { ShortUrlsTableType } from './ShortUrlsTable';
|
|
||||||
import { Paginator } from './Paginator';
|
|
||||||
import { useShortUrlsQuery } from './helpers/hooks';
|
|
||||||
import type { ShortUrlsOrder, ShortUrlsOrderableFields } from './data';
|
|
||||||
import type { ShortUrlsFilteringBarType } from './ShortUrlsFilteringBar';
|
|
||||||
import { supportsExcludeBotsOnShortUrls } from '../utils/helpers/features';
|
import { supportsExcludeBotsOnShortUrls } from '../utils/helpers/features';
|
||||||
|
import type { OrderDir } from '../utils/helpers/ordering';
|
||||||
|
import { determineOrderDir } from '../utils/helpers/ordering';
|
||||||
|
import { TableOrderIcon } from '../utils/table/TableOrderIcon';
|
||||||
|
import type { ShortUrlsOrder, ShortUrlsOrderableFields } from './data';
|
||||||
|
import { useShortUrlsQuery } from './helpers/hooks';
|
||||||
|
import { Paginator } from './Paginator';
|
||||||
|
import type { ShortUrlsList as ShortUrlsListState } from './reducers/shortUrlsList';
|
||||||
|
import type { ShortUrlsFilteringBarType } from './ShortUrlsFilteringBar';
|
||||||
|
import type { ShortUrlsTableType } from './ShortUrlsTable';
|
||||||
|
|
||||||
interface ShortUrlsListProps {
|
interface ShortUrlsListProps {
|
||||||
selectedServer: SelectedServer;
|
selectedServer: SelectedServer;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { ReactNode } from 'react';
|
|
||||||
import { isEmpty } from 'ramda';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
import { isEmpty } from 'ramda';
|
||||||
|
import type { ReactNode } from 'react';
|
||||||
import type { SelectedServer } from '../servers/data';
|
import type { SelectedServer } from '../servers/data';
|
||||||
import type { ShortUrlsList as ShortUrlsListState } from './reducers/shortUrlsList';
|
|
||||||
import type { ShortUrlsRowType } from './helpers/ShortUrlsRow';
|
|
||||||
import type { ShortUrlsOrderableFields } from './data';
|
import type { ShortUrlsOrderableFields } from './data';
|
||||||
|
import type { ShortUrlsRowType } from './helpers/ShortUrlsRow';
|
||||||
|
import type { ShortUrlsList as ShortUrlsListState } from './reducers/shortUrlsList';
|
||||||
import './ShortUrlsTable.scss';
|
import './ShortUrlsTable.scss';
|
||||||
|
|
||||||
interface ShortUrlsTableProps {
|
interface ShortUrlsTableProps {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faInfoCircle as infoIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faInfoCircle as infoIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import { Modal, ModalBody, ModalHeader } from 'reactstrap';
|
import { Modal, ModalBody, ModalHeader } from 'reactstrap';
|
||||||
import { useToggle } from '../utils/helpers/hooks';
|
import { useToggle } from '../utils/helpers/hooks';
|
||||||
import './UseExistingIfFoundInfoIcon.scss';
|
import './UseExistingIfFoundInfoIcon.scss';
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { Nullable, OptionalString } from '../../utils/utils';
|
|
||||||
import type { Order } from '../../utils/helpers/ordering';
|
import type { Order } from '../../utils/helpers/ordering';
|
||||||
|
import type { Nullable, OptionalString } from '../../utils/utils';
|
||||||
|
|
||||||
export interface EditShortUrlData {
|
export interface EditShortUrlData {
|
||||||
longUrl?: string;
|
longUrl?: string;
|
||||||
|
|
|
@ -4,11 +4,11 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import CopyToClipboard from 'react-copy-to-clipboard';
|
import CopyToClipboard from 'react-copy-to-clipboard';
|
||||||
import { Tooltip } from 'reactstrap';
|
import { Tooltip } from 'reactstrap';
|
||||||
import type { ShortUrlCreation } from '../reducers/shortUrlCreation';
|
import { ShlinkApiError } from '../../api/ShlinkApiError';
|
||||||
import type { TimeoutToggle } from '../../utils/helpers/hooks';
|
import type { TimeoutToggle } from '../../utils/helpers/hooks';
|
||||||
import { Result } from '../../utils/Result';
|
import { Result } from '../../utils/Result';
|
||||||
|
import type { ShortUrlCreation } from '../reducers/shortUrlCreation';
|
||||||
import './CreateShortUrlResult.scss';
|
import './CreateShortUrlResult.scss';
|
||||||
import { ShlinkApiError } from '../../api/ShlinkApiError';
|
|
||||||
|
|
||||||
export interface CreateShortUrlResultProps {
|
export interface CreateShortUrlResultProps {
|
||||||
creation: ShortUrlCreation;
|
creation: ShortUrlCreation;
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
|
import { pipe } from 'ramda';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
|
import { Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
|
||||||
import { pipe } from 'ramda';
|
|
||||||
import type { ShortUrlDeletion } from '../reducers/shortUrlDeletion';
|
|
||||||
import type { ShortUrlIdentifier, ShortUrlModalProps } from '../data';
|
|
||||||
import { handleEventPreventingDefault } from '../../utils/utils';
|
|
||||||
import { Result } from '../../utils/Result';
|
|
||||||
import { isInvalidDeletionError } from '../../api/utils';
|
|
||||||
import { ShlinkApiError } from '../../api/ShlinkApiError';
|
import { ShlinkApiError } from '../../api/ShlinkApiError';
|
||||||
|
import { isInvalidDeletionError } from '../../api/utils';
|
||||||
|
import { Result } from '../../utils/Result';
|
||||||
|
import { handleEventPreventingDefault } from '../../utils/utils';
|
||||||
|
import type { ShortUrlIdentifier, ShortUrlModalProps } from '../data';
|
||||||
|
import type { ShortUrlDeletion } from '../reducers/shortUrlDeletion';
|
||||||
|
|
||||||
interface DeleteShortUrlModalConnectProps extends ShortUrlModalProps {
|
interface DeleteShortUrlModalConnectProps extends ShortUrlModalProps {
|
||||||
shortUrlDeletion: ShortUrlDeletion;
|
shortUrlDeletion: ShortUrlDeletion;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { ExportBtn } from '../../utils/ExportBtn';
|
|
||||||
import { useToggle } from '../../utils/helpers/hooks';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
|
import type { ReportExporter } from '../../common/services/ReportExporter';
|
||||||
import type { SelectedServer } from '../../servers/data';
|
import type { SelectedServer } from '../../servers/data';
|
||||||
import { isServerWithId } from '../../servers/data';
|
import { isServerWithId } from '../../servers/data';
|
||||||
|
import { ExportBtn } from '../../utils/ExportBtn';
|
||||||
|
import { useToggle } from '../../utils/helpers/hooks';
|
||||||
import type { ShortUrl } from '../data';
|
import type { ShortUrl } from '../data';
|
||||||
import type { ReportExporter } from '../../common/services/ReportExporter';
|
|
||||||
import { useShortUrlsQuery } from './hooks';
|
import { useShortUrlsQuery } from './hooks';
|
||||||
|
|
||||||
export interface ExportShortUrlsBtnProps {
|
export interface ExportShortUrlsBtnProps {
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
import { useMemo, useState } from 'react';
|
|
||||||
import { Modal, FormGroup, ModalBody, ModalHeader, Row, Button } from 'reactstrap';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faFileDownload as downloadIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faFileDownload as downloadIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import { useMemo, useState } from 'react';
|
||||||
import { ExternalLink } from 'react-external-link';
|
import { ExternalLink } from 'react-external-link';
|
||||||
import type { ShortUrlModalProps } from '../data';
|
import { Button, FormGroup, Modal, ModalBody, ModalHeader, Row } from 'reactstrap';
|
||||||
|
import type { ImageDownloader } from '../../common/services/ImageDownloader';
|
||||||
import type { SelectedServer } from '../../servers/data';
|
import type { SelectedServer } from '../../servers/data';
|
||||||
import { CopyToClipboardIcon } from '../../utils/CopyToClipboardIcon';
|
import { CopyToClipboardIcon } from '../../utils/CopyToClipboardIcon';
|
||||||
|
import { supportsNonRestCors } from '../../utils/helpers/features';
|
||||||
import type { QrCodeFormat, QrErrorCorrection } from '../../utils/helpers/qrCodes';
|
import type { QrCodeFormat, QrErrorCorrection } from '../../utils/helpers/qrCodes';
|
||||||
import { buildQrCodeUrl } from '../../utils/helpers/qrCodes';
|
import { buildQrCodeUrl } from '../../utils/helpers/qrCodes';
|
||||||
import { supportsNonRestCors } from '../../utils/helpers/features';
|
import type { ShortUrlModalProps } from '../data';
|
||||||
import type { ImageDownloader } from '../../common/services/ImageDownloader';
|
|
||||||
import { QrFormatDropdown } from './qr-codes/QrFormatDropdown';
|
|
||||||
import { QrErrorCorrectionDropdown } from './qr-codes/QrErrorCorrectionDropdown';
|
import { QrErrorCorrectionDropdown } from './qr-codes/QrErrorCorrectionDropdown';
|
||||||
|
import { QrFormatDropdown } from './qr-codes/QrFormatDropdown';
|
||||||
import './QrCodeModal.scss';
|
import './QrCodeModal.scss';
|
||||||
|
|
||||||
interface QrCodeModalConnectProps extends ShortUrlModalProps {
|
interface QrCodeModalConnectProps extends ShortUrlModalProps {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import type { FC, ReactNode } from 'react';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import type { IconDefinition } from '@fortawesome/fontawesome-common-types';
|
import type { IconDefinition } from '@fortawesome/fontawesome-common-types';
|
||||||
import { faLinkSlash, faCalendarXmark, faCheck } from '@fortawesome/free-solid-svg-icons';
|
import { faCalendarXmark, faCheck, faLinkSlash } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { UncontrolledTooltip } from 'reactstrap';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import { isBefore } from 'date-fns';
|
import { isBefore } from 'date-fns';
|
||||||
import type { ShortUrl } from '../data';
|
import type { FC, ReactNode } from 'react';
|
||||||
|
import { UncontrolledTooltip } from 'reactstrap';
|
||||||
import { formatHumanFriendly, now, parseISO } from '../../utils/helpers/date';
|
import { formatHumanFriendly, now, parseISO } from '../../utils/helpers/date';
|
||||||
import { useElementRef } from '../../utils/helpers/hooks';
|
import { useElementRef } from '../../utils/helpers/hooks';
|
||||||
|
import type { ShortUrl } from '../data';
|
||||||
|
|
||||||
interface ShortUrlStatusProps {
|
interface ShortUrlStatusProps {
|
||||||
shortUrl: ShortUrl;
|
shortUrl: ShortUrl;
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faInfoCircle as infoIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faInfoCircle as infoIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { UncontrolledTooltip } from 'reactstrap';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { prettify } from '../../utils/helpers/numbers';
|
import { UncontrolledTooltip } from 'reactstrap';
|
||||||
import type { ShortUrl } from '../data';
|
|
||||||
import type { SelectedServer } from '../../servers/data';
|
import type { SelectedServer } from '../../servers/data';
|
||||||
import { ShortUrlDetailLink } from './ShortUrlDetailLink';
|
|
||||||
import { formatHumanFriendly, parseISO } from '../../utils/helpers/date';
|
import { formatHumanFriendly, parseISO } from '../../utils/helpers/date';
|
||||||
import { useElementRef } from '../../utils/helpers/hooks';
|
import { useElementRef } from '../../utils/helpers/hooks';
|
||||||
|
import { prettify } from '../../utils/helpers/numbers';
|
||||||
|
import type { ShortUrl } from '../data';
|
||||||
|
import { ShortUrlDetailLink } from './ShortUrlDetailLink';
|
||||||
import './ShortUrlVisitsCount.scss';
|
import './ShortUrlVisitsCount.scss';
|
||||||
|
|
||||||
interface ShortUrlVisitsCountProps {
|
interface ShortUrlVisitsCountProps {
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect, useRef } from 'react';
|
import { useEffect, useRef } from 'react';
|
||||||
import { ExternalLink } from 'react-external-link';
|
import { ExternalLink } from 'react-external-link';
|
||||||
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
|
||||||
import type { TimeoutToggle } from '../../utils/helpers/hooks';
|
|
||||||
import type { SelectedServer } from '../../servers/data';
|
import type { SelectedServer } from '../../servers/data';
|
||||||
import { CopyToClipboardIcon } from '../../utils/CopyToClipboardIcon';
|
|
||||||
import type { ShortUrl } from '../data';
|
|
||||||
import { Time } from '../../utils/dates/Time';
|
|
||||||
import type { Settings } from '../../settings/reducers/settings';
|
import type { Settings } from '../../settings/reducers/settings';
|
||||||
import { ShortUrlVisitsCount } from './ShortUrlVisitsCount';
|
import { CopyToClipboardIcon } from '../../utils/CopyToClipboardIcon';
|
||||||
import type { ShortUrlsRowMenuType } from './ShortUrlsRowMenu';
|
import { Time } from '../../utils/dates/Time';
|
||||||
import { Tags } from './Tags';
|
import type { TimeoutToggle } from '../../utils/helpers/hooks';
|
||||||
import { ShortUrlStatus } from './ShortUrlStatus';
|
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
||||||
|
import type { ShortUrl } from '../data';
|
||||||
import { useShortUrlsQuery } from './hooks';
|
import { useShortUrlsQuery } from './hooks';
|
||||||
|
import type { ShortUrlsRowMenuType } from './ShortUrlsRowMenu';
|
||||||
|
import { ShortUrlStatus } from './ShortUrlStatus';
|
||||||
|
import { ShortUrlVisitsCount } from './ShortUrlVisitsCount';
|
||||||
|
import { Tags } from './Tags';
|
||||||
import './ShortUrlsRow.scss';
|
import './ShortUrlsRow.scss';
|
||||||
|
|
||||||
interface ShortUrlsRowProps {
|
interface ShortUrlsRowProps {
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import {
|
import {
|
||||||
faChartPie as pieChartIcon,
|
faChartPie as pieChartIcon,
|
||||||
faQrcode as qrIcon,
|
|
||||||
faMinusCircle as deleteIcon,
|
|
||||||
faEdit as editIcon,
|
faEdit as editIcon,
|
||||||
|
faMinusCircle as deleteIcon,
|
||||||
|
faQrcode as qrIcon,
|
||||||
} from '@fortawesome/free-solid-svg-icons';
|
} from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { DropdownItem } from 'reactstrap';
|
import { DropdownItem } from 'reactstrap';
|
||||||
import { useToggle } from '../../utils/helpers/hooks';
|
|
||||||
import type { ShortUrl, ShortUrlModalProps } from '../data';
|
|
||||||
import type { SelectedServer } from '../../servers/data';
|
import type { SelectedServer } from '../../servers/data';
|
||||||
import { DropdownBtnMenu } from '../../utils/DropdownBtnMenu';
|
import { DropdownBtnMenu } from '../../utils/DropdownBtnMenu';
|
||||||
|
import { useToggle } from '../../utils/helpers/hooks';
|
||||||
|
import type { ShortUrl, ShortUrlModalProps } from '../data';
|
||||||
import { ShortUrlDetailLink } from './ShortUrlDetailLink';
|
import { ShortUrlDetailLink } from './ShortUrlDetailLink';
|
||||||
|
|
||||||
interface ShortUrlsRowMenuProps {
|
interface ShortUrlsRowMenuProps {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { FC } from 'react';
|
|
||||||
import { isEmpty } from 'ramda';
|
import { isEmpty } from 'ramda';
|
||||||
|
import type { FC } from 'react';
|
||||||
import { Tag } from '../../tags/helpers/Tag';
|
import { Tag } from '../../tags/helpers/Tag';
|
||||||
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { useParams, useLocation, useNavigate } from 'react-router-dom';
|
|
||||||
import { useMemo } from 'react';
|
|
||||||
import { isEmpty, pipe } from 'ramda';
|
import { isEmpty, pipe } from 'ramda';
|
||||||
import { parseQuery, stringifyQuery } from '../../utils/helpers/query';
|
import { useMemo } from 'react';
|
||||||
import type { ShortUrlsOrder, ShortUrlsOrderableFields } from '../data';
|
import { useLocation, useNavigate, useParams } from 'react-router-dom';
|
||||||
import { orderToString, stringToOrder } from '../../utils/helpers/ordering';
|
|
||||||
import type { TagsFilteringMode } from '../../api/types';
|
import type { TagsFilteringMode } from '../../api/types';
|
||||||
|
import { orderToString, stringToOrder } from '../../utils/helpers/ordering';
|
||||||
|
import { parseQuery, stringifyQuery } from '../../utils/helpers/query';
|
||||||
import type { BooleanString } from '../../utils/utils';
|
import type { BooleanString } from '../../utils/utils';
|
||||||
import { parseOptionalBooleanToString } from '../../utils/utils';
|
import { parseOptionalBooleanToString } from '../../utils/utils';
|
||||||
|
import type { ShortUrlsOrder, ShortUrlsOrderableFields } from '../data';
|
||||||
|
|
||||||
interface ShortUrlsQueryCommon {
|
interface ShortUrlsQueryCommon {
|
||||||
search?: string;
|
search?: string;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { isNil } from 'ramda';
|
import { isNil } from 'ramda';
|
||||||
import type { ShortUrl, ShortUrlData } from '../data';
|
import type { ShortUrlCreationSettings } from '../../settings/reducers/settings';
|
||||||
import type { OptionalString } from '../../utils/utils';
|
import type { OptionalString } from '../../utils/utils';
|
||||||
import { DEFAULT_DOMAIN } from '../../visits/reducers/domainVisits';
|
import { DEFAULT_DOMAIN } from '../../visits/reducers/domainVisits';
|
||||||
import type { ShortUrlCreationSettings } from '../../settings/reducers/settings';
|
import type { ShortUrl, ShortUrlData } from '../data';
|
||||||
|
|
||||||
export const shortUrlMatches = (shortUrl: ShortUrl, shortCode: string, domain: OptionalString): boolean => {
|
export const shortUrlMatches = (shortUrl: ShortUrl, shortCode: string, domain: OptionalString): boolean => {
|
||||||
if (isNil(domain)) {
|
if (isNil(domain)) {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { PayloadAction } from '@reduxjs/toolkit';
|
import type { PayloadAction } from '@reduxjs/toolkit';
|
||||||
import { createSlice } from '@reduxjs/toolkit';
|
import { createSlice } from '@reduxjs/toolkit';
|
||||||
import type { ShortUrl, ShortUrlData } from '../data';
|
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
import { parseApiError } from '../../api/utils';
|
|
||||||
import type { ProblemDetailsError } from '../../api/types/errors';
|
import type { ProblemDetailsError } from '../../api/types/errors';
|
||||||
|
import { parseApiError } from '../../api/utils';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
|
import type { ShortUrl, ShortUrlData } from '../data';
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/shortUrlCreation';
|
const REDUCER_PREFIX = 'shlink/shortUrlCreation';
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { createAction, createSlice } from '@reduxjs/toolkit';
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
import { parseApiError } from '../../api/utils';
|
|
||||||
import type { ProblemDetailsError } from '../../api/types/errors';
|
import type { ProblemDetailsError } from '../../api/types/errors';
|
||||||
|
import { parseApiError } from '../../api/utils';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
import type { ShortUrl, ShortUrlIdentifier } from '../data';
|
import type { ShortUrl, ShortUrlIdentifier } from '../data';
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/shortUrlDeletion';
|
const REDUCER_PREFIX = 'shlink/shortUrlDeletion';
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import type { PayloadAction } from '@reduxjs/toolkit';
|
import type { PayloadAction } from '@reduxjs/toolkit';
|
||||||
import { createSlice } from '@reduxjs/toolkit';
|
import { createSlice } from '@reduxjs/toolkit';
|
||||||
import type { ShortUrl, ShortUrlIdentifier } from '../data';
|
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
import { shortUrlMatches } from '../helpers';
|
|
||||||
import { parseApiError } from '../../api/utils';
|
|
||||||
import type { ProblemDetailsError } from '../../api/types/errors';
|
import type { ProblemDetailsError } from '../../api/types/errors';
|
||||||
|
import { parseApiError } from '../../api/utils';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
|
import type { ShortUrl, ShortUrlIdentifier } from '../data';
|
||||||
|
import { shortUrlMatches } from '../helpers';
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/shortUrlDetail';
|
const REDUCER_PREFIX = 'shlink/shortUrlDetail';
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import type { PayloadAction } from '@reduxjs/toolkit';
|
import type { PayloadAction } from '@reduxjs/toolkit';
|
||||||
import { createSlice } from '@reduxjs/toolkit';
|
import { createSlice } from '@reduxjs/toolkit';
|
||||||
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
|
import type { ProblemDetailsError } from '../../api/types/errors';
|
||||||
|
import { parseApiError } from '../../api/utils';
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
import type { EditShortUrlData, ShortUrl, ShortUrlIdentifier } from '../data';
|
import type { EditShortUrlData, ShortUrl, ShortUrlIdentifier } from '../data';
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
|
||||||
import { parseApiError } from '../../api/utils';
|
|
||||||
import type { ProblemDetailsError } from '../../api/types/errors';
|
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/shortUrlEdition';
|
const REDUCER_PREFIX = 'shlink/shortUrlEdition';
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import { createSlice } from '@reduxjs/toolkit';
|
import { createSlice } from '@reduxjs/toolkit';
|
||||||
import { assocPath, last, pipe, reject } from 'ramda';
|
import { assocPath, last, pipe, reject } from 'ramda';
|
||||||
import { shortUrlMatches } from '../helpers';
|
|
||||||
import { createNewVisits } from '../../visits/reducers/visitCreation';
|
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
import type { ShlinkShortUrlsListParams, ShlinkShortUrlsResponse } from '../../api/types';
|
import type { ShlinkShortUrlsListParams, ShlinkShortUrlsResponse } from '../../api/types';
|
||||||
import { shortUrlDeleted } from './shortUrlDeletion';
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
import type { createShortUrl } from './shortUrlCreation';
|
import { createNewVisits } from '../../visits/reducers/visitCreation';
|
||||||
import type { editShortUrl } from './shortUrlEdition';
|
|
||||||
import type { ShortUrl } from '../data';
|
import type { ShortUrl } from '../data';
|
||||||
|
import { shortUrlMatches } from '../helpers';
|
||||||
|
import type { createShortUrl } from './shortUrlCreation';
|
||||||
|
import { shortUrlDeleted } from './shortUrlDeletion';
|
||||||
|
import type { editShortUrl } from './shortUrlEdition';
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/shortUrlsList';
|
const REDUCER_PREFIX = 'shlink/shortUrlsList';
|
||||||
export const ITEMS_IN_OVERVIEW_PAGE = 5;
|
export const ITEMS_IN_OVERVIEW_PAGE = 5;
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
import type Bottle from 'bottlejs';
|
import type Bottle from 'bottlejs';
|
||||||
import { prop } from 'ramda';
|
import { prop } from 'ramda';
|
||||||
import { ShortUrlsFilteringBar } from '../ShortUrlsFilteringBar';
|
import type { ConnectDecorator } from '../../container/types';
|
||||||
import { ShortUrlsList } from '../ShortUrlsList';
|
import { CreateShortUrl } from '../CreateShortUrl';
|
||||||
|
import { EditShortUrl } from '../EditShortUrl';
|
||||||
|
import { CreateShortUrlResult } from '../helpers/CreateShortUrlResult';
|
||||||
|
import { DeleteShortUrlModal } from '../helpers/DeleteShortUrlModal';
|
||||||
|
import { ExportShortUrlsBtn } from '../helpers/ExportShortUrlsBtn';
|
||||||
|
import { QrCodeModal } from '../helpers/QrCodeModal';
|
||||||
import { ShortUrlsRow } from '../helpers/ShortUrlsRow';
|
import { ShortUrlsRow } from '../helpers/ShortUrlsRow';
|
||||||
import { ShortUrlsRowMenu } from '../helpers/ShortUrlsRowMenu';
|
import { ShortUrlsRowMenu } from '../helpers/ShortUrlsRowMenu';
|
||||||
import { CreateShortUrl } from '../CreateShortUrl';
|
import { createShortUrl, shortUrlCreationReducerCreator } from '../reducers/shortUrlCreation';
|
||||||
import { DeleteShortUrlModal } from '../helpers/DeleteShortUrlModal';
|
import { deleteShortUrl, shortUrlDeleted, shortUrlDeletionReducerCreator } from '../reducers/shortUrlDeletion';
|
||||||
import { CreateShortUrlResult } from '../helpers/CreateShortUrlResult';
|
|
||||||
import { listShortUrls, shortUrlsListReducerCreator } from '../reducers/shortUrlsList';
|
|
||||||
import { shortUrlCreationReducerCreator, createShortUrl } from '../reducers/shortUrlCreation';
|
|
||||||
import { shortUrlDeletionReducerCreator, deleteShortUrl, shortUrlDeleted } from '../reducers/shortUrlDeletion';
|
|
||||||
import { editShortUrl, shortUrlEditionReducerCreator } from '../reducers/shortUrlEdition';
|
|
||||||
import { shortUrlDetailReducerCreator } from '../reducers/shortUrlDetail';
|
import { shortUrlDetailReducerCreator } from '../reducers/shortUrlDetail';
|
||||||
import type { ConnectDecorator } from '../../container/types';
|
import { editShortUrl, shortUrlEditionReducerCreator } from '../reducers/shortUrlEdition';
|
||||||
import { ShortUrlsTable } from '../ShortUrlsTable';
|
import { listShortUrls, shortUrlsListReducerCreator } from '../reducers/shortUrlsList';
|
||||||
import { ShortUrlForm } from '../ShortUrlForm';
|
import { ShortUrlForm } from '../ShortUrlForm';
|
||||||
import { EditShortUrl } from '../EditShortUrl';
|
import { ShortUrlsFilteringBar } from '../ShortUrlsFilteringBar';
|
||||||
import { QrCodeModal } from '../helpers/QrCodeModal';
|
import { ShortUrlsList } from '../ShortUrlsList';
|
||||||
import { ExportShortUrlsBtn } from '../helpers/ExportShortUrlsBtn';
|
import { ShortUrlsTable } from '../ShortUrlsTable';
|
||||||
|
|
||||||
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
||||||
// Components
|
// Components
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
|
import { pipe } from 'ramda';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { Row } from 'reactstrap';
|
import { Row } from 'reactstrap';
|
||||||
import { pipe } from 'ramda';
|
|
||||||
import { Message } from '../utils/Message';
|
|
||||||
import { SearchField } from '../utils/SearchField';
|
|
||||||
import type { SelectedServer } from '../servers/data';
|
|
||||||
import { boundToMercureHub } from '../mercure/helpers/boundToMercureHub';
|
|
||||||
import { Result } from '../utils/Result';
|
|
||||||
import { ShlinkApiError } from '../api/ShlinkApiError';
|
import { ShlinkApiError } from '../api/ShlinkApiError';
|
||||||
|
import { boundToMercureHub } from '../mercure/helpers/boundToMercureHub';
|
||||||
import { Topics } from '../mercure/helpers/Topics';
|
import { Topics } from '../mercure/helpers/Topics';
|
||||||
|
import type { SelectedServer } from '../servers/data';
|
||||||
import type { Settings } from '../settings/reducers/settings';
|
import type { Settings } from '../settings/reducers/settings';
|
||||||
import { determineOrderDir, sortList } from '../utils/helpers/ordering';
|
import { determineOrderDir, sortList } from '../utils/helpers/ordering';
|
||||||
|
import { Message } from '../utils/Message';
|
||||||
import { OrderingDropdown } from '../utils/OrderingDropdown';
|
import { OrderingDropdown } from '../utils/OrderingDropdown';
|
||||||
import type { TagsList as TagsListState } from './reducers/tagsList';
|
import { Result } from '../utils/Result';
|
||||||
import type { TagsOrderableFields, TagsOrder } from './data/TagsListChildrenProps';
|
import { SearchField } from '../utils/SearchField';
|
||||||
import { TAGS_ORDERABLE_FIELDS } from './data/TagsListChildrenProps';
|
|
||||||
import type { NormalizedTag } from './data';
|
import type { NormalizedTag } from './data';
|
||||||
|
import type { TagsOrder, TagsOrderableFields } from './data/TagsListChildrenProps';
|
||||||
|
import { TAGS_ORDERABLE_FIELDS } from './data/TagsListChildrenProps';
|
||||||
|
import type { TagsList as TagsListState } from './reducers/tagsList';
|
||||||
import type { TagsTableProps } from './TagsTable';
|
import type { TagsTableProps } from './TagsTable';
|
||||||
|
|
||||||
export interface TagsListProps {
|
export interface TagsListProps {
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
|
import { splitEvery } from 'ramda';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect, useRef } from 'react';
|
import { useEffect, useRef } from 'react';
|
||||||
import { splitEvery } from 'ramda';
|
|
||||||
import { useLocation } from 'react-router-dom';
|
import { useLocation } from 'react-router-dom';
|
||||||
import { SimpleCard } from '../utils/SimpleCard';
|
|
||||||
import { SimplePaginator } from '../common/SimplePaginator';
|
import { SimplePaginator } from '../common/SimplePaginator';
|
||||||
import { useQueryState } from '../utils/helpers/hooks';
|
import { useQueryState } from '../utils/helpers/hooks';
|
||||||
import { parseQuery } from '../utils/helpers/query';
|
import { parseQuery } from '../utils/helpers/query';
|
||||||
|
import { SimpleCard } from '../utils/SimpleCard';
|
||||||
import { TableOrderIcon } from '../utils/table/TableOrderIcon';
|
import { TableOrderIcon } from '../utils/table/TableOrderIcon';
|
||||||
import type { TagsOrderableFields, TagsListChildrenProps, TagsOrder } from './data/TagsListChildrenProps';
|
import type { TagsListChildrenProps, TagsOrder, TagsOrderableFields } from './data/TagsListChildrenProps';
|
||||||
import type { TagsTableRowProps } from './TagsTableRow';
|
import type { TagsTableRowProps } from './TagsTableRow';
|
||||||
import './TagsTable.scss';
|
import './TagsTable.scss';
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
|
import { faPencilAlt as editIcon, faTrash as deleteIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { DropdownItem } from 'reactstrap';
|
import { DropdownItem } from 'reactstrap';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { faTrash as deleteIcon, faPencilAlt as editIcon } from '@fortawesome/free-solid-svg-icons';
|
|
||||||
import type { SelectedServer } from '../servers/data';
|
import type { SelectedServer } from '../servers/data';
|
||||||
import { getServerId } from '../servers/data';
|
import { getServerId } from '../servers/data';
|
||||||
import type { ColorGenerator } from '../utils/services/ColorGenerator';
|
|
||||||
import { prettify } from '../utils/helpers/numbers';
|
|
||||||
import { useToggle } from '../utils/helpers/hooks';
|
|
||||||
import { DropdownBtnMenu } from '../utils/DropdownBtnMenu';
|
import { DropdownBtnMenu } from '../utils/DropdownBtnMenu';
|
||||||
import { TagBullet } from './helpers/TagBullet';
|
import { useToggle } from '../utils/helpers/hooks';
|
||||||
|
import { prettify } from '../utils/helpers/numbers';
|
||||||
|
import type { ColorGenerator } from '../utils/services/ColorGenerator';
|
||||||
import type { NormalizedTag, TagModalProps } from './data';
|
import type { NormalizedTag, TagModalProps } from './data';
|
||||||
|
import { TagBullet } from './helpers/TagBullet';
|
||||||
|
|
||||||
export interface TagsTableRowProps {
|
export interface TagsTableRowProps {
|
||||||
tag: NormalizedTag;
|
tag: NormalizedTag;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
|
import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap';
|
||||||
import type { TagDeletion } from '../reducers/tagDelete';
|
|
||||||
import type { TagModalProps } from '../data';
|
|
||||||
import { Result } from '../../utils/Result';
|
|
||||||
import { ShlinkApiError } from '../../api/ShlinkApiError';
|
import { ShlinkApiError } from '../../api/ShlinkApiError';
|
||||||
|
import { Result } from '../../utils/Result';
|
||||||
|
import type { TagModalProps } from '../data';
|
||||||
|
import type { TagDeletion } from '../reducers/tagDelete';
|
||||||
|
|
||||||
interface DeleteTagConfirmModalProps extends TagModalProps {
|
interface DeleteTagConfirmModalProps extends TagModalProps {
|
||||||
deleteTag: (tag: string) => Promise<void>;
|
deleteTag: (tag: string) => Promise<void>;
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import { pipe } from 'ramda';
|
|
||||||
import { useState } from 'react';
|
|
||||||
import { Button, Input, Modal, ModalBody, ModalFooter, ModalHeader, Popover, InputGroup } from 'reactstrap';
|
|
||||||
import { HexColorPicker } from 'react-colorful';
|
|
||||||
import { faPalette as colorIcon } from '@fortawesome/free-solid-svg-icons';
|
import { faPalette as colorIcon } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
import { pipe } from 'ramda';
|
||||||
|
import { useState } from 'react';
|
||||||
|
import { HexColorPicker } from 'react-colorful';
|
||||||
|
import { Button, Input, InputGroup, Modal, ModalBody, ModalFooter, ModalHeader, Popover } from 'reactstrap';
|
||||||
|
import { ShlinkApiError } from '../../api/ShlinkApiError';
|
||||||
import { useToggle } from '../../utils/helpers/hooks';
|
import { useToggle } from '../../utils/helpers/hooks';
|
||||||
import { handleEventPreventingDefault } from '../../utils/utils';
|
import { Result } from '../../utils/Result';
|
||||||
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
||||||
|
import { handleEventPreventingDefault } from '../../utils/utils';
|
||||||
import type { TagModalProps } from '../data';
|
import type { TagModalProps } from '../data';
|
||||||
import type { EditTag, TagEdition } from '../reducers/tagEdit';
|
import type { EditTag, TagEdition } from '../reducers/tagEdit';
|
||||||
import { Result } from '../../utils/Result';
|
|
||||||
import { ShlinkApiError } from '../../api/ShlinkApiError';
|
|
||||||
import './EditTagModal.scss';
|
import './EditTagModal.scss';
|
||||||
|
|
||||||
interface EditTagModalProps extends TagModalProps {
|
interface EditTagModalProps extends TagModalProps {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { FC, MouseEventHandler, PropsWithChildren } from 'react';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
import type { FC, MouseEventHandler, PropsWithChildren } from 'react';
|
||||||
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
||||||
import './Tag.scss';
|
import './Tag.scss';
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import type { SuggestionComponentProps, TagComponentProps } from 'react-tag-autocomplete';
|
import type { SuggestionComponentProps, TagComponentProps } from 'react-tag-autocomplete';
|
||||||
import ReactTags from 'react-tag-autocomplete';
|
import ReactTags from 'react-tag-autocomplete';
|
||||||
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
|
||||||
import type { Settings } from '../../settings/reducers/settings';
|
import type { Settings } from '../../settings/reducers/settings';
|
||||||
|
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
||||||
import type { TagsList } from '../reducers/tagsList';
|
import type { TagsList } from '../reducers/tagsList';
|
||||||
import { TagBullet } from './TagBullet';
|
|
||||||
import { Tag } from './Tag';
|
import { Tag } from './Tag';
|
||||||
|
import { TagBullet } from './TagBullet';
|
||||||
|
|
||||||
export interface TagsSelectorProps {
|
export interface TagsSelectorProps {
|
||||||
selectedTags: string[];
|
selectedTags: string[];
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { createAction, createSlice } from '@reduxjs/toolkit';
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
import { parseApiError } from '../../api/utils';
|
|
||||||
import type { ProblemDetailsError } from '../../api/types/errors';
|
import type { ProblemDetailsError } from '../../api/types/errors';
|
||||||
|
import { parseApiError } from '../../api/utils';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/tagDelete';
|
const REDUCER_PREFIX = 'shlink/tagDelete';
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import { pick } from 'ramda';
|
|
||||||
import type { PayloadAction } from '@reduxjs/toolkit';
|
import type { PayloadAction } from '@reduxjs/toolkit';
|
||||||
import { createAction, createSlice } from '@reduxjs/toolkit';
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
||||||
|
import { pick } from 'ramda';
|
||||||
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
|
import type { ProblemDetailsError } from '../../api/types/errors';
|
||||||
|
import { parseApiError } from '../../api/utils';
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
import type { ColorGenerator } from '../../utils/services/ColorGenerator';
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
|
||||||
import { parseApiError } from '../../api/utils';
|
|
||||||
import type { ProblemDetailsError } from '../../api/types/errors';
|
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/tagEdit';
|
const REDUCER_PREFIX = 'shlink/tagEdit';
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
import { createAction, createSlice } from '@reduxjs/toolkit';
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
||||||
import { isEmpty, reject } from 'ramda';
|
import { isEmpty, reject } from 'ramda';
|
||||||
import { createNewVisits } from '../../visits/reducers/visitCreation';
|
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
|
||||||
import type { ShlinkTags } from '../../api/types';
|
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
import type { CreateVisit, Stats } from '../../visits/types';
|
import type { ShlinkTags } from '../../api/types';
|
||||||
|
import type { ProblemDetailsError } from '../../api/types/errors';
|
||||||
import { parseApiError } from '../../api/utils';
|
import { parseApiError } from '../../api/utils';
|
||||||
import type { TagStats } from '../data';
|
|
||||||
import type { createShortUrl } from '../../short-urls/reducers/shortUrlCreation';
|
import type { createShortUrl } from '../../short-urls/reducers/shortUrlCreation';
|
||||||
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
|
import { createNewVisits } from '../../visits/reducers/visitCreation';
|
||||||
|
import type { CreateVisit, Stats } from '../../visits/types';
|
||||||
|
import type { TagStats } from '../data';
|
||||||
import { tagDeleted } from './tagDelete';
|
import { tagDeleted } from './tagDelete';
|
||||||
import { tagEdited } from './tagEdit';
|
import { tagEdited } from './tagEdit';
|
||||||
import type { ProblemDetailsError } from '../../api/types/errors';
|
|
||||||
|
|
||||||
const REDUCER_PREFIX = 'shlink/tagsList';
|
const REDUCER_PREFIX = 'shlink/tagsList';
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import { prop } from 'ramda';
|
|
||||||
import type { IContainer } from 'bottlejs';
|
import type { IContainer } from 'bottlejs';
|
||||||
import type Bottle from 'bottlejs';
|
import type Bottle from 'bottlejs';
|
||||||
import { TagsSelector } from '../helpers/TagsSelector';
|
import { prop } from 'ramda';
|
||||||
|
import type { ConnectDecorator } from '../../container/types';
|
||||||
import { DeleteTagConfirmModal } from '../helpers/DeleteTagConfirmModal';
|
import { DeleteTagConfirmModal } from '../helpers/DeleteTagConfirmModal';
|
||||||
import { EditTagModal } from '../helpers/EditTagModal';
|
import { EditTagModal } from '../helpers/EditTagModal';
|
||||||
import { TagsList } from '../TagsList';
|
import { TagsSelector } from '../helpers/TagsSelector';
|
||||||
import { filterTags, listTags, tagsListReducerCreator } from '../reducers/tagsList';
|
|
||||||
import { tagDeleted, tagDeleteReducerCreator } from '../reducers/tagDelete';
|
import { tagDeleted, tagDeleteReducerCreator } from '../reducers/tagDelete';
|
||||||
import { editTag, tagEdited, tagEditReducerCreator } from '../reducers/tagEdit';
|
import { editTag, tagEdited, tagEditReducerCreator } from '../reducers/tagEdit';
|
||||||
import type { ConnectDecorator } from '../../container/types';
|
import { filterTags, listTags, tagsListReducerCreator } from '../reducers/tagsList';
|
||||||
|
import { TagsList } from '../TagsList';
|
||||||
import { TagsTable } from '../TagsTable';
|
import { TagsTable } from '../TagsTable';
|
||||||
import { TagsTableRow } from '../TagsTableRow';
|
import { TagsTableRow } from '../TagsTableRow';
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import type { ChangeEvent, FC, PropsWithChildren } from 'react';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { identity } from 'ramda';
|
import { identity } from 'ramda';
|
||||||
|
import type { ChangeEvent, FC, PropsWithChildren } from 'react';
|
||||||
import { useDomId } from './helpers/hooks';
|
import { useDomId } from './helpers/hooks';
|
||||||
|
|
||||||
export type BooleanControlProps = PropsWithChildren<{
|
export type BooleanControlProps = PropsWithChildren<{
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue