zavadil-react-common 2.2.5 → 2.2.7

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,4 +2,5 @@ export type TextToClipboardProps = {
2
2
  text?: string | null;
3
3
  onClipboardCopy?: () => any;
4
4
  };
5
- export default function TextToClipboard({ text, onClipboardCopy }: TextToClipboardProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function TextToClipboard({ text, onClipboardCopy }: TextToClipboardProps): import("react/jsx-runtime").JSX.Element;
6
+ export default TextToClipboard;
package/dist/index.d.ts CHANGED
@@ -289,7 +289,8 @@ declare function EntityWithNameIdSelect<T extends EntityWithName>({ id, sort, di
289
289
  type TextToClipboardProps = {
290
290
  text?: string | null;
291
291
  onClipboardCopy?: () => any;
292
- };
292
+ };
293
+ declare function TextToClipboard({ text, onClipboardCopy }: TextToClipboardProps): react_jsx_runtime.JSX.Element;
293
294
 
294
295
  type UserAlertTypeIconProps = {
295
296
  type: UserAlertType;
@@ -361,4 +362,4 @@ type LocalizeProps = {
361
362
  };
362
363
  declare function Localize({ text, tag }: LocalizeProps): react_jsx_runtime.JSX.Element;
363
364
 
364
- export { type ActiveButtonProps, AdvancedTable, type AdvancedTableProps, AutocompleteEntityIdSelect, AutocompleteEntitySelect, type AutocompleteEntitySelectProps, type AutocompleteIdSelectProps, AutocompleteLookupIdSelect, type AutocompleteLookupIdSelectProps, AutocompleteLookupSelect, type AutocompleteLookupSelectProps, AutocompleteSelect, type AutocompleteSelectProps, type BasicDialogProps, CacheStatsControl, type CacheStatsControlProps, ConfirmDialog, ConfirmDialogContext, ConfirmDialogContextData, type ConfirmDialogProps, DateInput, type DateInputProps, DateTime, DateTimeInput, type DateTimeInputProps, type DateTimeProps, DeleteButton, type DeleteButtonProps, Duration, type DurationProps, Elapsed, type ElapsedProps, EntityIdSelect, type EntityIdSelectProps, EntitySelect, type EntitySelectProps, EntityWithNameIdSelect, type EntityWithNameIdSelectProps, EntityWithNameSelect, type EntityWithNameSelectProps, EnumSelect, type EnumSelectProps, FormRow, FormRowControl, type FormRowControlProps, type FormRowProps, type GenericSelectOption, type GenericSelectProps, type HeaderCol, IconButton, type IconButtonProps, IconSwitch, type IconSwitchProps, JavaHeapControl, LoadingButton, LocalizationContext, Localize, type LocalizeProps, LookupSelect, type LookupSelectProps, NumberSelect, type NumberSelectProps, QueueStateControl, type QueueStateControlProps, QueueStatsControl, type QueueStatsControlProps, type RenderFunc, type RenderResult, SaveButton, type SaveButtonProps, type SelectableHeaderCol, type SelectableItem, type SelectableTableHeader, Spread, type SpreadProps, StringSelect, type StringSelectProps, Switch, type SwitchProps, type TableHeader, TablePagination, type TablePaginationProps, TablePlaceholder, type TablePlaceholderProps, TableWithSelect, type TableWithSelectProps, TextInputWithReset, type TextInputWithResetProps, type TextToClipboardProps, UserAlertTypeIcon, type UserAlertTypeIconProps, UserAlertWidget, type UserAlertWidgetProps, UserAlertsWidget, type UserAlertsWidgetProps, type WorkerJavaHeapControlProps };
365
+ export { type ActiveButtonProps, AdvancedTable, type AdvancedTableProps, AutocompleteEntityIdSelect, AutocompleteEntitySelect, type AutocompleteEntitySelectProps, type AutocompleteIdSelectProps, AutocompleteLookupIdSelect, type AutocompleteLookupIdSelectProps, AutocompleteLookupSelect, type AutocompleteLookupSelectProps, AutocompleteSelect, type AutocompleteSelectProps, type BasicDialogProps, CacheStatsControl, type CacheStatsControlProps, ConfirmDialog, ConfirmDialogContext, ConfirmDialogContextData, type ConfirmDialogProps, DateInput, type DateInputProps, DateTime, DateTimeInput, type DateTimeInputProps, type DateTimeProps, DeleteButton, type DeleteButtonProps, Duration, type DurationProps, Elapsed, type ElapsedProps, EntityIdSelect, type EntityIdSelectProps, EntitySelect, type EntitySelectProps, EntityWithNameIdSelect, type EntityWithNameIdSelectProps, EntityWithNameSelect, type EntityWithNameSelectProps, EnumSelect, type EnumSelectProps, FormRow, FormRowControl, type FormRowControlProps, type FormRowProps, type GenericSelectOption, type GenericSelectProps, type HeaderCol, IconButton, type IconButtonProps, IconSwitch, type IconSwitchProps, JavaHeapControl, LoadingButton, LocalizationContext, Localize, type LocalizeProps, LookupSelect, type LookupSelectProps, NumberSelect, type NumberSelectProps, QueueStateControl, type QueueStateControlProps, QueueStatsControl, type QueueStatsControlProps, type RenderFunc, type RenderResult, SaveButton, type SaveButtonProps, type SelectableHeaderCol, type SelectableItem, type SelectableTableHeader, Spread, type SpreadProps, StringSelect, type StringSelectProps, Switch, type SwitchProps, type TableHeader, TablePagination, type TablePaginationProps, TablePlaceholder, type TablePlaceholderProps, TableWithSelect, type TableWithSelectProps, TextInputWithReset, type TextInputWithResetProps, TextToClipboard, type TextToClipboardProps, UserAlertTypeIcon, type UserAlertTypeIconProps, UserAlertWidget, type UserAlertWidgetProps, UserAlertsWidget, type UserAlertsWidgetProps, type WorkerJavaHeapControlProps };
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 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 I,BsTrash as G,BsFillCaretDownFill as B,BsFillCaretUpFill as M,BsCheckCircle as D,BsCircle as F,BsCheckAll as A,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({forId:n,label:i,children:a}){return t(y.Group,{children:[e(y.Label,{htmlFor:n,children:e(K,{text:i})}),e("div",{children:a})]})}function q(n){const t=u((()=>n.id||a.randomString()),[n]);return e(Y,{label:n.label,forId:t,children:e(y.Control,{...n,id:t})})}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(I,{})})})]})}function W({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 X({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 Z({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 _({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 ee({disabled:n,icon:t,loading:i,children:a,size:l,variant:r,type:o,onClick:s}){return e(Z,!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 ne({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(ee,{disabled:n||!1===o,onClick:r,icon:s,loading:i,size:l,children:d})}function te({disabled:n,icon:t,loading:i,children:a,size:l,onClick:r,isChanged:o}){const s=u((()=>t||e(G,{})),[t]);return e(ee,{disabled:n||!1===o,onClick:r,icon:s,loading:i,size:l,variant:"danger",children:a})}function ie({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 ae({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(ie,{disabled:i,value:s,options:d,onChange:c,showEmptyOption:l,emptyOptionLabel:o})}function le({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(ae,{disabled:i,value:n,options:d,onChange:l,showEmptyOption:o,emptyOptionLabel:s})}function re({value:n,options:t,onChange:i,showEmptyOption:a,emptyOptionLabel:l}){const r=u((()=>t?t.map((e=>({id:e,label:e}))):[]),[t]);return e(ie,{value:n,options:r,onChange:i,showEmptyOption:a,emptyOptionLabel:l})}function oe({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 se({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((()=>{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=>{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 de({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(se,{disabled:t,selected:n,labelGetter:i,onSearch:o,onChange:l})}function ce({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(de,{disabled:t,selected:r,labelGetter:i,entityClient:l,onChange:d})}function he({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(se,{disabled:t,selected:n,labelGetter:o,onSearch:s,onChange:l})}function pe({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(he,{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(ae,{disabled:i,value:n,options:d,onChange:l,showEmptyOption:o,emptyOptionLabel:s})}function ue({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 ge({value:n,sort:t,disabled:i,onChange:a,options:l,showEmptyOption:r,emptyOptionLabel:o}){return e(ue,{value:n,labelGetter:e=>e.name,disabled:i,sort:t,options:l,onChange:a,showEmptyOption:r,emptyOptionLabel:o})}function be({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 ve({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 fe=[{id:10,label:"10"},{id:100,label:"100"},{id:1e3,label:"1000"}];function ye({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===fe.find((n=>n.id===e))){const n=d.clone(fe);return n.push({id:e,label:String(e)}),n}return fe}),[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(ve,{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(ve,{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(ae,{value:p.size,options:v,onChange:e=>{p.size=e||10,g({...p})},showEmptyOption:!1})})]})})})]})]})})}function Ce({disabled:n,checked:t,iconOn:i,iconOff:a,size:l,onChange:r}){const o=u((()=>t?i||e(D,{size:l}):a||e(F,{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 we({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(Ce,{checked:h,onChange:()=>y(!h),iconOn:e(A,{})})})}),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(ye,{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(Ce,{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 xe({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 Ne({value:n}){return e("div",{className:"text-nowrap",children:l.formatDateTimeForHumans(n)})}function ze({ms:t}){return d.isEmpty(t)?e(n,{}):e("div",{className:"text-nowrap",children:l.formatDuration(t)})}function ke({date:n}){const t=u((()=>d.isEmpty(n)?null:Date.now()-n.getTime()),[n]);return e(ze,{ms:t})}const Oe=new Map([[c.error,H],[c.warning,$],[c.info,T]]);function Se({type:n,size:t,customVariant:i}){const a=Oe.get(n)||j;return e("div",{className:`d-flex align-items-center text-${void 0===i?n:i}`,children:a({size:t})})}function Ee({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(Se,{type:n.type}),e("div",{children:n.message})]})}function Le({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(Ee,{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(Z,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(Se,{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(Z,{size:"sm",variant:"danger",onClick:()=>i.reset(),icon:e(G,{}),children:"Reset"})]})})]})}class Pe{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 Ie=p(new Pe((()=>{})));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 Be({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 Me({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 De=new Map([["Idle","secondary"],["Processing","success"],["Loading","warn"]]);function Fe({state:n}){const t=De.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(Fe,{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 He({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{ye as AdvancedTable,ce as AutocompleteEntityIdSelect,de as AutocompleteEntitySelect,pe as AutocompleteLookupIdSelect,he as AutocompleteLookupSelect,se as AutocompleteSelect,Me as CacheStatsControl,Ge as ConfirmDialog,Ie as ConfirmDialogContext,Pe as ConfirmDialogContextData,W as DateInput,Ne as DateTime,X as DateTimeInput,te as DeleteButton,ze as Duration,ke as Elapsed,me as EntityIdSelect,ue as EntitySelect,be as EntityWithNameIdSelect,ge as EntityWithNameSelect,re as EnumSelect,Y as FormRow,q as FormRowControl,Z as IconButton,_ as IconSwitch,Be as JavaHeapControl,ee as LoadingButton,J as LocalizationContext,K as Localize,le as LookupSelect,ae as NumberSelect,Fe as QueueStateControl,Ae as QueueStatsControl,ne as SaveButton,He as Spread,ie as StringSelect,oe as Switch,ve as TablePagination,xe as TablePlaceholder,we as TableWithSelect,Q as TextInputWithReset,Se as UserAlertTypeIcon,Ee as UserAlertWidget,Le 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 k,Table as z,Stack as O,ProgressBar as S,Modal as E,Badge as L,Placeholder as P}from"react-bootstrap";import{BsXCircle as I,BsTrash as G,BsClipboard as B,BsFillCaretDownFill as M,BsFillCaretUpFill as D,BsCheckCircle as F,BsCircle as A,BsCheckAll as H,BsBug as T,BsExclamationDiamond as $,BsInfo as j,BsQuestion as V,BsEye as R}from"react-icons/bs";import{FaFloppyDisk as U}from"react-icons/fa6";import{VscEyeClosed as J}from"react-icons/vsc";const K=p(new i);function Y({text:t,tag:i}){const a=m(K),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 q({forId:n,label:i,children:a}){return t(y.Group,{children:[e(y.Label,{htmlFor:n,children:e(Y,{text:i})}),e("div",{children:a})]})}function Q(n){const t=u((()=>n.id||a.randomString()),[n]);return e(q,{label:n.label,forId:t,children:e(y.Control,{...n,id:t})})}function W({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(I,{})})})]})}function X({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 Z({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 _({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 ee({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 ne({disabled:n,icon:t,loading:i,children:a,size:l,variant:r,type:o,onClick:s}){return e(_,!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 te({disabled:n,icon:t,loading:i,children:a,size:l,onClick:r,isChanged:o}){const s=u((()=>t||e(U,{})),[t]),d=u((()=>o?e("strong",{children:a}):a),[o,a]);return e(ne,{disabled:n||!1===o,onClick:r,icon:s,loading:i,size:l,children:d})}function ie({disabled:n,icon:t,loading:i,children:a,size:l,onClick:r,isChanged:o}){const s=u((()=>t||e(G,{})),[t]);return e(ne,{disabled:n||!1===o,onClick:r,icon:s,loading:i,size:l,variant:"danger",children:a})}function ae({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 le({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(ae,{disabled:i,value:s,options:d,onChange:c,showEmptyOption:l,emptyOptionLabel:o})}function re({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(le,{disabled:i,value:n,options:d,onChange:l,showEmptyOption:o,emptyOptionLabel:s})}function oe({value:n,options:t,onChange:i,showEmptyOption:a,emptyOptionLabel:l}){const r=u((()=>t?t.map((e=>({id:e,label:e}))):[]),[t]);return e(ae,{value:n,options:r,onChange:i,showEmptyOption:a,emptyOptionLabel:l})}function se({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 de({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((()=>{p&&(m(void 0),h(n?C(n):""))}),[l,p,n,C]),k=g((()=>{y.current=window.setTimeout(x,100)}),[y,x]),z=g((()=>{y.current&&clearTimeout(y.current)}),[y]);b((()=>z),[]),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=>{m(void 0),l({...e})}),[l]);return e("div",{onBlur:k,onFocus:z,children:t(N,{defaultShow:!1,show:null!==p,children:[e(W,{disabled:i,value:c,onChange:S,onReset:O,className:w}),p&&e(N.Menu,{children:p.map((t=>e(N.Item,{onClick:e=>{z(),E(t)},active:t.id===n?.id,children:C(t)},t.id)))})]})})}function ce({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(de,{disabled:t,selected:n,labelGetter:i,onSearch:o,onChange:l})}function he({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(ce,{disabled:t,selected:r,labelGetter:i,entityClient:l,onChange:d})}function pe({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(de,{disabled:t,selected:n,labelGetter:o,onSearch:s,onChange:l})}function me({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(pe,{disabled:t,selected:r,labelGetter:i,lookupClient:l,onChange:s})}function ue({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(le,{disabled:i,value:n,options:d,onChange:l,showEmptyOption:o,emptyOptionLabel:s})}function ge({value:n,sort:t,disabled:i,labelGetter:a,onChange:l,options:r,showEmptyOption:o,emptyOptionLabel:s}){return e(ue,{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 be({value:n,sort:t,disabled:i,onChange:a,options:l,showEmptyOption:r,emptyOptionLabel:o}){return e(ge,{value:n,labelGetter:e=>e.name,disabled:i,sort:t,options:l,onChange:a,showEmptyOption:r,emptyOptionLabel:o})}function ve({id:n,sort:t,disabled:i,onChange:a,options:l,showEmptyOption:r,emptyOptionLabel:o}){return e(ue,{id:n,labelGetter:e=>e.name,disabled:i,sort:t,options:l,onChange:a,showEmptyOption:r,emptyOptionLabel:o})}function fe({text:n,onClipboardCopy:i}){const l=g((()=>{a.isBlank(n)||navigator.clipboard.writeText(n).then((()=>{i&&i()}))}),[n,i]);return t(C,{children:[e(y.Control,{type:"text",disabled:!0,value:String(n),onClick:l}),e(w,{onClick:l,children:e("div",{className:"d-flex align-items-center",children:e(B,{})})})]})}function ye({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(k.First,{onClick:()=>l(0),disabled:0===n.page},"first")),r.push(e(k.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(k.Ellipsis,{disabled:!0},"ellipsisStart"));for(let t=i;t<=o;t++)r.push(e(k.Item,{active:t===n.page,onClick:()=>l(t),children:t+1},t));o<a-1&&r.push(e(k.Ellipsis,{disabled:!0},"ellipsisEnd")),r.push(e(k.Next,{onClick:()=>l(n.page+1),disabled:n.page===a-1},"next")),r.push(e(k.Last,{onClick:()=>l(a-1),disabled:n.page===a-1},"last"))}return e(k,{size:"sm",className:"flex-wrap m-0",children:r})}const Ce=[{id:10,label:"10"},{id:100,label:"100"},{id:1e3,label:"1000"}];function we({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===Ce.find((n=>n.id===e))){const n=d.clone(Ce);return n.push({id:e,label:String(e)}),n}return Ce}),[p]);return e("div",{children:t(z,{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(Y,{text:"Page"}),": ",p.page+1," / ",b]}),b>0&&e(ye,{paging:p,totalItems:m,onPagingChanged:g}),t("div",{children:[e(Y,{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(M,{}):e(D,{}):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(Y,{text:"Page"}),": ",p.page+1," / ",b]}),b>0&&e(ye,{paging:p,totalItems:m,onPagingChanged:g}),t("div",{children:[e(Y,{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(Y,{text:"Page size"}),":"]}),e("div",{children:e(le,{value:p.size,options:v,onChange:e=>{p.size=e||10,g({...p})},showEmptyOption:!1})})]})})})]})]})})}function xe({disabled:n,checked:t,iconOn:i,iconOff:a,size:l,onChange:r}){const o=u((()=>t?i||e(F,{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 Ne({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(xe,{checked:h,onChange:()=>y(!h),iconOn:e(H,{})})})}),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(we,{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(xe,{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 ke({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(z,{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 ze({value:n}){return e("div",{className:"text-nowrap",children:l.formatDateTimeForHumans(n)})}function Oe({ms:t}){return d.isEmpty(t)?e(n,{}):e("div",{className:"text-nowrap",children:l.formatDuration(t)})}function Se({date:n}){const t=u((()=>d.isEmpty(n)?null:Date.now()-n.getTime()),[n]);return e(Oe,{ms:t})}const Ee=new Map([[c.error,T],[c.warning,$],[c.info,j]]);function Le({type:n,size:t,customVariant:i}){const a=Ee.get(n)||V;return e("div",{className:`d-flex align-items-center text-${void 0===i?n:i}`,children:a({size:t})})}function Pe({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(Le,{type:n.type}),e("div",{children:n.message})]})}function Ie({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(Pe,{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(_,a?{size:"sm",variant:"primary",onClick:()=>l(!1),icon:e(J,{}),children:"Hide"}:{size:"sm",variant:"primary",onClick:()=>l(!0),icon:e(R,{}),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(Le,{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(_,{size:"sm",variant:"danger",onClick:()=>i.reset(),icon:e(G,{}),children:"Reset"})]})})]})}class Ge{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 Be=p(new Ge((()=>{})));function Me({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(Y,{text:"Back"})}),e(w,{variant:"primary",onClick:l,children:e(Y,{text:"Yes"})})]})})]})}function De({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 Fe({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 Ae=new Map([["Idle","secondary"],["Processing","success"],["Loading","warn"]]);function He({state:n}){const t=Ae.get(n)||"light";return e(L,{className:`bg-${t} text-bg-${t}`,children:n})}function Te({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(He,{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 $e({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{we as AdvancedTable,he as AutocompleteEntityIdSelect,ce as AutocompleteEntitySelect,me as AutocompleteLookupIdSelect,pe as AutocompleteLookupSelect,de as AutocompleteSelect,Fe as CacheStatsControl,Me as ConfirmDialog,Be as ConfirmDialogContext,Ge as ConfirmDialogContextData,X as DateInput,ze as DateTime,Z as DateTimeInput,ie as DeleteButton,Oe as Duration,Se as Elapsed,ue as EntityIdSelect,ge as EntitySelect,ve as EntityWithNameIdSelect,be as EntityWithNameSelect,oe as EnumSelect,q as FormRow,Q as FormRowControl,_ as IconButton,ee as IconSwitch,De as JavaHeapControl,ne as LoadingButton,K as LocalizationContext,Y as Localize,re as LookupSelect,le as NumberSelect,He as QueueStateControl,Te as QueueStatsControl,te as SaveButton,$e as Spread,ae as StringSelect,se as Switch,ye as TablePagination,ke as TablePlaceholder,Ne as TableWithSelect,W as TextInputWithReset,fe as TextToClipboard,Le as UserAlertTypeIcon,Pe as UserAlertWidget,Ie 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/FormRowControl.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\tlabel: string;\n\tforId?: string;\n};\n\nexport function FormRow({forId, label, children}: FormRowProps) {\n\treturn (\n\t\t<Form.Group>\n\t\t\t<Form.Label htmlFor={forId}>\n\t\t\t\t<Localize text={label}/>\n\t\t\t</Form.Label>\n\t\t\t<div>{children}</div>\n\t\t</Form.Group>\n\t);\n}\n","import {Form, FormControlProps} from \"react-bootstrap\";\nimport {FormRow} from \"./FormRow\";\nimport {useMemo} from \"react\";\nimport {StringUtil} from \"zavadil-ts-common\";\n\nexport type FormRowControlProps = FormControlProps & {\n\tlabel: string;\n};\n\nexport function FormRowControl(props: FormRowControlProps) {\n\tconst actualId = useMemo(() => props.id || StringUtil.randomString(), [props]);\n\treturn (\n\t\t<FormRow label={props.label} forId={actualId}>\n\t\t\t<Form.Control {...props} id={actualId}/>\n\t\t</FormRow>\n\t);\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\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\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","forId","label","_jsxs","Form","Group","Label","htmlFor","FormRowControl","props","actualId","id","StringUtil","randomString","Control","TextInputWithReset","value","onChange","onReset","onBlur","disabled","className","actual","getNonEmpty","isEmpty","isBlank","reset","useCallback","InputGroup","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","Select","map","o","i","NumberSelect","nValue","String","nOptions","nChange","s","NumberUtil","parseNumber","LookupSelect","sort","labelGetter","lOptions","result","a","b","name","EnumSelect","AutocompleteSelect","selected","onSearch","searchPromise","setSearchPromise","useState","searchText","setSearchText","itemSelection","setItemSelection","blurTimeout","useRef","finalLabelGetter","item","finalCss","userLeftControl","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/FormRowControl.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/forms/TextToClipboard.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\tlabel: string;\n\tforId?: string;\n};\n\nexport function FormRow({forId, label, children}: FormRowProps) {\n\treturn (\n\t\t<Form.Group>\n\t\t\t<Form.Label htmlFor={forId}>\n\t\t\t\t<Localize text={label}/>\n\t\t\t</Form.Label>\n\t\t\t<div>{children}</div>\n\t\t</Form.Group>\n\t);\n}\n","import {Form, FormControlProps} from \"react-bootstrap\";\nimport {FormRow} from \"./FormRow\";\nimport {useMemo} from \"react\";\nimport {StringUtil} from \"zavadil-ts-common\";\n\nexport type FormRowControlProps = FormControlProps & {\n\tlabel: string;\n};\n\nexport function FormRowControl(props: FormRowControlProps) {\n\tconst actualId = useMemo(() => props.id || StringUtil.randomString(), [props]);\n\treturn (\n\t\t<FormRow label={props.label} forId={actualId}>\n\t\t\t<Form.Control {...props} id={actualId}/>\n\t\t</FormRow>\n\t);\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\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\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 {Button, Form, InputGroup} from \"react-bootstrap\";\r\nimport {BsClipboard} from \"react-icons/bs\";\r\nimport {useCallback} from \"react\";\r\nimport {StringUtil} from \"zavadil-ts-common\";\r\n\r\nexport type TextToClipboardProps = {\r\n\ttext?: string | null;\r\n\tonClipboardCopy?: () => any;\r\n};\r\n\r\nexport function TextToClipboard({text, onClipboardCopy}: TextToClipboardProps) {\r\n\r\n\tconst toClipboard = useCallback(\r\n\t\t() => {\r\n\t\t\tif (StringUtil.isBlank(text)) return;\r\n\t\t\tnavigator.clipboard\r\n\t\t\t\t.writeText(text)\r\n\t\t\t\t.then(\r\n\t\t\t\t\t() => {\r\n\t\t\t\t\t\tif (onClipboardCopy) {\r\n\t\t\t\t\t\t\tonClipboardCopy();\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[text, onClipboardCopy]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<InputGroup>\r\n\t\t\t<Form.Control\r\n\t\t\t\ttype=\"text\"\r\n\t\t\t\tdisabled={true}\r\n\t\t\t\tvalue={String(text)}\r\n\t\t\t\tonClick={toClipboard}\r\n\t\t\t/>\r\n\t\t\t<Button onClick={toClipboard}>\r\n\t\t\t\t<div className=\"d-flex align-items-center\">\r\n\t\t\t\t\t<BsClipboard/>\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 TextToClipboard;\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","forId","label","_jsxs","Form","Group","Label","htmlFor","FormRowControl","props","actualId","id","StringUtil","randomString","Control","TextInputWithReset","value","onChange","onReset","onBlur","disabled","className","actual","getNonEmpty","isEmpty","isBlank","reset","useCallback","InputGroup","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","Select","map","o","i","NumberSelect","nValue","String","nOptions","nChange","s","NumberUtil","parseNumber","LookupSelect","sort","labelGetter","lOptions","result","a","b","name","EnumSelect","AutocompleteSelect","selected","onSearch","searchPromise","setSearchPromise","useState","searchText","setSearchText","itemSelection","setItemSelection","blurTimeout","useRef","finalLabelGetter","item","finalCss","userLeftControl","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","TextToClipboard","onClipboardCopy","toClipboard","navigator","clipboard","writeText","BsClipboard","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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"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react/jsx-runtime"),t=require("zavadil-ts-common"),n=require("react"),s=require("react-bootstrap"),i=require("react-icons/bs"),a=require("react-icons/fa6"),o=require("react-icons/vsc");const l=n.createContext(new t.BasicLocalization);function r({text:t,tag:s}){const i=n.useContext(l),a=n.useMemo((()=>{if(void 0!==s&&""!==s)return"string"==typeof s?{tags:[s]}:{tags:s}}),[s]),o=n.useMemo((()=>i.translate(t,a)),[i,t,a]);return e.jsx(e.Fragment,{children:o})}function c({forId:t,label:n,children:i}){return e.jsxs(s.Form.Group,{children:[e.jsx(s.Form.Label,{htmlFor:t,children:e.jsx(r,{text:n})}),e.jsx("div",{children:i})]})}function d({value:a,onChange:o,onReset:l,onBlur:r,disabled:c,className:d}){const p=n.useMemo((()=>t.StringUtil.getNonEmpty(a)),[a]),u=n.useMemo((()=>t.StringUtil.isBlank(a)),[p]),m=n.useCallback((()=>{l?l():o("")}),[l,o]);return e.jsxs(s.InputGroup,{className:d,children:[e.jsx(s.Form.Control,{type:"text",disabled:c,value:p,onChange:e=>o(e.target.value),onBlur:r}),e.jsx(s.Button,{onClick:m,disabled:u,children:e.jsx("div",{className:"d-flex align-items-center",children:e.jsx(i.BsXCircle,{})})})]})}function p({disabled:t,variant:n,icon:i,size:a,children:o,type:l,onClick:r}){return e.jsx(s.Button,{disabled:!0===t,size:a,onClick:r,variant:n,type:l,children:e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[i,o&&e.jsx("div",{children:o})]})})}function u({disabled:t,icon:n,loading:i,children:a,size:o,variant:l,type:r,onClick:c}){return!0===i?e.jsx(p,{disabled:!0,onClick:c,size:o,variant:l,type:r,icon:e.jsx(s.Spinner,{size:"sm"}),children:a}):e.jsx(p,{disabled:t,onClick:c,icon:n,size:o,variant:l,children:a})}function m({value:i,options:a,disabled:o,onChange:l,showEmptyOption:r,emptyOptionLabel:c}){return n.useEffect((()=>{t.StringUtil.isBlank(i)&&a.length>0&&!0!==r&&l(a[0].id)}),[i,a,r,l]),e.jsxs(s.Form.Select,{value:i||"",onChange:e=>l(e.target.value),disabled:o,children:[!0===r&&e.jsx("option",{value:"",children:c||""},""),a?a.map(((t,n)=>e.jsx("option",{value:t.id||"",children:t.label||""},n))):e.jsx("span",{children:e.jsx(s.Spinner,{})})]})}function x({value:s,options:i,disabled:a,onChange:o,showEmptyOption:l,emptyOptionLabel:r}){const c=n.useMemo((()=>s?String(s):""),[s]),d=n.useMemo((()=>i?i.map((e=>({id:e.id?String(e.id):"",label:e.label}))):[]),[i]),p=n.useCallback((e=>o(t.NumberUtil.parseNumber(e))),[o]);return e.jsx(m,{disabled:a,value:c,options:d,onChange:p,showEmptyOption:l,emptyOptionLabel:r})}function h({selected:i,disabled:a,labelGetter:o,onChange:l,onSearch:r}){const[c,p]=n.useState(),[u,m]=n.useState(),[x,h]=n.useState(),g=n.useRef(),j=n.useCallback((e=>o?o(e):"name"in e&&"string"==typeof e.name?e.name:`[${e.id}]`),[o]),b=n.useMemo((()=>i?"border rounded border-primary":void 0),[i]),f=n.useCallback((()=>{x&&(h(void 0),m(i?j(i):""))}),[l,x,i,j]),C=n.useCallback((()=>{g.current=window.setTimeout(f,100)}),[g,f]),v=n.useCallback((()=>{g.current&&clearTimeout(g.current)}),[g]);n.useEffect((()=>v),[]),n.useEffect((()=>{m(i?j(i):""),c&&(c.cancel(),p(void 0)),h(void 0)}),[i]);const y=n.useCallback((()=>{l(null),m(""),c&&(c.cancel(),p(void 0)),h(void 0)}),[l,c]),S=n.useCallback((e=>{m(e),c&&c.cancel();const n=new t.CancellablePromise(r(e));n.promise.then(h),p(n)}),[c,r]),w=n.useCallback((e=>{h(void 0),l({...e})}),[l]);return e.jsx("div",{onBlur:C,onFocus:v,children:e.jsxs(s.Dropdown,{defaultShow:!1,show:null!==x,children:[e.jsx(d,{disabled:a,value:u,onChange:S,onReset:y,className:b}),x&&e.jsx(s.Dropdown.Menu,{children:x.map((t=>e.jsx(s.Dropdown.Item,{onClick:e=>{v(),w(t)},active:t.id===i?.id,children:j(t)},t.id)))})]})})}function g({selected:s,disabled:i,labelGetter:a,onChange:o,entityClient:l}){const r=n.useCallback((e=>l.loadPage({search:t.StringUtil.safeLowercase(e),page:0,size:10,sorting:[{name:"id"}]}).then((e=>e.content))),[a]);return e.jsx(h,{disabled:i,selected:s,labelGetter:a,onSearch:r,onChange:o})}function j({selected:s,disabled:i,labelGetter:a,onChange:o,lookupClient:l}){const r=n.useMemo((()=>a||(e=>e.name)),[a]),c=n.useCallback((e=>l.loadPage({search:t.StringUtil.safeLowercase(e),page:0,size:10,sorting:[{name:"name"}]}).then((e=>e.content))),[a]);return e.jsx(h,{disabled:i,selected:s,labelGetter:r,onSearch:c,onChange:o})}function b({id:t,sort:s,disabled:i,labelGetter:a,onChange:o,options:l,showEmptyOption:r,emptyOptionLabel:c}){const d=n.useMemo((()=>{let e=[];return l&&(e=s?l.sort(((e,t)=>a(e)>a(t)?1:-1)):l),e.map((e=>({id:e.id,label:a(e)})))}),[l]);return e.jsx(x,{disabled:i,value:t,options:d,onChange:o,showEmptyOption:r,emptyOptionLabel:c})}function f({value:t,sort:n,disabled:s,labelGetter:i,onChange:a,options:o,showEmptyOption:l,emptyOptionLabel:r}){return e.jsx(b,{disabled:s,id:t?t.id:null,options:o,sort:n,onChange:e=>{a(o&&e?o.find((t=>t.id===e)):void 0)},labelGetter:i,showEmptyOption:l,emptyOptionLabel:r})}function C({paging:n,totalItems:i,onPagingChanged:a}){const o=Math.ceil(i/n.size),l=e=>{n.page=e,a(t.ObjectUtil.clone(n))},r=[];if(o>1){r.push(e.jsx(s.Pagination.First,{onClick:()=>l(0),disabled:0===n.page},"first")),r.push(e.jsx(s.Pagination.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,a=i+10;a>=o&&(a=o-1),i>0&&r.push(e.jsx(s.Pagination.Ellipsis,{disabled:!0},"ellipsisStart"));for(let t=i;t<=a;t++)r.push(e.jsx(s.Pagination.Item,{active:t===n.page,onClick:()=>l(t),children:t+1},t));a<o-1&&r.push(e.jsx(s.Pagination.Ellipsis,{disabled:!0},"ellipsisEnd")),r.push(e.jsx(s.Pagination.Next,{onClick:()=>l(n.page+1),disabled:n.page===o-1},"next")),r.push(e.jsx(s.Pagination.Last,{onClick:()=>l(o-1),disabled:n.page===o-1},"last"))}return e.jsx(s.Pagination,{size:"sm",className:"flex-wrap m-0",children:r})}const v=[{id:10,label:"10"},{id:100,label:"100"},{id:1e3,label:"1000"}];function y({hover:a,showPagingOnBottom:o,showPageSizeSelection:l,striped:c,bordered:d,header:p,children:u,paging:m,totalItems:h,onPagingChanged:g}){const j=Math.ceil(h/m.size),b=n.useMemo((()=>{const e=m.size;if(null===v.find((t=>t.id===e))){const n=t.ObjectUtil.clone(v);return n.push({id:e,label:String(e)}),n}return v}),[m]);return e.jsx("div",{children:e.jsxs(s.Table,{hover:a,striped:c,responsive:!0,bordered:d,children:[e.jsxs("thead",{children:[e.jsx("tr",{children:e.jsx("td",{colSpan:p.length,children:e.jsxs("div",{className:"d-flex justify-content-between align-items-center gap-2",children:[e.jsxs("div",{children:[e.jsx(r,{text:"Page"}),": ",m.page+1," / ",j]}),j>0&&e.jsx(C,{paging:m,totalItems:h,onPagingChanged:g}),e.jsxs("div",{children:[e.jsx(r,{text:"Total items"}),": ",h]})]})})}),e.jsx("tr",{children:p.map(((n,s)=>{const a=!1===n.sort?"":t.StringUtil.isBlank(n.sort)?n.name:n.sort;if(t.StringUtil.isBlank(a)||!a)return e.jsx("th",{children:n.label},s);const o=m.sorting&&m.sorting.find((e=>e.name===a));return e.jsxs("th",{className:"user-select-none text-nowrap",role:"button",onClick:e=>((e,n)=>{m.sorting||(m.sorting=[]);let s=m.sorting.find((e=>e.name===n));const i=s&&1===m.sorting.length;e.ctrlKey||i||(m.sorting=[],s=void 0),s?s.desc=!s.desc:m.sorting.push({name:n}),g(t.ObjectUtil.clone(m))})(e,a),children:[n.label,o?o.desc?e.jsx(i.BsFillCaretDownFill,{}):e.jsx(i.BsFillCaretUpFill,{}):e.jsx(e.Fragment,{})]},s)}))})]}),e.jsx("tbody",{children:u}),h>0&&e.jsxs("tfoot",{children:[o&&e.jsx("tr",{children:e.jsx("td",{colSpan:p.length,children:e.jsxs("div",{className:"d-flex justify-content-between align-items-center gap-2",children:[e.jsxs("div",{children:[e.jsx(r,{text:"Page"}),": ",m.page+1," / ",j]}),j>0&&e.jsx(C,{paging:m,totalItems:h,onPagingChanged:g}),e.jsxs("div",{children:[e.jsx(r,{text:"Total items"}),": ",h]})]})})}),l&&e.jsx("tr",{children:e.jsx("td",{colSpan:p.length,children:e.jsxs("div",{className:"d-flex align-items-center gap-2 justify-content-end",children:[e.jsxs("div",{className:"text-nowrap",children:[e.jsx(r,{text:"Page size"}),":"]}),e.jsx("div",{children:e.jsx(x,{value:m.size,options:b,onChange:e=>{m.size=e||10,g({...m})},showEmptyOption:!1})})]})})})]})]})})}function S({disabled:t,checked:s,iconOn:a,iconOff:o,size:l,onChange:r}){const c=n.useMemo((()=>s?a||e.jsx(i.BsCheckCircle,{size:l}):o||e.jsx(i.BsCircle,{size:l,className:"text-muted"})),[s,a,o,l]);return e.jsx("div",{className:"d-flex align-items-center cursor-pointer",onClick:e=>{e.stopPropagation(),e.preventDefault(),r(!s)},children:c})}function w({ms:n}){return t.ObjectUtil.isEmpty(n)?e.jsx(e.Fragment,{}):e.jsx("div",{className:"text-nowrap",children:t.DateUtil.formatDuration(n)})}const k=new Map([[t.UserAlertType.error,i.BsBug],[t.UserAlertType.warning,i.BsExclamationDiamond],[t.UserAlertType.info,i.BsInfo]]);function N({type:t,size:n,customVariant:s}){const a=k.get(t)||i.BsQuestion;return e.jsx("div",{className:`d-flex align-items-center text-${void 0===s?t:s}`,children:a({size:n})})}function B({userAlert:n,maxDurationMs:i}){return e.jsxs(s.Stack,{direction:"horizontal",gap:2,className:"align-items-center",children:[n.remainsMs&&e.jsx("div",{style:{width:20},children:e.jsx(s.ProgressBar,{min:0,max:i,now:n.remainsMs,variant:n.type})}),e.jsx("div",{children:t.DateUtil.formatDateForHumans(n.time)}),e.jsx(N,{type:n.type}),e.jsx("div",{children:n.message})]})}class z{constructor(e){this.setProps=e}confirm(e,t,n){this.setProps({name:e,text:t,onConfirm:()=>{n(),this.setProps(void 0)},onClose:()=>this.setProps(void 0)})}}const O=n.createContext(new z((()=>{})));const E=new Map([["Idle","secondary"],["Processing","success"],["Loading","warn"]]);function M({state:t}){const n=E.get(t)||"light";return e.jsx(s.Badge,{className:`bg-${n} text-bg-${n}`,children:t})}exports.AdvancedTable=y,exports.AutocompleteEntityIdSelect=function({id:s,disabled:i,labelGetter:a,onChange:o,entityClient:l}){const[r,c]=n.useState(null);n.useEffect((()=>{s?r&&r.id===s?c({...r}):l instanceof t.EntityClientWithStub?l.loadSingleStub(s).then(c):l.loadSingle(s).then(c):c(null)}),[s]);const d=n.useCallback((e=>{const t=e?e.id:null;t!==s&&o(t),c(e)}),[s,o]);return e.jsx(g,{disabled:i,selected:r,labelGetter:a,entityClient:l,onChange:d})},exports.AutocompleteEntitySelect=g,exports.AutocompleteLookupIdSelect=function({id:t,disabled:s,labelGetter:i,onChange:a,lookupClient:o}){const[l,r]=n.useState(null);n.useEffect((()=>{t?l&&l.id===t?r({...l}):o.loadSingle(t).then(r):r(null)}),[t]);const c=n.useCallback((e=>{const n=e?e.id:null;n!==t&&a(n),r(e)}),[t,l]);return e.jsx(j,{disabled:s,selected:l,labelGetter:i,lookupClient:o,onChange:c})},exports.AutocompleteLookupSelect=j,exports.AutocompleteSelect=h,exports.CacheStatsControl=function({name:t,stats:n}){return e.jsxs("div",{children:[e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsx("pre",{children:t}),e.jsxs("pre",{children:["[",n.cachedItems,n.capacity>0&&" / ",n.capacity>0&&n.capacity,"]"]})]}),n.capacity>0&&e.jsx("div",{className:"p-1",children:e.jsx(s.ProgressBar,{now:n.cachedItems,min:0,max:n.capacity})})]})},exports.ConfirmDialog=function({name:t,text:n,onClose:i,onConfirm:a}){return e.jsxs(s.Modal,{show:!0,backdrop:!0,onHide:i,children:[e.jsx(s.Modal.Header,{children:t||"Confirm"}),e.jsx(s.Modal.Body,{children:n}),e.jsx(s.Modal.Footer,{children:e.jsxs(s.Stack,{direction:"horizontal",children:[e.jsx(s.Button,{variant:"link",onClick:i,children:e.jsx(r,{text:"Back"})}),e.jsx(s.Button,{variant:"primary",onClick:a,children:e.jsx(r,{text:"Yes"})})]})})]})},exports.ConfirmDialogContext=O,exports.ConfirmDialogContextData=z,exports.DateInput=function({value:n,onChange:i,disabled:a}){return e.jsx(s.Form.Control,{type:"date",disabled:a,value:t.DateUtil.formatDateForInput(n),onChange:e=>{i(t.DateUtil.parseDate(e.target.value))}})},exports.DateTime=function({value:n}){return e.jsx("div",{className:"text-nowrap",children:t.DateUtil.formatDateTimeForHumans(n)})},exports.DateTimeInput=function({value:n,onChange:i,disabled:a}){return e.jsx(s.Form.Control,{type:"datetime-local",disabled:a,value:t.DateUtil.formatDateTimeForInput(n),onChange:e=>{i(t.DateUtil.parseDate(e.target.value))}})},exports.DeleteButton=function({disabled:t,icon:s,loading:a,children:o,size:l,onClick:r,isChanged:c}){const d=n.useMemo((()=>s||e.jsx(i.BsTrash,{})),[s]);return e.jsx(u,{disabled:t||!1===c,onClick:r,icon:d,loading:a,size:l,variant:"danger",children:o})},exports.Duration=w,exports.Elapsed=function({date:s}){const i=n.useMemo((()=>t.ObjectUtil.isEmpty(s)?null:Date.now()-s.getTime()),[s]);return e.jsx(w,{ms:i})},exports.EntityIdSelect=b,exports.EntitySelect=f,exports.EntityWithNameIdSelect=function({id:t,sort:n,disabled:s,onChange:i,options:a,showEmptyOption:o,emptyOptionLabel:l}){return e.jsx(b,{id:t,labelGetter:e=>e.name,disabled:s,sort:n,options:a,onChange:i,showEmptyOption:o,emptyOptionLabel:l})},exports.EntityWithNameSelect=function({value:t,sort:n,disabled:s,onChange:i,options:a,showEmptyOption:o,emptyOptionLabel:l}){return e.jsx(f,{value:t,labelGetter:e=>e.name,disabled:s,sort:n,options:a,onChange:i,showEmptyOption:o,emptyOptionLabel:l})},exports.EnumSelect=function({value:t,options:s,onChange:i,showEmptyOption:a,emptyOptionLabel:o}){const l=n.useMemo((()=>s?s.map((e=>({id:e,label:e}))):[]),[s]);return e.jsx(m,{value:t,options:l,onChange:i,showEmptyOption:a,emptyOptionLabel:o})},exports.FormRow=c,exports.FormRowControl=function(i){const a=n.useMemo((()=>i.id||t.StringUtil.randomString()),[i]);return e.jsx(c,{label:i.label,forId:a,children:e.jsx(s.Form.Control,{...i,id:a})})},exports.IconButton=p,exports.IconSwitch=function({disabled:t,checked:n,iconOn:i,iconOff:a,size:o,onChange:l}){return e.jsxs("div",{className:"d-flex align-items-center gap-2 cursor-pointer",onClick:e=>l(!n),children:[e.jsx(s.Form.Switch,{disabled:t,size:o,type:"switch",checked:n,readOnly:!0,className:"cursor-pointer"}),n?i:a]})},exports.JavaHeapControl=function({stats:n}){const i=n.heapSize,a=n.heapMaxSize,o=n.heapFreeSize,l=i-o;return e.jsxs("div",{children:[e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsx("pre",{children:"Java Heap"}),e.jsxs("pre",{children:["[",t.ByteUtil.formatByteSize(i)," / ",t.ByteUtil.formatByteSize(a),"]"]})]}),e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsx("pre",{children:"Used:"}),e.jsx(s.Badge,{className:"bg-warning text-bg-warning",children:t.ByteUtil.formatByteSize(l)}),e.jsx("pre",{children:"Free:"}),e.jsx(s.Badge,{className:"bg-success text-white",children:t.ByteUtil.formatByteSize(o)})]}),e.jsx("div",{className:"p-1",children:e.jsxs(s.ProgressBar,{min:0,max:a,children:[e.jsx(s.ProgressBar,{variant:"warning",min:0,now:l,max:a}),e.jsx(s.ProgressBar,{variant:"success",min:0,now:o,max:a})]})})]})},exports.LoadingButton=u,exports.LocalizationContext=l,exports.Localize=r,exports.LookupSelect=function({id:t,sort:s,disabled:i,labelGetter:a,onChange:o,options:l,showEmptyOption:r,emptyOptionLabel:c}){const d=n.useMemo((()=>{let e=[];return l&&(e=s?l.sort(((e,t)=>e.name>t.name?1:-1)):l),e.map((e=>({id:e.id,label:a?a(e):e.name})))}),[l]);return e.jsx(x,{disabled:i,value:t,options:d,onChange:o,showEmptyOption:r,emptyOptionLabel:c})},exports.NumberSelect=x,exports.QueueStateControl=M,exports.QueueStatsControl=function({name:t,stats:n}){const i=n?n.remaining+n.processed:void 0;return e.jsxs("div",{children:[e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsx("pre",{children:t}),e.jsxs("pre",{children:["[",void 0!==n?.processed?n.processed:"?"," / ",void 0!==i?i:"?","]"]}),e.jsx(M,{state:n?n.state:"Unknown"})]}),e.jsx("div",{className:"p-1",children:n?e.jsx(s.ProgressBar,{variant:"primary",striped:!0,animated:!0,min:0,now:n.processed,max:i||1}):e.jsx(s.Placeholder,{className:"w-100",animation:"glow",children:e.jsx(s.Placeholder,{className:"w-100"})})})]})},exports.SaveButton=function({disabled:t,icon:s,loading:i,children:o,size:l,onClick:r,isChanged:c}){const d=n.useMemo((()=>s||e.jsx(a.FaFloppyDisk,{})),[s]),p=n.useMemo((()=>c?e.jsx("strong",{children:o}):o),[c,o]);return e.jsx(u,{disabled:t||!1===c,onClick:r,icon:d,loading:i,size:l,children:p})},exports.Spread=function({children:t,center:s}){const i=n.useMemo((()=>!1===s?"":"d-flex align-items-center justify-content-center"),[s]);return e.jsx("div",{className:`w-100 h-100 position-absolute ${i}`,style:{left:0,right:0,top:0,bottom:0},children:t})},exports.StringSelect=m,exports.Switch=function({id:i,label:a,disabled:o,checked:l,size:r,onChange:c}){const d=n.useMemo((()=>i||t.StringUtil.randomString()),[i]);return e.jsx(s.Form.Switch,{disabled:o,id:d,size:r,type:"switch",checked:l,onChange:e=>c(!l),className:"cursor-pointer",label:a})},exports.TablePagination=C,exports.TablePlaceholder=function({cols:t,rows:i,size:a}){const o=n.useMemo((()=>void 0===t?1:t),[t]),l=n.useMemo((()=>void 0===i?20:i),[i]);return n.useMemo((()=>void 0===a?"lg":a),[a]),e.jsx("div",{children:e.jsx(s.Table,{responsive:!0,children:e.jsx("tbody",{children:Array.from({length:l},((t,n)=>e.jsx("tr",{children:Array.from({length:o},((t,n)=>e.jsx("td",{children:e.jsx("div",{className:"w-100 p-1 m-1"})},n)))},n)))})})})},exports.TableWithSelect=function({showSelect:s,header:a,items:o,onSelect:l,onClick:r,totalItems:c,paging:d,onPagingChanged:p}){const[u,m]=n.useState(!1),[x,h]=n.useState(),g=n.useCallback((e=>{x&&h(x.map((t=>({selected:e,item:t.item})))),m(e)}),[x]),j=n.useMemo((()=>{const t=[...a];return!1!==s&&t.unshift({name:"",label:e.jsx("div",{className:"py-1",children:e.jsx(S,{checked:u,onChange:()=>g(!u),iconOn:e.jsx(i.BsCheckAll,{})})})}),t}),[a,u,g]);return n.useEffect((()=>{h(o?o.map((e=>({selected:u,item:e}))):void 0)}),[o]),n.useEffect((()=>{x&&l&&l(x.filter((e=>e.selected)).map((e=>e.item)))}),[x,l]),e.jsx(y,{header:j,hover:void 0!==r,paging:d,striped:!0,totalItems:c,onPagingChanged:p,children:x&&x.map(((n,i)=>e.jsxs("tr",{className:`selectable ${r?"cursor-pointer":""} ${n.selected?"table-active table-primary":""}`,onClick:e=>{r&&r(n.item)},children:[!1!==s&&e.jsx("td",{children:e.jsx("div",{className:"py-2 d-flex align-items-center",children:e.jsx(S,{checked:n.selected,onChange:()=>{n.selected=!n.selected,u&&!n.selected&&m(!1),h([...x])}})})}),a.map(((s,i)=>{const a=s.renderer||(o=s.name,e=>t.ObjectUtil.getNestedValue(e,o));var o;return e.jsx("td",{children:a(n.item)},i)}))]},i)))})},exports.TextInputWithReset=d,exports.UserAlertTypeIcon=N,exports.UserAlertWidget=B,exports.UserAlertsWidget=function({userAlerts:t}){const[a,l]=n.useState(!1),[r,c]=n.useState(t.alerts.length),[d,u]=n.useState([...t.visibleAlerts]),[m,x]=n.useState(t.getSummary()),h=n.useCallback((()=>{c(t.alerts.length),u(a?[...t.alerts]:[...t.visibleAlerts]),x(t.getSummary())}),[t,a]);return n.useEffect((()=>{t.addOnChangeHandler(h);const e=setInterval((()=>t.updateVisibility()),100);return()=>{clearInterval(e),t.removeOnChangeHandler(h)}}),[t,h]),r<=0?e.jsx(e.Fragment,{}):e.jsxs("div",{className:"user-alerts border rounded bg-body text-body position-fixed text-end",style:{bottom:15,right:15,zIndex:2147483647},children:[d.length>0&&e.jsx("div",{className:"max-w-50 p-2 border-bottom",children:d.map(((n,s)=>e.jsx(B,{userAlert:n,maxDurationMs:t.maxVisibilityMs},s)))}),e.jsx("div",{className:"p-2",children:e.jsxs(s.Stack,{direction:"horizontal",gap:2,className:"justify-content-end align-items-center",children:[a?e.jsx(p,{size:"sm",variant:"primary",onClick:()=>l(!1),icon:e.jsx(o.VscEyeClosed,{}),children:"Hide"}):e.jsx(p,{size:"sm",variant:"primary",onClick:()=>l(!0),icon:e.jsx(i.BsEye,{}),children:"Show All"}),Array.from(m.entries()).map(((t,n)=>e.jsxs(s.Stack,{direction:"horizontal",gap:1,className:"px-1 border rounded align-items-center",children:[e.jsx(N,{type:t[0],customVariant:0===t[1]?"muted":void 0}),e.jsx("div",{className:t[1]>0?`text-${t[0]} fw-bold`:"text-muted",children:t[1]})]},n))),e.jsx(p,{size:"sm",variant:"danger",onClick:()=>t.reset(),icon:e.jsx(i.BsTrash,{}),children:"Reset"})]})})]})};
1
+ "use strict";var e=require("react/jsx-runtime"),t=require("zavadil-ts-common"),n=require("react"),s=require("react-bootstrap"),i=require("react-icons/bs"),a=require("react-icons/fa6"),o=require("react-icons/vsc");const l=n.createContext(new t.BasicLocalization);function r({text:t,tag:s}){const i=n.useContext(l),a=n.useMemo((()=>{if(void 0!==s&&""!==s)return"string"==typeof s?{tags:[s]}:{tags:s}}),[s]),o=n.useMemo((()=>i.translate(t,a)),[i,t,a]);return e.jsx(e.Fragment,{children:o})}function c({forId:t,label:n,children:i}){return e.jsxs(s.Form.Group,{children:[e.jsx(s.Form.Label,{htmlFor:t,children:e.jsx(r,{text:n})}),e.jsx("div",{children:i})]})}function d({value:a,onChange:o,onReset:l,onBlur:r,disabled:c,className:d}){const p=n.useMemo((()=>t.StringUtil.getNonEmpty(a)),[a]),u=n.useMemo((()=>t.StringUtil.isBlank(a)),[p]),x=n.useCallback((()=>{l?l():o("")}),[l,o]);return e.jsxs(s.InputGroup,{className:d,children:[e.jsx(s.Form.Control,{type:"text",disabled:c,value:p,onChange:e=>o(e.target.value),onBlur:r}),e.jsx(s.Button,{onClick:x,disabled:u,children:e.jsx("div",{className:"d-flex align-items-center",children:e.jsx(i.BsXCircle,{})})})]})}function p({disabled:t,variant:n,icon:i,size:a,children:o,type:l,onClick:r}){return e.jsx(s.Button,{disabled:!0===t,size:a,onClick:r,variant:n,type:l,children:e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[i,o&&e.jsx("div",{children:o})]})})}function u({disabled:t,icon:n,loading:i,children:a,size:o,variant:l,type:r,onClick:c}){return!0===i?e.jsx(p,{disabled:!0,onClick:c,size:o,variant:l,type:r,icon:e.jsx(s.Spinner,{size:"sm"}),children:a}):e.jsx(p,{disabled:t,onClick:c,icon:n,size:o,variant:l,children:a})}function x({value:i,options:a,disabled:o,onChange:l,showEmptyOption:r,emptyOptionLabel:c}){return n.useEffect((()=>{t.StringUtil.isBlank(i)&&a.length>0&&!0!==r&&l(a[0].id)}),[i,a,r,l]),e.jsxs(s.Form.Select,{value:i||"",onChange:e=>l(e.target.value),disabled:o,children:[!0===r&&e.jsx("option",{value:"",children:c||""},""),a?a.map(((t,n)=>e.jsx("option",{value:t.id||"",children:t.label||""},n))):e.jsx("span",{children:e.jsx(s.Spinner,{})})]})}function m({value:s,options:i,disabled:a,onChange:o,showEmptyOption:l,emptyOptionLabel:r}){const c=n.useMemo((()=>s?String(s):""),[s]),d=n.useMemo((()=>i?i.map((e=>({id:e.id?String(e.id):"",label:e.label}))):[]),[i]),p=n.useCallback((e=>o(t.NumberUtil.parseNumber(e))),[o]);return e.jsx(x,{disabled:a,value:c,options:d,onChange:p,showEmptyOption:l,emptyOptionLabel:r})}function h({selected:i,disabled:a,labelGetter:o,onChange:l,onSearch:r}){const[c,p]=n.useState(),[u,x]=n.useState(),[m,h]=n.useState(),g=n.useRef(),j=n.useCallback((e=>o?o(e):"name"in e&&"string"==typeof e.name?e.name:`[${e.id}]`),[o]),b=n.useMemo((()=>i?"border rounded border-primary":void 0),[i]),C=n.useCallback((()=>{m&&(h(void 0),x(i?j(i):""))}),[l,m,i,j]),f=n.useCallback((()=>{g.current=window.setTimeout(C,100)}),[g,C]),v=n.useCallback((()=>{g.current&&clearTimeout(g.current)}),[g]);n.useEffect((()=>v),[]),n.useEffect((()=>{x(i?j(i):""),c&&(c.cancel(),p(void 0)),h(void 0)}),[i]);const y=n.useCallback((()=>{l(null),x(""),c&&(c.cancel(),p(void 0)),h(void 0)}),[l,c]),S=n.useCallback((e=>{x(e),c&&c.cancel();const n=new t.CancellablePromise(r(e));n.promise.then(h),p(n)}),[c,r]),w=n.useCallback((e=>{h(void 0),l({...e})}),[l]);return e.jsx("div",{onBlur:f,onFocus:v,children:e.jsxs(s.Dropdown,{defaultShow:!1,show:null!==m,children:[e.jsx(d,{disabled:a,value:u,onChange:S,onReset:y,className:b}),m&&e.jsx(s.Dropdown.Menu,{children:m.map((t=>e.jsx(s.Dropdown.Item,{onClick:e=>{v(),w(t)},active:t.id===i?.id,children:j(t)},t.id)))})]})})}function g({selected:s,disabled:i,labelGetter:a,onChange:o,entityClient:l}){const r=n.useCallback((e=>l.loadPage({search:t.StringUtil.safeLowercase(e),page:0,size:10,sorting:[{name:"id"}]}).then((e=>e.content))),[a]);return e.jsx(h,{disabled:i,selected:s,labelGetter:a,onSearch:r,onChange:o})}function j({selected:s,disabled:i,labelGetter:a,onChange:o,lookupClient:l}){const r=n.useMemo((()=>a||(e=>e.name)),[a]),c=n.useCallback((e=>l.loadPage({search:t.StringUtil.safeLowercase(e),page:0,size:10,sorting:[{name:"name"}]}).then((e=>e.content))),[a]);return e.jsx(h,{disabled:i,selected:s,labelGetter:r,onSearch:c,onChange:o})}function b({id:t,sort:s,disabled:i,labelGetter:a,onChange:o,options:l,showEmptyOption:r,emptyOptionLabel:c}){const d=n.useMemo((()=>{let e=[];return l&&(e=s?l.sort(((e,t)=>a(e)>a(t)?1:-1)):l),e.map((e=>({id:e.id,label:a(e)})))}),[l]);return e.jsx(m,{disabled:i,value:t,options:d,onChange:o,showEmptyOption:r,emptyOptionLabel:c})}function C({value:t,sort:n,disabled:s,labelGetter:i,onChange:a,options:o,showEmptyOption:l,emptyOptionLabel:r}){return e.jsx(b,{disabled:s,id:t?t.id:null,options:o,sort:n,onChange:e=>{a(o&&e?o.find((t=>t.id===e)):void 0)},labelGetter:i,showEmptyOption:l,emptyOptionLabel:r})}function f({paging:n,totalItems:i,onPagingChanged:a}){const o=Math.ceil(i/n.size),l=e=>{n.page=e,a(t.ObjectUtil.clone(n))},r=[];if(o>1){r.push(e.jsx(s.Pagination.First,{onClick:()=>l(0),disabled:0===n.page},"first")),r.push(e.jsx(s.Pagination.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,a=i+10;a>=o&&(a=o-1),i>0&&r.push(e.jsx(s.Pagination.Ellipsis,{disabled:!0},"ellipsisStart"));for(let t=i;t<=a;t++)r.push(e.jsx(s.Pagination.Item,{active:t===n.page,onClick:()=>l(t),children:t+1},t));a<o-1&&r.push(e.jsx(s.Pagination.Ellipsis,{disabled:!0},"ellipsisEnd")),r.push(e.jsx(s.Pagination.Next,{onClick:()=>l(n.page+1),disabled:n.page===o-1},"next")),r.push(e.jsx(s.Pagination.Last,{onClick:()=>l(o-1),disabled:n.page===o-1},"last"))}return e.jsx(s.Pagination,{size:"sm",className:"flex-wrap m-0",children:r})}const v=[{id:10,label:"10"},{id:100,label:"100"},{id:1e3,label:"1000"}];function y({hover:a,showPagingOnBottom:o,showPageSizeSelection:l,striped:c,bordered:d,header:p,children:u,paging:x,totalItems:h,onPagingChanged:g}){const j=Math.ceil(h/x.size),b=n.useMemo((()=>{const e=x.size;if(null===v.find((t=>t.id===e))){const n=t.ObjectUtil.clone(v);return n.push({id:e,label:String(e)}),n}return v}),[x]);return e.jsx("div",{children:e.jsxs(s.Table,{hover:a,striped:c,responsive:!0,bordered:d,children:[e.jsxs("thead",{children:[e.jsx("tr",{children:e.jsx("td",{colSpan:p.length,children:e.jsxs("div",{className:"d-flex justify-content-between align-items-center gap-2",children:[e.jsxs("div",{children:[e.jsx(r,{text:"Page"}),": ",x.page+1," / ",j]}),j>0&&e.jsx(f,{paging:x,totalItems:h,onPagingChanged:g}),e.jsxs("div",{children:[e.jsx(r,{text:"Total items"}),": ",h]})]})})}),e.jsx("tr",{children:p.map(((n,s)=>{const a=!1===n.sort?"":t.StringUtil.isBlank(n.sort)?n.name:n.sort;if(t.StringUtil.isBlank(a)||!a)return e.jsx("th",{children:n.label},s);const o=x.sorting&&x.sorting.find((e=>e.name===a));return e.jsxs("th",{className:"user-select-none text-nowrap",role:"button",onClick:e=>((e,n)=>{x.sorting||(x.sorting=[]);let s=x.sorting.find((e=>e.name===n));const i=s&&1===x.sorting.length;e.ctrlKey||i||(x.sorting=[],s=void 0),s?s.desc=!s.desc:x.sorting.push({name:n}),g(t.ObjectUtil.clone(x))})(e,a),children:[n.label,o?o.desc?e.jsx(i.BsFillCaretDownFill,{}):e.jsx(i.BsFillCaretUpFill,{}):e.jsx(e.Fragment,{})]},s)}))})]}),e.jsx("tbody",{children:u}),h>0&&e.jsxs("tfoot",{children:[o&&e.jsx("tr",{children:e.jsx("td",{colSpan:p.length,children:e.jsxs("div",{className:"d-flex justify-content-between align-items-center gap-2",children:[e.jsxs("div",{children:[e.jsx(r,{text:"Page"}),": ",x.page+1," / ",j]}),j>0&&e.jsx(f,{paging:x,totalItems:h,onPagingChanged:g}),e.jsxs("div",{children:[e.jsx(r,{text:"Total items"}),": ",h]})]})})}),l&&e.jsx("tr",{children:e.jsx("td",{colSpan:p.length,children:e.jsxs("div",{className:"d-flex align-items-center gap-2 justify-content-end",children:[e.jsxs("div",{className:"text-nowrap",children:[e.jsx(r,{text:"Page size"}),":"]}),e.jsx("div",{children:e.jsx(m,{value:x.size,options:b,onChange:e=>{x.size=e||10,g({...x})},showEmptyOption:!1})})]})})})]})]})})}function S({disabled:t,checked:s,iconOn:a,iconOff:o,size:l,onChange:r}){const c=n.useMemo((()=>s?a||e.jsx(i.BsCheckCircle,{size:l}):o||e.jsx(i.BsCircle,{size:l,className:"text-muted"})),[s,a,o,l]);return e.jsx("div",{className:"d-flex align-items-center cursor-pointer",onClick:e=>{e.stopPropagation(),e.preventDefault(),r(!s)},children:c})}function w({ms:n}){return t.ObjectUtil.isEmpty(n)?e.jsx(e.Fragment,{}):e.jsx("div",{className:"text-nowrap",children:t.DateUtil.formatDuration(n)})}const k=new Map([[t.UserAlertType.error,i.BsBug],[t.UserAlertType.warning,i.BsExclamationDiamond],[t.UserAlertType.info,i.BsInfo]]);function B({type:t,size:n,customVariant:s}){const a=k.get(t)||i.BsQuestion;return e.jsx("div",{className:`d-flex align-items-center text-${void 0===s?t:s}`,children:a({size:n})})}function N({userAlert:n,maxDurationMs:i}){return e.jsxs(s.Stack,{direction:"horizontal",gap:2,className:"align-items-center",children:[n.remainsMs&&e.jsx("div",{style:{width:20},children:e.jsx(s.ProgressBar,{min:0,max:i,now:n.remainsMs,variant:n.type})}),e.jsx("div",{children:t.DateUtil.formatDateForHumans(n.time)}),e.jsx(B,{type:n.type}),e.jsx("div",{children:n.message})]})}class z{constructor(e){this.setProps=e}confirm(e,t,n){this.setProps({name:e,text:t,onConfirm:()=>{n(),this.setProps(void 0)},onClose:()=>this.setProps(void 0)})}}const O=n.createContext(new z((()=>{})));const E=new Map([["Idle","secondary"],["Processing","success"],["Loading","warn"]]);function M({state:t}){const n=E.get(t)||"light";return e.jsx(s.Badge,{className:`bg-${n} text-bg-${n}`,children:t})}exports.AdvancedTable=y,exports.AutocompleteEntityIdSelect=function({id:s,disabled:i,labelGetter:a,onChange:o,entityClient:l}){const[r,c]=n.useState(null);n.useEffect((()=>{s?r&&r.id===s?c({...r}):l instanceof t.EntityClientWithStub?l.loadSingleStub(s).then(c):l.loadSingle(s).then(c):c(null)}),[s]);const d=n.useCallback((e=>{const t=e?e.id:null;t!==s&&o(t),c(e)}),[s,o]);return e.jsx(g,{disabled:i,selected:r,labelGetter:a,entityClient:l,onChange:d})},exports.AutocompleteEntitySelect=g,exports.AutocompleteLookupIdSelect=function({id:t,disabled:s,labelGetter:i,onChange:a,lookupClient:o}){const[l,r]=n.useState(null);n.useEffect((()=>{t?l&&l.id===t?r({...l}):o.loadSingle(t).then(r):r(null)}),[t]);const c=n.useCallback((e=>{const n=e?e.id:null;n!==t&&a(n),r(e)}),[t,l]);return e.jsx(j,{disabled:s,selected:l,labelGetter:i,lookupClient:o,onChange:c})},exports.AutocompleteLookupSelect=j,exports.AutocompleteSelect=h,exports.CacheStatsControl=function({name:t,stats:n}){return e.jsxs("div",{children:[e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsx("pre",{children:t}),e.jsxs("pre",{children:["[",n.cachedItems,n.capacity>0&&" / ",n.capacity>0&&n.capacity,"]"]})]}),n.capacity>0&&e.jsx("div",{className:"p-1",children:e.jsx(s.ProgressBar,{now:n.cachedItems,min:0,max:n.capacity})})]})},exports.ConfirmDialog=function({name:t,text:n,onClose:i,onConfirm:a}){return e.jsxs(s.Modal,{show:!0,backdrop:!0,onHide:i,children:[e.jsx(s.Modal.Header,{children:t||"Confirm"}),e.jsx(s.Modal.Body,{children:n}),e.jsx(s.Modal.Footer,{children:e.jsxs(s.Stack,{direction:"horizontal",children:[e.jsx(s.Button,{variant:"link",onClick:i,children:e.jsx(r,{text:"Back"})}),e.jsx(s.Button,{variant:"primary",onClick:a,children:e.jsx(r,{text:"Yes"})})]})})]})},exports.ConfirmDialogContext=O,exports.ConfirmDialogContextData=z,exports.DateInput=function({value:n,onChange:i,disabled:a}){return e.jsx(s.Form.Control,{type:"date",disabled:a,value:t.DateUtil.formatDateForInput(n),onChange:e=>{i(t.DateUtil.parseDate(e.target.value))}})},exports.DateTime=function({value:n}){return e.jsx("div",{className:"text-nowrap",children:t.DateUtil.formatDateTimeForHumans(n)})},exports.DateTimeInput=function({value:n,onChange:i,disabled:a}){return e.jsx(s.Form.Control,{type:"datetime-local",disabled:a,value:t.DateUtil.formatDateTimeForInput(n),onChange:e=>{i(t.DateUtil.parseDate(e.target.value))}})},exports.DeleteButton=function({disabled:t,icon:s,loading:a,children:o,size:l,onClick:r,isChanged:c}){const d=n.useMemo((()=>s||e.jsx(i.BsTrash,{})),[s]);return e.jsx(u,{disabled:t||!1===c,onClick:r,icon:d,loading:a,size:l,variant:"danger",children:o})},exports.Duration=w,exports.Elapsed=function({date:s}){const i=n.useMemo((()=>t.ObjectUtil.isEmpty(s)?null:Date.now()-s.getTime()),[s]);return e.jsx(w,{ms:i})},exports.EntityIdSelect=b,exports.EntitySelect=C,exports.EntityWithNameIdSelect=function({id:t,sort:n,disabled:s,onChange:i,options:a,showEmptyOption:o,emptyOptionLabel:l}){return e.jsx(b,{id:t,labelGetter:e=>e.name,disabled:s,sort:n,options:a,onChange:i,showEmptyOption:o,emptyOptionLabel:l})},exports.EntityWithNameSelect=function({value:t,sort:n,disabled:s,onChange:i,options:a,showEmptyOption:o,emptyOptionLabel:l}){return e.jsx(C,{value:t,labelGetter:e=>e.name,disabled:s,sort:n,options:a,onChange:i,showEmptyOption:o,emptyOptionLabel:l})},exports.EnumSelect=function({value:t,options:s,onChange:i,showEmptyOption:a,emptyOptionLabel:o}){const l=n.useMemo((()=>s?s.map((e=>({id:e,label:e}))):[]),[s]);return e.jsx(x,{value:t,options:l,onChange:i,showEmptyOption:a,emptyOptionLabel:o})},exports.FormRow=c,exports.FormRowControl=function(i){const a=n.useMemo((()=>i.id||t.StringUtil.randomString()),[i]);return e.jsx(c,{label:i.label,forId:a,children:e.jsx(s.Form.Control,{...i,id:a})})},exports.IconButton=p,exports.IconSwitch=function({disabled:t,checked:n,iconOn:i,iconOff:a,size:o,onChange:l}){return e.jsxs("div",{className:"d-flex align-items-center gap-2 cursor-pointer",onClick:e=>l(!n),children:[e.jsx(s.Form.Switch,{disabled:t,size:o,type:"switch",checked:n,readOnly:!0,className:"cursor-pointer"}),n?i:a]})},exports.JavaHeapControl=function({stats:n}){const i=n.heapSize,a=n.heapMaxSize,o=n.heapFreeSize,l=i-o;return e.jsxs("div",{children:[e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsx("pre",{children:"Java Heap"}),e.jsxs("pre",{children:["[",t.ByteUtil.formatByteSize(i)," / ",t.ByteUtil.formatByteSize(a),"]"]})]}),e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsx("pre",{children:"Used:"}),e.jsx(s.Badge,{className:"bg-warning text-bg-warning",children:t.ByteUtil.formatByteSize(l)}),e.jsx("pre",{children:"Free:"}),e.jsx(s.Badge,{className:"bg-success text-white",children:t.ByteUtil.formatByteSize(o)})]}),e.jsx("div",{className:"p-1",children:e.jsxs(s.ProgressBar,{min:0,max:a,children:[e.jsx(s.ProgressBar,{variant:"warning",min:0,now:l,max:a}),e.jsx(s.ProgressBar,{variant:"success",min:0,now:o,max:a})]})})]})},exports.LoadingButton=u,exports.LocalizationContext=l,exports.Localize=r,exports.LookupSelect=function({id:t,sort:s,disabled:i,labelGetter:a,onChange:o,options:l,showEmptyOption:r,emptyOptionLabel:c}){const d=n.useMemo((()=>{let e=[];return l&&(e=s?l.sort(((e,t)=>e.name>t.name?1:-1)):l),e.map((e=>({id:e.id,label:a?a(e):e.name})))}),[l]);return e.jsx(m,{disabled:i,value:t,options:d,onChange:o,showEmptyOption:r,emptyOptionLabel:c})},exports.NumberSelect=m,exports.QueueStateControl=M,exports.QueueStatsControl=function({name:t,stats:n}){const i=n?n.remaining+n.processed:void 0;return e.jsxs("div",{children:[e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsx("pre",{children:t}),e.jsxs("pre",{children:["[",void 0!==n?.processed?n.processed:"?"," / ",void 0!==i?i:"?","]"]}),e.jsx(M,{state:n?n.state:"Unknown"})]}),e.jsx("div",{className:"p-1",children:n?e.jsx(s.ProgressBar,{variant:"primary",striped:!0,animated:!0,min:0,now:n.processed,max:i||1}):e.jsx(s.Placeholder,{className:"w-100",animation:"glow",children:e.jsx(s.Placeholder,{className:"w-100"})})})]})},exports.SaveButton=function({disabled:t,icon:s,loading:i,children:o,size:l,onClick:r,isChanged:c}){const d=n.useMemo((()=>s||e.jsx(a.FaFloppyDisk,{})),[s]),p=n.useMemo((()=>c?e.jsx("strong",{children:o}):o),[c,o]);return e.jsx(u,{disabled:t||!1===c,onClick:r,icon:d,loading:i,size:l,children:p})},exports.Spread=function({children:t,center:s}){const i=n.useMemo((()=>!1===s?"":"d-flex align-items-center justify-content-center"),[s]);return e.jsx("div",{className:`w-100 h-100 position-absolute ${i}`,style:{left:0,right:0,top:0,bottom:0},children:t})},exports.StringSelect=x,exports.Switch=function({id:i,label:a,disabled:o,checked:l,size:r,onChange:c}){const d=n.useMemo((()=>i||t.StringUtil.randomString()),[i]);return e.jsx(s.Form.Switch,{disabled:o,id:d,size:r,type:"switch",checked:l,onChange:e=>c(!l),className:"cursor-pointer",label:a})},exports.TablePagination=f,exports.TablePlaceholder=function({cols:t,rows:i,size:a}){const o=n.useMemo((()=>void 0===t?1:t),[t]),l=n.useMemo((()=>void 0===i?20:i),[i]);return n.useMemo((()=>void 0===a?"lg":a),[a]),e.jsx("div",{children:e.jsx(s.Table,{responsive:!0,children:e.jsx("tbody",{children:Array.from({length:l},((t,n)=>e.jsx("tr",{children:Array.from({length:o},((t,n)=>e.jsx("td",{children:e.jsx("div",{className:"w-100 p-1 m-1"})},n)))},n)))})})})},exports.TableWithSelect=function({showSelect:s,header:a,items:o,onSelect:l,onClick:r,totalItems:c,paging:d,onPagingChanged:p}){const[u,x]=n.useState(!1),[m,h]=n.useState(),g=n.useCallback((e=>{m&&h(m.map((t=>({selected:e,item:t.item})))),x(e)}),[m]),j=n.useMemo((()=>{const t=[...a];return!1!==s&&t.unshift({name:"",label:e.jsx("div",{className:"py-1",children:e.jsx(S,{checked:u,onChange:()=>g(!u),iconOn:e.jsx(i.BsCheckAll,{})})})}),t}),[a,u,g]);return n.useEffect((()=>{h(o?o.map((e=>({selected:u,item:e}))):void 0)}),[o]),n.useEffect((()=>{m&&l&&l(m.filter((e=>e.selected)).map((e=>e.item)))}),[m,l]),e.jsx(y,{header:j,hover:void 0!==r,paging:d,striped:!0,totalItems:c,onPagingChanged:p,children:m&&m.map(((n,i)=>e.jsxs("tr",{className:`selectable ${r?"cursor-pointer":""} ${n.selected?"table-active table-primary":""}`,onClick:e=>{r&&r(n.item)},children:[!1!==s&&e.jsx("td",{children:e.jsx("div",{className:"py-2 d-flex align-items-center",children:e.jsx(S,{checked:n.selected,onChange:()=>{n.selected=!n.selected,u&&!n.selected&&x(!1),h([...m])}})})}),a.map(((s,i)=>{const a=s.renderer||(o=s.name,e=>t.ObjectUtil.getNestedValue(e,o));var o;return e.jsx("td",{children:a(n.item)},i)}))]},i)))})},exports.TextInputWithReset=d,exports.TextToClipboard=function({text:a,onClipboardCopy:o}){const l=n.useCallback((()=>{t.StringUtil.isBlank(a)||navigator.clipboard.writeText(a).then((()=>{o&&o()}))}),[a,o]);return e.jsxs(s.InputGroup,{children:[e.jsx(s.Form.Control,{type:"text",disabled:!0,value:String(a),onClick:l}),e.jsx(s.Button,{onClick:l,children:e.jsx("div",{className:"d-flex align-items-center",children:e.jsx(i.BsClipboard,{})})})]})},exports.UserAlertTypeIcon=B,exports.UserAlertWidget=N,exports.UserAlertsWidget=function({userAlerts:t}){const[a,l]=n.useState(!1),[r,c]=n.useState(t.alerts.length),[d,u]=n.useState([...t.visibleAlerts]),[x,m]=n.useState(t.getSummary()),h=n.useCallback((()=>{c(t.alerts.length),u(a?[...t.alerts]:[...t.visibleAlerts]),m(t.getSummary())}),[t,a]);return n.useEffect((()=>{t.addOnChangeHandler(h);const e=setInterval((()=>t.updateVisibility()),100);return()=>{clearInterval(e),t.removeOnChangeHandler(h)}}),[t,h]),r<=0?e.jsx(e.Fragment,{}):e.jsxs("div",{className:"user-alerts border rounded bg-body text-body position-fixed text-end",style:{bottom:15,right:15,zIndex:2147483647},children:[d.length>0&&e.jsx("div",{className:"max-w-50 p-2 border-bottom",children:d.map(((n,s)=>e.jsx(N,{userAlert:n,maxDurationMs:t.maxVisibilityMs},s)))}),e.jsx("div",{className:"p-2",children:e.jsxs(s.Stack,{direction:"horizontal",gap:2,className:"justify-content-end align-items-center",children:[a?e.jsx(p,{size:"sm",variant:"primary",onClick:()=>l(!1),icon:e.jsx(o.VscEyeClosed,{}),children:"Hide"}):e.jsx(p,{size:"sm",variant:"primary",onClick:()=>l(!0),icon:e.jsx(i.BsEye,{}),children:"Show All"}),Array.from(x.entries()).map(((t,n)=>e.jsxs(s.Stack,{direction:"horizontal",gap:1,className:"px-1 border rounded align-items-center",children:[e.jsx(B,{type:t[0],customVariant:0===t[1]?"muted":void 0}),e.jsx("div",{className:t[1]>0?`text-${t[0]} fw-bold`:"text-muted",children:t[1]})]},n))),e.jsx(p,{size:"sm",variant:"danger",onClick:()=>t.reset(),icon:e.jsx(i.BsTrash,{}),children:"Reset"})]})})]})};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.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/IconButton.tsx","../src/component/forms/LoadingButton.tsx","../src/component/forms/StringSelect.tsx","../src/component/forms/NumberSelect.tsx","../src/component/forms/AutocompleteSelect.tsx","../src/component/forms/AutocompleteEntitySelect.tsx","../src/component/forms/AutocompleteLookupSelect.tsx","../src/component/forms/EntityIdSelect.tsx","../src/component/forms/EntitySelect.tsx","../src/component/tables/TablePagination.tsx","../src/component/tables/AdvancedTable.tsx","../src/component/forms/IconCheck.tsx","../src/component/datetime/Duration.tsx","../src/component/alerts/UserAlertTypeIcon.tsx","../src/component/alerts/UserAlertWidget.tsx","../src/component/dialogs/ConfirmDialog.tsx","../src/component/stats/QueueStateControl.tsx","../src/component/forms/AutocompleteEntityIdSelect.tsx","../src/component/forms/AutocompleteLookupIdSelect.tsx","../src/component/stats/CacheStatsControl.tsx","../src/component/forms/DateInput.tsx","../src/component/datetime/DateTime.tsx","../src/component/forms/DateTimeInput.tsx","../src/component/forms/DeleteButton.tsx","../src/component/datetime/Elapsed.tsx","../src/component/forms/EntityWithNameIdSelect.tsx","../src/component/forms/EntityWithNameSelect.tsx","../src/component/forms/EnumSelect.tsx","../src/component/forms/FormRowControl.tsx","../src/component/forms/IconSwitch.tsx","../src/component/stats/JavaHeapControl.tsx","../src/component/forms/LookupSelect.tsx","../src/component/stats/QueueStatsControl.tsx","../src/component/forms/SaveButton.tsx","../src/component/Spread.tsx","../src/component/forms/Switch.tsx","../src/component/tables/TablePlaceholder.tsx","../src/component/tables/TableWithSelect.tsx","../src/component/alerts/UserAlertsWidget.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\tlabel: string;\n\tforId?: string;\n};\n\nexport function FormRow({forId, label, children}: FormRowProps) {\n\treturn (\n\t\t<Form.Group>\n\t\t\t<Form.Label htmlFor={forId}>\n\t\t\t\t<Localize text={label}/>\n\t\t\t</Form.Label>\n\t\t\t<div>{children}</div>\n\t\t</Form.Group>\n\t);\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 { 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 { 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 {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 {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\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\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, 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 {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 {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 {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 {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 {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} 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 {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, 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 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 {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\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} 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 {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 {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 {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 {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 {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, FormControlProps} from \"react-bootstrap\";\nimport {FormRow} from \"./FormRow\";\nimport {useMemo} from \"react\";\nimport {StringUtil} from \"zavadil-ts-common\";\n\nexport type FormRowControlProps = FormControlProps & {\n\tlabel: string;\n};\n\nexport function FormRowControl(props: FormRowControlProps) {\n\tconst actualId = useMemo(() => props.id || StringUtil.randomString(), [props]);\n\treturn (\n\t\t<FormRow label={props.label} forId={actualId}>\n\t\t\t<Form.Control {...props} id={actualId}/>\n\t\t</FormRow>\n\t);\n}\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 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 {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 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\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\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","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 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 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 {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"],"names":["LocalizationContext","createContext","BasicLocalization","Localize","text","tag","localization","useContext","p","useMemo","undefined","tags","t","translate","_jsx","jsx","_Fragment","Fragment","children","FormRow","forId","label","_jsxs","Form","Group","Label","htmlFor","TextInputWithReset","value","onChange","onReset","onBlur","disabled","className","actual","StringUtil","getNonEmpty","isEmpty","isBlank","reset","useCallback","jsxs","InputGroup","Control","type","e","target","Button","onClick","BsXCircle","IconButton","variant","icon","size","LoadingButton","loading","Spinner","StringSelect","options","showEmptyOption","emptyOptionLabel","useEffect","length","id","Select","map","o","i","NumberSelect","nValue","String","nOptions","nChange","s","NumberUtil","parseNumber","AutocompleteSelect","selected","labelGetter","onSearch","searchPromise","setSearchPromise","useState","searchText","setSearchText","itemSelection","setItemSelection","blurTimeout","useRef","finalLabelGetter","item","name","finalCss","userLeftControl","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","content","AutocompleteLookupSelect","lookupClient","EntityIdSelect","sort","lOptions","result","a","b","EntitySelect","find","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","checked","iconOn","iconOff","renderedIcon","BsCheckCircle","BsCircle","stopPropagation","preventDefault","Duration","ms","DateUtil","formatDuration","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","now","formatDateForHumans","time","message","ConfirmDialogContextData","constructor","setProps","this","confirm","onConfirmed","onConfirm","onClose","ConfirmDialogContext","STATE_COLORS","QueueStateControl","state","color","Badge","setSelected","EntityClientWithStub","loadSingleStub","loadSingle","selectionChanged","nId","stats","cachedItems","capacity","Modal","backdrop","onHide","Header","Body","Footer","formatDateForInput","parseDate","formatDateTimeForHumans","formatDateTimeForInput","isChanged","icn","BsTrash","date","Date","getTime","props","actualId","randomString","Switch","readOnly","heapSize","heapMaxSize","free","heapFreeSize","used","ByteUtil","formatByteSize","remaining","processed","animated","Placeholder","animation","FaFloppyDisk","center","css","left","right","top","bottom","cols","rows","colsN","rowsN","Array","from","_","showSelect","items","onSelect","selectAll","setSelectAll","selectableItems","setSelectableItems","updateSelectAll","sa","selectableHeader","unshift","BsCheckAll","filter","renderer","getNestedValue","userAlerts","showAll","setShowAll","totalAlerts","setTotalAlerts","alerts","renderedAlerts","setRenderedAlerts","visibleAlerts","summary","setSummary","getSummary","onChangeHandler","addOnChangeHandler","handle","setInterval","updateVisibility","clearInterval","removeOnChangeHandler","zIndex","maxVisibilityMs","VscEyeClosed","BsEye","entries","entry"],"mappings":"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"}
1
+ {"version":3,"file":"index.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/IconButton.tsx","../src/component/forms/LoadingButton.tsx","../src/component/forms/StringSelect.tsx","../src/component/forms/NumberSelect.tsx","../src/component/forms/AutocompleteSelect.tsx","../src/component/forms/AutocompleteEntitySelect.tsx","../src/component/forms/AutocompleteLookupSelect.tsx","../src/component/forms/EntityIdSelect.tsx","../src/component/forms/EntitySelect.tsx","../src/component/tables/TablePagination.tsx","../src/component/tables/AdvancedTable.tsx","../src/component/forms/IconCheck.tsx","../src/component/datetime/Duration.tsx","../src/component/alerts/UserAlertTypeIcon.tsx","../src/component/alerts/UserAlertWidget.tsx","../src/component/dialogs/ConfirmDialog.tsx","../src/component/stats/QueueStateControl.tsx","../src/component/forms/AutocompleteEntityIdSelect.tsx","../src/component/forms/AutocompleteLookupIdSelect.tsx","../src/component/stats/CacheStatsControl.tsx","../src/component/forms/DateInput.tsx","../src/component/datetime/DateTime.tsx","../src/component/forms/DateTimeInput.tsx","../src/component/forms/DeleteButton.tsx","../src/component/datetime/Elapsed.tsx","../src/component/forms/EntityWithNameIdSelect.tsx","../src/component/forms/EntityWithNameSelect.tsx","../src/component/forms/EnumSelect.tsx","../src/component/forms/FormRowControl.tsx","../src/component/forms/IconSwitch.tsx","../src/component/stats/JavaHeapControl.tsx","../src/component/forms/LookupSelect.tsx","../src/component/stats/QueueStatsControl.tsx","../src/component/forms/SaveButton.tsx","../src/component/Spread.tsx","../src/component/forms/Switch.tsx","../src/component/tables/TablePlaceholder.tsx","../src/component/tables/TableWithSelect.tsx","../src/component/forms/TextToClipboard.tsx","../src/component/alerts/UserAlertsWidget.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\tlabel: string;\n\tforId?: string;\n};\n\nexport function FormRow({forId, label, children}: FormRowProps) {\n\treturn (\n\t\t<Form.Group>\n\t\t\t<Form.Label htmlFor={forId}>\n\t\t\t\t<Localize text={label}/>\n\t\t\t</Form.Label>\n\t\t\t<div>{children}</div>\n\t\t</Form.Group>\n\t);\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 { 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 { 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 {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 {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\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\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, 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 {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 {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 {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 {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 {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} 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 {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, 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 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 {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\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} 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 {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 {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 {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 {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 {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, FormControlProps} from \"react-bootstrap\";\nimport {FormRow} from \"./FormRow\";\nimport {useMemo} from \"react\";\nimport {StringUtil} from \"zavadil-ts-common\";\n\nexport type FormRowControlProps = FormControlProps & {\n\tlabel: string;\n};\n\nexport function FormRowControl(props: FormRowControlProps) {\n\tconst actualId = useMemo(() => props.id || StringUtil.randomString(), [props]);\n\treturn (\n\t\t<FormRow label={props.label} forId={actualId}>\n\t\t\t<Form.Control {...props} id={actualId}/>\n\t\t</FormRow>\n\t);\n}\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 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 {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 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\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\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","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 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 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 {Button, Form, InputGroup} from \"react-bootstrap\";\r\nimport {BsClipboard} from \"react-icons/bs\";\r\nimport {useCallback} from \"react\";\r\nimport {StringUtil} from \"zavadil-ts-common\";\r\n\r\nexport type TextToClipboardProps = {\r\n\ttext?: string | null;\r\n\tonClipboardCopy?: () => any;\r\n};\r\n\r\nexport function TextToClipboard({text, onClipboardCopy}: TextToClipboardProps) {\r\n\r\n\tconst toClipboard = useCallback(\r\n\t\t() => {\r\n\t\t\tif (StringUtil.isBlank(text)) return;\r\n\t\t\tnavigator.clipboard\r\n\t\t\t\t.writeText(text)\r\n\t\t\t\t.then(\r\n\t\t\t\t\t() => {\r\n\t\t\t\t\t\tif (onClipboardCopy) {\r\n\t\t\t\t\t\t\tonClipboardCopy();\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[text, onClipboardCopy]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<InputGroup>\r\n\t\t\t<Form.Control\r\n\t\t\t\ttype=\"text\"\r\n\t\t\t\tdisabled={true}\r\n\t\t\t\tvalue={String(text)}\r\n\t\t\t\tonClick={toClipboard}\r\n\t\t\t/>\r\n\t\t\t<Button onClick={toClipboard}>\r\n\t\t\t\t<div className=\"d-flex align-items-center\">\r\n\t\t\t\t\t<BsClipboard/>\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 TextToClipboard;\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"],"names":["LocalizationContext","createContext","BasicLocalization","Localize","text","tag","localization","useContext","p","useMemo","undefined","tags","t","translate","_jsx","jsx","_Fragment","Fragment","children","FormRow","forId","label","_jsxs","Form","Group","Label","htmlFor","TextInputWithReset","value","onChange","onReset","onBlur","disabled","className","actual","StringUtil","getNonEmpty","isEmpty","isBlank","reset","useCallback","jsxs","InputGroup","Control","type","e","target","Button","onClick","BsXCircle","IconButton","variant","icon","size","LoadingButton","loading","Spinner","StringSelect","options","showEmptyOption","emptyOptionLabel","useEffect","length","id","Select","map","o","i","NumberSelect","nValue","String","nOptions","nChange","s","NumberUtil","parseNumber","AutocompleteSelect","selected","labelGetter","onSearch","searchPromise","setSearchPromise","useState","searchText","setSearchText","itemSelection","setItemSelection","blurTimeout","useRef","finalLabelGetter","item","name","finalCss","userLeftControl","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","content","AutocompleteLookupSelect","lookupClient","EntityIdSelect","sort","lOptions","result","a","b","EntitySelect","find","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","checked","iconOn","iconOff","renderedIcon","BsCheckCircle","BsCircle","stopPropagation","preventDefault","Duration","ms","DateUtil","formatDuration","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","now","formatDateForHumans","time","message","ConfirmDialogContextData","constructor","setProps","this","confirm","onConfirmed","onConfirm","onClose","ConfirmDialogContext","STATE_COLORS","QueueStateControl","state","color","Badge","setSelected","EntityClientWithStub","loadSingleStub","loadSingle","selectionChanged","nId","stats","cachedItems","capacity","Modal","backdrop","onHide","Header","Body","Footer","formatDateForInput","parseDate","formatDateTimeForHumans","formatDateTimeForInput","isChanged","icn","BsTrash","date","Date","getTime","props","actualId","randomString","Switch","readOnly","heapSize","heapMaxSize","free","heapFreeSize","used","ByteUtil","formatByteSize","remaining","processed","animated","Placeholder","animation","FaFloppyDisk","center","css","left","right","top","bottom","cols","rows","colsN","rowsN","Array","from","_","showSelect","items","onSelect","selectAll","setSelectAll","selectableItems","setSelectableItems","updateSelectAll","sa","selectableHeader","unshift","BsCheckAll","filter","renderer","getNestedValue","onClipboardCopy","toClipboard","navigator","clipboard","writeText","BsClipboard","userAlerts","showAll","setShowAll","totalAlerts","setTotalAlerts","alerts","renderedAlerts","setRenderedAlerts","visibleAlerts","summary","setSummary","getSummary","onChangeHandler","addOnChangeHandler","handle","setInterval","updateVisibility","clearInterval","removeOnChangeHandler","zIndex","maxVisibilityMs","VscEyeClosed","BsEye","entries","entry"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zavadil-react-common",
3
- "version": "2.2.5",
3
+ "version": "2.2.7",
4
4
  "description": "Common types for React Typescript UI apps.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -8,7 +8,7 @@ export type TextToClipboardProps = {
8
8
  onClipboardCopy?: () => any;
9
9
  };
10
10
 
11
- export default function TextToClipboard({text, onClipboardCopy}: TextToClipboardProps) {
11
+ export function TextToClipboard({text, onClipboardCopy}: TextToClipboardProps) {
12
12
 
13
13
  const toClipboard = useCallback(
14
14
  () => {
@@ -42,3 +42,5 @@ export default function TextToClipboard({text, onClipboardCopy}: TextToClipboard
42
42
  </InputGroup>
43
43
  );
44
44
  }
45
+
46
+ export default TextToClipboard;