zavadil-react-common 2.1.12 → 2.1.13

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.
@@ -2,10 +2,11 @@ import { PropsWithChildren, ReactNode } from "react";
2
2
  import { ButtonVariant } from "react-bootstrap/types";
3
3
  export type IconButtonProps = {
4
4
  disabled?: boolean;
5
- onClick: () => any;
5
+ onClick?: () => any;
6
6
  size?: "sm" | "lg";
7
7
  icon?: ReactNode;
8
8
  variant?: ButtonVariant;
9
+ type?: "submit" | "reset" | "button" | undefined;
9
10
  };
10
- export declare function IconButton({ disabled, variant, icon, size, children, onClick }: PropsWithChildren<IconButtonProps>): import("react/jsx-runtime").JSX.Element;
11
+ export declare function IconButton({ disabled, variant, icon, size, children, type, onClick, }: PropsWithChildren<IconButtonProps>): import("react/jsx-runtime").JSX.Element;
11
12
  export default IconButton;
@@ -3,5 +3,5 @@ import { IconButtonProps } from "./IconButton";
3
3
  export type ActiveButtonProps = IconButtonProps & {
4
4
  loading?: boolean;
5
5
  };
6
- export declare function LoadingButton({ disabled, icon, loading, children, size, variant, onClick }: PropsWithChildren<ActiveButtonProps>): import("react/jsx-runtime").JSX.Element;
6
+ export declare function LoadingButton({ disabled, icon, loading, children, size, variant, type, onClick, }: PropsWithChildren<ActiveButtonProps>): import("react/jsx-runtime").JSX.Element;
7
7
  export default LoadingButton;
