react-admin-base-bootstrap 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.yarnrc +1 -0
  2. package/assets/main.css +63 -0
  3. package/lib/esm/Components/ApiSelect.d.ts +3 -0
  4. package/lib/esm/Components/ApiSelect.js +82 -0
  5. package/lib/esm/Components/BootstrapDataTable.d.ts +12 -0
  6. package/lib/esm/Components/BootstrapDataTable.js +141 -0
  7. package/lib/esm/Components/BootstrapPagination.d.ts +9 -0
  8. package/lib/esm/Components/BootstrapPagination.js +13 -0
  9. package/lib/esm/Components/CRUD.d.ts +20 -0
  10. package/lib/esm/Components/CRUD.js +88 -0
  11. package/lib/esm/Components/CheckBox.d.ts +2 -0
  12. package/lib/esm/Components/CheckBox.js +7 -0
  13. package/lib/esm/Components/EntityEditor.d.ts +11 -0
  14. package/lib/esm/Components/EntityEditor.js +61 -0
  15. package/lib/esm/Components/ErrorBoundary.d.ts +12 -0
  16. package/lib/esm/Components/ErrorBoundary.js +25 -0
  17. package/lib/esm/Components/ExcelExportButton.d.ts +8 -0
  18. package/lib/esm/Components/ExcelExportButton.js +8 -0
  19. package/lib/esm/Components/ExternalLoginButton.d.ts +7 -0
  20. package/lib/esm/Components/ExternalLoginButton.js +12 -0
  21. package/lib/esm/Components/FilePickerCore.d.ts +16 -0
  22. package/lib/esm/Components/FilePickerCore.js +82 -0
  23. package/lib/esm/Components/GoToTop.d.ts +11 -0
  24. package/lib/esm/Components/GoToTop.js +34 -0
  25. package/lib/esm/Components/ImagePicker.d.ts +2 -0
  26. package/lib/esm/Components/ImagePicker.js +22 -0
  27. package/lib/esm/Components/LanguageProvider.d.ts +8 -0
  28. package/lib/esm/Components/LanguageProvider.js +42 -0
  29. package/lib/esm/Components/LoadingButton.d.ts +2 -0
  30. package/lib/esm/Components/LoadingButton.js +6 -0
  31. package/lib/esm/Components/MenuState.d.ts +3 -0
  32. package/lib/esm/Components/MenuState.js +20 -0
  33. package/lib/esm/Components/MultiFilePicker.d.ts +11 -0
  34. package/lib/esm/Components/MultiFilePicker.js +22 -0
  35. package/lib/esm/Components/SingleFilePicker.d.ts +12 -0
  36. package/lib/esm/Components/SingleFilePicker.js +20 -0
  37. package/lib/esm/Components/TopProgressBar.d.ts +3 -0
  38. package/lib/esm/Components/TopProgressBar.js +10 -0
  39. package/lib/esm/Components/Validator.d.ts +16 -0
  40. package/lib/esm/Components/Validator.js +33 -0
  41. package/lib/esm/i18n/de.json +34 -0
  42. package/lib/esm/i18n/en.json +35 -0
  43. package/lib/esm/i18n/tr.json +35 -0
  44. package/lib/esm/index.d.ts +19 -0
  45. package/lib/esm/index.js +19 -0
  46. package/package.json +55 -0
  47. package/src/Components/ApiSelect.tsx +122 -0
  48. package/src/Components/BootstrapDataTable.tsx +160 -0
  49. package/src/Components/BootstrapPagination.tsx +35 -0
  50. package/src/Components/CRUD.tsx +117 -0
  51. package/src/Components/CheckBox.tsx +9 -0
  52. package/src/Components/EntityEditor.tsx +67 -0
  53. package/src/Components/ErrorBoundary.tsx +29 -0
  54. package/src/Components/ExcelExportButton.tsx +11 -0
  55. package/src/Components/ExternalLoginButton.tsx +14 -0
  56. package/src/Components/FilePickerCore.tsx +87 -0
  57. package/src/Components/GoToTop.tsx +41 -0
  58. package/src/Components/ImagePicker.tsx +26 -0
  59. package/src/Components/LanguageProvider.tsx +61 -0
  60. package/src/Components/LoadingButton.tsx +7 -0
  61. package/src/Components/MenuState.tsx +24 -0
  62. package/src/Components/MultiFilePicker.tsx +43 -0
  63. package/src/Components/SingleFilePicker.tsx +40 -0
  64. package/src/Components/TopProgressBar.tsx +13 -0
  65. package/src/Components/Validator.tsx +55 -0
  66. package/src/i18n/de.json +34 -0
  67. package/src/i18n/en.json +35 -0
  68. package/src/i18n/tr.json +35 -0
  69. package/src/index.ts +42 -0
  70. package/tsconfig.json +23 -0
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import {FormattedMessage} from "react-intl";
3
+
4
+ export default class GoToTop extends React.Component {
5
+
6
+ state = {show: false};
7
+
8
+ scrollTop(e) {
9
+ e.preventDefault();
10
+
11
+ window.scrollTo(0, 0);
12
+ }
13
+
14
+ handleScroll(e) {
15
+ var newShow = window.scrollY > 100;
16
+ if (newShow !== this.state.show) {
17
+ this.setState({show: newShow});
18
+ }
19
+ }
20
+
21
+ componentDidMount() {
22
+ this.handleScroll = this.handleScroll.bind(this);
23
+ window.addEventListener('scroll', this.handleScroll);
24
+ }
25
+
26
+ componentWillUnmount() {
27
+ window.removeEventListener('scroll', this.handleScroll);
28
+ }
29
+
30
+ render() {
31
+ if (!this.state.show) {
32
+ return null;
33
+ }
34
+
35
+ return <div onClick={this.scrollTop} className="back-btn-shown">
36
+ <span><FormattedMessage id="GO_TOP" /></span>
37
+ <i className="fa fa-angle-up" title="Go top"/>
38
+ </div>;
39
+ }
40
+ }
41
+
@@ -0,0 +1,26 @@
1
+
2
+ import React, { useCallback } from 'react';
3
+ import SingleFilePicker from './SingleFilePicker';
4
+
5
+ type ImagePickerProps = {
6
+ width: number;
7
+ height: number;
8
+ type: string;
9
+ exact?: boolean;
10
+ };
11
+
12
+ export default function ImagePicker(props) {
13
+ const { width, height, type, exact } = props;
14
+
15
+ const transform = useCallback(async function(file) {
16
+ const modalCropper = await import('modal-cropper');
17
+ const modalCropperFnc = modalCropper.default || modalCropper;
18
+ return await modalCropperFnc(file, width, height, type, exact);
19
+ }, [ width, height, type, exact ]);
20
+
21
+ return <SingleFilePicker
22
+ {...props}
23
+ transform={transform}
24
+ accepts="image/png, image/jpeg"
25
+ />;
26
+ }
@@ -0,0 +1,61 @@
1
+
2
+ import React, { useContext, useReducer, useMemo, useState } from 'react';
3
+ import { useApp } from 'react-admin-base';
4
+ import { IntlProvider } from 'react-intl';
5
+ import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';
6
+
7
+ import enMessages from '../i18n/en.json';
8
+ import deMessages from '../i18n/de.json';
9
+ import trMessages from '../i18n/tr.json';
10
+
11
+ const _languages = {
12
+ 'en': enMessages,
13
+ 'de': deMessages,
14
+ 'tr': trMessages
15
+ };
16
+
17
+ const LanguageContext = React.createContext(null as any);
18
+
19
+ export function useLanguage() {
20
+ return useContext(LanguageContext);
21
+ }
22
+
23
+ export default function LanguageProvider({ defaultLanguage, languages, children }) {
24
+ const app = useApp();
25
+
26
+ const preferredLanguage = (navigator.languages && navigator.languages[0]) ||
27
+ navigator.language;
28
+
29
+ const [ lang, setLang ] = useReducer((oldValue, newValue) => {
30
+ localStorage.setItem(app.id + "_" + 'language', newValue);
31
+ return newValue;
32
+ }, localStorage.getItem(app.id + "_" + 'language') || null);
33
+
34
+ const activeLanguageKey = (!!lang && languages[lang] && lang) || (languages[preferredLanguage] && preferredLanguage) || (languages[defaultLanguage] && defaultLanguage);
35
+ const activeLanguage = languages[activeLanguageKey];
36
+
37
+ const messages = useMemo(() => ({ ...(_languages[activeLanguageKey] || _languages.en), ...activeLanguage.messages }), [activeLanguage])
38
+ const value = useMemo(() => [ activeLanguage, languages, setLang], [ activeLanguage, languages, setLang]);
39
+
40
+ return <IntlProvider locale={activeLanguageKey} messages={messages}>
41
+ <LanguageContext.Provider value={value}>
42
+ { children }
43
+ </LanguageContext.Provider>
44
+ </IntlProvider>;
45
+ }
46
+
47
+ export function LanguageSwitcher() {
48
+ const [show, setShow] = useState(false);
49
+ const [ activeLang, languages, setLanguage ] = useLanguage();
50
+
51
+ return <Dropdown isOpen={show} toggle={() => setShow(!show)}>
52
+ <DropdownToggle className="nav-flag dropdown-toggle show" nav caret>
53
+ <img width="20" src={ activeLang.icon } alt={activeLang.name} />
54
+ </DropdownToggle>
55
+ <DropdownMenu end>
56
+ { Object.entries(languages).map(([key, value] : any) => <DropdownItem key={key} active={activeLang === value} onClick={() => setLanguage(key)}>
57
+ <img width="20" src={value.icon} alt={value.name} /> <span className="align-middle">{ value.name }</span>
58
+ </DropdownItem>) }
59
+ </DropdownMenu>
60
+ </Dropdown>;
61
+ }
@@ -0,0 +1,7 @@
1
+
2
+ import React from 'react';
3
+ import { Button } from 'reactstrap';
4
+
5
+ export default function LoadingButton(props) {
6
+ return props.loading ? <Button {...props} loading={undefined} disabled={true}><i className="fas fa-spin fa-circle-notch" /></Button> : <Button {...props} loading={undefined} />;
7
+ }
@@ -0,0 +1,24 @@
1
+ import { useEffect, useReducer } from 'react';
2
+ import { useMediaQuery } from 'react-responsive';
3
+ import { useHistory } from "react-router-dom";
4
+
5
+ export function useIsMobile() {
6
+ return useMediaQuery({ query: '(max-width: 992px)' });
7
+ }
8
+
9
+ export function useMenuState() {
10
+ const isMobile = useIsMobile();
11
+ const state = useReducer(a => !a, !isMobile);
12
+ const [ isOpen, toggleOpen ] = state;
13
+
14
+ const history = useHistory();
15
+ useEffect(function() {
16
+ if (isMobile && isOpen) {
17
+ return history.listen(function() {
18
+ toggleOpen();
19
+ });
20
+ }
21
+ }, [isMobile, isOpen, history]);
22
+
23
+ return state;
24
+ }
@@ -0,0 +1,43 @@
1
+
2
+ import React, { useMemo } from 'react';
3
+ import { useMultiFilePicker } from "react-admin-base";
4
+ import { FormattedMessage } from "react-intl";
5
+ import { Button } from "reactstrap";
6
+ import FilePickerCore from "./FilePickerCore";
7
+
8
+ type MultiFilePickerProps = {
9
+ disabled?: boolean;
10
+ className?: string;
11
+ accepts?: string;
12
+ value: any;
13
+ onChange: (value: any) => void;
14
+ children?: (value: any) => React.ReactNode;
15
+ }
16
+
17
+ export default function MultiFilePicker({ disabled, className, accepts, value, onChange, children }: MultiFilePickerProps) {
18
+ const uniqueIdList = useMemo(() => [] as any, []);
19
+ const [ controllers, _onChange, chooseFile ] = useMultiFilePicker(value, onChange);
20
+
21
+ function getConstantUniqueIdFor(element) {
22
+ if (uniqueIdList.indexOf(element) < 0) {
23
+ uniqueIdList.push(element);
24
+ }
25
+ return uniqueIdList.indexOf(element);
26
+ }
27
+
28
+ return <div>
29
+ <Button color="primary" size="sm" disabled={!!disabled} outline onClick={chooseFile.bind(null, accepts)}>
30
+ <i className="fa fa-upload" /> <FormattedMessage id="CHOOSE_FILE" />
31
+ </Button>
32
+ { children && children(null) }
33
+
34
+ { controllers.map((a,i) => <FilePickerCore
35
+ key={getConstantUniqueIdFor(a)}
36
+ disabled={!!disabled}
37
+ className="mt-2"
38
+ accepts={accepts}
39
+ value={a}
40
+ onNotify={_onChange.bind(null, a)}
41
+ >{children}</FilePickerCore>) }
42
+ </div>;
43
+ }
@@ -0,0 +1,40 @@
1
+
2
+ import React, { useCallback, useMemo } from 'react';
3
+ import { useUploadController } from "react-admin-base";
4
+ import FilePickerCore from "./FilePickerCore";
5
+
6
+ type SingleFilePickerProps = {
7
+ disabled?: boolean;
8
+ className?: string;
9
+ accepts?: string;
10
+ value: any;
11
+ onChange: (value: any) => void;
12
+ children?: (value: any) => React.ReactNode;
13
+ transform?: any;
14
+ }
15
+
16
+ export default function SingleFilePicker({ disabled, className, accepts, value, onChange, transform, children }: SingleFilePickerProps) {
17
+ const uploadController = useUploadController();
18
+ const controller = useMemo(() => uploadController(value), [uploadController, value]);
19
+
20
+ const _onChange = useCallback(function() {
21
+ if (controller.$state === 3) {
22
+ if (value !== controller) {
23
+ onChange(controller);
24
+ }
25
+ } else {
26
+ if (!!value) {
27
+ onChange(null);
28
+ }
29
+ }
30
+ }, [ value, controller, onChange ]);
31
+
32
+ return <FilePickerCore
33
+ disabled={!!disabled}
34
+ className={className}
35
+ accepts={accepts}
36
+ value={controller}
37
+ onNotify={_onChange}
38
+ transform={transform}
39
+ >{children}</FilePickerCore>;
40
+ }
@@ -0,0 +1,13 @@
1
+ import NProgress from 'nprogress';
2
+ import { useEffect } from 'react';
3
+ import { useAuth } from "react-admin-base";
4
+
5
+ export default function TopProgressBar({ children }) {
6
+ const [ api ] = useAuth();
7
+
8
+ useEffect(function() {
9
+ return api.set_hook(() => NProgress.start(), () => NProgress.done());
10
+ }, [api.set_hook]);
11
+
12
+ return children;
13
+ }
@@ -0,0 +1,55 @@
1
+
2
+ import React from 'react';
3
+ import { useValidate, useValidator } from 'react-admin-base';
4
+ import { FormattedMessage } from "react-intl";
5
+ import { Alert, FormFeedback } from "reactstrap";
6
+
7
+ function ValidatorCore(name: string, value: any, type: any, children: any) {
8
+ const error = useValidate(name || '', value, type);
9
+
10
+ return <>
11
+ {(error
12
+ && React.cloneElement(children, { invalid: !!error, className: (children.props.className || '') + (!!error ? ' is-invalid' : '') })) || children}
13
+ {error && <FormFeedback className="d-block">{error}</FormFeedback>}
14
+ </>;
15
+ }
16
+
17
+ type ValidatorProps = {
18
+ name: string;
19
+ type: any;
20
+ children: any;
21
+ };
22
+
23
+ export function Validator({ name, type, children }: ValidatorProps) {
24
+ return ValidatorCore(name, children.props.value || children.props.checked, type, children);
25
+ }
26
+
27
+ type ValueValidatorProps = {
28
+ name: string;
29
+ type: any;
30
+ value: any;
31
+ children: any;
32
+ };
33
+
34
+ export function ValueValidator({ name, value, type, children }: ValueValidatorProps) {
35
+ return ValidatorCore(name, value, type, children);
36
+ }
37
+
38
+ export function ValidationErrors() {
39
+ const validator = useValidator();
40
+
41
+ if (validator.messagesShown) {
42
+ let errors = Object.values(validator.getErrorMessages()).filter(a => !!a);
43
+ if (!!errors.length) {
44
+ return <Alert color="danger" toggle={() => validator.hideMessages()}>
45
+ <p><i className="fas fa-exclamation-circle" /> <b><FormattedMessage id="VALIDATION.ERROR" /></b></p>
46
+ <ol className="mb-0">
47
+ { errors.map(value => <li>{ value as any }</li>) }
48
+ </ol>
49
+ </Alert>;
50
+ }
51
+ }
52
+
53
+ return null;
54
+ }
55
+
@@ -0,0 +1,34 @@
1
+ {
2
+ "ENTITY.SAVE": "Speichern",
3
+ "ENTITY.CANCEL": "Abbrechen",
4
+ "USERNAME": "Benutzername",
5
+ "PASSWORD": "Passwort",
6
+ "FORGOT_PASSWORD": "Ich habe mein Passwort vergessen",
7
+ "LOGIN": "Einloggen",
8
+ "LOGIN_HEAD": "Anmeldebereich",
9
+ "SUBMIT": "Absenden",
10
+ "SIGN_IN_USING": "Mit anmelden",
11
+ "RESET_PASSWORD": "Passwort zurücksetzen",
12
+ "EMAIL": "Email",
13
+ "AUTH_CODE": "Autorisierungscode",
14
+ "ENTER_AUTH_CODE": "Bitte geben Sie den Bestätigungscode ein, an den wir gesendet haben",
15
+ "CHANGE_EMAIL": "An eine neue E-Mail-Adresse gesendet.",
16
+ "PASSWORD_REPEAT": "Passwort (wieder)",
17
+ "VALIDATION.ERROR": "Entität hat folgende Fehler:",
18
+ "ENTITY.SAVED": "Änderungen werden gespeichert.",
19
+ "CHOOSE_FILE": "Datei aussuchen",
20
+ "OR": "ODER",
21
+ "NEW_ACCOUNT": "Registrieren Sie ein neues Konto",
22
+ "GO_TOP": "Oben",
23
+ "INVALID_PASSWORD": "Ungültiger Benutzername oder Passwort",
24
+ "ALL": "Alles",
25
+ "SEARCH": "Suche...",
26
+ "NO_DATA_IS_AVAILABLE": "Es sind keine Daten verfügbar.",
27
+ "SELECT": "Auswählen",
28
+ "BACK": "Zurück",
29
+ "ACTIONS.DELETE.TITLE": "Bist du sicher?",
30
+ "ACTIONS.DELETE.TEXT": "Diese Aktion ist nicht umkehrbar!",
31
+ "ACTIONS.DELETE.CONFIRM": "Ja, löschen!",
32
+ "PLEASE_WAIT": "Warten Sie mal.",
33
+ "AUTHORIZATION_CODE": "Zugangscode"
34
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "ENTITY.SAVE": "Save",
3
+ "ENTITY.CANCEL": "Cancel",
4
+ "USERNAME": "Username",
5
+ "PASSWORD": "Password",
6
+ "FORGOT_PASSWORD": "I forgot my password",
7
+ "LOGIN": "Login",
8
+ "LOGIN_HEAD": "Login Area",
9
+ "SUBMIT": "Submit",
10
+ "SIGN_IN_USING": "Sign in using {provider}",
11
+ "RESET_PASSWORD": "Reset Password",
12
+ "EMAIL": "Email",
13
+ "AUTH_CODE": "Authorization Code",
14
+ "ENTER_AUTH_CODE": "Please enter the verification code that we sent to {email}.",
15
+ "CHANGE_EMAIL": "Not your e-mail? <1>Sent to a new email address</1>.",
16
+ "PASSWORD_REPEAT": "Password (again)",
17
+ "VALIDATION.ERROR": "Entity has following errors:",
18
+ "ENTITY.SAVED": "Changes are saved.",
19
+ "CHOOSE_FILE": "Choose file",
20
+ "OR": "OR",
21
+ "NEW_ACCOUNT": "Register a new account",
22
+ "GO_TOP": "Go Top",
23
+ "CREATE_VALUE": "Create \"{text}\"",
24
+ "INVALID_PASSWORD": "Invalid username or password",
25
+ "ALL": "All",
26
+ "SEARCH": "Search...",
27
+ "NO_DATA_IS_AVAILABLE": "No data is available.",
28
+ "SELECT": "Please Select",
29
+ "BACK": "Back",
30
+ "ACTIONS.DELETE.TITLE": "Are you sure?",
31
+ "ACTIONS.DELETE.TEXT": "You won't be able to revert this!",
32
+ "ACTIONS.DELETE.CONFIRM": "Yes, delete it!",
33
+ "PLEASE_WAIT": "Please wait.",
34
+ "AUTHORIZATION_CODE": "Authorization Code"
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "ENTITY.SAVE": "Kaydet",
3
+ "ENTITY.CANCEL": "İptal",
4
+ "USERNAME": "Kullanıcı Adı",
5
+ "PASSWORD": "Şifre",
6
+ "FORGOT_PASSWORD": "Şifremi unuttum",
7
+ "SUBMIT": "Gönder",
8
+ "LOGIN": "Giriş",
9
+ "LOGIN_HEAD": "Oturum Açma Alanı",
10
+ "SIGN_IN_USING": "Kullanarak oturum açın",
11
+ "RESET_PASSWORD": "Şifreyi Sıfırla",
12
+ "EMAIL": "E-Posta",
13
+ "AUTH_CODE": "Yetki Kodu",
14
+ "ENTER_AUTH_CODE": "Lütfen gönderdiğimiz doğrulama kodunu giriniz.",
15
+ "CHANGE_EMAIL": "Yeni bir e-posta adresine gönderildi.",
16
+ "PASSWORD_REPEAT": "Şifre (tekrar)",
17
+ "VALIDATION.ERROR": "Aşağıdaki hatalar mevcut:",
18
+ "ENTITY.SAVED": "Değişiklikler kaydedildi.",
19
+ "CHOOSE_FILE": "Dosya Seçin",
20
+ "OR": "Veya",
21
+ "NEW_ACCOUNT": "Yeni bir hesap açın",
22
+ "GO_TOP": "Yukarı",
23
+ "CREATE_VALUE": "Oluştur \"{text}\"",
24
+ "INVALID_PASSWORD": "Kullanıcı adı veya şifre hatalı",
25
+ "ALL": "Hepsi",
26
+ "SEARCH": "Arama...",
27
+ "NO_DATA_IS_AVAILABLE": "Veri bulunmamaktadır.",
28
+ "SELECT": "Seçiniz",
29
+ "BACK": "Geri",
30
+ "ACTIONS.DELETE.TITLE": "Emin misiniz?",
31
+ "ACTIONS.DELETE.TEXT": "Bu işlem geri alınamaz!",
32
+ "ACTIONS.DELETE.CONFIRM": "Evet, sil!",
33
+ "PLEASE_WAIT": "Lütfen bekleyiniz.",
34
+ "AUTHORIZATION_CODE": "Yetki Kodu"
35
+ }
package/src/index.ts ADDED
@@ -0,0 +1,42 @@
1
+
2
+ import BootstrapTable, { Actions, ActionsColumn, Column, default as BootstrapDataTable, IdColumn, useDataTableContext } from './Components/BootstrapDataTable';
3
+ import CRUD, { CRUDActions, ModalEntityEditor } from './Components/CRUD';
4
+ import EntityEditor from "./Components/EntityEditor";
5
+ import ExcelExportButton from './Components/ExcelExportButton';
6
+ import ExternalLoginButton from './Components/ExternalLoginButton';
7
+ import GoToTop from "./Components/GoToTop";
8
+ import { ValidationErrors, Validator, ValueValidator } from "./Components/Validator";
9
+ import ApiSelect from "./Components/ApiSelect";
10
+ import { Preview, Relative } from './Components/FilePickerCore';
11
+ import ImagePicker from './Components/ImagePicker';
12
+ import LoadingButton from './Components/LoadingButton';
13
+ import MultiFilePicker from "./Components/MultiFilePicker";
14
+ import SingleFilePicker from "./Components/SingleFilePicker";
15
+ import LanguageProvider, { LanguageSwitcher, useLanguage } from "./Components/LanguageProvider";
16
+ import CheckBox from './Components/CheckBox';
17
+ import ErrorBoundary from './Components/ErrorBoundary';
18
+ import { useMenuState, useIsMobile } from './Components/MenuState';
19
+ import TopProgressBar from './Components/TopProgressBar';
20
+
21
+ export {
22
+ useIsMobile, useMenuState,
23
+ TopProgressBar,
24
+ CRUD, ModalEntityEditor, CRUDActions,
25
+ Relative,
26
+ ApiSelect,
27
+ Preview,
28
+ ExcelExportButton,
29
+ ExternalLoginButton,
30
+ SingleFilePicker,
31
+ MultiFilePicker,
32
+ ImagePicker,
33
+ BootstrapTable,
34
+ EntityEditor,
35
+ GoToTop,
36
+ Validator, ValueValidator, ValidationErrors,
37
+ LoadingButton,
38
+ BootstrapDataTable, IdColumn, Column, ActionsColumn, Actions, useDataTableContext,
39
+ LanguageProvider, useLanguage, LanguageSwitcher,
40
+ ErrorBoundary,
41
+ CheckBox
42
+ };
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "outDir": "lib/esm",
4
+ "module": "esnext",
5
+ "target": "es6",
6
+ "lib": ["dom", "esnext.intl", "es2020"],
7
+ "jsx": "react",
8
+ "declaration": true,
9
+ "moduleResolution": "node",
10
+ "noUnusedLocals": false,
11
+ "noUnusedParameters": false,
12
+ "esModuleInterop": true,
13
+ "noImplicitReturns": false,
14
+ "noImplicitThis": true,
15
+ "noImplicitAny": false,
16
+ "strictNullChecks": true,
17
+ "suppressImplicitAnyIndexErrors": true,
18
+ "allowSyntheticDefaultImports": true,
19
+ "resolveJsonModule": true,
20
+ "strict": false
21
+ },
22
+ "include": ["src"]
23
+ }