package/dist/index.d.ts CHANGED
@@ -106,12 +106,13 @@ declare function DateTimeInput({ value, onChange, disabled }: DateTimeInputProps
106
106
 
107
107
  type IconButtonProps = {
108
108
  disabled?: boolean;
109
- onClick: () => any;
109
+ onClick?: () => any;
110
110
  size?: "sm" | "lg";
111
111
  icon?: ReactNode;
112
112
  variant?: ButtonVariant;
113
+ type?: "submit" | "reset" | "button" | undefined;
113
114
  };
114
- declare function IconButton({ disabled, variant, icon, size, children, onClick }: PropsWithChildren<IconButtonProps>): react_jsx_runtime.JSX.Element;
115
+ declare function IconButton({ disabled, variant, icon, size, children, type, onClick, }: PropsWithChildren<IconButtonProps>): react_jsx_runtime.JSX.Element;
115
116
 
116
117
  type IconSwitchProps = {
117
118
  disabled?: boolean;
@@ -126,7 +127,7 @@ declare function IconSwitch({ disabled, checked, iconOn, iconOff, size, onChange
126
127
  type ActiveButtonProps = IconButtonProps & {
127
128
  loading?: boolean;
128
129
  };
129
- declare function LoadingButton({ disabled, icon, loading, children, size, variant, onClick }: PropsWithChildren<ActiveButtonProps>): react_jsx_runtime.JSX.Element;
130
+ declare function LoadingButton({ disabled, icon, loading, children, size, variant, type, onClick, }: PropsWithChildren<ActiveButtonProps>): react_jsx_runtime.JSX.Element;
130
131
 
131
132
  type SaveButtonProps = ActiveButtonProps & {
132
133
  isChanged?: boolean;
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as e,Fragment as n,jsxs as t}from"react/jsx-runtime";import{BasicLocalization as i,StringUtil as a,DateUtil as l,NumberUtil as r,CancellablePromise as o,EntityClientWithStub as s,ObjectUtil as d,UserAlertType as c,ByteUtil as h}from"zavadil-ts-common";import{createContext as m,useContext as p,useMemo as u,useCallback as g,useEffect as b,useState as v,useRef as f}from"react";import{Form as y,InputGroup as C,Button as w,Spinner as x,Dropdown as N,Pagination as z,Table as k,Stack as O,ProgressBar as S,Modal as E,Badge as L,Placeholder as P}from"react-bootstrap";import{BsXCircle as G,BsTrash as I,BsFillCaretDownFill as B,BsFillCaretUpFill as M,BsCheckCircle as D,BsCircle as A,BsCheckAll as F,BsBug as H,BsExclamationDiamond as $,BsInfo as T,BsQuestion as j,BsEye as V}from"react-icons/bs";import{FaFloppyDisk as R}from"react-icons/fa6";import{VscEyeClosed as U}from"react-icons/vsc";const J=m(new i);function K({text:t,tag:i}){const a=p(J),l=u((()=>{if(void 0!==i&&""!==i)return"string"==typeof i?{tags:[i]}:{tags:i}}),[i]),r=u((()=>a.translate(t,l)),[a,t,l]);return e(n,{children:r})}function Y({label:n,children:i}){return t(y.Group,{children:[e(y.Label,{children:e(K,{text:n})}),e("div",{children:i})]})}function q({value:n,onChange:i,onReset:l,onBlur:r,disabled:o,className:s}){const d=u((()=>a.getNonEmpty(n)),[n]),c=u((()=>a.isBlank(n)),[d]),h=g((()=>{l?l():i("")}),[l,i]);return t(C,{className:s,children:[e(y.Control,{type:"text",disabled:o,value:d,onChange:e=>i(e.target.value),onBlur:r}),e(w,{onClick:h,disabled:c,children:e("div",{className:"d-flex align-items-center",children:e(G,{})})})]})}function Q({value:n,onChange:t,disabled:i}){return e(y.Control,{type:"date",disabled:i,value:l.formatDateForInput(n),onChange:e=>{t(l.parseDate(e.target.value))}})}function W({value:n,onChange:t,disabled:i}){return e(y.Control,{type:"datetime-local",disabled:i,value:l.formatDateTimeForInput(n),onChange:e=>{t(l.parseDate(e.target.value))}})}function X({disabled:n,variant:i,icon:a,size:l,children:r,onClick:o}){return e(w,{disabled:!0===n,size:l,onClick:o,variant:i,children:t("div",{className:"d-flex align-items-center gap-2",children:[a,r&&e("div",{children:r})]})})}function Z({disabled:n,checked:i,iconOn:a,iconOff:l,size:r,onChange:o}){return t("div",{className:"d-flex align-items-center gap-2 cursor-pointer",onClick:e=>o(!i),children:[e(y.Switch,{disabled:n,size:r,type:"switch",checked:i,readOnly:!0,className:"cursor-pointer"}),i?a:l]})}function _({disabled:n,icon:t,loading:i,children:a,size:l,variant:r,onClick:o}){return e(X,!0===i?{disabled:!0,onClick:o,size:l,variant:r,icon:e(x,{size:"sm"}),children:a}:{disabled:n,onClick:o,icon:t,size:l,variant:r,children:a})}function ee({disabled:n,icon:t,loading:i,children:a,size:l,onClick:r,isChanged:o}){const s=u((()=>t||e(R,{})),[t]),d=u((()=>o?e("strong",{children:a}):a),[o,a]);return e(_,{disabled:n||!1===o,onClick:r,icon:s,loading:i,size:l,children:d})}function ne({disabled:n,icon:t,loading:i,children:a,size:l,onClick:r,isChanged:o}){const s=u((()=>t||e(I,{})),[t]);return e(_,{disabled:n||!1===o,onClick:r,icon:s,loading:i,size:l,variant:"danger",children:a})}function te({value:n,options:i,disabled:l,onChange:r,showEmptyOption:o,emptyOptionLabel:s}){return b((()=>{a.isBlank(n)&&i.length>0&&!0!==o&&r(i[0].id)}),[n,i,o,r]),t(y.Select,{value:n||"",onChange:e=>r(e.target.value),disabled:l,children:[!0===o&&e("option",{value:"",children:s||""},""),i?i.map(((n,t)=>e("option",{value:n.id||"",children:n.label||""},t))):e("span",{children:e(x,{})})]})}function ie({value:n,options:t,disabled:i,onChange:a,showEmptyOption:l,emptyOptionLabel:o}){const s=u((()=>n?String(n):""),[n]),d=u((()=>t?t.map((e=>({id:e.id?String(e.id):"",label:e.label}))):[]),[t]),c=g((e=>a(r.parseNumber(e))),[a]);return e(te,{disabled:i,value:s,options:d,onChange:c,showEmptyOption:l,emptyOptionLabel:o})}function ae({id:n,sort:t,disabled:i,labelGetter:a,onChange:l,options:r,showEmptyOption:o,emptyOptionLabel:s}){const d=u((()=>{let e=[];return r&&(e=t?r.sort(((e,n)=>e.name>n.name?1:-1)):r),e.map((e=>({id:e.id,label:a?a(e):e.name})))}),[r]);return e(ie,{disabled:i,value:n,options:d,onChange:l,showEmptyOption:o,emptyOptionLabel:s})}function le({value:n,options:t,onChange:i,showEmptyOption:a,emptyOptionLabel:l}){const r=u((()=>t?t.map((e=>({id:e,label:e}))):[]),[t]);return e(te,{value:n,options:r,onChange:i,showEmptyOption:a,emptyOptionLabel:l})}function re({id:n,label:t,disabled:i,checked:l,size:r,onChange:o}){const s=u((()=>n||a.randomString()),[n]);return e(y.Switch,{disabled:i,id:s,size:r,type:"switch",checked:l,onChange:e=>o(!l),className:"cursor-pointer",label:t})}function oe({selected:n,disabled:i,labelGetter:a,onChange:l,onSearch:r}){const[s,d]=v(),[c,h]=v(),[m,p]=v(),y=f(),C=g((e=>a?a(e):"name"in e&&"string"==typeof e.name?e.name:`[${e.id}]`),[a]),w=u((()=>n?"border rounded border-primary":void 0),[n]),x=g((()=>{console.log("user left control"),m&&(p(void 0),h(n?C(n):""))}),[l,m,n,C]),z=g((()=>{y.current=window.setTimeout(x,100)}),[y,x]),k=g((()=>{y.current&&clearTimeout(y.current)}),[y]);b((()=>k),[]),b((()=>{h(n?C(n):""),s&&(s.cancel(),d(void 0)),p(void 0)}),[n]);const O=g((()=>{l(null),h(""),s&&(s.cancel(),d(void 0)),p(void 0)}),[l,s]),S=g((e=>{h(e),s&&s.cancel();const n=new o(r(e));n.promise.then(p),d(n)}),[s,r]),E=g((e=>{console.log("user selected item"),p(void 0),l({...e})}),[l]);return e("div",{onBlur:z,onFocus:k,children:t(N,{defaultShow:!1,show:null!==m,children:[e(q,{disabled:i,value:c,onChange:S,onReset:O,className:w}),m&&e(N.Menu,{children:m.map((t=>e(N.Item,{onClick:e=>{k(),E(t)},active:t.id===n?.id,children:C(t)},t.id)))})]})})}function se({selected:n,disabled:t,labelGetter:i,onChange:l,entityClient:r}){const o=g((e=>r.loadPage({search:a.safeLowercase(e),page:0,size:10,sorting:[{name:"id"}]}).then((e=>e.content))),[i]);return e(oe,{disabled:t,selected:n,labelGetter:i,onSearch:o,onChange:l})}function de({id:n,disabled:t,labelGetter:i,onChange:a,entityClient:l}){const[r,o]=v(null);b((()=>{n?r&&r.id===n?o({...r}):l instanceof s?l.loadSingleStub(n).then(o):l.loadSingle(n).then(o):o(null)}),[n]);const d=g((e=>{const t=e?e.id:null;t!==n&&a(t),o(e)}),[n,a]);return e(se,{disabled:t,selected:r,labelGetter:i,entityClient:l,onChange:d})}function ce({selected:n,disabled:t,labelGetter:i,onChange:l,lookupClient:r}){const o=u((()=>i||(e=>e.name)),[i]),s=g((e=>r.loadPage({search:a.safeLowercase(e),page:0,size:10,sorting:[{name:"name"}]}).then((e=>e.content))),[i]);return e(oe,{disabled:t,selected:n,labelGetter:o,onSearch:s,onChange:l})}function he({id:n,disabled:t,labelGetter:i,onChange:a,lookupClient:l}){const[r,o]=v(null);b((()=>{n?r&&r.id===n?o({...r}):l.loadSingle(n).then(o):o(null)}),[n]);const s=g((e=>{const t=e?e.id:null;t!==n&&a(t),o(e)}),[n,r]);return e(ce,{disabled:t,selected:r,labelGetter:i,lookupClient:l,onChange:s})}function me({id:n,sort:t,disabled:i,labelGetter:a,onChange:l,options:r,showEmptyOption:o,emptyOptionLabel:s}){const d=u((()=>{let e=[];return r&&(e=t?r.sort(((e,n)=>a(e)>a(n)?1:-1)):r),e.map((e=>({id:e.id,label:a(e)})))}),[r]);return e(ie,{disabled:i,value:n,options:d,onChange:l,showEmptyOption:o,emptyOptionLabel:s})}function pe({value:n,sort:t,disabled:i,labelGetter:a,onChange:l,options:r,showEmptyOption:o,emptyOptionLabel:s}){return e(me,{disabled:i,id:n?n.id:null,options:r,sort:t,onChange:e=>{l(r&&e?r.find((n=>n.id===e)):void 0)},labelGetter:a,showEmptyOption:o,emptyOptionLabel:s})}function ue({value:n,sort:t,disabled:i,onChange:a,options:l,showEmptyOption:r,emptyOptionLabel:o}){return e(pe,{value:n,labelGetter:e=>e.name,disabled:i,sort:t,options:l,onChange:a,showEmptyOption:r,emptyOptionLabel:o})}function ge({id:n,sort:t,disabled:i,onChange:a,options:l,showEmptyOption:r,emptyOptionLabel:o}){return e(me,{id:n,labelGetter:e=>e.name,disabled:i,sort:t,options:l,onChange:a,showEmptyOption:r,emptyOptionLabel:o})}function be({paging:n,totalItems:t,onPagingChanged:i}){const a=Math.ceil(t/n.size),l=e=>{n.page=e,i(d.clone(n))},r=[];if(a>1){r.push(e(z.First,{onClick:()=>l(0),disabled:0===n.page},"first")),r.push(e(z.Prev,{onClick:()=>l(n.page-1),disabled:0===n.page},"prev"));const t=Math.round(3.5);let i=n.page>t?n.page-t:0,o=i+10;o>=a&&(o=a-1),i>0&&r.push(e(z.Ellipsis,{disabled:!0},"ellipsisStart"));for(let t=i;t<=o;t++)r.push(e(z.Item,{active:t===n.page,onClick:()=>l(t),children:t+1},t));o<a-1&&r.push(e(z.Ellipsis,{disabled:!0},"ellipsisEnd")),r.push(e(z.Next,{onClick:()=>l(n.page+1),disabled:n.page===a-1},"next")),r.push(e(z.Last,{onClick:()=>l(a-1),disabled:n.page===a-1},"last"))}return e(z,{size:"sm",className:"flex-wrap m-0",children:r})}const ve=[{id:10,label:"10"},{id:100,label:"100"},{id:1e3,label:"1000"}];function fe({hover:i,showPagingOnBottom:l,showPageSizeSelection:r,striped:o,bordered:s,header:c,children:h,paging:m,totalItems:p,onPagingChanged:g}){const b=Math.ceil(p/m.size),v=u((()=>{const e=m.size;if(null===ve.find((n=>n.id===e))){const n=d.clone(ve);return n.push({id:e,label:String(e)}),n}return ve}),[m]);return e("div",{children:t(k,{hover:i,striped:o,responsive:!0,bordered:s,children:[t("thead",{children:[e("tr",{children:e("td",{colSpan:c.length,children:t("div",{className:"d-flex justify-content-between align-items-center gap-2",children:[t("div",{children:[e(K,{text:"Page"}),": ",m.page+1," / ",b]}),b>0&&e(be,{paging:m,totalItems:p,onPagingChanged:g}),t("div",{children:[e(K,{text:"Total items"}),": ",p]})]})})}),e("tr",{children:c.map(((i,l)=>{const r=!1===i.sort?"":a.isBlank(i.sort)?i.name:i.sort;if(a.isBlank(r)||!r)return e("th",{children:i.label},l);const o=m.sorting&&m.sorting.find((e=>e.name===r));return t("th",{className:"user-select-none text-nowrap",role:"button",onClick:e=>((e,n)=>{m.sorting||(m.sorting=[]);let t=m.sorting.find((e=>e.name===n));const i=t&&1===m.sorting.length;e.ctrlKey||i||(m.sorting=[],t=void 0),t?t.desc=!t.desc:m.sorting.push({name:n}),g(d.clone(m))})(e,r),children:[i.label,o?o.desc?e(B,{}):e(M,{}):e(n,{})]},l)}))})]}),e("tbody",{children:h}),p>0&&t("tfoot",{children:[l&&e("tr",{children:e("td",{colSpan:c.length,children:t("div",{className:"d-flex justify-content-between align-items-center gap-2",children:[t("div",{children:[e(K,{text:"Page"}),": ",m.page+1," / ",b]}),b>0&&e(be,{paging:m,totalItems:p,onPagingChanged:g}),t("div",{children:[e(K,{text:"Total items"}),": ",p]})]})})}),r&&e("tr",{children:e("td",{colSpan:c.length,children:t("div",{className:"d-flex align-items-center gap-2 justify-content-end",children:[t("div",{className:"text-nowrap",children:[e(K,{text:"Page size"}),":"]}),e("div",{children:e(ie,{value:m.size,options:v,onChange:e=>{m.size=e||10,g({...m})},showEmptyOption:!1})})]})})})]})]})})}function ye({disabled:n,checked:t,iconOn:i,iconOff:a,size:l,onChange:r}){const o=u((()=>t?i||e(D,{size:l}):a||e(A,{size:l,className:"text-muted"})),[t,i,a,l]);return e("div",{className:"d-flex align-items-center cursor-pointer",onClick:e=>{e.stopPropagation(),e.preventDefault(),r(!t)},children:o})}function Ce({showSelect:n,header:i,items:a,onSelect:l,onClick:r,totalItems:o,paging:s,onPagingChanged:c}){const[h,m]=v(!1),[p,f]=v(),y=g((e=>{p&&f(p.map((n=>({selected:e,item:n.item})))),m(e)}),[p]),C=u((()=>{const t=[...i];return!1!==n&&t.unshift({name:"",label:e("div",{className:"py-1",children:e(ye,{checked:h,onChange:()=>y(!h),iconOn:e(F,{})})})}),t}),[i,h,y]);return b((()=>{f(a?a.map((e=>({selected:h,item:e}))):void 0)}),[a]),b((()=>{p&&l&&l(p.filter((e=>e.selected)).map((e=>e.item)))}),[p,l]),e(fe,{header:C,hover:void 0!==r,paging:s,striped:!0,totalItems:o,onPagingChanged:c,children:p&&p.map(((a,l)=>t("tr",{className:`selectable ${r?"cursor-pointer":""} ${a.selected?"table-active table-primary":""}`,onClick:e=>{r&&r(a.item)},children:[!1!==n&&e("td",{children:e("div",{className:"py-2 d-flex align-items-center",children:e(ye,{checked:a.selected,onChange:()=>{a.selected=!a.selected,h&&!a.selected&&m(!1),f([...p])}})})}),i.map(((n,t)=>{const i=n.renderer||(l=n.name,e=>d.getNestedValue(e,l));var l;return e("td",{children:i(a.item)},t)}))]},l)))})}function we({cols:n,rows:t,size:i}){const a=u((()=>void 0===n?1:n),[n]),l=u((()=>void 0===t?20:t),[t]);return u((()=>void 0===i?"lg":i),[i]),e("div",{children:e(k,{responsive:!0,children:e("tbody",{children:Array.from({length:l},((n,t)=>e("tr",{children:Array.from({length:a},((n,t)=>e("td",{children:e("div",{className:"w-100 p-1 m-1"})},t)))},t)))})})})}function xe({value:n}){return e("div",{className:"text-nowrap",children:l.formatDateTimeForHumans(n)})}function Ne({ms:t}){return d.isEmpty(t)?e(n,{}):e("div",{className:"text-nowrap",children:l.formatDuration(t)})}function ze({date:n}){const t=u((()=>d.isEmpty(n)?null:Date.now()-n.getTime()),[n]);return e(Ne,{ms:t})}const ke=new Map([[c.error,H],[c.warning,$],[c.info,T]]);function Oe({type:n,size:t,customVariant:i}){const a=ke.get(n)||j;return e("div",{className:`d-flex align-items-center text-${void 0===i?n:i}`,children:a({size:t})})}function Se({userAlert:n,maxDurationMs:i}){return t(O,{direction:"horizontal",gap:2,className:"align-items-center",children:[n.remainsMs&&e("div",{style:{width:20},children:e(S,{min:0,max:i,now:n.remainsMs,variant:n.type})}),e("div",{children:l.formatDateForHumans(n.time)}),e(Oe,{type:n.type}),e("div",{children:n.message})]})}function Ee({userAlerts:i}){const[a,l]=v(!1),[r,o]=v(i.alerts.length),[s,d]=v([...i.visibleAlerts]),[c,h]=v(i.getSummary()),m=g((()=>{o(i.alerts.length),d(a?[...i.alerts]:[...i.visibleAlerts]),h(i.getSummary())}),[i,a]);return b((()=>{i.addOnChangeHandler(m);const e=setInterval((()=>i.updateVisibility()),100);return()=>{clearInterval(e),i.removeOnChangeHandler(m)}}),[i,m]),r<=0?e(n,{}):t("div",{className:"user-alerts border rounded bg-body text-body position-fixed text-end",style:{bottom:15,right:15,zIndex:2147483647},children:[s.length>0&&e("div",{className:"max-w-50 p-2 border-bottom",children:s.map(((n,t)=>e(Se,{userAlert:n,maxDurationMs:i.maxVisibilityMs},t)))}),e("div",{className:"p-2",children:t(O,{direction:"horizontal",gap:2,className:"justify-content-end align-items-center",children:[e(X,a?{size:"sm",variant:"primary",onClick:()=>l(!1),icon:e(U,{}),children:"Hide"}:{size:"sm",variant:"primary",onClick:()=>l(!0),icon:e(V,{}),children:"Show All"}),Array.from(c.entries()).map(((n,i)=>t(O,{direction:"horizontal",gap:1,className:"px-1 border rounded align-items-center",children:[e(Oe,{type:n[0],customVariant:0===n[1]?"muted":void 0}),e("div",{className:n[1]>0?`text-${n[0]} fw-bold`:"text-muted",children:n[1]})]},i))),e(X,{size:"sm",variant:"danger",onClick:()=>i.reset(),icon:e(I,{}),children:"Reset"})]})})]})}class Le{constructor(e){this.setProps=e}confirm(e,n,t){this.setProps({name:e,text:n,onConfirm:()=>{t(),this.setProps(void 0)},onClose:()=>this.setProps(void 0)})}}const Pe=m(new Le((()=>{})));function Ge({name:n,text:i,onClose:a,onConfirm:l}){return t(E,{show:!0,backdrop:!0,onHide:a,children:[e(E.Header,{children:n||"Confirm"}),e(E.Body,{children:i}),e(E.Footer,{children:t(O,{direction:"horizontal",children:[e(w,{variant:"link",onClick:a,children:e(K,{text:"Back"})}),e(w,{variant:"primary",onClick:l,children:e(K,{text:"Yes"})})]})})]})}function Ie({stats:n}){const i=n.heapSize,a=n.heapMaxSize,l=n.heapFreeSize,r=i-l;return t("div",{children:[t("div",{className:"d-flex align-items-center gap-2",children:[e("pre",{children:"Java Heap"}),t("pre",{children:["[",h.formatByteSize(i)," / ",h.formatByteSize(a),"]"]})]}),t("div",{className:"d-flex align-items-center gap-2",children:[e("pre",{children:"Used:"}),e(L,{className:"bg-warning text-bg-warning",children:h.formatByteSize(r)}),e("pre",{children:"Free:"}),e(L,{className:"bg-success text-white",children:h.formatByteSize(l)})]}),e("div",{className:"p-1",children:t(S,{min:0,max:a,children:[e(S,{variant:"warning",min:0,now:r,max:a}),e(S,{variant:"success",min:0,now:l,max:a})]})})]})}function Be({name:n,stats:i}){return t("div",{children:[t("div",{className:"d-flex align-items-center gap-2",children:[e("pre",{children:n}),t("pre",{children:["[",i.cachedItems,i.capacity>0&&" / ",i.capacity>0&&i.capacity,"]"]})]}),i.capacity>0&&e("div",{className:"p-1",children:e(S,{now:i.cachedItems,min:0,max:i.capacity})})]})}const Me=new Map([["Idle","secondary"],["Processing","success"],["Loading","warn"]]);function De({state:n}){const t=Me.get(n)||"light";return e(L,{className:`bg-${t} text-bg-${t}`,children:n})}function Ae({name:n,stats:i}){const a=i?i.remaining+i.processed:void 0;return t("div",{children:[t("div",{className:"d-flex align-items-center gap-2",children:[e("pre",{children:n}),t("pre",{children:["[",void 0!==i?.processed?i.processed:"?"," / ",void 0!==a?a:"?","]"]}),e(De,{state:i?i.state:"Unknown"})]}),e("div",{className:"p-1",children:i?e(S,{variant:"primary",striped:!0,animated:!0,min:0,now:i.processed,max:a||1}):e(P,{className:"w-100",animation:"glow",children:e(P,{className:"w-100"})})})]})}function Fe({children:n,center:t}){const i=u((()=>!1===t?"":"d-flex align-items-center justify-content-center"),[t]);return e("div",{className:`w-100 h-100 position-absolute ${i}`,style:{left:0,right:0,top:0,bottom:0},children:n})}export{fe as AdvancedTable,de as AutocompleteEntityIdSelect,se as AutocompleteEntitySelect,he as AutocompleteLookupIdSelect,ce as AutocompleteLookupSelect,oe as AutocompleteSelect,Be as CacheStatsControl,Ge as ConfirmDialog,Pe as ConfirmDialogContext,Le as ConfirmDialogContextData,Q as DateInput,xe as DateTime,W as DateTimeInput,ne as DeleteButton,Ne as Duration,ze as Elapsed,me as EntityIdSelect,pe as EntitySelect,ge as EntityWithNameIdSelect,ue as EntityWithNameSelect,le as EnumSelect,Y as FormRow,X as IconButton,Z as IconSwitch,Ie as JavaHeapControl,_ as LoadingButton,J as LocalizationContext,K as Localize,ae as LookupSelect,ie as NumberSelect,De as QueueStateControl,Ae as QueueStatsControl,ee as SaveButton,Fe as Spread,te as StringSelect,re as Switch,be as TablePagination,we as TablePlaceholder,Ce as TableWithSelect,q as TextInputWithReset,Oe as UserAlertTypeIcon,Se as UserAlertWidget,Ee as UserAlertsWidget};
1
+ import{jsx as e,Fragment as n,jsxs as t}from"react/jsx-runtime";import{BasicLocalization as i,StringUtil as a,DateUtil as l,NumberUtil as r,CancellablePromise as o,EntityClientWithStub as s,ObjectUtil as d,UserAlertType as c,ByteUtil as h}from"zavadil-ts-common";import{createContext as p,useContext as m,useMemo as u,useCallback as g,useEffect as b,useState as v,useRef as f}from"react";import{Form as y,InputGroup as C,Button as w,Spinner as x,Dropdown as N,Pagination as z,Table as k,Stack as O,ProgressBar as S,Modal as E,Badge as L,Placeholder as P}from"react-bootstrap";import{BsXCircle as G,BsTrash as I,BsFillCaretDownFill as B,BsFillCaretUpFill as M,BsCheckCircle as D,BsCircle as A,BsCheckAll as F,BsBug as H,BsExclamationDiamond as $,BsInfo as T,BsQuestion as j,BsEye as V}from"react-icons/bs";import{FaFloppyDisk as R}from"react-icons/fa6";import{VscEyeClosed as U}from"react-icons/vsc";const J=p(new i);function K({text:t,tag:i}){const a=m(J),l=u((()=>{if(void 0!==i&&""!==i)return"string"==typeof i?{tags:[i]}:{tags:i}}),[i]),r=u((()=>a.translate(t,l)),[a,t,l]);return e(n,{children:r})}function Y({label:n,children:i}){return t(y.Group,{children:[e(y.Label,{children:e(K,{text:n})}),e("div",{children:i})]})}function q({value:n,onChange:i,onReset:l,onBlur:r,disabled:o,className:s}){const d=u((()=>a.getNonEmpty(n)),[n]),c=u((()=>a.isBlank(n)),[d]),h=g((()=>{l?l():i("")}),[l,i]);return t(C,{className:s,children:[e(y.Control,{type:"text",disabled:o,value:d,onChange:e=>i(e.target.value),onBlur:r}),e(w,{onClick:h,disabled:c,children:e("div",{className:"d-flex align-items-center",children:e(G,{})})})]})}function Q({value:n,onChange:t,disabled:i}){return e(y.Control,{type:"date",disabled:i,value:l.formatDateForInput(n),onChange:e=>{t(l.parseDate(e.target.value))}})}function W({value:n,onChange:t,disabled:i}){return e(y.Control,{type:"datetime-local",disabled:i,value:l.formatDateTimeForInput(n),onChange:e=>{t(l.parseDate(e.target.value))}})}function X({disabled:n,variant:i,icon:a,size:l,children:r,type:o,onClick:s}){return e(w,{disabled:!0===n,size:l,onClick:s,variant:i,type:o,children:t("div",{className:"d-flex align-items-center gap-2",children:[a,r&&e("div",{children:r})]})})}function Z({disabled:n,checked:i,iconOn:a,iconOff:l,size:r,onChange:o}){return t("div",{className:"d-flex align-items-center gap-2 cursor-pointer",onClick:e=>o(!i),children:[e(y.Switch,{disabled:n,size:r,type:"switch",checked:i,readOnly:!0,className:"cursor-pointer"}),i?a:l]})}function _({disabled:n,icon:t,loading:i,children:a,size:l,variant:r,type:o,onClick:s}){return e(X,!0===i?{disabled:!0,onClick:s,size:l,variant:r,type:o,icon:e(x,{size:"sm"}),children:a}:{disabled:n,onClick:s,icon:t,size:l,variant:r,children:a})}function ee({disabled:n,icon:t,loading:i,children:a,size:l,onClick:r,isChanged:o}){const s=u((()=>t||e(R,{})),[t]),d=u((()=>o?e("strong",{children:a}):a),[o,a]);return e(_,{disabled:n||!1===o,onClick:r,icon:s,loading:i,size:l,children:d})}function ne({disabled:n,icon:t,loading:i,children:a,size:l,onClick:r,isChanged:o}){const s=u((()=>t||e(I,{})),[t]);return e(_,{disabled:n||!1===o,onClick:r,icon:s,loading:i,size:l,variant:"danger",children:a})}function te({value:n,options:i,disabled:l,onChange:r,showEmptyOption:o,emptyOptionLabel:s}){return b((()=>{a.isBlank(n)&&i.length>0&&!0!==o&&r(i[0].id)}),[n,i,o,r]),t(y.Select,{value:n||"",onChange:e=>r(e.target.value),disabled:l,children:[!0===o&&e("option",{value:"",children:s||""},""),i?i.map(((n,t)=>e("option",{value:n.id||"",children:n.label||""},t))):e("span",{children:e(x,{})})]})}function ie({value:n,options:t,disabled:i,onChange:a,showEmptyOption:l,emptyOptionLabel:o}){const s=u((()=>n?String(n):""),[n]),d=u((()=>t?t.map((e=>({id:e.id?String(e.id):"",label:e.label}))):[]),[t]),c=g((e=>a(r.parseNumber(e))),[a]);return e(te,{disabled:i,value:s,options:d,onChange:c,showEmptyOption:l,emptyOptionLabel:o})}function ae({id:n,sort:t,disabled:i,labelGetter:a,onChange:l,options:r,showEmptyOption:o,emptyOptionLabel:s}){const d=u((()=>{let e=[];return r&&(e=t?r.sort(((e,n)=>e.name>n.name?1:-1)):r),e.map((e=>({id:e.id,label:a?a(e):e.name})))}),[r]);return e(ie,{disabled:i,value:n,options:d,onChange:l,showEmptyOption:o,emptyOptionLabel:s})}function le({value:n,options:t,onChange:i,showEmptyOption:a,emptyOptionLabel:l}){const r=u((()=>t?t.map((e=>({id:e,label:e}))):[]),[t]);return e(te,{value:n,options:r,onChange:i,showEmptyOption:a,emptyOptionLabel:l})}function re({id:n,label:t,disabled:i,checked:l,size:r,onChange:o}){const s=u((()=>n||a.randomString()),[n]);return e(y.Switch,{disabled:i,id:s,size:r,type:"switch",checked:l,onChange:e=>o(!l),className:"cursor-pointer",label:t})}function oe({selected:n,disabled:i,labelGetter:a,onChange:l,onSearch:r}){const[s,d]=v(),[c,h]=v(),[p,m]=v(),y=f(),C=g((e=>a?a(e):"name"in e&&"string"==typeof e.name?e.name:`[${e.id}]`),[a]),w=u((()=>n?"border rounded border-primary":void 0),[n]),x=g((()=>{console.log("user left control"),p&&(m(void 0),h(n?C(n):""))}),[l,p,n,C]),z=g((()=>{y.current=window.setTimeout(x,100)}),[y,x]),k=g((()=>{y.current&&clearTimeout(y.current)}),[y]);b((()=>k),[]),b((()=>{h(n?C(n):""),s&&(s.cancel(),d(void 0)),m(void 0)}),[n]);const O=g((()=>{l(null),h(""),s&&(s.cancel(),d(void 0)),m(void 0)}),[l,s]),S=g((e=>{h(e),s&&s.cancel();const n=new o(r(e));n.promise.then(m),d(n)}),[s,r]),E=g((e=>{console.log("user selected item"),m(void 0),l({...e})}),[l]);return e("div",{onBlur:z,onFocus:k,children:t(N,{defaultShow:!1,show:null!==p,children:[e(q,{disabled:i,value:c,onChange:S,onReset:O,className:w}),p&&e(N.Menu,{children:p.map((t=>e(N.Item,{onClick:e=>{k(),E(t)},active:t.id===n?.id,children:C(t)},t.id)))})]})})}function se({selected:n,disabled:t,labelGetter:i,onChange:l,entityClient:r}){const o=g((e=>r.loadPage({search:a.safeLowercase(e),page:0,size:10,sorting:[{name:"id"}]}).then((e=>e.content))),[i]);return e(oe,{disabled:t,selected:n,labelGetter:i,onSearch:o,onChange:l})}function de({id:n,disabled:t,labelGetter:i,onChange:a,entityClient:l}){const[r,o]=v(null);b((()=>{n?r&&r.id===n?o({...r}):l instanceof s?l.loadSingleStub(n).then(o):l.loadSingle(n).then(o):o(null)}),[n]);const d=g((e=>{const t=e?e.id:null;t!==n&&a(t),o(e)}),[n,a]);return e(se,{disabled:t,selected:r,labelGetter:i,entityClient:l,onChange:d})}function ce({selected:n,disabled:t,labelGetter:i,onChange:l,lookupClient:r}){const o=u((()=>i||(e=>e.name)),[i]),s=g((e=>r.loadPage({search:a.safeLowercase(e),page:0,size:10,sorting:[{name:"name"}]}).then((e=>e.content))),[i]);return e(oe,{disabled:t,selected:n,labelGetter:o,onSearch:s,onChange:l})}function he({id:n,disabled:t,labelGetter:i,onChange:a,lookupClient:l}){const[r,o]=v(null);b((()=>{n?r&&r.id===n?o({...r}):l.loadSingle(n).then(o):o(null)}),[n]);const s=g((e=>{const t=e?e.id:null;t!==n&&a(t),o(e)}),[n,r]);return e(ce,{disabled:t,selected:r,labelGetter:i,lookupClient:l,onChange:s})}function pe({id:n,sort:t,disabled:i,labelGetter:a,onChange:l,options:r,showEmptyOption:o,emptyOptionLabel:s}){const d=u((()=>{let e=[];return r&&(e=t?r.sort(((e,n)=>a(e)>a(n)?1:-1)):r),e.map((e=>({id:e.id,label:a(e)})))}),[r]);return e(ie,{disabled:i,value:n,options:d,onChange:l,showEmptyOption:o,emptyOptionLabel:s})}function me({value:n,sort:t,disabled:i,labelGetter:a,onChange:l,options:r,showEmptyOption:o,emptyOptionLabel:s}){return e(pe,{disabled:i,id:n?n.id:null,options:r,sort:t,onChange:e=>{l(r&&e?r.find((n=>n.id===e)):void 0)},labelGetter:a,showEmptyOption:o,emptyOptionLabel:s})}function ue({value:n,sort:t,disabled:i,onChange:a,options:l,showEmptyOption:r,emptyOptionLabel:o}){return e(me,{value:n,labelGetter:e=>e.name,disabled:i,sort:t,options:l,onChange:a,showEmptyOption:r,emptyOptionLabel:o})}function ge({id:n,sort:t,disabled:i,onChange:a,options:l,showEmptyOption:r,emptyOptionLabel:o}){return e(pe,{id:n,labelGetter:e=>e.name,disabled:i,sort:t,options:l,onChange:a,showEmptyOption:r,emptyOptionLabel:o})}function be({paging:n,totalItems:t,onPagingChanged:i}){const a=Math.ceil(t/n.size),l=e=>{n.page=e,i(d.clone(n))},r=[];if(a>1){r.push(e(z.First,{onClick:()=>l(0),disabled:0===n.page},"first")),r.push(e(z.Prev,{onClick:()=>l(n.page-1),disabled:0===n.page},"prev"));const t=Math.round(3.5);let i=n.page>t?n.page-t:0,o=i+10;o>=a&&(o=a-1),i>0&&r.push(e(z.Ellipsis,{disabled:!0},"ellipsisStart"));for(let t=i;t<=o;t++)r.push(e(z.Item,{active:t===n.page,onClick:()=>l(t),children:t+1},t));o<a-1&&r.push(e(z.Ellipsis,{disabled:!0},"ellipsisEnd")),r.push(e(z.Next,{onClick:()=>l(n.page+1),disabled:n.page===a-1},"next")),r.push(e(z.Last,{onClick:()=>l(a-1),disabled:n.page===a-1},"last"))}return e(z,{size:"sm",className:"flex-wrap m-0",children:r})}const ve=[{id:10,label:"10"},{id:100,label:"100"},{id:1e3,label:"1000"}];function fe({hover:i,showPagingOnBottom:l,showPageSizeSelection:r,striped:o,bordered:s,header:c,children:h,paging:p,totalItems:m,onPagingChanged:g}){const b=Math.ceil(m/p.size),v=u((()=>{const e=p.size;if(null===ve.find((n=>n.id===e))){const n=d.clone(ve);return n.push({id:e,label:String(e)}),n}return ve}),[p]);return e("div",{children:t(k,{hover:i,striped:o,responsive:!0,bordered:s,children:[t("thead",{children:[e("tr",{children:e("td",{colSpan:c.length,children:t("div",{className:"d-flex justify-content-between align-items-center gap-2",children:[t("div",{children:[e(K,{text:"Page"}),": ",p.page+1," / ",b]}),b>0&&e(be,{paging:p,totalItems:m,onPagingChanged:g}),t("div",{children:[e(K,{text:"Total items"}),": ",m]})]})})}),e("tr",{children:c.map(((i,l)=>{const r=!1===i.sort?"":a.isBlank(i.sort)?i.name:i.sort;if(a.isBlank(r)||!r)return e("th",{children:i.label},l);const o=p.sorting&&p.sorting.find((e=>e.name===r));return t("th",{className:"user-select-none text-nowrap",role:"button",onClick:e=>((e,n)=>{p.sorting||(p.sorting=[]);let t=p.sorting.find((e=>e.name===n));const i=t&&1===p.sorting.length;e.ctrlKey||i||(p.sorting=[],t=void 0),t?t.desc=!t.desc:p.sorting.push({name:n}),g(d.clone(p))})(e,r),children:[i.label,o?o.desc?e(B,{}):e(M,{}):e(n,{})]},l)}))})]}),e("tbody",{children:h}),m>0&&t("tfoot",{children:[l&&e("tr",{children:e("td",{colSpan:c.length,children:t("div",{className:"d-flex justify-content-between align-items-center gap-2",children:[t("div",{children:[e(K,{text:"Page"}),": ",p.page+1," / ",b]}),b>0&&e(be,{paging:p,totalItems:m,onPagingChanged:g}),t("div",{children:[e(K,{text:"Total items"}),": ",m]})]})})}),r&&e("tr",{children:e("td",{colSpan:c.length,children:t("div",{className:"d-flex align-items-center gap-2 justify-content-end",children:[t("div",{className:"text-nowrap",children:[e(K,{text:"Page size"}),":"]}),e("div",{children:e(ie,{value:p.size,options:v,onChange:e=>{p.size=e||10,g({...p})},showEmptyOption:!1})})]})})})]})]})})}function ye({disabled:n,checked:t,iconOn:i,iconOff:a,size:l,onChange:r}){const o=u((()=>t?i||e(D,{size:l}):a||e(A,{size:l,className:"text-muted"})),[t,i,a,l]);return e("div",{className:"d-flex align-items-center cursor-pointer",onClick:e=>{e.stopPropagation(),e.preventDefault(),r(!t)},children:o})}function Ce({showSelect:n,header:i,items:a,onSelect:l,onClick:r,totalItems:o,paging:s,onPagingChanged:c}){const[h,p]=v(!1),[m,f]=v(),y=g((e=>{m&&f(m.map((n=>({selected:e,item:n.item})))),p(e)}),[m]),C=u((()=>{const t=[...i];return!1!==n&&t.unshift({name:"",label:e("div",{className:"py-1",children:e(ye,{checked:h,onChange:()=>y(!h),iconOn:e(F,{})})})}),t}),[i,h,y]);return b((()=>{f(a?a.map((e=>({selected:h,item:e}))):void 0)}),[a]),b((()=>{m&&l&&l(m.filter((e=>e.selected)).map((e=>e.item)))}),[m,l]),e(fe,{header:C,hover:void 0!==r,paging:s,striped:!0,totalItems:o,onPagingChanged:c,children:m&&m.map(((a,l)=>t("tr",{className:`selectable ${r?"cursor-pointer":""} ${a.selected?"table-active table-primary":""}`,onClick:e=>{r&&r(a.item)},children:[!1!==n&&e("td",{children:e("div",{className:"py-2 d-flex align-items-center",children:e(ye,{checked:a.selected,onChange:()=>{a.selected=!a.selected,h&&!a.selected&&p(!1),f([...m])}})})}),i.map(((n,t)=>{const i=n.renderer||(l=n.name,e=>d.getNestedValue(e,l));var l;return e("td",{children:i(a.item)},t)}))]},l)))})}function we({cols:n,rows:t,size:i}){const a=u((()=>void 0===n?1:n),[n]),l=u((()=>void 0===t?20:t),[t]);return u((()=>void 0===i?"lg":i),[i]),e("div",{children:e(k,{responsive:!0,children:e("tbody",{children:Array.from({length:l},((n,t)=>e("tr",{children:Array.from({length:a},((n,t)=>e("td",{children:e("div",{className:"w-100 p-1 m-1"})},t)))},t)))})})})}function xe({value:n}){return e("div",{className:"text-nowrap",children:l.formatDateTimeForHumans(n)})}function Ne({ms:t}){return d.isEmpty(t)?e(n,{}):e("div",{className:"text-nowrap",children:l.formatDuration(t)})}function ze({date:n}){const t=u((()=>d.isEmpty(n)?null:Date.now()-n.getTime()),[n]);return e(Ne,{ms:t})}const ke=new Map([[c.error,H],[c.warning,$],[c.info,T]]);function Oe({type:n,size:t,customVariant:i}){const a=ke.get(n)||j;return e("div",{className:`d-flex align-items-center text-${void 0===i?n:i}`,children:a({size:t})})}function Se({userAlert:n,maxDurationMs:i}){return t(O,{direction:"horizontal",gap:2,className:"align-items-center",children:[n.remainsMs&&e("div",{style:{width:20},children:e(S,{min:0,max:i,now:n.remainsMs,variant:n.type})}),e("div",{children:l.formatDateForHumans(n.time)}),e(Oe,{type:n.type}),e("div",{children:n.message})]})}function Ee({userAlerts:i}){const[a,l]=v(!1),[r,o]=v(i.alerts.length),[s,d]=v([...i.visibleAlerts]),[c,h]=v(i.getSummary()),p=g((()=>{o(i.alerts.length),d(a?[...i.alerts]:[...i.visibleAlerts]),h(i.getSummary())}),[i,a]);return b((()=>{i.addOnChangeHandler(p);const e=setInterval((()=>i.updateVisibility()),100);return()=>{clearInterval(e),i.removeOnChangeHandler(p)}}),[i,p]),r<=0?e(n,{}):t("div",{className:"user-alerts border rounded bg-body text-body position-fixed text-end",style:{bottom:15,right:15,zIndex:2147483647},children:[s.length>0&&e("div",{className:"max-w-50 p-2 border-bottom",children:s.map(((n,t)=>e(Se,{userAlert:n,maxDurationMs:i.maxVisibilityMs},t)))}),e("div",{className:"p-2",children:t(O,{direction:"horizontal",gap:2,className:"justify-content-end align-items-center",children:[e(X,a?{size:"sm",variant:"primary",onClick:()=>l(!1),icon:e(U,{}),children:"Hide"}:{size:"sm",variant:"primary",onClick:()=>l(!0),icon:e(V,{}),children:"Show All"}),Array.from(c.entries()).map(((n,i)=>t(O,{direction:"horizontal",gap:1,className:"px-1 border rounded align-items-center",children:[e(Oe,{type:n[0],customVariant:0===n[1]?"muted":void 0}),e("div",{className:n[1]>0?`text-${n[0]} fw-bold`:"text-muted",children:n[1]})]},i))),e(X,{size:"sm",variant:"danger",onClick:()=>i.reset(),icon:e(I,{}),children:"Reset"})]})})]})}class Le{constructor(e){this.setProps=e}confirm(e,n,t){this.setProps({name:e,text:n,onConfirm:()=>{t(),this.setProps(void 0)},onClose:()=>this.setProps(void 0)})}}const Pe=p(new Le((()=>{})));function Ge({name:n,text:i,onClose:a,onConfirm:l}){return t(E,{show:!0,backdrop:!0,onHide:a,children:[e(E.Header,{children:n||"Confirm"}),e(E.Body,{children:i}),e(E.Footer,{children:t(O,{direction:"horizontal",children:[e(w,{variant:"link",onClick:a,children:e(K,{text:"Back"})}),e(w,{variant:"primary",onClick:l,children:e(K,{text:"Yes"})})]})})]})}function Ie({stats:n}){const i=n.heapSize,a=n.heapMaxSize,l=n.heapFreeSize,r=i-l;return t("div",{children:[t("div",{className:"d-flex align-items-center gap-2",children:[e("pre",{children:"Java Heap"}),t("pre",{children:["[",h.formatByteSize(i)," / ",h.formatByteSize(a),"]"]})]}),t("div",{className:"d-flex align-items-center gap-2",children:[e("pre",{children:"Used:"}),e(L,{className:"bg-warning text-bg-warning",children:h.formatByteSize(r)}),e("pre",{children:"Free:"}),e(L,{className:"bg-success text-white",children:h.formatByteSize(l)})]}),e("div",{className:"p-1",children:t(S,{min:0,max:a,children:[e(S,{variant:"warning",min:0,now:r,max:a}),e(S,{variant:"success",min:0,now:l,max:a})]})})]})}function Be({name:n,stats:i}){return t("div",{children:[t("div",{className:"d-flex align-items-center gap-2",children:[e("pre",{children:n}),t("pre",{children:["[",i.cachedItems,i.capacity>0&&" / ",i.capacity>0&&i.capacity,"]"]})]}),i.capacity>0&&e("div",{className:"p-1",children:e(S,{now:i.cachedItems,min:0,max:i.capacity})})]})}const Me=new Map([["Idle","secondary"],["Processing","success"],["Loading","warn"]]);function De({state:n}){const t=Me.get(n)||"light";return e(L,{className:`bg-${t} text-bg-${t}`,children:n})}function Ae({name:n,stats:i}){const a=i?i.remaining+i.processed:void 0;return t("div",{children:[t("div",{className:"d-flex align-items-center gap-2",children:[e("pre",{children:n}),t("pre",{children:["[",void 0!==i?.processed?i.processed:"?"," / ",void 0!==a?a:"?","]"]}),e(De,{state:i?i.state:"Unknown"})]}),e("div",{className:"p-1",children:i?e(S,{variant:"primary",striped:!0,animated:!0,min:0,now:i.processed,max:a||1}):e(P,{className:"w-100",animation:"glow",children:e(P,{className:"w-100"})})})]})}function Fe({children:n,center:t}){const i=u((()=>!1===t?"":"d-flex align-items-center justify-content-center"),[t]);return e("div",{className:`w-100 h-100 position-absolute ${i}`,style:{left:0,right:0,top:0,bottom:0},children:n})}export{fe as AdvancedTable,de as AutocompleteEntityIdSelect,se as AutocompleteEntitySelect,he as AutocompleteLookupIdSelect,ce as AutocompleteLookupSelect,oe as AutocompleteSelect,Be as CacheStatsControl,Ge as ConfirmDialog,Pe as ConfirmDialogContext,Le as ConfirmDialogContextData,Q as DateInput,xe as DateTime,W as DateTimeInput,ne as DeleteButton,Ne as Duration,ze as Elapsed,pe as EntityIdSelect,me as EntitySelect,ge as EntityWithNameIdSelect,ue as EntityWithNameSelect,le as EnumSelect,Y as FormRow,X as IconButton,Z as IconSwitch,Ie as JavaHeapControl,_ as LoadingButton,J as LocalizationContext,K as Localize,ae as LookupSelect,ie as NumberSelect,De as QueueStateControl,Ae as QueueStatsControl,ee as SaveButton,Fe as Spread,te as StringSelect,re as Switch,be as TablePagination,we as TablePlaceholder,Ce as TableWithSelect,q as TextInputWithReset,Oe as UserAlertTypeIcon,Se as UserAlertWidget,Ee as UserAlertsWidget};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/component/localization/LocalizationContext.ts","../src/component/localization/Localize.tsx","../src/component/forms/FormRow.tsx","../src/component/forms/TextInputWithReset.tsx","../src/component/forms/DateInput.tsx","../src/component/forms/DateTimeInput.tsx","../src/component/forms/IconButton.tsx","../src/component/forms/IconSwitch.tsx","../src/component/forms/LoadingButton.tsx","../src/component/forms/SaveButton.tsx","../src/component/forms/DeleteButton.tsx","../src/component/forms/StringSelect.tsx","../src/component/forms/NumberSelect.tsx","../src/component/forms/LookupSelect.tsx","../src/component/forms/EnumSelect.tsx","../src/component/forms/Switch.tsx","../src/component/forms/AutocompleteSelect.tsx","../src/component/forms/AutocompleteEntitySelect.tsx","../src/component/forms/AutocompleteEntityIdSelect.tsx","../src/component/forms/AutocompleteLookupSelect.tsx","../src/component/forms/AutocompleteLookupIdSelect.tsx","../src/component/forms/EntityIdSelect.tsx","../src/component/forms/EntitySelect.tsx","../src/component/forms/EntityWithNameSelect.tsx","../src/component/forms/EntityWithNameIdSelect.tsx","../src/component/tables/TablePagination.tsx","../src/component/tables/AdvancedTable.tsx","../src/component/forms/IconCheck.tsx","../src/component/tables/TableWithSelect.tsx","../src/component/tables/TablePlaceholder.tsx","../src/component/datetime/DateTime.tsx","../src/component/datetime/Duration.tsx","../src/component/datetime/Elapsed.tsx","../src/component/alerts/UserAlertTypeIcon.tsx","../src/component/alerts/UserAlertWidget.tsx","../src/component/alerts/UserAlertsWidget.tsx","../src/component/dialogs/ConfirmDialog.tsx","../src/component/stats/JavaHeapControl.tsx","../src/component/stats/CacheStatsControl.tsx","../src/component/stats/QueueStateControl.tsx","../src/component/stats/QueueStatsControl.tsx","../src/component/Spread.tsx"],"sourcesContent":["import {createContext} from \"react\";\nimport {BasicLocalization, Localization} from \"zavadil-ts-common\";\n\nexport const LocalizationContext = createContext<Localization>(new BasicLocalization());\n","import {useContext, useMemo} from \"react\";\r\nimport {LocalizationContext} from \"./LocalizationContext\";\r\nimport {TranslateParams} from \"zavadil-ts-common\";\r\n\r\nexport type LocalizeProps = {\r\n\ttext: string;\r\n\ttag?: string | Array<string>;\r\n};\r\n\r\nexport function Localize({text, tag}: LocalizeProps) {\r\n\tconst localization = useContext(LocalizationContext);\r\n\r\n\tconst p: TranslateParams | undefined = useMemo(\r\n\t\t() => {\r\n\t\t\tif (tag === undefined || tag === '') return undefined;\r\n\t\t\tif (typeof tag === 'string') return {tags: [tag]};\r\n\t\t\treturn {tags: tag};\r\n\t\t},\r\n\t\t[tag]\r\n\t);\r\n\r\n\tconst t = useMemo(\r\n\t\t() => localization.translate(text, p),\r\n\t\t[localization, text, p]\r\n\t);\r\n\treturn <>{t}</>;\r\n}\r\n\r\nexport default Localize;\r\n","import { PropsWithChildren } from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { Localize } from \"../localization\";\n\nexport type FormRowProps = PropsWithChildren & {\n label: string;\n};\n\nexport function FormRow({ label, children }: FormRowProps) {\n return (\n <Form.Group>\n <Form.Label>\n <Localize text={label} />\n </Form.Label>\n <div>{children}</div>\n </Form.Group>\n );\n}\n","import {StringUtil} from 'zavadil-ts-common';\r\nimport {Button, Form, InputGroup} from \"react-bootstrap\";\r\nimport {BsXCircle} from \"react-icons/bs\";\r\nimport {useCallback, useMemo} from \"react\";\r\n\r\nexport type TextInputWithResetProps = {\r\n\tvalue?: string | null;\r\n\tonChange: (s: string) => any;\r\n\tonReset?: () => any;\r\n\tdisabled?: boolean;\r\n\tonBlur?: () => any;\r\n\tclassName?: string;\r\n};\r\n\r\nexport function TextInputWithReset({value, onChange, onReset, onBlur, disabled, className}: TextInputWithResetProps) {\r\n\tconst actual = useMemo(\r\n\t\t() => StringUtil.getNonEmpty(value),\r\n\t\t[value]\r\n\t);\r\n\r\n\tconst isEmpty = useMemo(\r\n\t\t() => StringUtil.isBlank(value),\r\n\t\t[actual]\r\n\t);\r\n\r\n\tconst reset = useCallback(\r\n\t\t() => {\r\n\t\t\tif (onReset) {\r\n\t\t\t\tonReset();\r\n\t\t\t} else {\r\n\t\t\t\tonChange('');\r\n\t\t\t}\r\n\t\t},\r\n\t\t[onReset, onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<InputGroup className={className}>\r\n\t\t\t<Form.Control\r\n\t\t\t\ttype=\"text\"\r\n\t\t\t\tdisabled={disabled}\r\n\t\t\t\tvalue={actual}\r\n\t\t\t\tonChange={(e) => onChange(e.target.value)}\r\n\t\t\t\tonBlur={onBlur}\r\n\t\t\t/>\r\n\t\t\t<Button onClick={reset} disabled={isEmpty}>\r\n\t\t\t\t<div className=\"d-flex align-items-center\">\r\n\t\t\t\t\t<BsXCircle/>\r\n\t\t\t\t</div>\r\n\t\t\t</Button>\r\n\t\t</InputGroup>\r\n\t);\r\n}\r\n\r\nexport default TextInputWithReset;\r\n","import {DateUtil} from 'zavadil-ts-common';\r\nimport {Form} from \"react-bootstrap\";\r\n\r\nexport type DateInputProps = {\r\n\tvalue?: Date | null;\r\n\tonChange: (d: Date | undefined) => any;\r\n\tdisabled?: boolean;\r\n};\r\n\r\nexport function DateInput({value, onChange, disabled}: DateInputProps) {\r\n\treturn (\r\n\t\t<Form.Control\r\n\t\t\ttype=\"date\"\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={DateUtil.formatDateForInput(value)}\r\n\t\t\tonChange={(e) => {\r\n\t\t\t\tonChange(DateUtil.parseDate(e.target.value));\r\n\t\t\t}}\r\n\t\t/>\r\n\t);\r\n}\r\n\r\nexport default DateInput;\r\n","import {DateUtil} from 'zavadil-ts-common';\r\nimport {Form} from \"react-bootstrap\";\r\n\r\nexport type DateTimeInputProps = {\r\n\tvalue?: Date | null;\r\n\tonChange: (d: Date | undefined) => any;\r\n\tdisabled?: boolean;\r\n};\r\n\r\nexport function DateTimeInput({value, onChange, disabled}: DateTimeInputProps) {\r\n\treturn (\r\n\t\t<Form.Control\r\n\t\t\ttype=\"datetime-local\"\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={DateUtil.formatDateTimeForInput(value)}\r\n\t\t\tonChange={(e) => {\r\n\t\t\t\tonChange(DateUtil.parseDate(e.target.value));\r\n\t\t\t}}\r\n\t\t/>\r\n\t);\r\n}\r\n\r\nexport default DateTimeInput;\r\n","import {Button} from \"react-bootstrap\";\r\nimport {PropsWithChildren, ReactNode} from \"react\";\r\nimport {ButtonVariant} from \"react-bootstrap/types\";\r\n\r\nexport type IconButtonProps = {\r\n\tdisabled?: boolean;\r\n\tonClick: () => any;\r\n\tsize?: \"sm\" | \"lg\";\r\n\ticon?: ReactNode;\r\n\tvariant?: ButtonVariant;\r\n};\r\n\r\nexport function IconButton({disabled, variant, icon, size, children, onClick}: PropsWithChildren<IconButtonProps>) {\r\n\treturn (\r\n\t\t<Button disabled={disabled === true} size={size} onClick={onClick} variant={variant}>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t{icon}\r\n\t\t\t\t{\r\n\t\t\t\t\tchildren && <div>{children}</div>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</Button>\r\n\t);\r\n}\r\n\r\nexport default IconButton;\r\n","import {Form} from \"react-bootstrap\";\r\nimport {ReactNode} from \"react\";\r\n\r\nexport type IconSwitchProps = {\r\n\tdisabled?: boolean;\r\n\tchecked: boolean;\r\n\tonChange: (checked: boolean) => any;\r\n\tsize?: number;\r\n\ticonOn: ReactNode;\r\n\ticonOff: ReactNode;\r\n};\r\n\r\nexport function IconSwitch({disabled, checked, iconOn, iconOff, size, onChange}: IconSwitchProps) {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName=\"d-flex align-items-center gap-2 cursor-pointer\"\r\n\t\t\tonClick={(e) => onChange(!checked)}\r\n\t\t>\r\n\t\t\t<Form.Switch\r\n\t\t\t\tdisabled={disabled}\r\n\t\t\t\tsize={size}\r\n\t\t\t\ttype=\"switch\"\r\n\t\t\t\tchecked={checked}\r\n\t\t\t\treadOnly={true}\r\n\t\t\t\tclassName=\"cursor-pointer\"\r\n\t\t\t/>\r\n\t\t\t{\r\n\t\t\t\tchecked ? iconOn : iconOff\r\n\t\t\t}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default IconSwitch;\r\n","import {Spinner} from \"react-bootstrap\";\r\nimport {PropsWithChildren} from \"react\";\r\nimport {IconButton, IconButtonProps} from \"./IconButton\";\r\n\r\nexport type ActiveButtonProps = IconButtonProps & {\r\n\tloading?: boolean;\r\n};\r\n\r\nexport function LoadingButton({disabled, icon, loading, children, size, variant, onClick}: PropsWithChildren<ActiveButtonProps>) {\r\n\treturn (\r\n\t\t(loading === true) ?\r\n\t\t\t<IconButton disabled={true} onClick={onClick} size={size} variant={variant} icon={<Spinner size=\"sm\"/>}>{children}</IconButton>\r\n\t\t\t: <IconButton disabled={disabled} onClick={onClick} icon={icon} size={size} variant={variant}>{children}</IconButton>\r\n\t);\r\n}\r\n\r\nexport default LoadingButton;\r\n","import {PropsWithChildren, useMemo} from \"react\";\r\nimport {ActiveButtonProps, LoadingButton} from \"./LoadingButton\";\r\nimport {FaFloppyDisk} from \"react-icons/fa6\";\r\n\r\nexport type SaveButtonProps = ActiveButtonProps & {\r\n\tisChanged?: boolean;\r\n};\r\n\r\nexport function SaveButton({disabled, icon, loading, children, size, onClick, isChanged}: PropsWithChildren<SaveButtonProps>) {\r\n\tconst icn = useMemo(\r\n\t\t() => icon ? icon : <FaFloppyDisk/>,\r\n\t\t[icon]\r\n\t);\r\n\r\n\tconst content = useMemo(\r\n\t\t() => isChanged ? <strong>{children}</strong> : children,\r\n\t\t[isChanged, children]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<LoadingButton\r\n\t\t\tdisabled={disabled || (isChanged === false)}\r\n\t\t\tonClick={onClick}\r\n\t\t\ticon={icn}\r\n\t\t\tloading={loading}\r\n\t\t\tsize={size}\r\n\t\t>\r\n\t\t\t{content}\r\n\t\t</LoadingButton>\r\n\t);\r\n}\r\n","import {PropsWithChildren, useMemo} from \"react\";\r\nimport {ActiveButtonProps, LoadingButton} from \"./LoadingButton\";\r\nimport {BsTrash} from \"react-icons/bs\";\r\n\r\nexport type DeleteButtonProps = ActiveButtonProps & {\r\n\tisChanged?: boolean;\r\n};\r\n\r\nexport function DeleteButton({disabled, icon, loading, children, size, onClick, isChanged}: PropsWithChildren<DeleteButtonProps>) {\r\n\tconst icn = useMemo(\r\n\t\t() => icon ? icon : <BsTrash/>,\r\n\t\t[icon]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<LoadingButton\r\n\t\t\tdisabled={disabled || (isChanged === false)}\r\n\t\t\tonClick={onClick}\r\n\t\t\ticon={icn}\r\n\t\t\tloading={loading}\r\n\t\t\tsize={size}\r\n\t\t\tvariant=\"danger\"\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</LoadingButton>\r\n\t);\r\n}\r\n","import {Form, Spinner} from \"react-bootstrap\";\r\nimport {StringUtil} from \"zavadil-ts-common\";\r\nimport {useEffect} from \"react\";\r\n\r\nexport type GenericSelectOption<T> = {\r\n\tid?: T | null;\r\n\tlabel: string;\r\n}\r\n\r\nexport type GenericSelectProps<T> = {\r\n\tvalue?: T | null;\r\n\toptions: Array<GenericSelectOption<T>>;\r\n\tonChange: (id: T | null | undefined) => any;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n}\r\n\r\nexport type StringSelectProps = GenericSelectProps<string>;\r\n\r\nexport function StringSelect({value, options, disabled, onChange, showEmptyOption, emptyOptionLabel}: StringSelectProps) {\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tif (StringUtil.isBlank(value)) {\r\n\t\t\t\tif (options.length > 0 && showEmptyOption !== true) {\r\n\t\t\t\t\tonChange(options[0].id);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t[value, options, showEmptyOption, onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<Form.Select\r\n\t\t\tvalue={value || ''}\r\n\t\t\tonChange={(e) => onChange(e.target.value)}\r\n\t\t\tdisabled={disabled}\r\n\t\t>\r\n\t\t\t{\r\n\t\t\t\t(showEmptyOption === true) && (\r\n\t\t\t\t\t<option key={\"\"} value={\"\"}>{emptyOptionLabel || ''}</option>\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t\t{\r\n\t\t\t\toptions ?\r\n\t\t\t\t\toptions.map(\r\n\t\t\t\t\t\t(o, i) => <option key={i} value={o.id || ''}>{o.label || ''}</option>\r\n\t\t\t\t\t) : <span><Spinner/></span>\r\n\t\t\t}\r\n\t\t</Form.Select>\r\n\t)\r\n}\r\n","import {useCallback, useMemo} from \"react\";\r\nimport {NumberUtil} from \"zavadil-ts-common\";\r\nimport {GenericSelectProps, StringSelect} from \"./StringSelect\";\r\n\r\nexport type NumberSelectProps = GenericSelectProps<number>;\r\n\r\nexport function NumberSelect({value, options, disabled, onChange, showEmptyOption, emptyOptionLabel}: NumberSelectProps) {\r\n\tconst nValue = useMemo(\r\n\t\t() => {\r\n\t\t\tif (!value) return '';\r\n\t\t\treturn String(value);\r\n\t\t},\r\n\t\t[value]\r\n\t);\r\n\r\n\tconst nOptions = useMemo(\r\n\t\t() => {\r\n\t\t\tif (!options) return [];\r\n\t\t\treturn options.map(\r\n\t\t\t\t(o) => {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tid: o.id ? String(o.id) : '',\r\n\t\t\t\t\t\tlabel: o.label\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t},\r\n\t\t[options]\r\n\t);\r\n\r\n\tconst nChange = useCallback(\r\n\t\t(s: string | null | undefined) => onChange(NumberUtil.parseNumber(s)),\r\n\t\t[onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<StringSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={nValue}\r\n\t\t\toptions={nOptions}\r\n\t\t\tonChange={nChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useMemo} from \"react\";\r\nimport {NumberSelect} from \"./NumberSelect\";\r\nimport {LookupTableEntity} from \"zavadil-ts-common\";\r\nimport {GenericSelectOption} from \"./StringSelect\";\r\n\r\nexport type LookupSelectProps = {\r\n\tid?: number | null;\r\n\tonChange: (n: number | null | undefined) => any;\r\n\toptions?: Array<LookupTableEntity> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n\tlabelGetter?: <T extends LookupTableEntity>(item: T) => string;\r\n}\r\n\r\nexport function LookupSelect({id, sort, disabled, labelGetter, onChange, options, showEmptyOption, emptyOptionLabel}: LookupSelectProps) {\r\n\tconst lOptions: GenericSelectOption<number>[] = useMemo(\r\n\t\t() => {\r\n\t\t\tlet result: Array<LookupTableEntity> = []\r\n\t\t\tif (options) {\r\n\t\t\t\tresult = sort ? options.sort((a, b) => a.name > b.name ? 1 : -1) : options;\r\n\t\t\t}\r\n\t\t\treturn result\r\n\t\t\t\t.map(\r\n\t\t\t\t\t(o) => {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tid: o.id,\r\n\t\t\t\t\t\t\tlabel: labelGetter ? labelGetter(o) : o.name\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t},\r\n\t\t[options]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<NumberSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={id}\r\n\t\t\toptions={lOptions}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useMemo} from \"react\";\r\nimport {StringSelect} from \"./StringSelect\";\r\n\r\nexport type EnumSelectProps = {\r\n\tvalue?: string | null;\r\n\toptions: Array<string>;\r\n\tonChange: (id: string | null | undefined) => any;\r\n\tshowEmptyOption?: boolean;\r\n\temptyOptionLabel?: string;\r\n};\r\n\r\nexport function EnumSelect({value, options, onChange, showEmptyOption, emptyOptionLabel}: EnumSelectProps) {\r\n\tconst nOptions = useMemo(\r\n\t\t() => {\r\n\t\t\tif (!options) return [];\r\n\t\t\treturn options.map(\r\n\t\t\t\t(s) => {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tid: s,\r\n\t\t\t\t\t\tlabel: s\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t},\r\n\t\t[options]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<StringSelect\r\n\t\t\tvalue={value}\r\n\t\t\toptions={nOptions}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import { Form } from \"react-bootstrap\";\nimport { useMemo, ReactNode } from \"react\";\nimport { StringUtil } from \"zavadil-ts-common\";\n\nexport type SwitchProps = {\n id?: string;\n disabled?: boolean;\n checked: boolean;\n onChange: (checked: boolean) => any;\n size?: number;\n label?: string | ReactNode;\n};\n\nexport function Switch({\n id,\n label,\n disabled,\n checked,\n size,\n onChange,\n}: SwitchProps) {\n const actualId = useMemo(() => (id ? id : StringUtil.randomString()), [id]);\n return (\n <Form.Switch\n disabled={disabled}\n id={actualId}\n size={size}\n type=\"switch\"\n checked={checked}\n onChange={(e) => onChange(!checked)}\n className=\"cursor-pointer\"\n label={label}\n />\n );\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from \"react\";\r\nimport {CancellablePromise, EntityBase} from \"zavadil-ts-common\";\r\nimport TextInputWithReset from \"./TextInputWithReset\";\r\nimport {Dropdown} from \"react-bootstrap\";\r\n\r\nexport type AutocompleteSelectProps<T extends EntityBase> = {\r\n\tselected?: T | null;\r\n\tonChange: (e: T | null) => any;\r\n\tonSearch: (text: string) => Promise<Array<T>>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteSelect<T extends EntityBase>({selected, disabled, labelGetter, onChange, onSearch}: AutocompleteSelectProps<T>) {\r\n\tconst [searchPromise, setSearchPromise] = useState<CancellablePromise>();\r\n\tconst [searchText, setSearchText] = useState<string>();\r\n\tconst [itemSelection, setItemSelection] = useState<Array<T>>();\r\n\tconst blurTimeout = useRef<number>();\r\n\r\n\tconst finalLabelGetter = useCallback(\r\n\t\t(item: T) => {\r\n\t\t\tif (labelGetter) return labelGetter(item);\r\n\t\t\tif ('name' in item && typeof item.name === 'string') return item.name;\r\n\t\t\treturn `[${item.id}]`;\r\n\t\t},\r\n\t\t[labelGetter]\r\n\t);\r\n\r\n\tconst finalCss = useMemo(\r\n\t\t() => selected ? 'border rounded border-primary' : undefined,\r\n\t\t[selected]\r\n\t);\r\n\r\n\tconst userLeftControl = useCallback(\r\n\t\t() => {\r\n\t\t\tconsole.log('user left control');\r\n\t\t\tif (itemSelection) {\r\n\t\t\t\tsetItemSelection(undefined);\r\n\t\t\t\tsetSearchText(selected ? finalLabelGetter(selected) : '');\r\n\t\t\t}\r\n\t\t},\r\n\t\t[onChange, itemSelection, selected, finalLabelGetter]\r\n\t);\r\n\r\n\tconst startBlur = useCallback(\r\n\t\t() => {\r\n\t\t\tblurTimeout.current = window.setTimeout(userLeftControl, 100);\r\n\t\t},\r\n\t\t[blurTimeout, userLeftControl]\r\n\t);\r\n\r\n\tconst cancelBlur = useCallback(\r\n\t\t() => {\r\n\t\t\tif (blurTimeout.current) {\r\n\t\t\t\tclearTimeout(blurTimeout.current);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[blurTimeout]\r\n\t);\r\n\r\n\t// Clean up the timeout when the component unmounts\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\treturn cancelBlur;\r\n\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tsetSearchText(selected ? finalLabelGetter(selected) : '');\r\n\t\t\tif (searchPromise) {\r\n\t\t\t\tsearchPromise.cancel();\r\n\t\t\t\tsetSearchPromise(undefined);\r\n\t\t\t}\r\n\t\t\tsetItemSelection(undefined);\r\n\t\t},\r\n\t\t[selected]\r\n\t);\r\n\r\n\tconst reset = useCallback(\r\n\t\t() => {\r\n\t\t\tonChange(null)\r\n\t\t\tsetSearchText('');\r\n\t\t\tif (searchPromise) {\r\n\t\t\t\tsearchPromise.cancel();\r\n\t\t\t\tsetSearchPromise(undefined);\r\n\t\t\t}\r\n\t\t\tsetItemSelection(undefined);\r\n\t\t},\r\n\t\t[onChange, searchPromise]\r\n\t);\r\n\r\n\tconst userChangedText = useCallback(\r\n\t\t(s: string) => {\r\n\t\t\tsetSearchText(s);\r\n\t\t\tif (searchPromise) {\r\n\t\t\t\tsearchPromise.cancel();\r\n\t\t\t}\r\n\t\t\tconst cancellable = new CancellablePromise(onSearch(s));\r\n\t\t\tcancellable.promise.then(setItemSelection);\r\n\t\t\tsetSearchPromise(cancellable);\r\n\t\t},\r\n\t\t[searchPromise, onSearch]\r\n\t);\r\n\r\n\r\n\tconst userSelectedItem = useCallback(\r\n\t\t(item: T) => {\r\n\t\t\tconsole.log('user selected item');\r\n\t\t\tsetItemSelection(undefined);\r\n\t\t\tonChange({...item});\r\n\t\t},\r\n\t\t[onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<div onBlur={startBlur} onFocus={cancelBlur}>\r\n\t\t\t<Dropdown defaultShow={false} show={itemSelection !== null}>\r\n\t\t\t\t<TextInputWithReset\r\n\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\tvalue={searchText}\r\n\t\t\t\t\tonChange={userChangedText}\r\n\t\t\t\t\tonReset={reset}\r\n\t\t\t\t\tclassName={finalCss}\r\n\t\t\t\t/>\r\n\t\t\t\t{\r\n\t\t\t\t\titemSelection &&\r\n\t\t\t\t\t<Dropdown.Menu>\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\titemSelection.map(\r\n\t\t\t\t\t\t\t\t(item) => <Dropdown.Item\r\n\t\t\t\t\t\t\t\t\tkey={item.id}\r\n\t\t\t\t\t\t\t\t\tonClick={\r\n\t\t\t\t\t\t\t\t\t\t(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\tcancelBlur();\r\n\t\t\t\t\t\t\t\t\t\t\tuserSelectedItem(item);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tactive={item.id === selected?.id}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{finalLabelGetter(item)}\r\n\t\t\t\t\t\t\t\t</Dropdown.Item>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</Dropdown.Menu>\r\n\t\t\t\t}\r\n\t\t\t</Dropdown>\r\n\t\t</div>\r\n\t);\r\n}\r\n","import {useCallback} from \"react\";\r\nimport {EntityBase, EntityClient, StringUtil} from \"zavadil-ts-common\";\r\nimport {AutocompleteSelect} from \"./AutocompleteSelect\";\r\n\r\nexport type AutocompleteEntitySelectProps<T extends EntityBase> = {\r\n\tselected?: T | null;\r\n\tonChange: (e: T | null) => any;\r\n\tentityClient: EntityClient<T>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteEntitySelect<T extends EntityBase>({\r\n\tselected,\r\n\tdisabled,\r\n\tlabelGetter,\r\n\tonChange,\r\n\tentityClient\r\n}: AutocompleteEntitySelectProps<T>) {\r\n\r\n\tconst search = useCallback(\r\n\t\t(s: string) => entityClient\r\n\t\t\t.loadPage({search: StringUtil.safeLowercase(s), page: 0, size: 10, sorting: [{name: 'id'}]})\r\n\t\t\t.then((p) => p.content),\r\n\t\t[labelGetter]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<AutocompleteSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tselected={selected}\r\n\t\t\tlabelGetter={labelGetter}\r\n\t\t\tonSearch={search}\r\n\t\t\tonChange={onChange}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useCallback, useEffect, useState} from \"react\";\r\nimport {EntityBase, EntityClient, EntityClientWithStub} from \"zavadil-ts-common\";\r\nimport {AutocompleteEntitySelect} from \"./AutocompleteEntitySelect\";\r\n\r\nexport type AutocompleteIdSelectProps<T extends EntityBase, TStub extends EntityBase> = {\r\n\tid?: number | null;\r\n\tonChange: (id?: number | null) => any;\r\n\tentityClient: EntityClient<T> | EntityClientWithStub<T, TStub>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteEntityIdSelect<T extends EntityBase, TStub extends EntityBase>({\r\n\tid,\r\n\tdisabled,\r\n\tlabelGetter,\r\n\tonChange,\r\n\tentityClient\r\n}: AutocompleteIdSelectProps<T, TStub>) {\r\n\tconst [selected, setSelected] = useState<T | null>(null);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tif (!id) {\r\n\t\t\t\tsetSelected(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (selected && selected.id === id) {\r\n\t\t\t\tsetSelected({...selected});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (entityClient instanceof EntityClientWithStub) {\r\n\t\t\t\tentityClient.loadSingleStub(id).then(setSelected);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tentityClient.loadSingle(id).then(setSelected);\r\n\t\t},\r\n\t\t[id]\r\n\t);\r\n\r\n\tconst selectionChanged = useCallback(\r\n\t\t(s: T | null) => {\r\n\t\t\tconst nId = s ? s.id : null;\r\n\t\t\tif (nId !== id) onChange(nId);\r\n\t\t\tsetSelected(s);\r\n\t\t},\r\n\t\t[id, onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<AutocompleteEntitySelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tselected={selected}\r\n\t\t\tlabelGetter={labelGetter}\r\n\t\t\tentityClient={entityClient}\r\n\t\t\tonChange={selectionChanged}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useCallback, useMemo} from \"react\";\r\nimport {LookupClient, LookupTableEntity, StringUtil} from \"zavadil-ts-common\";\r\nimport {AutocompleteSelect} from \"./AutocompleteSelect\";\r\n\r\nexport type AutocompleteLookupSelectProps<T extends LookupTableEntity> = {\r\n\tselected?: T | null;\r\n\tonChange: (e: T | null) => any;\r\n\tlookupClient: LookupClient<T>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteLookupSelect<T extends LookupTableEntity>({\r\n\tselected,\r\n\tdisabled,\r\n\tlabelGetter,\r\n\tonChange,\r\n\tlookupClient\r\n}: AutocompleteLookupSelectProps<T>) {\r\n\tconst finalLabelGetter = useMemo(\r\n\t\t() => labelGetter ? labelGetter : (item: LookupTableEntity) => item.name,\r\n\t\t[labelGetter]\r\n\t);\r\n\r\n\tconst search = useCallback(\r\n\t\t(s: string) => lookupClient\r\n\t\t\t.loadPage({search: StringUtil.safeLowercase(s), page: 0, size: 10, sorting: [{name: 'name'}]})\r\n\t\t\t.then((p) => p.content),\r\n\t\t[labelGetter]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<AutocompleteSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tselected={selected}\r\n\t\t\tlabelGetter={finalLabelGetter}\r\n\t\t\tonSearch={search}\r\n\t\t\tonChange={onChange}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useCallback, useEffect, useState} from \"react\";\r\nimport {LookupClient, LookupTableEntity} from \"zavadil-ts-common\";\r\nimport {AutocompleteLookupSelect} from \"./AutocompleteLookupSelect\";\r\n\r\nexport type AutocompleteLookupIdSelectProps<T extends LookupTableEntity> = {\r\n\tid?: number | null;\r\n\tonChange: (id?: number | null) => any;\r\n\tlookupClient: LookupClient<T>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteLookupIdSelect<T extends LookupTableEntity>({\r\n\tid,\r\n\tdisabled,\r\n\tlabelGetter,\r\n\tonChange,\r\n\tlookupClient\r\n}: AutocompleteLookupIdSelectProps<T>) {\r\n\tconst [selected, setSelected] = useState<T | null>(null);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tif (!id) {\r\n\t\t\t\tsetSelected(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (selected && selected.id === id) {\r\n\t\t\t\tsetSelected({...selected});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tlookupClient.loadSingle(id).then(setSelected);\r\n\t\t},\r\n\t\t[id]\r\n\t);\r\n\r\n\tconst selectionChanged = useCallback(\r\n\t\t(s: T | null) => {\r\n\t\t\tconst nId = s ? s.id : null;\r\n\t\t\tif (nId !== id) onChange(nId);\r\n\t\t\tsetSelected(s);\r\n\t\t},\r\n\t\t[id, selected]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<AutocompleteLookupSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tselected={selected}\r\n\t\t\tlabelGetter={labelGetter}\r\n\t\t\tlookupClient={lookupClient}\r\n\t\t\tonChange={selectionChanged}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useMemo} from \"react\";\r\nimport {NumberSelect} from \"./NumberSelect\";\r\nimport {EntityBase} from \"zavadil-ts-common\";\r\nimport {GenericSelectOption} from \"./StringSelect\";\r\n\r\nexport type EntityIdSelectProps<T extends EntityBase> = {\r\n\tid?: number | null;\r\n\tonChange: (n: number | null | undefined) => any;\r\n\toptions?: Array<T> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n\tlabelGetter: (item: T) => string;\r\n}\r\n\r\nexport function EntityIdSelect<T extends EntityBase>(\r\n\t{id, sort, disabled, labelGetter, onChange, options, showEmptyOption, emptyOptionLabel}: EntityIdSelectProps<T>\r\n) {\r\n\tconst lOptions: GenericSelectOption<number>[] = useMemo(\r\n\t\t() => {\r\n\t\t\tlet result: Array<T> = []\r\n\t\t\tif (options) {\r\n\t\t\t\tresult = sort ? options.sort((a, b) => labelGetter(a) > labelGetter(b) ? 1 : -1) : options;\r\n\t\t\t}\r\n\t\t\treturn result\r\n\t\t\t\t.map(\r\n\t\t\t\t\t(o) => {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tid: o.id,\r\n\t\t\t\t\t\t\tlabel: labelGetter(o)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t},\r\n\t\t[options]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<NumberSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={id}\r\n\t\t\toptions={lOptions}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {EntityBase} from \"zavadil-ts-common\";\r\nimport {EntityIdSelect} from \"./EntityIdSelect\";\r\n\r\nexport type EntitySelectProps<T extends EntityBase> = {\r\n\tvalue?: T | null;\r\n\tonChange: (e: T | null | undefined) => any;\r\n\toptions?: Array<T> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n\tlabelGetter: (item: T) => string;\r\n}\r\n\r\nexport function EntitySelect<T extends EntityBase>(\r\n\t{value, sort, disabled, labelGetter, onChange, options, showEmptyOption, emptyOptionLabel}: EntitySelectProps<T>\r\n) {\r\n\r\n\treturn (\r\n\t\t<EntityIdSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tid={value ? value.id : null}\r\n\t\t\toptions={options}\r\n\t\t\tsort={sort}\r\n\t\t\tonChange={\r\n\t\t\t\t(id) => {\r\n\t\t\t\t\tif (!options || !id) {\r\n\t\t\t\t\t\tonChange(undefined);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonChange(options.find((o) => o.id === id));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlabelGetter={labelGetter}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {EntityWithName} from \"zavadil-ts-common\";\r\nimport {EntitySelect} from \"./EntitySelect\";\r\n\r\nexport type EntityWithNameSelectProps<T extends EntityWithName> = {\r\n\tvalue?: T | null;\r\n\tonChange: (e: T | null | undefined) => any;\r\n\toptions?: Array<T> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n}\r\n\r\nexport function EntityWithNameSelect<T extends EntityWithName>(\r\n\t{value, sort, disabled, onChange, options, showEmptyOption, emptyOptionLabel}: EntityWithNameSelectProps<T>\r\n) {\r\n\treturn (\r\n\t\t<EntitySelect\r\n\t\t\tvalue={value}\r\n\t\t\tlabelGetter={(e) => e.name}\r\n\t\t\tdisabled={disabled}\r\n\t\t\tsort={sort}\r\n\t\t\toptions={options}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {EntityWithName} from \"zavadil-ts-common\";\r\nimport {EntityIdSelect} from \"./EntityIdSelect\";\r\n\r\nexport type EntityWithNameIdSelectProps<T extends EntityWithName> = {\r\n\tid?: number | null;\r\n\tonChange: (n: number | null | undefined) => any;\r\n\toptions?: Array<T> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n}\r\n\r\nexport function EntityWithNameIdSelect<T extends EntityWithName>(\r\n\t{id, sort, disabled, onChange, options, showEmptyOption, emptyOptionLabel}: EntityWithNameIdSelectProps<T>\r\n) {\r\n\treturn (\r\n\t\t<EntityIdSelect\r\n\t\t\tid={id}\r\n\t\t\tlabelGetter={(e) => e.name}\r\n\t\t\tdisabled={disabled}\r\n\t\t\tsort={sort}\r\n\t\t\toptions={options}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {ObjectUtil, PagingRequest} from 'zavadil-ts-common';\r\nimport React from 'react';\r\nimport {Pagination} from \"react-bootstrap\";\r\n\r\nconst MAX_DISPLAY_PAGES = 10;\r\n\r\nexport type TablePaginationProps = {\r\n\tpaging: PagingRequest;\r\n\ttotalItems: number;\r\n\tonPagingChanged: (p: PagingRequest) => any\r\n};\r\n\r\nexport function TablePagination({\r\n\tpaging,\r\n\ttotalItems,\r\n\tonPagingChanged\r\n}: TablePaginationProps) {\r\n\tconst totalPages = Math.ceil(totalItems / paging.size);\r\n\r\n\tconst pageChanged = (page: number) => {\r\n\t\tpaging.page = page;\r\n\t\tonPagingChanged(ObjectUtil.clone(paging));\r\n\t}\r\n\r\n\tconst paginationItems = [];\r\n\r\n\tif (totalPages > 1) {\r\n\t\tpaginationItems.push(<Pagination.First key=\"first\" onClick={() => pageChanged(0)} disabled={paging.page === 0}/>);\r\n\t\tpaginationItems.push(<Pagination.Prev key=\"prev\" onClick={() => pageChanged(paging.page - 1)} disabled={paging.page === 0}/>);\r\n\r\n\t\tconst maxPagesSide = Math.round((MAX_DISPLAY_PAGES - 3) / 2);\r\n\r\n\t\tlet start = (paging.page > maxPagesSide) ? paging.page - maxPagesSide : 0;\r\n\t\tlet end = start + MAX_DISPLAY_PAGES;\r\n\r\n\t\tif (end >= totalPages) {\r\n\t\t\tend = totalPages - 1;\r\n\t\t}\r\n\r\n\t\tif (start > 0) {\r\n\t\t\tpaginationItems.push(<Pagination.Ellipsis key=\"ellipsisStart\" disabled={true}/>);\r\n\t\t}\r\n\r\n\t\tfor (let number = start; number <= end; number++) {\r\n\t\t\tpaginationItems.push(\r\n\t\t\t\t<Pagination.Item key={number} active={number === paging.page} onClick={() => pageChanged(number)}>\r\n\t\t\t\t\t{number + 1}\r\n\t\t\t\t</Pagination.Item>,\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (end < (totalPages - 1)) {\r\n\t\t\tpaginationItems.push(<Pagination.Ellipsis key=\"ellipsisEnd\" disabled={true}/>);\r\n\t\t}\r\n\r\n\t\tpaginationItems.push(<Pagination.Next key=\"next\" onClick={() => pageChanged(paging.page + 1)} disabled={paging.page === (totalPages - 1)}/>);\r\n\t\tpaginationItems.push(<Pagination.Last key=\"last\" onClick={() => pageChanged(totalPages - 1)} disabled={paging.page === (totalPages - 1)}/>);\r\n\t}\r\n\r\n\treturn <Pagination size=\"sm\" className=\"flex-wrap m-0\">{paginationItems}</Pagination>\r\n}\r\n\r\nexport default TablePagination;\r\n","import {ObjectUtil, PagingRequest, StringUtil} from 'zavadil-ts-common';\r\nimport React, {PropsWithChildren, useMemo} from 'react';\r\nimport {Table} from \"react-bootstrap\";\r\nimport {BsFillCaretDownFill, BsFillCaretUpFill} from 'react-icons/bs';\r\nimport {TableHeader} from \"./TableTypes\";\r\nimport {NumberSelect} from \"../forms\";\r\nimport Localize from \"../localization/Localize\";\r\nimport TablePagination from \"./TablePagination\";\r\n\r\nconst DEFAULT_SIZES = [\r\n\t{\r\n\t\tid: 10,\r\n\t\tlabel: '10'\r\n\t},\r\n\t{\r\n\t\tid: 100,\r\n\t\tlabel: '100'\r\n\t},\r\n\t{\r\n\t\tid: 1000,\r\n\t\tlabel: '1000'\r\n\t}\r\n];\r\n\r\nexport type AdvancedTableProps = {\r\n\theader: TableHeader;\r\n\tlanguage?: \"cs\" | \"en\";\r\n\tpaging: PagingRequest;\r\n\ttotalItems: number;\r\n\thover?: boolean;\r\n\tshowPagingOnBottom?: boolean;\r\n\tshowPageSizeSelection?: boolean;\r\n\tstriped?: boolean;\r\n\tbordered?: boolean;\r\n\tonPagingChanged: (p: PagingRequest) => any\r\n};\r\n\r\nexport function AdvancedTable({\r\n\thover,\r\n\tshowPagingOnBottom,\r\n\tshowPageSizeSelection,\r\n\tstriped,\r\n\tbordered,\r\n\theader,\r\n\tchildren,\r\n\tpaging,\r\n\ttotalItems,\r\n\tonPagingChanged\r\n}: PropsWithChildren<AdvancedTableProps>) {\r\n\tconst totalPages = Math.ceil(totalItems / paging.size);\r\n\r\n\tconst sizes = useMemo(\r\n\t\t() => {\r\n\t\t\tconst s = paging.size;\r\n\t\t\tif (DEFAULT_SIZES.find((si) => si.id === s) === null) {\r\n\t\t\t\tconst ss = ObjectUtil.clone(DEFAULT_SIZES);\r\n\t\t\t\tss.push({id: s, label: String(s)});\r\n\t\t\t\treturn ss;\r\n\t\t\t}\r\n\t\t\treturn DEFAULT_SIZES;\r\n\t\t},\r\n\t\t[paging]\r\n\t);\r\n\r\n\tconst sortingChanged = (e: React.MouseEvent<HTMLTableCellElement>, fieldName: string) => {\r\n\t\tif (!paging.sorting) paging.sorting = [];\r\n\t\tlet field = paging.sorting.find((f) => f.name === fieldName);\r\n\t\tconst isSoleField = field && paging.sorting.length === 1;\r\n\t\tif (!(e.ctrlKey || isSoleField)) {\r\n\t\t\tpaging.sorting = [];\r\n\t\t\tfield = undefined;\r\n\t\t}\r\n\t\tif (field) {\r\n\t\t\tfield.desc = !field.desc;\r\n\t\t} else {\r\n\t\t\tpaging.sorting.push({name: fieldName});\r\n\t\t}\r\n\t\tonPagingChanged(ObjectUtil.clone(paging));\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<Table hover={hover} striped={striped} responsive bordered={bordered}>\r\n\t\t\t\t<thead>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<td colSpan={header.length}>\r\n\t\t\t\t\t\t<div className=\"d-flex justify-content-between align-items-center gap-2\">\r\n\t\t\t\t\t\t\t<div><Localize text='Page'/>: {paging.page + 1} / {totalPages}</div>\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ttotalPages > 0 && <TablePagination paging={paging} totalItems={totalItems} onPagingChanged={onPagingChanged}/>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t<div><Localize text='Total items'/>: {totalItems}</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\theader.map(\r\n\t\t\t\t\t\t\t(h, index) => {\r\n\t\t\t\t\t\t\t\tconst sortBy = h.sort === false ? '' : (StringUtil.isBlank(h.sort) ? h.name : h.sort);\r\n\t\t\t\t\t\t\t\tif (StringUtil.isBlank(sortBy) || (!sortBy)) {\r\n\t\t\t\t\t\t\t\t\treturn <th key={index}>{h.label}</th>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tconst field = paging.sorting && paging.sorting.find((s) => s.name === sortBy);\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<th\r\n\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"user-select-none text-nowrap\"\r\n\t\t\t\t\t\t\t\t\t\trole=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={(e: React.MouseEvent<HTMLTableCellElement>) => sortingChanged(e, sortBy)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{h.label}\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\tfield ? field.desc ? <BsFillCaretDownFill/> : <BsFillCaretUpFill/> : <></>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\t\t\t\t<tbody>\r\n\t\t\t\t{children}\r\n\t\t\t\t</tbody>\r\n\t\t\t\t{\r\n\t\t\t\t\ttotalItems > 0 && <tfoot>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshowPagingOnBottom &&\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td colSpan={header.length}>\r\n\t\t\t\t\t\t\t\t<div className=\"d-flex justify-content-between align-items-center gap-2\">\r\n\t\t\t\t\t\t\t\t\t<div><Localize text='Page'/>: {paging.page + 1} / {totalPages}</div>\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\ttotalPages > 0 && <TablePagination paging={paging} totalItems={totalItems} onPagingChanged={onPagingChanged}/>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t<div><Localize text='Total items'/>: {totalItems}</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshowPageSizeSelection &&\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td colSpan={header.length}>\r\n\t\t\t\t\t\t\t\t<div className=\"d-flex align-items-center gap-2 justify-content-end\">\r\n\t\t\t\t\t\t\t\t\t<div className=\"text-nowrap\"><Localize text='Page size'/>:</div>\r\n\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t<NumberSelect\r\n\t\t\t\t\t\t\t\t\t\t\tvalue={paging.size}\r\n\t\t\t\t\t\t\t\t\t\t\toptions={sizes}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={\r\n\t\t\t\t\t\t\t\t\t\t\t\t(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpaging.size = e || 10\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonPagingChanged({...paging});\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tshowEmptyOption={false}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t</tfoot>\r\n\t\t\t\t}\r\n\t\t\t</Table>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default AdvancedTable;\r\n","import {ReactNode, useMemo} from \"react\";\r\nimport {SwitchProps} from \"./Switch\";\r\nimport {BsCheckCircle, BsCircle} from \"react-icons/bs\";\r\n\r\nexport type IconCheckProps = SwitchProps & {\r\n\ticonOn?: ReactNode;\r\n\ticonOff?: ReactNode;\r\n};\r\n\r\nexport function IconCheck({disabled, checked, iconOn, iconOff, size, onChange}: IconCheckProps) {\r\n\tconst renderedIcon = useMemo(\r\n\t\t() => checked ? (iconOn ? iconOn : <BsCheckCircle size={size}/>) : (iconOff ? iconOff : <BsCircle size={size} className=\"text-muted\"/>),\r\n\t\t[checked, iconOn, iconOff, size]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName=\"d-flex align-items-center cursor-pointer\"\r\n\t\t\tonClick={(e) => {\r\n\t\t\t\te.stopPropagation();\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tonChange(!checked)\r\n\t\t\t}\r\n\t\t\t}\r\n\t\t>\r\n\t\t\t{renderedIcon}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default IconCheck;\r\n","import React, {useCallback, useEffect, useMemo, useState} from 'react';\r\nimport {ObjectUtil} from 'zavadil-ts-common';\r\nimport {AdvancedTable, AdvancedTableProps} from \"./AdvancedTable\";\r\nimport {RenderFunc, SelectableTableHeader, TableHeader} from \"./TableTypes\";\r\nimport {BsCheckAll} from \"react-icons/bs\";\r\nimport IconCheck from \"../forms/IconCheck\";\r\n\r\nexport type SelectableItem<T> = {\r\n\tselected: boolean;\r\n\titem: T;\r\n};\r\n\r\nexport type TableWithSelectProps<T> = Omit<AdvancedTableProps, 'header'> & {\r\n\tshowSelect?: boolean;\r\n\theader: SelectableTableHeader<T>;\r\n\titems?: Array<T>;\r\n\tonSelect?: (selected: Array<T>) => any;\r\n\tonClick?: (selected: T) => any;\r\n};\r\n\r\nfunction createRenderer<T>(name: string): RenderFunc<T> {\r\n\treturn (e: T) => ObjectUtil.getNestedValue(e, name);\r\n}\r\n\r\nexport function TableWithSelect<T>({\r\n\tshowSelect,\r\n\theader,\r\n\titems,\r\n\tonSelect,\r\n\tonClick,\r\n\ttotalItems,\r\n\tpaging,\r\n\tonPagingChanged\r\n}: TableWithSelectProps<T>) {\r\n\tconst [selectAll, setSelectAll] = useState<boolean>(false);\r\n\tconst [selectableItems, setSelectableItems] = useState<Array<SelectableItem<T>>>();\r\n\r\n\tconst updateSelectAll = useCallback(\r\n\t\t(sa: boolean) => {\r\n\t\t\tif (selectableItems) {\r\n\t\t\t\tsetSelectableItems(selectableItems.map(\r\n\t\t\t\t\t(i) => {\r\n\t\t\t\t\t\treturn {selected: sa, item: i.item};\r\n\t\t\t\t\t}\r\n\t\t\t\t));\r\n\t\t\t}\r\n\t\t\tsetSelectAll(sa);\r\n\t\t},\r\n\t\t[selectableItems]\r\n\t);\r\n\r\n\tconst selectableHeader = useMemo(\r\n\t\t() => {\r\n\t\t\tconst h: TableHeader = [...header];\r\n\t\t\tif (showSelect !== false) {\r\n\t\t\t\th.unshift(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: '',\r\n\t\t\t\t\t\tlabel: <div className=\"py-1\">\r\n\t\t\t\t\t\t\t<IconCheck\r\n\t\t\t\t\t\t\t\tchecked={selectAll}\r\n\t\t\t\t\t\t\t\tonChange={\r\n\t\t\t\t\t\t\t\t\t() => updateSelectAll(!selectAll)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\ticonOn={<BsCheckAll/>}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\treturn h;\r\n\t\t},\r\n\t\t[header, selectAll, updateSelectAll]\r\n\t);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tsetSelectableItems(items ? items.map(\r\n\t\t\t\t(i) => {\r\n\t\t\t\t\treturn {selected: selectAll, item: i};\r\n\t\t\t\t}\r\n\t\t\t) : undefined);\r\n\t\t},\r\n\t\t[items]\r\n\t);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tif (!selectableItems) return;\r\n\t\t\tif (!onSelect) return;\r\n\t\t\tonSelect(selectableItems.filter((i) => i.selected).map((i) => i.item));\r\n\t\t},\r\n\t\t[selectableItems, onSelect]\r\n\t);\r\n\r\n\treturn <AdvancedTable\r\n\t\theader={selectableHeader}\r\n\t\thover={onClick !== undefined}\r\n\t\tpaging={paging}\r\n\t\tstriped={true}\r\n\t\ttotalItems={totalItems}\r\n\t\tonPagingChanged={onPagingChanged}\r\n\t>\r\n\t\t{\r\n\t\t\tselectableItems && selectableItems.map(\r\n\t\t\t\t(item, index) => <tr\r\n\t\t\t\t\tkey={index}\r\n\t\t\t\t\tclassName={`selectable ${onClick ? 'cursor-pointer' : ''} ${item.selected ? 'table-active table-primary' : ''}`}\r\n\t\t\t\t\tonClick={\r\n\t\t\t\t\t\t(e) => {\r\n\t\t\t\t\t\t\tif (onClick) onClick(item.item);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t(showSelect !== false) && <td>\r\n\t\t\t\t\t\t\t<div className=\"py-2 d-flex align-items-center\">\r\n\t\t\t\t\t\t\t\t<IconCheck\r\n\t\t\t\t\t\t\t\t\tchecked={item.selected}\r\n\t\t\t\t\t\t\t\t\tonChange={\r\n\t\t\t\t\t\t\t\t\t\t() => {\r\n\t\t\t\t\t\t\t\t\t\t\titem.selected = !item.selected;\r\n\t\t\t\t\t\t\t\t\t\t\tif (selectAll && !item.selected) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetSelectAll(false);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tsetSelectableItems([...selectableItems]);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\theader.map(\r\n\t\t\t\t\t\t\t(h, index) => {\r\n\t\t\t\t\t\t\t\tconst renderer = h.renderer || createRenderer(h.name);\r\n\t\t\t\t\t\t\t\treturn <td key={index}>{renderer(item.item)}</td>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t</tr>\r\n\t\t\t)\r\n\t\t}\r\n\t</AdvancedTable>\r\n}\r\n\r\nexport default TableWithSelect;\r\n","import React, {useMemo} from 'react';\r\nimport {Table} from \"react-bootstrap\";\r\nimport {PlaceholderSize} from \"react-bootstrap/usePlaceholder\";\r\n\r\nconst DEFAULT_COLS = 1;\r\nconst DEFAULT_ROWS = 20;\r\nconst DEFAULT_SIZE: PlaceholderSize = \"lg\";\r\n\r\nexport type TablePlaceholderProps = {\r\n\tcols?: number;\r\n\trows?: number;\r\n\tsize?: PlaceholderSize;\r\n};\r\n\r\nexport function TablePlaceholder({cols, rows, size}: TablePlaceholderProps) {\r\n\tconst colsN: number = useMemo(() => cols === undefined ? DEFAULT_COLS : cols, [cols]);\r\n\tconst rowsN: number = useMemo(() => rows === undefined ? DEFAULT_ROWS : rows, [rows]);\r\n\tconst sizeS: PlaceholderSize = useMemo(() => size === undefined ? DEFAULT_SIZE : size, [size]);\r\n\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<Table responsive>\r\n\t\t\t\t<tbody>\r\n\t\t\t\t{\r\n\t\t\t\t\tArray.from(\r\n\t\t\t\t\t\t{length: rowsN},\r\n\t\t\t\t\t\t(_, i) => <tr key={i}>\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tArray.from(\r\n\t\t\t\t\t\t\t\t\t{length: colsN},\r\n\t\t\t\t\t\t\t\t\t(_, i) => <td key={i}>\r\n\t\t\t\t\t\t\t\t\t\t<div className=\"w-100 p-1 m-1\"></div>\r\n\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t)\r\n\t\t\t\t}\r\n\t\t\t\t</tbody>\r\n\t\t\t</Table>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default TablePlaceholder;\r\n","import {DateUtil} from 'zavadil-ts-common';\r\n\r\nexport type DateTimeProps = {\r\n\tvalue?: Date | null;\r\n};\r\n\r\nexport function DateTime({value}: DateTimeProps) {\r\n\treturn (\r\n\t\t<div className=\"text-nowrap\">{DateUtil.formatDateTimeForHumans(value)}</div>\r\n\t);\r\n}\r\n","import {DateUtil, ObjectUtil} from \"zavadil-ts-common\";\r\n\r\nexport type DurationProps = {\r\n\tms?: number | null;\r\n};\r\n\r\nexport function Duration({ms}: DurationProps) {\r\n\tif (ObjectUtil.isEmpty(ms)) return <></>;\r\n\treturn <div className=\"text-nowrap\">{DateUtil.formatDuration(ms)}</div>;\r\n}\r\n","import {ObjectUtil} from \"zavadil-ts-common\";\r\nimport {useMemo} from \"react\";\r\nimport {Duration} from \"./Duration\";\r\n\r\nexport type ElapsedProps = {\r\n\tdate?: Date | null;\r\n};\r\n\r\nexport function Elapsed({date}: ElapsedProps) {\r\n\tconst ms = useMemo(\r\n\t\t() => {\r\n\t\t\tif (ObjectUtil.isEmpty(date)) return null;\r\n\t\t\treturn Date.now() - date.getTime();\r\n\t\t},\r\n\t\t[date]\r\n\t);\r\n\treturn <Duration ms={ms}/>;\r\n}\r\n","import {BsBug, BsExclamationDiamond, BsInfo, BsQuestion} from \"react-icons/bs\";\r\nimport {IconType} from \"react-icons\";\r\nimport {UserAlertType} from \"zavadil-ts-common\";\r\n\r\nexport type UserAlertTypeIconProps = {\r\n\ttype: UserAlertType;\r\n\tsize?: string | number;\r\n\tcustomVariant?: string;\r\n};\r\n\r\nconst ICONS = new Map<UserAlertType, IconType>(\r\n\t[\r\n\t\t[UserAlertType.error, BsBug],\r\n\t\t[UserAlertType.warning, BsExclamationDiamond],\r\n\t\t[UserAlertType.info, BsInfo]\r\n\t]\r\n);\r\n\r\nexport function UserAlertTypeIcon({type, size, customVariant}: UserAlertTypeIconProps) {\r\n\tconst iconFunc = ICONS.get(type) || BsQuestion;\r\n\treturn <div className={`d-flex align-items-center text-${customVariant === undefined ? type : customVariant}`}>{iconFunc({size: size})}</div>\r\n}\r\n\r\nexport default UserAlertTypeIcon;\r\n","import {DateUtil, UserAlert} from 'zavadil-ts-common';\r\nimport {ProgressBar, Stack} from \"react-bootstrap\";\r\nimport UserAlertTypeIcon from \"./UserAlertTypeIcon\";\r\n\r\nexport type UserAlertWidgetProps = {\r\n\tuserAlert: UserAlert;\r\n\tmaxDurationMs: number;\r\n};\r\n\r\nexport function UserAlertWidget({userAlert, maxDurationMs}: UserAlertWidgetProps) {\r\n\treturn (\r\n\t\t<Stack direction=\"horizontal\" gap={2} className=\"align-items-center\">\r\n\t\t\t{\r\n\t\t\t\tuserAlert.remainsMs && <div style={{width: 20}}>\r\n\t\t\t\t\t<ProgressBar min={0} max={maxDurationMs} now={userAlert.remainsMs} variant={userAlert.type}/>\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t\t<div>{DateUtil.formatDateForHumans(userAlert.time)}</div>\r\n\t\t\t<UserAlertTypeIcon type={userAlert.type}/>\r\n\t\t\t<div>{userAlert.message}</div>\r\n\t\t</Stack>\r\n\t);\r\n}\r\n\r\nexport default UserAlertWidget;\r\n","import {UserAlert, UserAlerts, UserAlertType} from 'zavadil-ts-common';\r\nimport {useCallback, useEffect, useState} from \"react\";\r\nimport UserAlertWidget from \"./UserAlertWidget\";\r\nimport UserAlertTypeIcon from \"./UserAlertTypeIcon\";\r\nimport {Stack} from \"react-bootstrap\";\r\nimport {IconButton} from \"../forms\";\r\nimport {BsEye, BsTrash} from \"react-icons/bs\";\r\nimport {VscEyeClosed} from \"react-icons/vsc\";\r\n\r\nexport type UserAlertsWidgetProps = {\r\n\tuserAlerts: UserAlerts;\r\n};\r\n\r\nexport function UserAlertsWidget({userAlerts}: UserAlertsWidgetProps) {\r\n\tconst [showAll, setShowAll] = useState<boolean>(false);\r\n\tconst [totalAlerts, setTotalAlerts] = useState<number>(userAlerts.alerts.length);\r\n\tconst [renderedAlerts, setRenderedAlerts] = useState<UserAlert[]>([...userAlerts.visibleAlerts]);\r\n\tconst [summary, setSummary] = useState<Map<UserAlertType, number>>(userAlerts.getSummary());\r\n\r\n\tconst onChangeHandler = useCallback(\r\n\t\t() => {\r\n\t\t\tsetTotalAlerts(userAlerts.alerts.length);\r\n\t\t\tsetRenderedAlerts(showAll ? [...userAlerts.alerts] : [...userAlerts.visibleAlerts]);\r\n\t\t\tsetSummary(userAlerts.getSummary());\r\n\t\t},\r\n\t\t[userAlerts, showAll]\r\n\t);\r\n\r\n\tuseEffect(() => {\r\n\t\t\tuserAlerts.addOnChangeHandler(onChangeHandler);\r\n\t\t\tconst handle = setInterval(\r\n\t\t\t\t() => userAlerts.updateVisibility(),\r\n\t\t\t\t100\r\n\t\t\t);\r\n\t\t\treturn () => {\r\n\t\t\t\tclearInterval(handle);\r\n\t\t\t\tuserAlerts.removeOnChangeHandler(onChangeHandler);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[userAlerts, onChangeHandler]\r\n\t);\r\n\r\n\tif (totalAlerts <= 0) return <></>;\r\n\r\n\treturn (\r\n\t\t<div className=\"user-alerts border rounded bg-body text-body position-fixed text-end\" style={{bottom: 15, right: 15, zIndex: 2147483647}}>\r\n\t\t\t{\r\n\t\t\t\trenderedAlerts.length > 0 &&\r\n\t\t\t\t<div className=\"max-w-50 p-2 border-bottom\">\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\trenderedAlerts.map((a, index) => <UserAlertWidget key={index} userAlert={a} maxDurationMs={userAlerts.maxVisibilityMs}/>)\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t\t<div className=\"p-2\">\r\n\t\t\t\t<Stack direction=\"horizontal\" gap={2} className=\"justify-content-end align-items-center\">\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshowAll ? <IconButton size=\"sm\" variant=\"primary\" onClick={() => setShowAll(false)} icon={<VscEyeClosed/>}>Hide</IconButton>\r\n\t\t\t\t\t\t\t: <IconButton size=\"sm\" variant=\"primary\" onClick={() => setShowAll(true)} icon={<BsEye/>}>Show All</IconButton>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tArray.from(summary.entries()).map(\r\n\t\t\t\t\t\t\t(entry, index) => (\r\n\t\t\t\t\t\t\t\t<Stack key={index} direction=\"horizontal\" gap={1} className=\"px-1 border rounded align-items-center\">\r\n\t\t\t\t\t\t\t\t\t<UserAlertTypeIcon type={entry[0]} customVariant={entry[1] === 0 ? 'muted' : undefined}/>\r\n\t\t\t\t\t\t\t\t\t<div className={entry[1] > 0 ? `text-${entry[0]} fw-bold` : 'text-muted'}>\r\n\t\t\t\t\t\t\t\t\t\t{entry[1]}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t\t<IconButton size=\"sm\" variant=\"danger\" onClick={() => userAlerts.reset()} icon={<BsTrash/>}>Reset</IconButton>\r\n\t\t\t\t</Stack>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default UserAlertsWidget;\r\n","import {Button, Modal, Stack} from \"react-bootstrap\";\r\nimport {BasicDialogProps} from \"./DialogProps\";\r\nimport {createContext} from \"react\";\r\nimport {Localize} from \"../localization\";\r\n\r\nexport class ConfirmDialogContextData {\r\n\tsetProps: (props?: ConfirmDialogProps) => any;\r\n\r\n\tconstructor(setProps: (props?: ConfirmDialogProps) => any) {\r\n\t\tthis.setProps = setProps;\r\n\t}\r\n\r\n\tconfirm(name: string, text: string, onConfirmed: () => any) {\r\n\t\tthis.setProps(\r\n\t\t\t{\r\n\t\t\t\tname: name,\r\n\t\t\t\ttext: text,\r\n\t\t\t\tonConfirm: () => {\r\n\t\t\t\t\tonConfirmed();\r\n\t\t\t\t\tthis.setProps(undefined);\r\n\t\t\t\t},\r\n\t\t\t\tonClose: () => this.setProps(undefined)\r\n\t\t\t}\r\n\t\t)\r\n\t}\r\n}\r\n\r\nexport const ConfirmDialogContext = createContext<ConfirmDialogContextData>(new ConfirmDialogContextData(() => undefined));\r\n\r\nexport type ConfirmDialogProps = BasicDialogProps & {\r\n\tonConfirm: () => any;\r\n};\r\n\r\nexport function ConfirmDialog({name, text, onClose, onConfirm}: ConfirmDialogProps) {\r\n\treturn (\r\n\t\t<Modal show={true} backdrop={true} onHide={onClose}>\r\n\t\t\t<Modal.Header>{name || 'Confirm'}</Modal.Header>\r\n\t\t\t<Modal.Body>{text}</Modal.Body>\r\n\t\t\t<Modal.Footer>\r\n\t\t\t\t<Stack direction=\"horizontal\">\r\n\t\t\t\t\t<Button variant=\"link\" onClick={onClose}><Localize text=\"Back\"/></Button>\r\n\t\t\t\t\t<Button variant=\"primary\" onClick={onConfirm}><Localize text=\"Yes\"/></Button>\r\n\t\t\t\t</Stack>\r\n\t\t\t</Modal.Footer>\r\n\t\t</Modal>\r\n\t);\r\n}\r\n","import React from 'react';\r\nimport {Badge, ProgressBar} from \"react-bootstrap\";\r\nimport {ByteUtil, JavaHeapStats} from \"zavadil-ts-common\";\r\n\r\nexport type WorkerJavaHeapControlProps = {\r\n\tstats: JavaHeapStats;\r\n};\r\n\r\nexport function JavaHeapControl({stats}: WorkerJavaHeapControlProps) {\r\n\tconst size = stats.heapSize;\r\n\tconst max = stats.heapMaxSize;\r\n\tconst free = stats.heapFreeSize;\r\n\tconst used = size - free;\r\n\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t<pre>Java Heap</pre>\r\n\t\t\t\t<pre>[{ByteUtil.formatByteSize(size)} / {ByteUtil.formatByteSize(max)}]</pre>\r\n\t\t\t</div>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t<pre>Used:</pre>\r\n\t\t\t\t<Badge className=\"bg-warning text-bg-warning\">\r\n\t\t\t\t\t{ByteUtil.formatByteSize(used)}\r\n\t\t\t\t</Badge>\r\n\t\t\t\t<pre>Free:</pre>\r\n\t\t\t\t<Badge className=\"bg-success text-white\">\r\n\t\t\t\t\t{ByteUtil.formatByteSize(free)}\r\n\t\t\t\t</Badge>\r\n\t\t\t</div>\r\n\t\t\t<div className=\"p-1\">\r\n\t\t\t\t<ProgressBar min={0} max={max}>\r\n\t\t\t\t\t<ProgressBar variant=\"warning\" min={0} now={used} max={max}/>\r\n\t\t\t\t\t<ProgressBar variant=\"success\" min={0} now={free} max={max}/>\r\n\t\t\t\t</ProgressBar>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n","import React from 'react';\r\nimport {ProgressBar} from \"react-bootstrap\";\r\nimport {CacheStats} from 'zavadil-ts-common';\r\n\r\nexport type CacheStatsControlProps = {\r\n\tname: string;\r\n\tstats: CacheStats;\r\n}\r\n\r\nexport function CacheStatsControl({name, stats}: CacheStatsControlProps) {\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t<pre>{name}</pre>\r\n\t\t\t\t<pre>\r\n\t\t\t\t[\r\n\t\t\t\t\t{stats.cachedItems}\r\n\t\t\t\t\t{stats.capacity > 0 && ' / '}\r\n\t\t\t\t\t{stats.capacity > 0 && stats.capacity}\r\n\t\t\t\t\t]\r\n\t\t\t\t</pre>\r\n\t\t\t</div>\r\n\t\t\t{\r\n\t\t\t\tstats.capacity > 0 &&\r\n\t\t\t\t<div className=\"p-1\">\r\n\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\tnow={stats.cachedItems}\r\n\t\t\t\t\t\tmin={0}\r\n\t\t\t\t\t\tmax={stats.capacity}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t</div>\r\n\t);\r\n}\r\n","import React from 'react';\r\nimport {Badge} from \"react-bootstrap\";\r\n\r\nexport type QueueStateControlProps = {\r\n\tstate: string;\r\n}\r\n\r\nconst STATE_COLORS = new Map<string, string>([\r\n\t['Idle', 'secondary'],\r\n\t['Processing', 'success'],\r\n\t['Loading', 'warn'],\r\n]);\r\n\r\nexport function QueueStateControl({state}: QueueStateControlProps) {\r\n\tconst color = STATE_COLORS.get(state) || 'light';\r\n\treturn <Badge className={`bg-${color} text-bg-${color}`}>{state}</Badge>\r\n}\r\n","import React from 'react';\r\nimport {Placeholder, ProgressBar} from \"react-bootstrap\";\r\nimport {QueueStats} from 'zavadil-ts-common';\r\nimport {QueueStateControl} from \"./QueueStateControl\";\r\n\r\nexport type QueueStatsControlProps = {\r\n\tname: string;\r\n\tstats?: QueueStats | null;\r\n}\r\n\r\nexport function QueueStatsControl({name, stats}: QueueStatsControlProps) {\r\n\tconst max = stats ? stats.remaining + stats.processed : undefined\r\n\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t<pre>{name}</pre>\r\n\t\t\t\t<pre>[{stats?.processed !== undefined ? stats.processed : '?'} / {max !== undefined ? max : '?'}]</pre>\r\n\t\t\t\t<QueueStateControl state={stats ? stats.state : 'Unknown'}/>\r\n\t\t\t</div>\r\n\t\t\t<div className=\"p-1\">\r\n\t\t\t\t{\r\n\t\t\t\t\tstats ? <ProgressBar variant=\"primary\" striped={true} animated={true} min={0} now={stats.processed} max={max || 1}/>\r\n\t\t\t\t\t\t: <Placeholder className=\"w-100\" animation=\"glow\">\r\n\t\t\t\t\t\t\t<Placeholder className=\"w-100\"/>\r\n\t\t\t\t\t\t</Placeholder>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n","import {PropsWithChildren, useMemo} from \"react\";\r\n\r\nexport type SpreadProps = {\r\n\tcenter?: boolean;\r\n};\r\n\r\nexport function Spread({children, center}: PropsWithChildren<SpreadProps>) {\r\n\tconst css = useMemo(\r\n\t\t() => center === false ? '' : 'd-flex align-items-center justify-content-center',\r\n\t\t[center]\r\n\t);\r\n\r\n\treturn <div\r\n\t\tclassName={`w-100 h-100 position-absolute ${css}`}\r\n\t\tstyle={{left: 0, right: 0, top: 0, bottom: 0}}\r\n\t>\r\n\t\t{children}\r\n\t</div>\r\n}\r\n\r\nexport default Spread;\r\n"],"names":["LocalizationContext","createContext","BasicLocalization","Localize","text","tag","localization","useContext","p","useMemo","undefined","tags","t","translate","_jsx","_Fragment","children","FormRow","label","_jsxs","Form","Group","Label","TextInputWithReset","value","onChange","onReset","onBlur","disabled","className","actual","StringUtil","getNonEmpty","isEmpty","isBlank","reset","useCallback","InputGroup","Control","type","e","target","Button","onClick","BsXCircle","DateInput","DateUtil","formatDateForInput","parseDate","DateTimeInput","formatDateTimeForInput","IconButton","variant","icon","size","IconSwitch","checked","iconOn","iconOff","Switch","readOnly","LoadingButton","loading","Spinner","SaveButton","isChanged","icn","FaFloppyDisk","content","DeleteButton","BsTrash","StringSelect","options","showEmptyOption","emptyOptionLabel","useEffect","length","id","Select","map","o","i","NumberSelect","nValue","String","nOptions","nChange","s","NumberUtil","parseNumber","LookupSelect","sort","labelGetter","lOptions","result","a","b","name","EnumSelect","actualId","randomString","AutocompleteSelect","selected","onSearch","searchPromise","setSearchPromise","useState","searchText","setSearchText","itemSelection","setItemSelection","blurTimeout","useRef","finalLabelGetter","item","finalCss","userLeftControl","console","log","startBlur","current","window","setTimeout","cancelBlur","clearTimeout","cancel","userChangedText","cancellable","CancellablePromise","promise","then","userSelectedItem","onFocus","Dropdown","defaultShow","show","Menu","Item","active","AutocompleteEntitySelect","entityClient","search","loadPage","safeLowercase","page","sorting","AutocompleteEntityIdSelect","setSelected","EntityClientWithStub","loadSingleStub","loadSingle","selectionChanged","nId","AutocompleteLookupSelect","lookupClient","AutocompleteLookupIdSelect","EntityIdSelect","EntitySelect","find","EntityWithNameSelect","EntityWithNameIdSelect","TablePagination","paging","totalItems","onPagingChanged","totalPages","Math","ceil","pageChanged","ObjectUtil","clone","paginationItems","push","Pagination","First","Prev","maxPagesSide","round","start","end","Ellipsis","number","Next","Last","DEFAULT_SIZES","AdvancedTable","hover","showPagingOnBottom","showPageSizeSelection","striped","bordered","header","sizes","si","ss","Table","responsive","colSpan","h","index","sortBy","field","role","fieldName","f","isSoleField","ctrlKey","desc","sortingChanged","BsFillCaretDownFill","BsFillCaretUpFill","IconCheck","renderedIcon","BsCheckCircle","BsCircle","stopPropagation","preventDefault","TableWithSelect","showSelect","items","onSelect","selectAll","setSelectAll","selectableItems","setSelectableItems","updateSelectAll","sa","selectableHeader","unshift","BsCheckAll","filter","renderer","getNestedValue","TablePlaceholder","cols","rows","colsN","rowsN","Array","from","_","DateTime","formatDateTimeForHumans","Duration","ms","formatDuration","Elapsed","date","Date","now","getTime","ICONS","Map","UserAlertType","error","BsBug","warning","BsExclamationDiamond","info","BsInfo","UserAlertTypeIcon","customVariant","iconFunc","get","BsQuestion","UserAlertWidget","userAlert","maxDurationMs","Stack","direction","gap","remainsMs","style","width","ProgressBar","min","max","formatDateForHumans","time","message","UserAlertsWidget","userAlerts","showAll","setShowAll","totalAlerts","setTotalAlerts","alerts","renderedAlerts","setRenderedAlerts","visibleAlerts","summary","setSummary","getSummary","onChangeHandler","addOnChangeHandler","handle","setInterval","updateVisibility","clearInterval","removeOnChangeHandler","bottom","right","zIndex","maxVisibilityMs","VscEyeClosed","BsEye","entries","entry","ConfirmDialogContextData","constructor","setProps","this","confirm","onConfirmed","onConfirm","onClose","ConfirmDialogContext","ConfirmDialog","Modal","backdrop","onHide","Header","Body","Footer","JavaHeapControl","stats","heapSize","heapMaxSize","free","heapFreeSize","used","ByteUtil","formatByteSize","Badge","CacheStatsControl","cachedItems","capacity","STATE_COLORS","QueueStateControl","state","color","QueueStatsControl","remaining","processed","animated","Placeholder","animation","Spread","center","css","left","top"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/component/localization/LocalizationContext.ts","../src/component/localization/Localize.tsx","../src/component/forms/FormRow.tsx","../src/component/forms/TextInputWithReset.tsx","../src/component/forms/DateInput.tsx","../src/component/forms/DateTimeInput.tsx","../src/component/forms/IconButton.tsx","../src/component/forms/IconSwitch.tsx","../src/component/forms/LoadingButton.tsx","../src/component/forms/SaveButton.tsx","../src/component/forms/DeleteButton.tsx","../src/component/forms/StringSelect.tsx","../src/component/forms/NumberSelect.tsx","../src/component/forms/LookupSelect.tsx","../src/component/forms/EnumSelect.tsx","../src/component/forms/Switch.tsx","../src/component/forms/AutocompleteSelect.tsx","../src/component/forms/AutocompleteEntitySelect.tsx","../src/component/forms/AutocompleteEntityIdSelect.tsx","../src/component/forms/AutocompleteLookupSelect.tsx","../src/component/forms/AutocompleteLookupIdSelect.tsx","../src/component/forms/EntityIdSelect.tsx","../src/component/forms/EntitySelect.tsx","../src/component/forms/EntityWithNameSelect.tsx","../src/component/forms/EntityWithNameIdSelect.tsx","../src/component/tables/TablePagination.tsx","../src/component/tables/AdvancedTable.tsx","../src/component/forms/IconCheck.tsx","../src/component/tables/TableWithSelect.tsx","../src/component/tables/TablePlaceholder.tsx","../src/component/datetime/DateTime.tsx","../src/component/datetime/Duration.tsx","../src/component/datetime/Elapsed.tsx","../src/component/alerts/UserAlertTypeIcon.tsx","../src/component/alerts/UserAlertWidget.tsx","../src/component/alerts/UserAlertsWidget.tsx","../src/component/dialogs/ConfirmDialog.tsx","../src/component/stats/JavaHeapControl.tsx","../src/component/stats/CacheStatsControl.tsx","../src/component/stats/QueueStateControl.tsx","../src/component/stats/QueueStatsControl.tsx","../src/component/Spread.tsx"],"sourcesContent":["import {createContext} from \"react\";\nimport {BasicLocalization, Localization} from \"zavadil-ts-common\";\n\nexport const LocalizationContext = createContext<Localization>(new BasicLocalization());\n","import {useContext, useMemo} from \"react\";\r\nimport {LocalizationContext} from \"./LocalizationContext\";\r\nimport {TranslateParams} from \"zavadil-ts-common\";\r\n\r\nexport type LocalizeProps = {\r\n\ttext: string;\r\n\ttag?: string | Array<string>;\r\n};\r\n\r\nexport function Localize({text, tag}: LocalizeProps) {\r\n\tconst localization = useContext(LocalizationContext);\r\n\r\n\tconst p: TranslateParams | undefined = useMemo(\r\n\t\t() => {\r\n\t\t\tif (tag === undefined || tag === '') return undefined;\r\n\t\t\tif (typeof tag === 'string') return {tags: [tag]};\r\n\t\t\treturn {tags: tag};\r\n\t\t},\r\n\t\t[tag]\r\n\t);\r\n\r\n\tconst t = useMemo(\r\n\t\t() => localization.translate(text, p),\r\n\t\t[localization, text, p]\r\n\t);\r\n\treturn <>{t}</>;\r\n}\r\n\r\nexport default Localize;\r\n","import { PropsWithChildren } from \"react\";\nimport { Form } from \"react-bootstrap\";\nimport { Localize } from \"../localization\";\n\nexport type FormRowProps = PropsWithChildren & {\n label: string;\n};\n\nexport function FormRow({ label, children }: FormRowProps) {\n return (\n <Form.Group>\n <Form.Label>\n <Localize text={label} />\n </Form.Label>\n <div>{children}</div>\n </Form.Group>\n );\n}\n","import {StringUtil} from 'zavadil-ts-common';\r\nimport {Button, Form, InputGroup} from \"react-bootstrap\";\r\nimport {BsXCircle} from \"react-icons/bs\";\r\nimport {useCallback, useMemo} from \"react\";\r\n\r\nexport type TextInputWithResetProps = {\r\n\tvalue?: string | null;\r\n\tonChange: (s: string) => any;\r\n\tonReset?: () => any;\r\n\tdisabled?: boolean;\r\n\tonBlur?: () => any;\r\n\tclassName?: string;\r\n};\r\n\r\nexport function TextInputWithReset({value, onChange, onReset, onBlur, disabled, className}: TextInputWithResetProps) {\r\n\tconst actual = useMemo(\r\n\t\t() => StringUtil.getNonEmpty(value),\r\n\t\t[value]\r\n\t);\r\n\r\n\tconst isEmpty = useMemo(\r\n\t\t() => StringUtil.isBlank(value),\r\n\t\t[actual]\r\n\t);\r\n\r\n\tconst reset = useCallback(\r\n\t\t() => {\r\n\t\t\tif (onReset) {\r\n\t\t\t\tonReset();\r\n\t\t\t} else {\r\n\t\t\t\tonChange('');\r\n\t\t\t}\r\n\t\t},\r\n\t\t[onReset, onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<InputGroup className={className}>\r\n\t\t\t<Form.Control\r\n\t\t\t\ttype=\"text\"\r\n\t\t\t\tdisabled={disabled}\r\n\t\t\t\tvalue={actual}\r\n\t\t\t\tonChange={(e) => onChange(e.target.value)}\r\n\t\t\t\tonBlur={onBlur}\r\n\t\t\t/>\r\n\t\t\t<Button onClick={reset} disabled={isEmpty}>\r\n\t\t\t\t<div className=\"d-flex align-items-center\">\r\n\t\t\t\t\t<BsXCircle/>\r\n\t\t\t\t</div>\r\n\t\t\t</Button>\r\n\t\t</InputGroup>\r\n\t);\r\n}\r\n\r\nexport default TextInputWithReset;\r\n","import {DateUtil} from 'zavadil-ts-common';\r\nimport {Form} from \"react-bootstrap\";\r\n\r\nexport type DateInputProps = {\r\n\tvalue?: Date | null;\r\n\tonChange: (d: Date | undefined) => any;\r\n\tdisabled?: boolean;\r\n};\r\n\r\nexport function DateInput({value, onChange, disabled}: DateInputProps) {\r\n\treturn (\r\n\t\t<Form.Control\r\n\t\t\ttype=\"date\"\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={DateUtil.formatDateForInput(value)}\r\n\t\t\tonChange={(e) => {\r\n\t\t\t\tonChange(DateUtil.parseDate(e.target.value));\r\n\t\t\t}}\r\n\t\t/>\r\n\t);\r\n}\r\n\r\nexport default DateInput;\r\n","import {DateUtil} from 'zavadil-ts-common';\r\nimport {Form} from \"react-bootstrap\";\r\n\r\nexport type DateTimeInputProps = {\r\n\tvalue?: Date | null;\r\n\tonChange: (d: Date | undefined) => any;\r\n\tdisabled?: boolean;\r\n};\r\n\r\nexport function DateTimeInput({value, onChange, disabled}: DateTimeInputProps) {\r\n\treturn (\r\n\t\t<Form.Control\r\n\t\t\ttype=\"datetime-local\"\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={DateUtil.formatDateTimeForInput(value)}\r\n\t\t\tonChange={(e) => {\r\n\t\t\t\tonChange(DateUtil.parseDate(e.target.value));\r\n\t\t\t}}\r\n\t\t/>\r\n\t);\r\n}\r\n\r\nexport default DateTimeInput;\r\n","import { Button } from \"react-bootstrap\";\nimport { PropsWithChildren, ReactNode } from \"react\";\nimport { ButtonVariant } from \"react-bootstrap/types\";\n\nexport type IconButtonProps = {\n disabled?: boolean;\n onClick?: () => any;\n size?: \"sm\" | \"lg\";\n icon?: ReactNode;\n variant?: ButtonVariant;\n type?: \"submit\" | \"reset\" | \"button\" | undefined;\n};\n\nexport function IconButton({\n disabled,\n variant,\n icon,\n size,\n children,\n type,\n onClick,\n}: PropsWithChildren<IconButtonProps>) {\n return (\n <Button\n disabled={disabled === true}\n size={size}\n onClick={onClick}\n variant={variant}\n type={type}\n >\n <div className=\"d-flex align-items-center gap-2\">\n {icon}\n {children && <div>{children}</div>}\n </div>\n </Button>\n );\n}\n\nexport default IconButton;\n","import {Form} from \"react-bootstrap\";\r\nimport {ReactNode} from \"react\";\r\n\r\nexport type IconSwitchProps = {\r\n\tdisabled?: boolean;\r\n\tchecked: boolean;\r\n\tonChange: (checked: boolean) => any;\r\n\tsize?: number;\r\n\ticonOn: ReactNode;\r\n\ticonOff: ReactNode;\r\n};\r\n\r\nexport function IconSwitch({disabled, checked, iconOn, iconOff, size, onChange}: IconSwitchProps) {\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName=\"d-flex align-items-center gap-2 cursor-pointer\"\r\n\t\t\tonClick={(e) => onChange(!checked)}\r\n\t\t>\r\n\t\t\t<Form.Switch\r\n\t\t\t\tdisabled={disabled}\r\n\t\t\t\tsize={size}\r\n\t\t\t\ttype=\"switch\"\r\n\t\t\t\tchecked={checked}\r\n\t\t\t\treadOnly={true}\r\n\t\t\t\tclassName=\"cursor-pointer\"\r\n\t\t\t/>\r\n\t\t\t{\r\n\t\t\t\tchecked ? iconOn : iconOff\r\n\t\t\t}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default IconSwitch;\r\n","import { Spinner } from \"react-bootstrap\";\nimport { PropsWithChildren } from \"react\";\nimport { IconButton, IconButtonProps } from \"./IconButton\";\n\nexport type ActiveButtonProps = IconButtonProps & {\n loading?: boolean;\n};\n\nexport function LoadingButton({\n disabled,\n icon,\n loading,\n children,\n size,\n variant,\n type,\n onClick,\n}: PropsWithChildren<ActiveButtonProps>) {\n return loading === true ? (\n <IconButton\n disabled={true}\n onClick={onClick}\n size={size}\n variant={variant}\n type={type}\n icon={<Spinner size=\"sm\" />}\n >\n {children}\n </IconButton>\n ) : (\n <IconButton\n disabled={disabled}\n onClick={onClick}\n icon={icon}\n size={size}\n variant={variant}\n >\n {children}\n </IconButton>\n );\n}\n\nexport default LoadingButton;\n","import {PropsWithChildren, useMemo} from \"react\";\r\nimport {ActiveButtonProps, LoadingButton} from \"./LoadingButton\";\r\nimport {FaFloppyDisk} from \"react-icons/fa6\";\r\n\r\nexport type SaveButtonProps = ActiveButtonProps & {\r\n\tisChanged?: boolean;\r\n};\r\n\r\nexport function SaveButton({disabled, icon, loading, children, size, onClick, isChanged}: PropsWithChildren<SaveButtonProps>) {\r\n\tconst icn = useMemo(\r\n\t\t() => icon ? icon : <FaFloppyDisk/>,\r\n\t\t[icon]\r\n\t);\r\n\r\n\tconst content = useMemo(\r\n\t\t() => isChanged ? <strong>{children}</strong> : children,\r\n\t\t[isChanged, children]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<LoadingButton\r\n\t\t\tdisabled={disabled || (isChanged === false)}\r\n\t\t\tonClick={onClick}\r\n\t\t\ticon={icn}\r\n\t\t\tloading={loading}\r\n\t\t\tsize={size}\r\n\t\t>\r\n\t\t\t{content}\r\n\t\t</LoadingButton>\r\n\t);\r\n}\r\n","import {PropsWithChildren, useMemo} from \"react\";\r\nimport {ActiveButtonProps, LoadingButton} from \"./LoadingButton\";\r\nimport {BsTrash} from \"react-icons/bs\";\r\n\r\nexport type DeleteButtonProps = ActiveButtonProps & {\r\n\tisChanged?: boolean;\r\n};\r\n\r\nexport function DeleteButton({disabled, icon, loading, children, size, onClick, isChanged}: PropsWithChildren<DeleteButtonProps>) {\r\n\tconst icn = useMemo(\r\n\t\t() => icon ? icon : <BsTrash/>,\r\n\t\t[icon]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<LoadingButton\r\n\t\t\tdisabled={disabled || (isChanged === false)}\r\n\t\t\tonClick={onClick}\r\n\t\t\ticon={icn}\r\n\t\t\tloading={loading}\r\n\t\t\tsize={size}\r\n\t\t\tvariant=\"danger\"\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</LoadingButton>\r\n\t);\r\n}\r\n","import {Form, Spinner} from \"react-bootstrap\";\r\nimport {StringUtil} from \"zavadil-ts-common\";\r\nimport {useEffect} from \"react\";\r\n\r\nexport type GenericSelectOption<T> = {\r\n\tid?: T | null;\r\n\tlabel: string;\r\n}\r\n\r\nexport type GenericSelectProps<T> = {\r\n\tvalue?: T | null;\r\n\toptions: Array<GenericSelectOption<T>>;\r\n\tonChange: (id: T | null | undefined) => any;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n}\r\n\r\nexport type StringSelectProps = GenericSelectProps<string>;\r\n\r\nexport function StringSelect({value, options, disabled, onChange, showEmptyOption, emptyOptionLabel}: StringSelectProps) {\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tif (StringUtil.isBlank(value)) {\r\n\t\t\t\tif (options.length > 0 && showEmptyOption !== true) {\r\n\t\t\t\t\tonChange(options[0].id);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t[value, options, showEmptyOption, onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<Form.Select\r\n\t\t\tvalue={value || ''}\r\n\t\t\tonChange={(e) => onChange(e.target.value)}\r\n\t\t\tdisabled={disabled}\r\n\t\t>\r\n\t\t\t{\r\n\t\t\t\t(showEmptyOption === true) && (\r\n\t\t\t\t\t<option key={\"\"} value={\"\"}>{emptyOptionLabel || ''}</option>\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t\t{\r\n\t\t\t\toptions ?\r\n\t\t\t\t\toptions.map(\r\n\t\t\t\t\t\t(o, i) => <option key={i} value={o.id || ''}>{o.label || ''}</option>\r\n\t\t\t\t\t) : <span><Spinner/></span>\r\n\t\t\t}\r\n\t\t</Form.Select>\r\n\t)\r\n}\r\n","import {useCallback, useMemo} from \"react\";\r\nimport {NumberUtil} from \"zavadil-ts-common\";\r\nimport {GenericSelectProps, StringSelect} from \"./StringSelect\";\r\n\r\nexport type NumberSelectProps = GenericSelectProps<number>;\r\n\r\nexport function NumberSelect({value, options, disabled, onChange, showEmptyOption, emptyOptionLabel}: NumberSelectProps) {\r\n\tconst nValue = useMemo(\r\n\t\t() => {\r\n\t\t\tif (!value) return '';\r\n\t\t\treturn String(value);\r\n\t\t},\r\n\t\t[value]\r\n\t);\r\n\r\n\tconst nOptions = useMemo(\r\n\t\t() => {\r\n\t\t\tif (!options) return [];\r\n\t\t\treturn options.map(\r\n\t\t\t\t(o) => {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tid: o.id ? String(o.id) : '',\r\n\t\t\t\t\t\tlabel: o.label\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t},\r\n\t\t[options]\r\n\t);\r\n\r\n\tconst nChange = useCallback(\r\n\t\t(s: string | null | undefined) => onChange(NumberUtil.parseNumber(s)),\r\n\t\t[onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<StringSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={nValue}\r\n\t\t\toptions={nOptions}\r\n\t\t\tonChange={nChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useMemo} from \"react\";\r\nimport {NumberSelect} from \"./NumberSelect\";\r\nimport {LookupTableEntity} from \"zavadil-ts-common\";\r\nimport {GenericSelectOption} from \"./StringSelect\";\r\n\r\nexport type LookupSelectProps = {\r\n\tid?: number | null;\r\n\tonChange: (n: number | null | undefined) => any;\r\n\toptions?: Array<LookupTableEntity> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n\tlabelGetter?: <T extends LookupTableEntity>(item: T) => string;\r\n}\r\n\r\nexport function LookupSelect({id, sort, disabled, labelGetter, onChange, options, showEmptyOption, emptyOptionLabel}: LookupSelectProps) {\r\n\tconst lOptions: GenericSelectOption<number>[] = useMemo(\r\n\t\t() => {\r\n\t\t\tlet result: Array<LookupTableEntity> = []\r\n\t\t\tif (options) {\r\n\t\t\t\tresult = sort ? options.sort((a, b) => a.name > b.name ? 1 : -1) : options;\r\n\t\t\t}\r\n\t\t\treturn result\r\n\t\t\t\t.map(\r\n\t\t\t\t\t(o) => {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tid: o.id,\r\n\t\t\t\t\t\t\tlabel: labelGetter ? labelGetter(o) : o.name\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t},\r\n\t\t[options]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<NumberSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={id}\r\n\t\t\toptions={lOptions}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useMemo} from \"react\";\r\nimport {StringSelect} from \"./StringSelect\";\r\n\r\nexport type EnumSelectProps = {\r\n\tvalue?: string | null;\r\n\toptions: Array<string>;\r\n\tonChange: (id: string | null | undefined) => any;\r\n\tshowEmptyOption?: boolean;\r\n\temptyOptionLabel?: string;\r\n};\r\n\r\nexport function EnumSelect({value, options, onChange, showEmptyOption, emptyOptionLabel}: EnumSelectProps) {\r\n\tconst nOptions = useMemo(\r\n\t\t() => {\r\n\t\t\tif (!options) return [];\r\n\t\t\treturn options.map(\r\n\t\t\t\t(s) => {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tid: s,\r\n\t\t\t\t\t\tlabel: s\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t},\r\n\t\t[options]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<StringSelect\r\n\t\t\tvalue={value}\r\n\t\t\toptions={nOptions}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import { Form } from \"react-bootstrap\";\nimport { useMemo, ReactNode } from \"react\";\nimport { StringUtil } from \"zavadil-ts-common\";\n\nexport type SwitchProps = {\n id?: string;\n disabled?: boolean;\n checked: boolean;\n onChange: (checked: boolean) => any;\n size?: number;\n label?: string | ReactNode;\n};\n\nexport function Switch({\n id,\n label,\n disabled,\n checked,\n size,\n onChange,\n}: SwitchProps) {\n const actualId = useMemo(() => (id ? id : StringUtil.randomString()), [id]);\n return (\n <Form.Switch\n disabled={disabled}\n id={actualId}\n size={size}\n type=\"switch\"\n checked={checked}\n onChange={(e) => onChange(!checked)}\n className=\"cursor-pointer\"\n label={label}\n />\n );\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from \"react\";\r\nimport {CancellablePromise, EntityBase} from \"zavadil-ts-common\";\r\nimport TextInputWithReset from \"./TextInputWithReset\";\r\nimport {Dropdown} from \"react-bootstrap\";\r\n\r\nexport type AutocompleteSelectProps<T extends EntityBase> = {\r\n\tselected?: T | null;\r\n\tonChange: (e: T | null) => any;\r\n\tonSearch: (text: string) => Promise<Array<T>>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteSelect<T extends EntityBase>({selected, disabled, labelGetter, onChange, onSearch}: AutocompleteSelectProps<T>) {\r\n\tconst [searchPromise, setSearchPromise] = useState<CancellablePromise>();\r\n\tconst [searchText, setSearchText] = useState<string>();\r\n\tconst [itemSelection, setItemSelection] = useState<Array<T>>();\r\n\tconst blurTimeout = useRef<number>();\r\n\r\n\tconst finalLabelGetter = useCallback(\r\n\t\t(item: T) => {\r\n\t\t\tif (labelGetter) return labelGetter(item);\r\n\t\t\tif ('name' in item && typeof item.name === 'string') return item.name;\r\n\t\t\treturn `[${item.id}]`;\r\n\t\t},\r\n\t\t[labelGetter]\r\n\t);\r\n\r\n\tconst finalCss = useMemo(\r\n\t\t() => selected ? 'border rounded border-primary' : undefined,\r\n\t\t[selected]\r\n\t);\r\n\r\n\tconst userLeftControl = useCallback(\r\n\t\t() => {\r\n\t\t\tconsole.log('user left control');\r\n\t\t\tif (itemSelection) {\r\n\t\t\t\tsetItemSelection(undefined);\r\n\t\t\t\tsetSearchText(selected ? finalLabelGetter(selected) : '');\r\n\t\t\t}\r\n\t\t},\r\n\t\t[onChange, itemSelection, selected, finalLabelGetter]\r\n\t);\r\n\r\n\tconst startBlur = useCallback(\r\n\t\t() => {\r\n\t\t\tblurTimeout.current = window.setTimeout(userLeftControl, 100);\r\n\t\t},\r\n\t\t[blurTimeout, userLeftControl]\r\n\t);\r\n\r\n\tconst cancelBlur = useCallback(\r\n\t\t() => {\r\n\t\t\tif (blurTimeout.current) {\r\n\t\t\t\tclearTimeout(blurTimeout.current);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[blurTimeout]\r\n\t);\r\n\r\n\t// Clean up the timeout when the component unmounts\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\treturn cancelBlur;\r\n\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tsetSearchText(selected ? finalLabelGetter(selected) : '');\r\n\t\t\tif (searchPromise) {\r\n\t\t\t\tsearchPromise.cancel();\r\n\t\t\t\tsetSearchPromise(undefined);\r\n\t\t\t}\r\n\t\t\tsetItemSelection(undefined);\r\n\t\t},\r\n\t\t[selected]\r\n\t);\r\n\r\n\tconst reset = useCallback(\r\n\t\t() => {\r\n\t\t\tonChange(null)\r\n\t\t\tsetSearchText('');\r\n\t\t\tif (searchPromise) {\r\n\t\t\t\tsearchPromise.cancel();\r\n\t\t\t\tsetSearchPromise(undefined);\r\n\t\t\t}\r\n\t\t\tsetItemSelection(undefined);\r\n\t\t},\r\n\t\t[onChange, searchPromise]\r\n\t);\r\n\r\n\tconst userChangedText = useCallback(\r\n\t\t(s: string) => {\r\n\t\t\tsetSearchText(s);\r\n\t\t\tif (searchPromise) {\r\n\t\t\t\tsearchPromise.cancel();\r\n\t\t\t}\r\n\t\t\tconst cancellable = new CancellablePromise(onSearch(s));\r\n\t\t\tcancellable.promise.then(setItemSelection);\r\n\t\t\tsetSearchPromise(cancellable);\r\n\t\t},\r\n\t\t[searchPromise, onSearch]\r\n\t);\r\n\r\n\r\n\tconst userSelectedItem = useCallback(\r\n\t\t(item: T) => {\r\n\t\t\tconsole.log('user selected item');\r\n\t\t\tsetItemSelection(undefined);\r\n\t\t\tonChange({...item});\r\n\t\t},\r\n\t\t[onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<div onBlur={startBlur} onFocus={cancelBlur}>\r\n\t\t\t<Dropdown defaultShow={false} show={itemSelection !== null}>\r\n\t\t\t\t<TextInputWithReset\r\n\t\t\t\t\tdisabled={disabled}\r\n\t\t\t\t\tvalue={searchText}\r\n\t\t\t\t\tonChange={userChangedText}\r\n\t\t\t\t\tonReset={reset}\r\n\t\t\t\t\tclassName={finalCss}\r\n\t\t\t\t/>\r\n\t\t\t\t{\r\n\t\t\t\t\titemSelection &&\r\n\t\t\t\t\t<Dropdown.Menu>\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\titemSelection.map(\r\n\t\t\t\t\t\t\t\t(item) => <Dropdown.Item\r\n\t\t\t\t\t\t\t\t\tkey={item.id}\r\n\t\t\t\t\t\t\t\t\tonClick={\r\n\t\t\t\t\t\t\t\t\t\t(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\tcancelBlur();\r\n\t\t\t\t\t\t\t\t\t\t\tuserSelectedItem(item);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tactive={item.id === selected?.id}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{finalLabelGetter(item)}\r\n\t\t\t\t\t\t\t\t</Dropdown.Item>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</Dropdown.Menu>\r\n\t\t\t\t}\r\n\t\t\t</Dropdown>\r\n\t\t</div>\r\n\t);\r\n}\r\n","import {useCallback} from \"react\";\r\nimport {EntityBase, EntityClient, StringUtil} from \"zavadil-ts-common\";\r\nimport {AutocompleteSelect} from \"./AutocompleteSelect\";\r\n\r\nexport type AutocompleteEntitySelectProps<T extends EntityBase> = {\r\n\tselected?: T | null;\r\n\tonChange: (e: T | null) => any;\r\n\tentityClient: EntityClient<T>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteEntitySelect<T extends EntityBase>({\r\n\tselected,\r\n\tdisabled,\r\n\tlabelGetter,\r\n\tonChange,\r\n\tentityClient\r\n}: AutocompleteEntitySelectProps<T>) {\r\n\r\n\tconst search = useCallback(\r\n\t\t(s: string) => entityClient\r\n\t\t\t.loadPage({search: StringUtil.safeLowercase(s), page: 0, size: 10, sorting: [{name: 'id'}]})\r\n\t\t\t.then((p) => p.content),\r\n\t\t[labelGetter]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<AutocompleteSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tselected={selected}\r\n\t\t\tlabelGetter={labelGetter}\r\n\t\t\tonSearch={search}\r\n\t\t\tonChange={onChange}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useCallback, useEffect, useState} from \"react\";\r\nimport {EntityBase, EntityClient, EntityClientWithStub} from \"zavadil-ts-common\";\r\nimport {AutocompleteEntitySelect} from \"./AutocompleteEntitySelect\";\r\n\r\nexport type AutocompleteIdSelectProps<T extends EntityBase, TStub extends EntityBase> = {\r\n\tid?: number | null;\r\n\tonChange: (id?: number | null) => any;\r\n\tentityClient: EntityClient<T> | EntityClientWithStub<T, TStub>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteEntityIdSelect<T extends EntityBase, TStub extends EntityBase>({\r\n\tid,\r\n\tdisabled,\r\n\tlabelGetter,\r\n\tonChange,\r\n\tentityClient\r\n}: AutocompleteIdSelectProps<T, TStub>) {\r\n\tconst [selected, setSelected] = useState<T | null>(null);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tif (!id) {\r\n\t\t\t\tsetSelected(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (selected && selected.id === id) {\r\n\t\t\t\tsetSelected({...selected});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (entityClient instanceof EntityClientWithStub) {\r\n\t\t\t\tentityClient.loadSingleStub(id).then(setSelected);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tentityClient.loadSingle(id).then(setSelected);\r\n\t\t},\r\n\t\t[id]\r\n\t);\r\n\r\n\tconst selectionChanged = useCallback(\r\n\t\t(s: T | null) => {\r\n\t\t\tconst nId = s ? s.id : null;\r\n\t\t\tif (nId !== id) onChange(nId);\r\n\t\t\tsetSelected(s);\r\n\t\t},\r\n\t\t[id, onChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<AutocompleteEntitySelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tselected={selected}\r\n\t\t\tlabelGetter={labelGetter}\r\n\t\t\tentityClient={entityClient}\r\n\t\t\tonChange={selectionChanged}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useCallback, useMemo} from \"react\";\r\nimport {LookupClient, LookupTableEntity, StringUtil} from \"zavadil-ts-common\";\r\nimport {AutocompleteSelect} from \"./AutocompleteSelect\";\r\n\r\nexport type AutocompleteLookupSelectProps<T extends LookupTableEntity> = {\r\n\tselected?: T | null;\r\n\tonChange: (e: T | null) => any;\r\n\tlookupClient: LookupClient<T>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteLookupSelect<T extends LookupTableEntity>({\r\n\tselected,\r\n\tdisabled,\r\n\tlabelGetter,\r\n\tonChange,\r\n\tlookupClient\r\n}: AutocompleteLookupSelectProps<T>) {\r\n\tconst finalLabelGetter = useMemo(\r\n\t\t() => labelGetter ? labelGetter : (item: LookupTableEntity) => item.name,\r\n\t\t[labelGetter]\r\n\t);\r\n\r\n\tconst search = useCallback(\r\n\t\t(s: string) => lookupClient\r\n\t\t\t.loadPage({search: StringUtil.safeLowercase(s), page: 0, size: 10, sorting: [{name: 'name'}]})\r\n\t\t\t.then((p) => p.content),\r\n\t\t[labelGetter]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<AutocompleteSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tselected={selected}\r\n\t\t\tlabelGetter={finalLabelGetter}\r\n\t\t\tonSearch={search}\r\n\t\t\tonChange={onChange}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useCallback, useEffect, useState} from \"react\";\r\nimport {LookupClient, LookupTableEntity} from \"zavadil-ts-common\";\r\nimport {AutocompleteLookupSelect} from \"./AutocompleteLookupSelect\";\r\n\r\nexport type AutocompleteLookupIdSelectProps<T extends LookupTableEntity> = {\r\n\tid?: number | null;\r\n\tonChange: (id?: number | null) => any;\r\n\tlookupClient: LookupClient<T>;\r\n\tdisabled?: boolean;\r\n\tlabelGetter?: (item: T) => string;\r\n}\r\n\r\nexport function AutocompleteLookupIdSelect<T extends LookupTableEntity>({\r\n\tid,\r\n\tdisabled,\r\n\tlabelGetter,\r\n\tonChange,\r\n\tlookupClient\r\n}: AutocompleteLookupIdSelectProps<T>) {\r\n\tconst [selected, setSelected] = useState<T | null>(null);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tif (!id) {\r\n\t\t\t\tsetSelected(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (selected && selected.id === id) {\r\n\t\t\t\tsetSelected({...selected});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tlookupClient.loadSingle(id).then(setSelected);\r\n\t\t},\r\n\t\t[id]\r\n\t);\r\n\r\n\tconst selectionChanged = useCallback(\r\n\t\t(s: T | null) => {\r\n\t\t\tconst nId = s ? s.id : null;\r\n\t\t\tif (nId !== id) onChange(nId);\r\n\t\t\tsetSelected(s);\r\n\t\t},\r\n\t\t[id, selected]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<AutocompleteLookupSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tselected={selected}\r\n\t\t\tlabelGetter={labelGetter}\r\n\t\t\tlookupClient={lookupClient}\r\n\t\t\tonChange={selectionChanged}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {useMemo} from \"react\";\r\nimport {NumberSelect} from \"./NumberSelect\";\r\nimport {EntityBase} from \"zavadil-ts-common\";\r\nimport {GenericSelectOption} from \"./StringSelect\";\r\n\r\nexport type EntityIdSelectProps<T extends EntityBase> = {\r\n\tid?: number | null;\r\n\tonChange: (n: number | null | undefined) => any;\r\n\toptions?: Array<T> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n\tlabelGetter: (item: T) => string;\r\n}\r\n\r\nexport function EntityIdSelect<T extends EntityBase>(\r\n\t{id, sort, disabled, labelGetter, onChange, options, showEmptyOption, emptyOptionLabel}: EntityIdSelectProps<T>\r\n) {\r\n\tconst lOptions: GenericSelectOption<number>[] = useMemo(\r\n\t\t() => {\r\n\t\t\tlet result: Array<T> = []\r\n\t\t\tif (options) {\r\n\t\t\t\tresult = sort ? options.sort((a, b) => labelGetter(a) > labelGetter(b) ? 1 : -1) : options;\r\n\t\t\t}\r\n\t\t\treturn result\r\n\t\t\t\t.map(\r\n\t\t\t\t\t(o) => {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tid: o.id,\r\n\t\t\t\t\t\t\tlabel: labelGetter(o)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t},\r\n\t\t[options]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<NumberSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tvalue={id}\r\n\t\t\toptions={lOptions}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {EntityBase} from \"zavadil-ts-common\";\r\nimport {EntityIdSelect} from \"./EntityIdSelect\";\r\n\r\nexport type EntitySelectProps<T extends EntityBase> = {\r\n\tvalue?: T | null;\r\n\tonChange: (e: T | null | undefined) => any;\r\n\toptions?: Array<T> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n\tlabelGetter: (item: T) => string;\r\n}\r\n\r\nexport function EntitySelect<T extends EntityBase>(\r\n\t{value, sort, disabled, labelGetter, onChange, options, showEmptyOption, emptyOptionLabel}: EntitySelectProps<T>\r\n) {\r\n\r\n\treturn (\r\n\t\t<EntityIdSelect\r\n\t\t\tdisabled={disabled}\r\n\t\t\tid={value ? value.id : null}\r\n\t\t\toptions={options}\r\n\t\t\tsort={sort}\r\n\t\t\tonChange={\r\n\t\t\t\t(id) => {\r\n\t\t\t\t\tif (!options || !id) {\r\n\t\t\t\t\t\tonChange(undefined);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonChange(options.find((o) => o.id === id));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlabelGetter={labelGetter}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {EntityWithName} from \"zavadil-ts-common\";\r\nimport {EntitySelect} from \"./EntitySelect\";\r\n\r\nexport type EntityWithNameSelectProps<T extends EntityWithName> = {\r\n\tvalue?: T | null;\r\n\tonChange: (e: T | null | undefined) => any;\r\n\toptions?: Array<T> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n}\r\n\r\nexport function EntityWithNameSelect<T extends EntityWithName>(\r\n\t{value, sort, disabled, onChange, options, showEmptyOption, emptyOptionLabel}: EntityWithNameSelectProps<T>\r\n) {\r\n\treturn (\r\n\t\t<EntitySelect\r\n\t\t\tvalue={value}\r\n\t\t\tlabelGetter={(e) => e.name}\r\n\t\t\tdisabled={disabled}\r\n\t\t\tsort={sort}\r\n\t\t\toptions={options}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {EntityWithName} from \"zavadil-ts-common\";\r\nimport {EntityIdSelect} from \"./EntityIdSelect\";\r\n\r\nexport type EntityWithNameIdSelectProps<T extends EntityWithName> = {\r\n\tid?: number | null;\r\n\tonChange: (n: number | null | undefined) => any;\r\n\toptions?: Array<T> | null;\r\n\tshowEmptyOption?: boolean;\r\n\tdisabled?: boolean;\r\n\temptyOptionLabel?: string;\r\n\tsort?: boolean;\r\n}\r\n\r\nexport function EntityWithNameIdSelect<T extends EntityWithName>(\r\n\t{id, sort, disabled, onChange, options, showEmptyOption, emptyOptionLabel}: EntityWithNameIdSelectProps<T>\r\n) {\r\n\treturn (\r\n\t\t<EntityIdSelect\r\n\t\t\tid={id}\r\n\t\t\tlabelGetter={(e) => e.name}\r\n\t\t\tdisabled={disabled}\r\n\t\t\tsort={sort}\r\n\t\t\toptions={options}\r\n\t\t\tonChange={onChange}\r\n\t\t\tshowEmptyOption={showEmptyOption}\r\n\t\t\temptyOptionLabel={emptyOptionLabel}\r\n\t\t/>\r\n\t);\r\n}\r\n","import {ObjectUtil, PagingRequest} from 'zavadil-ts-common';\r\nimport React from 'react';\r\nimport {Pagination} from \"react-bootstrap\";\r\n\r\nconst MAX_DISPLAY_PAGES = 10;\r\n\r\nexport type TablePaginationProps = {\r\n\tpaging: PagingRequest;\r\n\ttotalItems: number;\r\n\tonPagingChanged: (p: PagingRequest) => any\r\n};\r\n\r\nexport function TablePagination({\r\n\tpaging,\r\n\ttotalItems,\r\n\tonPagingChanged\r\n}: TablePaginationProps) {\r\n\tconst totalPages = Math.ceil(totalItems / paging.size);\r\n\r\n\tconst pageChanged = (page: number) => {\r\n\t\tpaging.page = page;\r\n\t\tonPagingChanged(ObjectUtil.clone(paging));\r\n\t}\r\n\r\n\tconst paginationItems = [];\r\n\r\n\tif (totalPages > 1) {\r\n\t\tpaginationItems.push(<Pagination.First key=\"first\" onClick={() => pageChanged(0)} disabled={paging.page === 0}/>);\r\n\t\tpaginationItems.push(<Pagination.Prev key=\"prev\" onClick={() => pageChanged(paging.page - 1)} disabled={paging.page === 0}/>);\r\n\r\n\t\tconst maxPagesSide = Math.round((MAX_DISPLAY_PAGES - 3) / 2);\r\n\r\n\t\tlet start = (paging.page > maxPagesSide) ? paging.page - maxPagesSide : 0;\r\n\t\tlet end = start + MAX_DISPLAY_PAGES;\r\n\r\n\t\tif (end >= totalPages) {\r\n\t\t\tend = totalPages - 1;\r\n\t\t}\r\n\r\n\t\tif (start > 0) {\r\n\t\t\tpaginationItems.push(<Pagination.Ellipsis key=\"ellipsisStart\" disabled={true}/>);\r\n\t\t}\r\n\r\n\t\tfor (let number = start; number <= end; number++) {\r\n\t\t\tpaginationItems.push(\r\n\t\t\t\t<Pagination.Item key={number} active={number === paging.page} onClick={() => pageChanged(number)}>\r\n\t\t\t\t\t{number + 1}\r\n\t\t\t\t</Pagination.Item>,\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (end < (totalPages - 1)) {\r\n\t\t\tpaginationItems.push(<Pagination.Ellipsis key=\"ellipsisEnd\" disabled={true}/>);\r\n\t\t}\r\n\r\n\t\tpaginationItems.push(<Pagination.Next key=\"next\" onClick={() => pageChanged(paging.page + 1)} disabled={paging.page === (totalPages - 1)}/>);\r\n\t\tpaginationItems.push(<Pagination.Last key=\"last\" onClick={() => pageChanged(totalPages - 1)} disabled={paging.page === (totalPages - 1)}/>);\r\n\t}\r\n\r\n\treturn <Pagination size=\"sm\" className=\"flex-wrap m-0\">{paginationItems}</Pagination>\r\n}\r\n\r\nexport default TablePagination;\r\n","import {ObjectUtil, PagingRequest, StringUtil} from 'zavadil-ts-common';\r\nimport React, {PropsWithChildren, useMemo} from 'react';\r\nimport {Table} from \"react-bootstrap\";\r\nimport {BsFillCaretDownFill, BsFillCaretUpFill} from 'react-icons/bs';\r\nimport {TableHeader} from \"./TableTypes\";\r\nimport {NumberSelect} from \"../forms\";\r\nimport Localize from \"../localization/Localize\";\r\nimport TablePagination from \"./TablePagination\";\r\n\r\nconst DEFAULT_SIZES = [\r\n\t{\r\n\t\tid: 10,\r\n\t\tlabel: '10'\r\n\t},\r\n\t{\r\n\t\tid: 100,\r\n\t\tlabel: '100'\r\n\t},\r\n\t{\r\n\t\tid: 1000,\r\n\t\tlabel: '1000'\r\n\t}\r\n];\r\n\r\nexport type AdvancedTableProps = {\r\n\theader: TableHeader;\r\n\tlanguage?: \"cs\" | \"en\";\r\n\tpaging: PagingRequest;\r\n\ttotalItems: number;\r\n\thover?: boolean;\r\n\tshowPagingOnBottom?: boolean;\r\n\tshowPageSizeSelection?: boolean;\r\n\tstriped?: boolean;\r\n\tbordered?: boolean;\r\n\tonPagingChanged: (p: PagingRequest) => any\r\n};\r\n\r\nexport function AdvancedTable({\r\n\thover,\r\n\tshowPagingOnBottom,\r\n\tshowPageSizeSelection,\r\n\tstriped,\r\n\tbordered,\r\n\theader,\r\n\tchildren,\r\n\tpaging,\r\n\ttotalItems,\r\n\tonPagingChanged\r\n}: PropsWithChildren<AdvancedTableProps>) {\r\n\tconst totalPages = Math.ceil(totalItems / paging.size);\r\n\r\n\tconst sizes = useMemo(\r\n\t\t() => {\r\n\t\t\tconst s = paging.size;\r\n\t\t\tif (DEFAULT_SIZES.find((si) => si.id === s) === null) {\r\n\t\t\t\tconst ss = ObjectUtil.clone(DEFAULT_SIZES);\r\n\t\t\t\tss.push({id: s, label: String(s)});\r\n\t\t\t\treturn ss;\r\n\t\t\t}\r\n\t\t\treturn DEFAULT_SIZES;\r\n\t\t},\r\n\t\t[paging]\r\n\t);\r\n\r\n\tconst sortingChanged = (e: React.MouseEvent<HTMLTableCellElement>, fieldName: string) => {\r\n\t\tif (!paging.sorting) paging.sorting = [];\r\n\t\tlet field = paging.sorting.find((f) => f.name === fieldName);\r\n\t\tconst isSoleField = field && paging.sorting.length === 1;\r\n\t\tif (!(e.ctrlKey || isSoleField)) {\r\n\t\t\tpaging.sorting = [];\r\n\t\t\tfield = undefined;\r\n\t\t}\r\n\t\tif (field) {\r\n\t\t\tfield.desc = !field.desc;\r\n\t\t} else {\r\n\t\t\tpaging.sorting.push({name: fieldName});\r\n\t\t}\r\n\t\tonPagingChanged(ObjectUtil.clone(paging));\r\n\t}\r\n\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<Table hover={hover} striped={striped} responsive bordered={bordered}>\r\n\t\t\t\t<thead>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<td colSpan={header.length}>\r\n\t\t\t\t\t\t<div className=\"d-flex justify-content-between align-items-center gap-2\">\r\n\t\t\t\t\t\t\t<div><Localize text='Page'/>: {paging.page + 1} / {totalPages}</div>\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\ttotalPages > 0 && <TablePagination paging={paging} totalItems={totalItems} onPagingChanged={onPagingChanged}/>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t<div><Localize text='Total items'/>: {totalItems}</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\theader.map(\r\n\t\t\t\t\t\t\t(h, index) => {\r\n\t\t\t\t\t\t\t\tconst sortBy = h.sort === false ? '' : (StringUtil.isBlank(h.sort) ? h.name : h.sort);\r\n\t\t\t\t\t\t\t\tif (StringUtil.isBlank(sortBy) || (!sortBy)) {\r\n\t\t\t\t\t\t\t\t\treturn <th key={index}>{h.label}</th>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tconst field = paging.sorting && paging.sorting.find((s) => s.name === sortBy);\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<th\r\n\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\tclassName=\"user-select-none text-nowrap\"\r\n\t\t\t\t\t\t\t\t\t\trole=\"button\"\r\n\t\t\t\t\t\t\t\t\t\tonClick={(e: React.MouseEvent<HTMLTableCellElement>) => sortingChanged(e, sortBy)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{h.label}\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\tfield ? field.desc ? <BsFillCaretDownFill/> : <BsFillCaretUpFill/> : <></>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t</tr>\r\n\t\t\t\t</thead>\r\n\t\t\t\t<tbody>\r\n\t\t\t\t{children}\r\n\t\t\t\t</tbody>\r\n\t\t\t\t{\r\n\t\t\t\t\ttotalItems > 0 && <tfoot>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshowPagingOnBottom &&\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td colSpan={header.length}>\r\n\t\t\t\t\t\t\t\t<div className=\"d-flex justify-content-between align-items-center gap-2\">\r\n\t\t\t\t\t\t\t\t\t<div><Localize text='Page'/>: {paging.page + 1} / {totalPages}</div>\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\ttotalPages > 0 && <TablePagination paging={paging} totalItems={totalItems} onPagingChanged={onPagingChanged}/>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t<div><Localize text='Total items'/>: {totalItems}</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshowPageSizeSelection &&\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td colSpan={header.length}>\r\n\t\t\t\t\t\t\t\t<div className=\"d-flex align-items-center gap-2 justify-content-end\">\r\n\t\t\t\t\t\t\t\t\t<div className=\"text-nowrap\"><Localize text='Page size'/>:</div>\r\n\t\t\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t\t\t<NumberSelect\r\n\t\t\t\t\t\t\t\t\t\t\tvalue={paging.size}\r\n\t\t\t\t\t\t\t\t\t\t\toptions={sizes}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={\r\n\t\t\t\t\t\t\t\t\t\t\t\t(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpaging.size = e || 10\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonPagingChanged({...paging});\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tshowEmptyOption={false}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t</tfoot>\r\n\t\t\t\t}\r\n\t\t\t</Table>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default AdvancedTable;\r\n","import {ReactNode, useMemo} from \"react\";\r\nimport {SwitchProps} from \"./Switch\";\r\nimport {BsCheckCircle, BsCircle} from \"react-icons/bs\";\r\n\r\nexport type IconCheckProps = SwitchProps & {\r\n\ticonOn?: ReactNode;\r\n\ticonOff?: ReactNode;\r\n};\r\n\r\nexport function IconCheck({disabled, checked, iconOn, iconOff, size, onChange}: IconCheckProps) {\r\n\tconst renderedIcon = useMemo(\r\n\t\t() => checked ? (iconOn ? iconOn : <BsCheckCircle size={size}/>) : (iconOff ? iconOff : <BsCircle size={size} className=\"text-muted\"/>),\r\n\t\t[checked, iconOn, iconOff, size]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName=\"d-flex align-items-center cursor-pointer\"\r\n\t\t\tonClick={(e) => {\r\n\t\t\t\te.stopPropagation();\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tonChange(!checked)\r\n\t\t\t}\r\n\t\t\t}\r\n\t\t>\r\n\t\t\t{renderedIcon}\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default IconCheck;\r\n","import React, {useCallback, useEffect, useMemo, useState} from 'react';\r\nimport {ObjectUtil} from 'zavadil-ts-common';\r\nimport {AdvancedTable, AdvancedTableProps} from \"./AdvancedTable\";\r\nimport {RenderFunc, SelectableTableHeader, TableHeader} from \"./TableTypes\";\r\nimport {BsCheckAll} from \"react-icons/bs\";\r\nimport IconCheck from \"../forms/IconCheck\";\r\n\r\nexport type SelectableItem<T> = {\r\n\tselected: boolean;\r\n\titem: T;\r\n};\r\n\r\nexport type TableWithSelectProps<T> = Omit<AdvancedTableProps, 'header'> & {\r\n\tshowSelect?: boolean;\r\n\theader: SelectableTableHeader<T>;\r\n\titems?: Array<T>;\r\n\tonSelect?: (selected: Array<T>) => any;\r\n\tonClick?: (selected: T) => any;\r\n};\r\n\r\nfunction createRenderer<T>(name: string): RenderFunc<T> {\r\n\treturn (e: T) => ObjectUtil.getNestedValue(e, name);\r\n}\r\n\r\nexport function TableWithSelect<T>({\r\n\tshowSelect,\r\n\theader,\r\n\titems,\r\n\tonSelect,\r\n\tonClick,\r\n\ttotalItems,\r\n\tpaging,\r\n\tonPagingChanged\r\n}: TableWithSelectProps<T>) {\r\n\tconst [selectAll, setSelectAll] = useState<boolean>(false);\r\n\tconst [selectableItems, setSelectableItems] = useState<Array<SelectableItem<T>>>();\r\n\r\n\tconst updateSelectAll = useCallback(\r\n\t\t(sa: boolean) => {\r\n\t\t\tif (selectableItems) {\r\n\t\t\t\tsetSelectableItems(selectableItems.map(\r\n\t\t\t\t\t(i) => {\r\n\t\t\t\t\t\treturn {selected: sa, item: i.item};\r\n\t\t\t\t\t}\r\n\t\t\t\t));\r\n\t\t\t}\r\n\t\t\tsetSelectAll(sa);\r\n\t\t},\r\n\t\t[selectableItems]\r\n\t);\r\n\r\n\tconst selectableHeader = useMemo(\r\n\t\t() => {\r\n\t\t\tconst h: TableHeader = [...header];\r\n\t\t\tif (showSelect !== false) {\r\n\t\t\t\th.unshift(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tname: '',\r\n\t\t\t\t\t\tlabel: <div className=\"py-1\">\r\n\t\t\t\t\t\t\t<IconCheck\r\n\t\t\t\t\t\t\t\tchecked={selectAll}\r\n\t\t\t\t\t\t\t\tonChange={\r\n\t\t\t\t\t\t\t\t\t() => updateSelectAll(!selectAll)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\ticonOn={<BsCheckAll/>}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\treturn h;\r\n\t\t},\r\n\t\t[header, selectAll, updateSelectAll]\r\n\t);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tsetSelectableItems(items ? items.map(\r\n\t\t\t\t(i) => {\r\n\t\t\t\t\treturn {selected: selectAll, item: i};\r\n\t\t\t\t}\r\n\t\t\t) : undefined);\r\n\t\t},\r\n\t\t[items]\r\n\t);\r\n\r\n\tuseEffect(\r\n\t\t() => {\r\n\t\t\tif (!selectableItems) return;\r\n\t\t\tif (!onSelect) return;\r\n\t\t\tonSelect(selectableItems.filter((i) => i.selected).map((i) => i.item));\r\n\t\t},\r\n\t\t[selectableItems, onSelect]\r\n\t);\r\n\r\n\treturn <AdvancedTable\r\n\t\theader={selectableHeader}\r\n\t\thover={onClick !== undefined}\r\n\t\tpaging={paging}\r\n\t\tstriped={true}\r\n\t\ttotalItems={totalItems}\r\n\t\tonPagingChanged={onPagingChanged}\r\n\t>\r\n\t\t{\r\n\t\t\tselectableItems && selectableItems.map(\r\n\t\t\t\t(item, index) => <tr\r\n\t\t\t\t\tkey={index}\r\n\t\t\t\t\tclassName={`selectable ${onClick ? 'cursor-pointer' : ''} ${item.selected ? 'table-active table-primary' : ''}`}\r\n\t\t\t\t\tonClick={\r\n\t\t\t\t\t\t(e) => {\r\n\t\t\t\t\t\t\tif (onClick) onClick(item.item);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t(showSelect !== false) && <td>\r\n\t\t\t\t\t\t\t<div className=\"py-2 d-flex align-items-center\">\r\n\t\t\t\t\t\t\t\t<IconCheck\r\n\t\t\t\t\t\t\t\t\tchecked={item.selected}\r\n\t\t\t\t\t\t\t\t\tonChange={\r\n\t\t\t\t\t\t\t\t\t\t() => {\r\n\t\t\t\t\t\t\t\t\t\t\titem.selected = !item.selected;\r\n\t\t\t\t\t\t\t\t\t\t\tif (selectAll && !item.selected) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetSelectAll(false);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tsetSelectableItems([...selectableItems]);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\theader.map(\r\n\t\t\t\t\t\t\t(h, index) => {\r\n\t\t\t\t\t\t\t\tconst renderer = h.renderer || createRenderer(h.name);\r\n\t\t\t\t\t\t\t\treturn <td key={index}>{renderer(item.item)}</td>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t</tr>\r\n\t\t\t)\r\n\t\t}\r\n\t</AdvancedTable>\r\n}\r\n\r\nexport default TableWithSelect;\r\n","import React, {useMemo} from 'react';\r\nimport {Table} from \"react-bootstrap\";\r\nimport {PlaceholderSize} from \"react-bootstrap/usePlaceholder\";\r\n\r\nconst DEFAULT_COLS = 1;\r\nconst DEFAULT_ROWS = 20;\r\nconst DEFAULT_SIZE: PlaceholderSize = \"lg\";\r\n\r\nexport type TablePlaceholderProps = {\r\n\tcols?: number;\r\n\trows?: number;\r\n\tsize?: PlaceholderSize;\r\n};\r\n\r\nexport function TablePlaceholder({cols, rows, size}: TablePlaceholderProps) {\r\n\tconst colsN: number = useMemo(() => cols === undefined ? DEFAULT_COLS : cols, [cols]);\r\n\tconst rowsN: number = useMemo(() => rows === undefined ? DEFAULT_ROWS : rows, [rows]);\r\n\tconst sizeS: PlaceholderSize = useMemo(() => size === undefined ? DEFAULT_SIZE : size, [size]);\r\n\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<Table responsive>\r\n\t\t\t\t<tbody>\r\n\t\t\t\t{\r\n\t\t\t\t\tArray.from(\r\n\t\t\t\t\t\t{length: rowsN},\r\n\t\t\t\t\t\t(_, i) => <tr key={i}>\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tArray.from(\r\n\t\t\t\t\t\t\t\t\t{length: colsN},\r\n\t\t\t\t\t\t\t\t\t(_, i) => <td key={i}>\r\n\t\t\t\t\t\t\t\t\t\t<div className=\"w-100 p-1 m-1\"></div>\r\n\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t)\r\n\t\t\t\t}\r\n\t\t\t\t</tbody>\r\n\t\t\t</Table>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default TablePlaceholder;\r\n","import {DateUtil} from 'zavadil-ts-common';\r\n\r\nexport type DateTimeProps = {\r\n\tvalue?: Date | null;\r\n};\r\n\r\nexport function DateTime({value}: DateTimeProps) {\r\n\treturn (\r\n\t\t<div className=\"text-nowrap\">{DateUtil.formatDateTimeForHumans(value)}</div>\r\n\t);\r\n}\r\n","import {DateUtil, ObjectUtil} from \"zavadil-ts-common\";\r\n\r\nexport type DurationProps = {\r\n\tms?: number | null;\r\n};\r\n\r\nexport function Duration({ms}: DurationProps) {\r\n\tif (ObjectUtil.isEmpty(ms)) return <></>;\r\n\treturn <div className=\"text-nowrap\">{DateUtil.formatDuration(ms)}</div>;\r\n}\r\n","import {ObjectUtil} from \"zavadil-ts-common\";\r\nimport {useMemo} from \"react\";\r\nimport {Duration} from \"./Duration\";\r\n\r\nexport type ElapsedProps = {\r\n\tdate?: Date | null;\r\n};\r\n\r\nexport function Elapsed({date}: ElapsedProps) {\r\n\tconst ms = useMemo(\r\n\t\t() => {\r\n\t\t\tif (ObjectUtil.isEmpty(date)) return null;\r\n\t\t\treturn Date.now() - date.getTime();\r\n\t\t},\r\n\t\t[date]\r\n\t);\r\n\treturn <Duration ms={ms}/>;\r\n}\r\n","import {BsBug, BsExclamationDiamond, BsInfo, BsQuestion} from \"react-icons/bs\";\r\nimport {IconType} from \"react-icons\";\r\nimport {UserAlertType} from \"zavadil-ts-common\";\r\n\r\nexport type UserAlertTypeIconProps = {\r\n\ttype: UserAlertType;\r\n\tsize?: string | number;\r\n\tcustomVariant?: string;\r\n};\r\n\r\nconst ICONS = new Map<UserAlertType, IconType>(\r\n\t[\r\n\t\t[UserAlertType.error, BsBug],\r\n\t\t[UserAlertType.warning, BsExclamationDiamond],\r\n\t\t[UserAlertType.info, BsInfo]\r\n\t]\r\n);\r\n\r\nexport function UserAlertTypeIcon({type, size, customVariant}: UserAlertTypeIconProps) {\r\n\tconst iconFunc = ICONS.get(type) || BsQuestion;\r\n\treturn <div className={`d-flex align-items-center text-${customVariant === undefined ? type : customVariant}`}>{iconFunc({size: size})}</div>\r\n}\r\n\r\nexport default UserAlertTypeIcon;\r\n","import {DateUtil, UserAlert} from 'zavadil-ts-common';\r\nimport {ProgressBar, Stack} from \"react-bootstrap\";\r\nimport UserAlertTypeIcon from \"./UserAlertTypeIcon\";\r\n\r\nexport type UserAlertWidgetProps = {\r\n\tuserAlert: UserAlert;\r\n\tmaxDurationMs: number;\r\n};\r\n\r\nexport function UserAlertWidget({userAlert, maxDurationMs}: UserAlertWidgetProps) {\r\n\treturn (\r\n\t\t<Stack direction=\"horizontal\" gap={2} className=\"align-items-center\">\r\n\t\t\t{\r\n\t\t\t\tuserAlert.remainsMs && <div style={{width: 20}}>\r\n\t\t\t\t\t<ProgressBar min={0} max={maxDurationMs} now={userAlert.remainsMs} variant={userAlert.type}/>\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t\t<div>{DateUtil.formatDateForHumans(userAlert.time)}</div>\r\n\t\t\t<UserAlertTypeIcon type={userAlert.type}/>\r\n\t\t\t<div>{userAlert.message}</div>\r\n\t\t</Stack>\r\n\t);\r\n}\r\n\r\nexport default UserAlertWidget;\r\n","import {UserAlert, UserAlerts, UserAlertType} from 'zavadil-ts-common';\r\nimport {useCallback, useEffect, useState} from \"react\";\r\nimport UserAlertWidget from \"./UserAlertWidget\";\r\nimport UserAlertTypeIcon from \"./UserAlertTypeIcon\";\r\nimport {Stack} from \"react-bootstrap\";\r\nimport {IconButton} from \"../forms\";\r\nimport {BsEye, BsTrash} from \"react-icons/bs\";\r\nimport {VscEyeClosed} from \"react-icons/vsc\";\r\n\r\nexport type UserAlertsWidgetProps = {\r\n\tuserAlerts: UserAlerts;\r\n};\r\n\r\nexport function UserAlertsWidget({userAlerts}: UserAlertsWidgetProps) {\r\n\tconst [showAll, setShowAll] = useState<boolean>(false);\r\n\tconst [totalAlerts, setTotalAlerts] = useState<number>(userAlerts.alerts.length);\r\n\tconst [renderedAlerts, setRenderedAlerts] = useState<UserAlert[]>([...userAlerts.visibleAlerts]);\r\n\tconst [summary, setSummary] = useState<Map<UserAlertType, number>>(userAlerts.getSummary());\r\n\r\n\tconst onChangeHandler = useCallback(\r\n\t\t() => {\r\n\t\t\tsetTotalAlerts(userAlerts.alerts.length);\r\n\t\t\tsetRenderedAlerts(showAll ? [...userAlerts.alerts] : [...userAlerts.visibleAlerts]);\r\n\t\t\tsetSummary(userAlerts.getSummary());\r\n\t\t},\r\n\t\t[userAlerts, showAll]\r\n\t);\r\n\r\n\tuseEffect(() => {\r\n\t\t\tuserAlerts.addOnChangeHandler(onChangeHandler);\r\n\t\t\tconst handle = setInterval(\r\n\t\t\t\t() => userAlerts.updateVisibility(),\r\n\t\t\t\t100\r\n\t\t\t);\r\n\t\t\treturn () => {\r\n\t\t\t\tclearInterval(handle);\r\n\t\t\t\tuserAlerts.removeOnChangeHandler(onChangeHandler);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[userAlerts, onChangeHandler]\r\n\t);\r\n\r\n\tif (totalAlerts <= 0) return <></>;\r\n\r\n\treturn (\r\n\t\t<div className=\"user-alerts border rounded bg-body text-body position-fixed text-end\" style={{bottom: 15, right: 15, zIndex: 2147483647}}>\r\n\t\t\t{\r\n\t\t\t\trenderedAlerts.length > 0 &&\r\n\t\t\t\t<div className=\"max-w-50 p-2 border-bottom\">\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\trenderedAlerts.map((a, index) => <UserAlertWidget key={index} userAlert={a} maxDurationMs={userAlerts.maxVisibilityMs}/>)\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t\t<div className=\"p-2\">\r\n\t\t\t\t<Stack direction=\"horizontal\" gap={2} className=\"justify-content-end align-items-center\">\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tshowAll ? <IconButton size=\"sm\" variant=\"primary\" onClick={() => setShowAll(false)} icon={<VscEyeClosed/>}>Hide</IconButton>\r\n\t\t\t\t\t\t\t: <IconButton size=\"sm\" variant=\"primary\" onClick={() => setShowAll(true)} icon={<BsEye/>}>Show All</IconButton>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tArray.from(summary.entries()).map(\r\n\t\t\t\t\t\t\t(entry, index) => (\r\n\t\t\t\t\t\t\t\t<Stack key={index} direction=\"horizontal\" gap={1} className=\"px-1 border rounded align-items-center\">\r\n\t\t\t\t\t\t\t\t\t<UserAlertTypeIcon type={entry[0]} customVariant={entry[1] === 0 ? 'muted' : undefined}/>\r\n\t\t\t\t\t\t\t\t\t<div className={entry[1] > 0 ? `text-${entry[0]} fw-bold` : 'text-muted'}>\r\n\t\t\t\t\t\t\t\t\t\t{entry[1]}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t\t<IconButton size=\"sm\" variant=\"danger\" onClick={() => userAlerts.reset()} icon={<BsTrash/>}>Reset</IconButton>\r\n\t\t\t\t</Stack>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n\r\nexport default UserAlertsWidget;\r\n","import {Button, Modal, Stack} from \"react-bootstrap\";\r\nimport {BasicDialogProps} from \"./DialogProps\";\r\nimport {createContext} from \"react\";\r\nimport {Localize} from \"../localization\";\r\n\r\nexport class ConfirmDialogContextData {\r\n\tsetProps: (props?: ConfirmDialogProps) => any;\r\n\r\n\tconstructor(setProps: (props?: ConfirmDialogProps) => any) {\r\n\t\tthis.setProps = setProps;\r\n\t}\r\n\r\n\tconfirm(name: string, text: string, onConfirmed: () => any) {\r\n\t\tthis.setProps(\r\n\t\t\t{\r\n\t\t\t\tname: name,\r\n\t\t\t\ttext: text,\r\n\t\t\t\tonConfirm: () => {\r\n\t\t\t\t\tonConfirmed();\r\n\t\t\t\t\tthis.setProps(undefined);\r\n\t\t\t\t},\r\n\t\t\t\tonClose: () => this.setProps(undefined)\r\n\t\t\t}\r\n\t\t)\r\n\t}\r\n}\r\n\r\nexport const ConfirmDialogContext = createContext<ConfirmDialogContextData>(new ConfirmDialogContextData(() => undefined));\r\n\r\nexport type ConfirmDialogProps = BasicDialogProps & {\r\n\tonConfirm: () => any;\r\n};\r\n\r\nexport function ConfirmDialog({name, text, onClose, onConfirm}: ConfirmDialogProps) {\r\n\treturn (\r\n\t\t<Modal show={true} backdrop={true} onHide={onClose}>\r\n\t\t\t<Modal.Header>{name || 'Confirm'}</Modal.Header>\r\n\t\t\t<Modal.Body>{text}</Modal.Body>\r\n\t\t\t<Modal.Footer>\r\n\t\t\t\t<Stack direction=\"horizontal\">\r\n\t\t\t\t\t<Button variant=\"link\" onClick={onClose}><Localize text=\"Back\"/></Button>\r\n\t\t\t\t\t<Button variant=\"primary\" onClick={onConfirm}><Localize text=\"Yes\"/></Button>\r\n\t\t\t\t</Stack>\r\n\t\t\t</Modal.Footer>\r\n\t\t</Modal>\r\n\t);\r\n}\r\n","import React from 'react';\r\nimport {Badge, ProgressBar} from \"react-bootstrap\";\r\nimport {ByteUtil, JavaHeapStats} from \"zavadil-ts-common\";\r\n\r\nexport type WorkerJavaHeapControlProps = {\r\n\tstats: JavaHeapStats;\r\n};\r\n\r\nexport function JavaHeapControl({stats}: WorkerJavaHeapControlProps) {\r\n\tconst size = stats.heapSize;\r\n\tconst max = stats.heapMaxSize;\r\n\tconst free = stats.heapFreeSize;\r\n\tconst used = size - free;\r\n\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t<pre>Java Heap</pre>\r\n\t\t\t\t<pre>[{ByteUtil.formatByteSize(size)} / {ByteUtil.formatByteSize(max)}]</pre>\r\n\t\t\t</div>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t<pre>Used:</pre>\r\n\t\t\t\t<Badge className=\"bg-warning text-bg-warning\">\r\n\t\t\t\t\t{ByteUtil.formatByteSize(used)}\r\n\t\t\t\t</Badge>\r\n\t\t\t\t<pre>Free:</pre>\r\n\t\t\t\t<Badge className=\"bg-success text-white\">\r\n\t\t\t\t\t{ByteUtil.formatByteSize(free)}\r\n\t\t\t\t</Badge>\r\n\t\t\t</div>\r\n\t\t\t<div className=\"p-1\">\r\n\t\t\t\t<ProgressBar min={0} max={max}>\r\n\t\t\t\t\t<ProgressBar variant=\"warning\" min={0} now={used} max={max}/>\r\n\t\t\t\t\t<ProgressBar variant=\"success\" min={0} now={free} max={max}/>\r\n\t\t\t\t</ProgressBar>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n","import React from 'react';\r\nimport {ProgressBar} from \"react-bootstrap\";\r\nimport {CacheStats} from 'zavadil-ts-common';\r\n\r\nexport type CacheStatsControlProps = {\r\n\tname: string;\r\n\tstats: CacheStats;\r\n}\r\n\r\nexport function CacheStatsControl({name, stats}: CacheStatsControlProps) {\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t<pre>{name}</pre>\r\n\t\t\t\t<pre>\r\n\t\t\t\t[\r\n\t\t\t\t\t{stats.cachedItems}\r\n\t\t\t\t\t{stats.capacity > 0 && ' / '}\r\n\t\t\t\t\t{stats.capacity > 0 && stats.capacity}\r\n\t\t\t\t\t]\r\n\t\t\t\t</pre>\r\n\t\t\t</div>\r\n\t\t\t{\r\n\t\t\t\tstats.capacity > 0 &&\r\n\t\t\t\t<div className=\"p-1\">\r\n\t\t\t\t\t<ProgressBar\r\n\t\t\t\t\t\tnow={stats.cachedItems}\r\n\t\t\t\t\t\tmin={0}\r\n\t\t\t\t\t\tmax={stats.capacity}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</div>\r\n\t\t\t}\r\n\t\t</div>\r\n\t);\r\n}\r\n","import React from 'react';\r\nimport {Badge} from \"react-bootstrap\";\r\n\r\nexport type QueueStateControlProps = {\r\n\tstate: string;\r\n}\r\n\r\nconst STATE_COLORS = new Map<string, string>([\r\n\t['Idle', 'secondary'],\r\n\t['Processing', 'success'],\r\n\t['Loading', 'warn'],\r\n]);\r\n\r\nexport function QueueStateControl({state}: QueueStateControlProps) {\r\n\tconst color = STATE_COLORS.get(state) || 'light';\r\n\treturn <Badge className={`bg-${color} text-bg-${color}`}>{state}</Badge>\r\n}\r\n","import React from 'react';\r\nimport {Placeholder, ProgressBar} from \"react-bootstrap\";\r\nimport {QueueStats} from 'zavadil-ts-common';\r\nimport {QueueStateControl} from \"./QueueStateControl\";\r\n\r\nexport type QueueStatsControlProps = {\r\n\tname: string;\r\n\tstats?: QueueStats | null;\r\n}\r\n\r\nexport function QueueStatsControl({name, stats}: QueueStatsControlProps) {\r\n\tconst max = stats ? stats.remaining + stats.processed : undefined\r\n\r\n\treturn (\r\n\t\t<div>\r\n\t\t\t<div className=\"d-flex align-items-center gap-2\">\r\n\t\t\t\t<pre>{name}</pre>\r\n\t\t\t\t<pre>[{stats?.processed !== undefined ? stats.processed : '?'} / {max !== undefined ? max : '?'}]</pre>\r\n\t\t\t\t<QueueStateControl state={stats ? stats.state : 'Unknown'}/>\r\n\t\t\t</div>\r\n\t\t\t<div className=\"p-1\">\r\n\t\t\t\t{\r\n\t\t\t\t\tstats ? <ProgressBar variant=\"primary\" striped={true} animated={true} min={0} now={stats.processed} max={max || 1}/>\r\n\t\t\t\t\t\t: <Placeholder className=\"w-100\" animation=\"glow\">\r\n\t\t\t\t\t\t\t<Placeholder className=\"w-100\"/>\r\n\t\t\t\t\t\t</Placeholder>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n}\r\n","import {PropsWithChildren, useMemo} from \"react\";\r\n\r\nexport type SpreadProps = {\r\n\tcenter?: boolean;\r\n};\r\n\r\nexport function Spread({children, center}: PropsWithChildren<SpreadProps>) {\r\n\tconst css = useMemo(\r\n\t\t() => center === false ? '' : 'd-flex align-items-center justify-content-center',\r\n\t\t[center]\r\n\t);\r\n\r\n\treturn <div\r\n\t\tclassName={`w-100 h-100 position-absolute ${css}`}\r\n\t\tstyle={{left: 0, right: 0, top: 0, bottom: 0}}\r\n\t>\r\n\t\t{children}\r\n\t</div>\r\n}\r\n\r\nexport default Spread;\r\n"],"names":["LocalizationContext","createContext","BasicLocalization","Localize","text","tag","localization","useContext","p","useMemo","undefined","tags","t","translate","_jsx","_Fragment","children","FormRow","label","_jsxs","Form","Group","Label","TextInputWithReset","value","onChange","onReset","onBlur","disabled","className","actual","StringUtil","getNonEmpty","isEmpty","isBlank","reset","useCallback","InputGroup","Control","type","e","target","Button","onClick","BsXCircle","DateInput","DateUtil","formatDateForInput","parseDate","DateTimeInput","formatDateTimeForInput","IconButton","variant","icon","size","IconSwitch","checked","iconOn","iconOff","Switch","readOnly","LoadingButton","loading","Spinner","SaveButton","isChanged","icn","FaFloppyDisk","content","DeleteButton","BsTrash","StringSelect","options","showEmptyOption","emptyOptionLabel","useEffect","length","id","Select","map","o","i","NumberSelect","nValue","String","nOptions","nChange","s","NumberUtil","parseNumber","LookupSelect","sort","labelGetter","lOptions","result","a","b","name","EnumSelect","actualId","randomString","AutocompleteSelect","selected","onSearch","searchPromise","setSearchPromise","useState","searchText","setSearchText","itemSelection","setItemSelection","blurTimeout","useRef","finalLabelGetter","item","finalCss","userLeftControl","console","log","startBlur","current","window","setTimeout","cancelBlur","clearTimeout","cancel","userChangedText","cancellable","CancellablePromise","promise","then","userSelectedItem","onFocus","Dropdown","defaultShow","show","Menu","Item","active","AutocompleteEntitySelect","entityClient","search","loadPage","safeLowercase","page","sorting","AutocompleteEntityIdSelect","setSelected","EntityClientWithStub","loadSingleStub","loadSingle","selectionChanged","nId","AutocompleteLookupSelect","lookupClient","AutocompleteLookupIdSelect","EntityIdSelect","EntitySelect","find","EntityWithNameSelect","EntityWithNameIdSelect","TablePagination","paging","totalItems","onPagingChanged","totalPages","Math","ceil","pageChanged","ObjectUtil","clone","paginationItems","push","Pagination","First","Prev","maxPagesSide","round","start","end","Ellipsis","number","Next","Last","DEFAULT_SIZES","AdvancedTable","hover","showPagingOnBottom","showPageSizeSelection","striped","bordered","header","sizes","si","ss","Table","responsive","colSpan","h","index","sortBy","field","role","fieldName","f","isSoleField","ctrlKey","desc","sortingChanged","BsFillCaretDownFill","BsFillCaretUpFill","IconCheck","renderedIcon","BsCheckCircle","BsCircle","stopPropagation","preventDefault","TableWithSelect","showSelect","items","onSelect","selectAll","setSelectAll","selectableItems","setSelectableItems","updateSelectAll","sa","selectableHeader","unshift","BsCheckAll","filter","renderer","getNestedValue","TablePlaceholder","cols","rows","colsN","rowsN","Array","from","_","DateTime","formatDateTimeForHumans","Duration","ms","formatDuration","Elapsed","date","Date","now","getTime","ICONS","Map","UserAlertType","error","BsBug","warning","BsExclamationDiamond","info","BsInfo","UserAlertTypeIcon","customVariant","iconFunc","get","BsQuestion","UserAlertWidget","userAlert","maxDurationMs","Stack","direction","gap","remainsMs","style","width","ProgressBar","min","max","formatDateForHumans","time","message","UserAlertsWidget","userAlerts","showAll","setShowAll","totalAlerts","setTotalAlerts","alerts","renderedAlerts","setRenderedAlerts","visibleAlerts","summary","setSummary","getSummary","onChangeHandler","addOnChangeHandler","handle","setInterval","updateVisibility","clearInterval","removeOnChangeHandler","bottom","right","zIndex","maxVisibilityMs","VscEyeClosed","BsEye","entries","entry","ConfirmDialogContextData","constructor","setProps","this","confirm","onConfirmed","onConfirm","onClose","ConfirmDialogContext","ConfirmDialog","Modal","backdrop","onHide","Header","Body","Footer","JavaHeapControl","stats","heapSize","heapMaxSize","free","heapFreeSize","used","ByteUtil","formatByteSize","Badge","CacheStatsControl","cachedItems","capacity","STATE_COLORS","QueueStateControl","state","color","QueueStatsControl","remaining","processed","animated","Placeholder","animation","Spread","center","css","left","top"],"mappings":"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"}